diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000000..ff3f1ffc4c7 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +> 0.5%, last 3 major versions, Firefox ESR, not dead diff --git a/.checkmarx/config.yml b/.checkmarx/config.yml new file mode 100644 index 00000000000..e45e83fcac9 --- /dev/null +++ b/.checkmarx/config.yml @@ -0,0 +1,12 @@ +version: 1 + +# Checkmarx configuration file +# +# https://checkmarx.com/resource/documents/en/34965-68549-configuring-projects-using-config-as-code-files.html +checkmarx: + scan: + configs: + sast: + presetName: "BW ASA Premium" + # Exclude spec files, and test specific files + filter: "!*.spec.ts,!**/spec/**,!apps/desktop/native-messaging-test-runner/**" diff --git a/.codescene/code-health-rules.json b/.codescene/code-health-rules.json new file mode 100644 index 00000000000..bafdb1188ef --- /dev/null +++ b/.codescene/code-health-rules.json @@ -0,0 +1,14 @@ +{ + "usage": "Documentation: https://codescene.io/docs/guides/technical/code-health.html. Template: https://codescene.io/projects/26215/config/codehealth/export/code-health-rules.json", + "rule_sets": [ + { + "matching_content_path": "**/*.spec.ts", + "rules": [ + { + "name": "Code Duplication", + "weight": 0.0 + } + ] + } + ] +} diff --git a/.eslintignore b/.eslintignore index e1fbda38133..b6c475d3326 100644 --- a/.eslintignore +++ b/.eslintignore @@ -12,14 +12,13 @@ storybook-static apps/browser/config/config.js apps/browser/src/auth/scripts/duo.js -apps/browser/src/autofill/content/autofill.js +apps/browser/webpack/manifest.js apps/desktop/desktop_native apps/desktop/src/auth/scripts/duo.js apps/web/config.js apps/web/scripts/*.js -apps/web/src/theme.js apps/web/tailwind.config.js apps/cli/config/config.js diff --git a/.eslintrc.json b/.eslintrc.json index 4fba3dd6128..c606b8f933b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -16,11 +16,12 @@ }, "extends": [ "eslint:recommended", + "plugin:@angular-eslint/recommended", "plugin:@typescript-eslint/recommended", "plugin:import/recommended", "plugin:import/typescript", - "prettier", "plugin:rxjs/recommended", + "prettier", "plugin:storybook/recommended" ], "settings": { @@ -34,20 +35,28 @@ } }, "rules": { - "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled - "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], + "@angular-eslint/component-class-suffix": 0, + "@angular-eslint/contextual-lifecycle": 0, + "@angular-eslint/directive-class-suffix": 0, + "@angular-eslint/no-empty-lifecycle-method": 0, + "@angular-eslint/no-host-metadata-property": 0, + "@angular-eslint/no-input-rename": 0, + "@angular-eslint/no-inputs-metadata-property": 0, + "@angular-eslint/no-output-native": 0, + "@angular-eslint/no-output-on-prefix": 0, + "@angular-eslint/no-output-rename": 0, + "@angular-eslint/no-outputs-metadata-property": 0, + "@angular-eslint/use-lifecycle-interface": "error", + "@angular-eslint/use-pipe-transform-interface": 0, "@typescript-eslint/explicit-member-accessibility": [ "error", - { - "accessibility": "no-public" - } - ], - "@typescript-eslint/no-this-alias": [ - "error", - { - "allowedNames": ["self"] - } + { "accessibility": "no-public" } ], + "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-misused-promises": ["error", { "checksVoidReturn": false }], + "@typescript-eslint/no-this-alias": ["error", { "allowedNames": ["self"] }], + "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], "no-console": "error", "import/no-unresolved": "off", // TODO: Look into turning off once each package is an actual package. "import/order": [ @@ -72,7 +81,7 @@ "pathGroupsExcludedImportTypes": ["builtin"] } ], - "rxjs-angular/prefer-takeuntil": "error", + "rxjs-angular/prefer-takeuntil": ["error", { "alias": ["takeUntilDestroyed"] }], "rxjs/no-exposed-subjects": ["error", { "allowProtected": true }], "no-restricted-syntax": [ "error", @@ -91,6 +100,11 @@ "error", { "zones": [ + { + "target": ["libs/**/*"], + "from": ["apps/**/*"], + "message": "Libs should not import app-specific code." + }, { // avoid specific frameworks or large dependencies in common "target": "./libs/common/**/*", @@ -102,18 +116,33 @@ // Node "./libs/node/**/*", + //Generator + "./libs/tools/generator/components/**/*", + "./libs/tools/generator/core/**/*", + "./libs/tools/generator/extensions/**/*", + // Import/export "./libs/importer/**/*", - "./libs/exporter/**/*" + "./libs/tools/export/vault-export/vault-export-core/**/*" ] + }, + { + // avoid import of unexported state objects + "target": [ + "!(libs)/**/*", + "libs/!(common)/**/*", + "libs/common/!(src)/**/*", + "libs/common/src/!(platform)/**/*", + "libs/common/src/platform/!(state)/**/*" + ], + "from": ["./libs/common/src/platform/state/**/*"], + // allow module index import + "except": ["**/state/index.ts"] } ] } ], - "no-restricted-imports": [ - "error", - { "patterns": ["src/**/*"], "paths": ["@fluffy-spoon/substitute"] } - ] + "no-restricted-imports": ["error", { "patterns": ["src/**/*"] }] } }, { @@ -135,6 +164,15 @@ "tailwindcss/no-contradicting-classname": "error" } }, + { + "files": ["libs/admin-console/src/**/*.ts"], + "rules": { + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/admin-console/*", "src/**/*"] } + ] + } + }, { "files": ["libs/angular/src/**/*.ts"], "rules": { @@ -147,6 +185,12 @@ "no-restricted-imports": ["error", { "patterns": ["@bitwarden/auth/*", "src/**/*"] }] } }, + { + "files": ["libs/billing/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/billing/*", "src/**/*"] }] + } + }, { "files": ["libs/common/src/**/*.ts"], "rules": { @@ -163,9 +207,66 @@ } }, { - "files": ["libs/exporter/src/**/*.ts"], + "files": ["libs/tools/generator/components/src/**/*.ts"], "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/exporter/*", "src/**/*"] }] + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/generator-components/*", "src/**/*"] } + ] + } + }, + { + "files": ["libs/tools/generator/core/src/**/*.ts"], + "rules": { + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/generator-core/*", "src/**/*"] } + ] + } + }, + { + "files": ["libs/tools/generator/extensions/history/src/**/*.ts"], + "rules": { + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/generator-history/*", "src/**/*"] } + ] + } + }, + { + "files": ["libs/tools/generator/extensions/legacy/src/**/*.ts"], + "rules": { + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/generator-legacy/*", "src/**/*"] } + ] + } + }, + { + "files": ["libs/tools/generator/extensions/navigation/src/**/*.ts"], + "rules": { + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/generator-navigation/*", "src/**/*"] } + ] + } + }, + { + "files": ["libs/tools/export/vault-export/vault-export-core/src/**/*.ts"], + "rules": { + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/vault-export-core/*", "src/**/*"] } + ] + } + }, + { + "files": ["libs/tools/export/vault-export/vault-export-ui/src/**/*.ts"], + "rules": { + "no-restricted-imports": [ + "error", + { "patterns": ["@bitwarden/vault-export-ui/*", "src/**/*"] } + ] } }, { @@ -180,11 +281,94 @@ "no-restricted-imports": ["error", { "patterns": ["@bitwarden/node/*", "src/**/*"] }] } }, + { + "files": ["libs/platform/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/platform/*", "src/**/*"] }] + } + }, + { + "files": ["libs/tools/send/send-ui/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/send-ui/*", "src/**/*"] }] + } + }, + { + "files": ["libs/tools/card/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/tools-card/*", "src/**/*"] }] + } + }, { "files": ["libs/vault/src/**/*.ts"], "rules": { "no-restricted-imports": ["error", { "patterns": ["@bitwarden/vault/*", "src/**/*"] }] } + }, + { + "files": ["apps/browser/src/**/*.ts", "libs/**/*.ts"], + "excludedFiles": [ + "apps/browser/src/autofill/{content,notification}/**/*.ts", + "apps/browser/src/**/background/**/*.ts", // It's okay to have long lived listeners in the background + "apps/browser/src/platform/background.ts" + ], + "rules": { + "no-restricted-syntax": [ + "error", + { + "message": "Using addListener in the browser popup produces a memory leak in Safari, use `BrowserApi.addListener` instead", + // This selector covers events like chrome.storage.onChange & chrome.runtime.onMessage + "selector": "CallExpression > [object.object.object.name='chrome'][property.name='addListener']" + }, + { + "message": "Using addListener in the browser popup produces a memory leak in Safari, use `BrowserApi.addListener` instead", + // This selector covers events like chrome.storage.local.onChange + "selector": "CallExpression > [object.object.object.object.name='chrome'][property.name='addListener']" + } + ] + } + }, + { + "files": ["**/*.ts"], + "excludedFiles": ["**/platform/**/*.ts"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + "**/platform/**/internal", // General internal pattern + // All features that have been converted to barrel files + "**/platform/messaging/**" + ] + } + ] + } + }, + { + "files": ["bitwarden_license/bit-common/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/bit-common/*", "src/**/*"] }] + } + }, + { + "files": ["apps/**/*.ts"], + "rules": { + // Catches static imports + "no-restricted-imports": [ + "error", + { + "patterns": ["biwarden_license/**", "@bitwarden/bit-common/*", "@bitwarden/bit-web/*"] + } + ], + // Catches dynamic imports, e.g. in routing modules where modules are lazy-loaded + "no-restricted-syntax": [ + "error", + { + "message": "Don't import Bitwarden licensed code into OSS code.", + "selector": "ImportExpression > Literal.source[value=/.*(bitwarden_license|bit-common|bit-web).*/]" + } + ] + } } ] } diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 9dd7b5c2e6f..c0d1e0eb8ab 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -22,3 +22,6 @@ 193434461dbd9c48fe5dcbad95693470aec422ac # Jslib: Monorepository https://github.com/bitwarden/clients/pull/2824/commits/d7492e3cf320410e74ebd0e0675ab994e64bd01a d7492e3cf320410e74ebd0e0675ab994e64bd01a + +# All Clients: Apply Prettier https://github.com/bitwarden/clients/pull/7014 +28de9439beb87133c8683434df952a0c0be94100 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c5f55674aee..c050ee1f6c0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,13 +1,12 @@ -# Please sort lines alphabetically, this will ensure we don't accidentally add duplicates. +# Please sort into logical groups with comment headers. Sort groups in order of specificity. +# For example, default owners should always be the first group. +# Sort lines alphabetically within these groups to avoid accidentally adding duplicates. # # https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners -# The following owners will be the default owners for everything in the repo. -# Unless a later match takes precedence -* @bitwarden/tech-leads - ## Secrets Manager team files ## bitwarden_license/bit-web/src/app/secrets-manager @bitwarden/team-secrets-manager-dev +apps/web/src/app/secrets-manager/ @bitwarden/team-secrets-manager-dev ## Auth team files ## apps/browser/src/auth @bitwarden/team-auth-dev @@ -29,8 +28,17 @@ apps/web/src/app/tools @bitwarden/team-tools-dev libs/angular/src/tools @bitwarden/team-tools-dev libs/common/src/models/export @bitwarden/team-tools-dev libs/common/src/tools @bitwarden/team-tools-dev -libs/exporter @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 + +## Localization/Crowdin (Tools team) +apps/browser/src/_locales @bitwarden/team-tools-dev +apps/browser/store/locales @bitwarden/team-tools-dev +apps/cli/src/locales @bitwarden/team-tools-dev +apps/desktop/src/locales @bitwarden/team-tools-dev +apps/web/src/locales @bitwarden/team-tools-dev ## Vault team files ## apps/browser/src/vault @bitwarden/team-vault-dev @@ -47,21 +55,30 @@ apps/cli/src/admin-console @bitwarden/team-admin-console-dev apps/desktop/src/admin-console @bitwarden/team-admin-console-dev apps/web/src/app/admin-console @bitwarden/team-admin-console-dev bitwarden_license/bit-web/src/app/admin-console @bitwarden/team-admin-console-dev +bitwarden_license/bit-cli/src/admin-console @bitwarden/team-admin-console-dev libs/angular/src/admin-console @bitwarden/team-admin-console-dev libs/common/src/admin-console @bitwarden/team-admin-console-dev +libs/admin-console @bitwarden/team-admin-console-dev ## Billing team files ## +apps/browser/src/billing @bitwarden/team-billing-dev apps/web/src/app/billing @bitwarden/team-billing-dev libs/angular/src/billing @bitwarden/team-billing-dev libs/common/src/billing @bitwarden/team-billing-dev +libs/billing @bitwarden/team-billing-dev +bitwarden_license/bit-web/src/app/billing @bitwarden/team-billing-dev ## Platform team files ## apps/browser/src/platform @bitwarden/team-platform-dev apps/cli/src/platform @bitwarden/team-platform-dev +apps/desktop/macos @bitwarden/team-platform-dev apps/desktop/src/platform @bitwarden/team-platform-dev apps/web/src/app/platform @bitwarden/team-platform-dev libs/angular/src/platform @bitwarden/team-platform-dev libs/common/src/platform @bitwarden/team-platform-dev +libs/common/spec @bitwarden/team-platform-dev +libs/common/src/state-migrations @bitwarden/team-platform-dev +libs/platform @bitwarden/team-platform-dev # Node-specifc platform files libs/node @bitwarden/team-platform-dev # Web utils used across app and connectors @@ -73,35 +90,63 @@ apps/web/src/translation-constants.ts @bitwarden/team-platform-dev ## Autofill team files ## apps/browser/src/autofill @bitwarden/team-autofill-dev +apps/desktop/src/autofill @bitwarden/team-autofill-dev +libs/common/src/autofill @bitwarden/team-autofill-dev +apps/desktop/macos/autofill-extension @bitwarden/team-autofill-dev +# DuckDuckGo integration +apps/desktop/native-messaging-test-runner @bitwarden/team-autofill-dev +apps/desktop/src/services/native-message-handler.service.ts @bitwarden/team-autofill-dev ## Component Library ## -.storybook @bitwarden/team-platform-dev -libs/components @bitwarden/team-platform-dev +.storybook @bitwarden/team-design-system +libs/components @bitwarden/team-design-system +apps/browser/src/platform/popup/layout @bitwarden/team-design-system +apps/web/src/app/layouts @bitwarden/team-design-system ## Desktop native module ## apps/desktop/desktop_native @bitwarden/team-platform-dev -## Multiple file owners ## -apps/browser/package.json -apps/browser/src/manifest.json -apps/browser/src/manifest.v3.json +## Key management team files ## +apps/desktop/src/key-management @bitwarden/team-key-management-dev +apps/web/src/app/key-management @bitwarden/team-key-management-dev +apps/browser/src/key-management @bitwarden/team-key-management-dev +apps/cli/src/key-management @bitwarden/team-key-management-dev +libs/key-management @bitwarden/team-key-management-dev -apps/cli/package.json - -apps/desktop/package.json -apps/desktop/src/package-lock.json -apps/desktop/src/package.json - -/apps/web/config -/apps/web/package.json - -package-lock.json +apps/desktop/destkop_native/core/src/biometric/ @bitwarden/team-key-management-dev +apps/desktop/src/services/native-messaging.service.ts @bitwarden/team-key-management-dev +apps/browser/src/background/nativeMessaging.background.ts @bitwarden/team-key-management-dev ## Locales ## apps/browser/src/_locales/en/messages.json +apps/browser/store/locales/en apps/cli/src/locales/en/messages.json apps/desktop/src/locales/en/messages.json apps/web/src/locales/en/messages.json -## DevOps team files ## -/.github/workflows @bitwarden/dept-devops +## Ssh agent temporary co-codeowner +apps/desktop/desktop_native/core/src/ssh_agent @bitwarden/team-platform-dev @bitwarden/wg-ssh-keys + +## BRE team owns these workflows ## +.github/workflows/brew-bump-desktop.yml @bitwarden/dept-bre +.github/workflows/deploy-web.yml @bitwarden/dept-bre +.github/workflows/publish-cli.yml @bitwarden/dept-bre +.github/workflows/publish-desktop.yml @bitwarden/dept-bre +.github/workflows/publish-web.yml @bitwarden/dept-bre +.github/workflows/retrieve-current-desktop-rollout.yml @bitwarden/dept-bre +.github/workflows/staged-rollout-desktop.yml @bitwarden/dept-bre + +## Shared ownership workflows ## +.github/workflows/release-browser.yml +.github/workflows/release-cli.yml +.github/workflows/release-desktop-beta.yml +.github/workflows/release-desktop.yml +.github/workflows/release-web.yml +.github/workflows/version-auto-bump.yml +.github/workflows/version-bump.yml + +## Docker files have shared ownership ## +**/Dockerfile +**/*.Dockerfile +**/.dockerignore +**/entrypoint.sh diff --git a/.github/ISSUE_TEMPLATE/desktop.yml b/.github/ISSUE_TEMPLATE/desktop.yml index 8da7b28588d..6fd6f1d1c2b 100644 --- a/.github/ISSUE_TEMPLATE/desktop.yml +++ b/.github/ISSUE_TEMPLATE/desktop.yml @@ -90,4 +90,4 @@ body: description: | Issue tracking information options: - - label: I understand that work is tracked outside of Github. A PR will be linked to this issue should one be opened to address it, but Bitwarden doesn't use fields like "assigned", "milestone", or "project" to track progress. + - label: I understand that work is tracked outside of GitHub. A PR will be linked to this issue should one be opened to address it, but Bitwarden doesn't use fields like "assigned", "milestone", or "project" to track progress. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a2ff0baf25f..edbc9d98cc9 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,33 +1,35 @@ -## Type of change +## đŸŽŸī¸ Tracking - + -``` -- [ ] Bug fix -- [ ] New feature development -- [ ] Tech debt (refactoring, code cleanup, dependency upgrades, etc) -- [ ] Build/deploy pipeline (DevOps) -- [ ] Other -``` +## 📔 Objective -## Objective + - +## 📸 Screenshots -## Code changes + - - +## ⏰ Reminders before review -- **file.ext:** Description of what was changed and why +- Contributor guidelines followed +- All formatters and local linters executed and passed +- Written new unit and / or integration tests where applicable +- Protected functional changes with optionality (feature flags) +- Used internationalization (i18n) for all UI strings +- CI builds passed +- Communicated to DevOps any deployment requirements +- Updated any necessary documentation (Confluence, contributing docs) or informed the documentation team -## Screenshots +## đŸĻŽ Reviewer guidelines - + -## Before you submit - -- Please add **unit tests** where it makes sense to do so (encouraged but not required) -- If this change requires a **documentation update** - notify the documentation team -- If this change has particular **deployment requirements** - notify the DevOps team -- Ensure that all UI additions follow [WCAG AA requirements](https://contributing.bitwarden.com/contributing/accessibility/) +- 👍 (`:+1:`) or similar for great changes +- 📝 (`:memo:`) or â„šī¸ (`:information_source:`) for notes or general info +- ❓ (`:question:`) for questions +- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry that's not quite a confirmed issue and could potentially benefit from discussion +- 🎨 (`:art:`) for suggestions / improvements +- ❌ (`:x:`) or âš ī¸ (`:warning:`) for more significant problems or concerns needing attention +- 🌱 (`:seedling:`) or â™ģī¸ (`:recycle:`) for future improvements or indications of technical debt +- ⛏ (`:pick:`) for minor or nitpick changes diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 00000000000..b4774407206 --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,2 @@ +ignore: + - "**/*.spec.ts" # Tests diff --git a/.github/renovate.json b/.github/renovate.json index 81dea677317..0172403f0f1 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,55 +1,272 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:base", - ":combinePatchMinorReleases", - ":dependencyDashboard", - ":maintainLockFilesWeekly", - ":pinAllExceptPeerDependencies", - ":rebaseStalePrs", - "schedule:weekends", - ":separateMajorReleases" - ], - "prConcurrentLimit": 3, + "extends": ["github>bitwarden/renovate-config"], "enabledManagers": ["cargo", "github-actions", "npm"], "packageRules": [ - { - "groupName": "cargo minor", - "matchManagers": ["cargo"], - "matchUpdateTypes": ["minor", "patch"] - }, { "groupName": "gh minor", "matchManagers": ["github-actions"], "matchUpdateTypes": ["minor", "patch"] }, { - "groupName": "npm minor", - "matchManagers": ["npm"], - "matchUpdateTypes": ["minor", "patch"] + "matchManagers": ["github-actions"], + "commitMessagePrefix": "[deps] DevOps:" }, { - "matchPackageNames": ["typescript"], + "matchManagers": ["cargo"], + "commitMessagePrefix": "[deps] Platform:" + }, + { + "groupName": "napi", + "matchPackageNames": ["napi", "napi-build", "napi-derive"] + }, + { + "matchPackageNames": ["typescript", "zone.js"], "matchUpdateTypes": ["major", "minor"], + "description": "Determined by Angular", "enabled": false }, { - "matchPackageNames": ["typescript"], + "matchPackageNames": ["typescript", "zone.js"], "matchUpdateTypes": "patch" }, { "groupName": "jest", "matchPackageNames": ["@types/jest", "jest", "ts-jest", "jest-preset-angular"], "matchUpdateTypes": "major" + }, + { + "groupName": "macOS/iOS bindings", + "matchPackageNames": ["core-foundation", "security-framework", "security-framework-sys"] + }, + { + "matchPackageNames": [ + "base64-loader", + "buffer", + "bufferutil", + "core-js", + "css-loader", + "html-loader", + "mini-css-extract-plugin", + "ngx-infinite-scroll", + "postcss", + "postcss-loader", + "process", + "sass", + "sass-loader", + "style-loader", + "ts-loader", + "url", + "util" + ], + "description": "Admin Console owned dependencies", + "commitMessagePrefix": "[deps] AC:", + "reviewers": ["team:team-admin-console-dev"] + }, + { + "matchPackageNames": ["qrious"], + "description": "Auth owned dependencies", + "commitMessagePrefix": "[deps] Auth:", + "reviewers": ["team:team-auth-dev"] + }, + { + "matchPackageNames": [ + "@webcomponents/custom-elements", + "concurrently", + "cross-env", + "del", + "gulp", + "gulp-if", + "gulp-json-editor", + "gulp-replace", + "gulp-zip", + "nord", + "patch-package", + "prettier", + "prettier-plugin-tailwindcss", + "rimraf", + "tabbable", + "tldts", + "wait-on" + ], + "description": "Autofill owned dependencies", + "commitMessagePrefix": "[deps] Autofill:", + "reviewers": ["team:team-autofill-dev"] + }, + { + "matchPackageNames": ["braintree-web-drop-in"], + "description": "Billing owned dependencies", + "commitMessagePrefix": "[deps] Billing:", + "reviewers": ["team:team-billing-dev"] + }, + { + "matchPackageNames": [ + "@babel/core", + "@babel/preset-env", + "@electron/notarize", + "@electron/rebuild", + "@ngtools/webpack", + "@types/chrome", + "@types/firefox-webext-browser", + "@types/glob", + "@types/jquery", + "@types/lowdb", + "@types/node", + "@types/node-forge", + "@types/node-ipc", + "@yao-pkg", + "babel-loader", + "browserslist", + "copy-webpack-plugin", + "electron", + "electron-builder", + "electron-log", + "electron-reload", + "electron-store", + "electron-updater", + "html-webpack-injector", + "html-webpack-plugin", + "lowdb", + "node-forge", + "node-ipc", + "pkg", + "rxjs", + "tsconfig-paths-webpack-plugin", + "type-fest", + "typescript", + "webpack", + "webpack-cli", + "webpack-dev-server", + "webpack-node-externals" + ], + "description": "Platform owned dependencies", + "commitMessagePrefix": "[deps] Platform:", + "reviewers": ["team:team-platform-dev"] + }, + { + "matchPackageNames": [ + "@angular-devkit/build-angular", + "@angular/animations", + "@angular/cdk", + "@angular/cli", + "@angular/common", + "@angular/compiler", + "@angular/compiler-cli", + "@angular/core", + "@angular/forms", + "@angular/platform", + "@angular/compiler", + "@angular/router", + "@compodoc/compodoc", + "@ng-select/ng-select", + "@storybook/addon-a11y", + "@storybook/addon-actions", + "@storybook/addon-designs", + "@storybook/addon-essentials", + "@storybook/addon-links", + "@storybook/angular", + "@types/react", + "autoprefixer", + "bootstrap", + "chromatic", + "jquery", + "ngx-toastr", + "popper.js", + "react", + "react-dom", + "remark-gfm", + "storybook", + "tailwindcss", + "zone.js" + ], + "description": "Component library owned dependencies", + "commitMessagePrefix": "[deps] Design System:", + "reviewers": ["team:team-design-system"] + }, + { + "matchPackageNames": [ + "@angular-eslint/eslint-plugin", + "@angular-eslint/eslint-plugin-template", + "@angular-eslint/template-parser", + "@types/jest", + "@typescript-eslint/eslint-plugin", + "@typescript-eslint/parser", + "eslint", + "eslint-config-prettier", + "eslint-import-resolver-typescript", + "eslint-plugin-import", + "eslint-plugin-rxjs", + "eslint-plugin-rxjs-angular", + "eslint-plugin-storybook", + "eslint-plugin-tailwindcss", + "husky", + "jest-junit", + "jest-mock-extended", + "jest-preset-angular", + "lint-staged", + "ts-jest" + ], + "description": "Secrets Manager owned dependencies", + "commitMessagePrefix": "[deps] SM:", + "reviewers": ["team:team-secrets-manager-dev"] + }, + { + "matchPackageNames": [ + "@microsoft/signalr-protocol-msgpack", + "@microsoft/signalr", + "@types/jsdom", + "@types/papaparse", + "@types/zxcvbn", + "jsdom", + "jszip", + "oidc-client-ts", + "papaparse", + "utf-8-validate", + "zxcvbn" + ], + "description": "Tools owned dependencies", + "commitMessagePrefix": "[deps] Tools:", + "reviewers": ["team:team-tools-dev"] + }, + { + "matchPackageNames": [ + "@koa/multer", + "@koa/router", + "@types/inquirer", + "@types/koa", + "@types/koa__multer", + "@types/koa__router", + "@types/koa-bodyparser", + "@types/koa-json", + "@types/lunr", + "@types/node-fetch", + "@types/proper-lockfile", + "@types/retry", + "chalk", + "commander", + "form-data", + "https-proxy-agent", + "inquirer", + "koa", + "koa-bodyparser", + "koa-json", + "lunr", + "multer", + "node-fetch", + "open", + "proper-lockfile", + "qrcode-parser" + ], + "description": "Vault owned dependencies", + "commitMessagePrefix": "[deps] Vault:", + "reviewers": ["team:team-vault-dev"] + }, + { + "matchPackageNames": ["@types/argon2-browser", "argon2", "argon2-browser", "big-integer"], + "description": "Key Management owned dependencies", + "commitMessagePrefix": "[deps] KM:", + "reviewers": ["team:team-key-management-dev"] } ], - "ignoreDeps": [ - "@types/koa-bodyparser", - "bootstrap", - "electron-builder", - "electron", - "node-ipc", - "regedit", - "zone.js" - ] + "ignoreDeps": ["@types/koa-bodyparser", "bootstrap", "node-ipc", "node", "npm"] } diff --git a/.github/secrets/appstore-app-cert.p12.gpg b/.github/secrets/appstore-app-cert.p12.gpg deleted file mode 100644 index 284add80d50..00000000000 Binary files a/.github/secrets/appstore-app-cert.p12.gpg and /dev/null differ diff --git a/.github/secrets/appstore-installer-cert.p12.gpg b/.github/secrets/appstore-installer-cert.p12.gpg deleted file mode 100644 index cd1f58eca16..00000000000 Binary files a/.github/secrets/appstore-installer-cert.p12.gpg and /dev/null differ diff --git a/.github/secrets/bitwarden-desktop-key.p12.gpg b/.github/secrets/bitwarden-desktop-key.p12.gpg deleted file mode 100644 index 76ee0cbb5e4..00000000000 Binary files a/.github/secrets/bitwarden-desktop-key.p12.gpg and /dev/null differ diff --git a/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg b/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg deleted file mode 100644 index d55f4055170..00000000000 Binary files a/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg and /dev/null differ diff --git a/.github/secrets/devid-app-cert.p12.gpg b/.github/secrets/devid-app-cert.p12.gpg deleted file mode 100644 index 8e2e2146e23..00000000000 Binary files a/.github/secrets/devid-app-cert.p12.gpg and /dev/null differ diff --git a/.github/secrets/devid-installer-cert.p12.gpg b/.github/secrets/devid-installer-cert.p12.gpg deleted file mode 100644 index f379fc214fe..00000000000 Binary files a/.github/secrets/devid-installer-cert.p12.gpg and /dev/null differ diff --git a/.github/secrets/macdev-cert.p12.gpg b/.github/secrets/macdev-cert.p12.gpg deleted file mode 100644 index f89cfb82a11..00000000000 Binary files a/.github/secrets/macdev-cert.p12.gpg and /dev/null differ diff --git a/.github/whitelist-capital-letters.txt b/.github/whitelist-capital-letters.txt index f5a60f817ce..a320149281b 100644 --- a/.github/whitelist-capital-letters.txt +++ b/.github/whitelist-capital-letters.txt @@ -5,26 +5,16 @@ ./apps/browser/store/windows/Assets ./bitwarden_license/README.md ./libs/angular/src/directives/cipherListVirtualScroll.directive.ts -./libs/angular/src/scss/webfonts/Open_Sans-italic-700.woff -./libs/angular/src/scss/webfonts/Open_Sans-normal-300.woff -./libs/angular/src/scss/webfonts/Open_Sans-normal-700.woff -./libs/angular/src/scss/webfonts/Open_Sans-italic-300.woff -./libs/angular/src/scss/webfonts/Open_Sans-italic-600.woff -./libs/angular/src/scss/webfonts/Open_Sans-italic-800.woff -./libs/angular/src/scss/webfonts/Open_Sans-italic-400.woff -./libs/angular/src/scss/webfonts/Open_Sans-normal-600.woff -./libs/angular/src/scss/webfonts/Open_Sans-normal-800.woff -./libs/angular/src/scss/webfonts/Open_Sans-normal-400.woff -./libs/angular/src/validators/inputsFieldMatch.validator.ts -./libs/angular/src/validators/notAllowedValueAsync.validator.ts -./libs/angular/src/services/theming/themeBuilder.ts -./libs/common/src/misc/nodeUtils.ts -./libs/common/src/misc/linkedFieldOption.decorator.ts -./libs/common/src/misc/serviceUtils.ts -./libs/common/src/misc/serviceUtils.spec.ts -./libs/common/src/abstractions/anonymousHub.service.ts -./libs/common/src/services/anonymousHub.service.ts +./libs/admin-console/README.md ./libs/auth/README.md +./libs/billing/README.md +./libs/common/src/tools/integration/README.md +./libs/platform/README.md +./libs/key-management/README.md +./libs/tools/README.md +./libs/tools/export/vault-export/README.md +./libs/tools/send/README.md +./libs/tools/card/README.md ./libs/vault/README.md ./README.md ./LICENSE_BITWARDEN.txt @@ -41,22 +31,11 @@ ./apps/desktop/resources/appx/Wide310x150Logo.png ./apps/desktop/resources/appx/Square44x44Logo.png ./apps/desktop/README.md -./apps/desktop/desktop_native/Cargo.toml -./apps/desktop/desktop_native/Cargo.lock ./apps/cli/stores/chocolatey/tools/VERIFICATION.txt ./apps/cli/README.md ./apps/browser/README.md ./apps/browser/store/windows/AppxManifest.xml ./apps/browser/src/background/nativeMessaging.background.ts -./apps/browser/src/background/models/addLoginRuntimeMessage.ts -./apps/browser/src/background/models/addChangePasswordQueueMessage.ts -./apps/browser/src/background/models/addLoginQueueMessage.ts -./apps/browser/src/background/models/changePasswordRuntimeMessage.ts -./apps/browser/src/background/models/notificationQueueMessage.ts -./apps/browser/src/background/models/notificationQueueMessageType.ts -./apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts -./apps/browser/src/background/webRequest.background.ts -./apps/browser/src/popup/services/debounceNavigationService.ts ./apps/browser/src/models/browserComponentState.ts ./apps/browser/src/models/browserSendComponentState.ts ./apps/browser/src/models/browserGroupingsComponentState.ts diff --git a/.github/workflows/auto-branch-updater.yml b/.github/workflows/auto-branch-updater.yml index fee2ad958f2..dc4a43fc34e 100644 --- a/.github/workflows/auto-branch-updater.yml +++ b/.github/workflows/auto-branch-updater.yml @@ -1,10 +1,9 @@ ---- name: Auto Update Branch on: push: branches: - - 'master' + - 'main' - 'rc' paths: - 'apps/web/**' @@ -29,7 +28,7 @@ jobs: run: echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: 'eu-web-${{ steps.setup.outputs.branch }}' fetch-depth: 0 diff --git a/.github/workflows/automatic-issue-responses.yml b/.github/workflows/automatic-issue-responses.yml index 90d561c9221..e38f8103cb5 100644 --- a/.github/workflows/automatic-issue-responses.yml +++ b/.github/workflows/automatic-issue-responses.yml @@ -1,4 +1,3 @@ ---- name: Automatic issue responses on: issues: @@ -7,7 +6,7 @@ on: jobs: close-issue: name: 'Close issue with automatic response' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 permissions: issues: write steps: diff --git a/.github/workflows/automatic-pull-request-responses.yml b/.github/workflows/automatic-pull-request-responses.yml index 261cd5c2555..6bd069d21ac 100644 --- a/.github/workflows/automatic-pull-request-responses.yml +++ b/.github/workflows/automatic-pull-request-responses.yml @@ -1,4 +1,3 @@ ---- name: Automatic pull request responses on: pull_request: @@ -7,7 +6,7 @@ on: jobs: close-issue: name: 'Close pull request with automatic response' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 permissions: pull-requests: write steps: diff --git a/.github/workflows/brew-bump-cli.yml b/.github/workflows/brew-bump-cli.yml deleted file mode 100644 index d2e998eacb0..00000000000 --- a/.github/workflows/brew-bump-cli.yml +++ /dev/null @@ -1,41 +0,0 @@ ---- -name: Bump CLI Formula - -on: - push: - tags: - - cli-v** - workflow_dispatch: - -defaults: - run: - shell: bash - -jobs: - update-desktop-cask: - name: Update Bitwarden CLI Formula - runs-on: macos-11 - steps: - - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: "bitwarden-ci" - secrets: "brew-bump-workflow-pat" - - - name: Update Homebrew formula - uses: dawidd6/action-homebrew-bump-formula@d3667e5ae14df19579e4414897498e3e88f2f458 # v3.10.0 - with: - # Required, custom GitHub access token with the 'public_repo' and 'workflow' scopes - token: ${{ steps.retrieve-secrets.outputs.brew-bump-workflow-pat }} - org: bitwarden - tap: Homebrew/homebrew-core - formula: bitwarden-cli - tag: ${{ github.ref }} - revision: ${{ github.sha }} - force: true diff --git a/.github/workflows/brew-bump-desktop.yml b/.github/workflows/brew-bump-desktop.yml index 1856cc5fb82..1b3c99128bf 100644 --- a/.github/workflows/brew-bump-desktop.yml +++ b/.github/workflows/brew-bump-desktop.yml @@ -1,4 +1,3 @@ ---- name: Bump Desktop Cask on: @@ -14,16 +13,16 @@ defaults: jobs: update-desktop-cask: name: Update Bitwarden Desktop Cask - runs-on: macos-11 + runs-on: macos-13 steps: - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "brew-bump-workflow-pat" diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 57c2fdcef07..7740e418e7b 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -1,8 +1,8 @@ ---- name: Build Browser on: - pull_request: + pull_request_target: + types: [opened, synchronize] branches-ignore: - 'l10n_master' - 'cf-pages' @@ -10,55 +10,53 @@ on: - 'apps/browser/**' - 'libs/**' - '*' - - '!libs/importer' - '!*.md' - '!*.txt' push: branches: - - 'master' + - 'main' - 'rc' - 'hotfix-rc-browser' paths: - 'apps/browser/**' - 'libs/**' - '*' - - '!libs/importer' - '!*.md' - '!*.txt' - '.github/workflows/build-browser.yml' workflow_call: inputs: {} workflow_dispatch: - inputs: {} + inputs: + sdk_branch: + description: "Custom SDK branch" + required: false + type: string defaults: run: shell: bash jobs: - cloc: - name: CLOC - runs-on: ubuntu-22.04 - steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Set up cloc - run: | - sudo apt update - sudo apt -y install cloc - - - name: Print lines of code - run: cloc --include-lang TypeScript,JavaScript,HTML,Sass,CSS --vcs git - + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main setup: name: Setup runs-on: ubuntu-22.04 + needs: + - check-run outputs: repo_url: ${{ steps.gen_vars.outputs.repo_url }} adj_build_number: ${{ steps.gen_vars.outputs.adj_build_number }} + node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Get Package Version id: gen_vars run: | @@ -68,6 +66,14 @@ jobs: echo "repo_url=$repo_url" >> $GITHUB_OUTPUT echo "adj_build_number=$adj_build_num" >> $GITHUB_OUTPUT + - name: Get Node Version + id: retrieve-node-version + working-directory: ./ + run: | + NODE_NVMRC=$(cat .nvmrc) + NODE_VERSION=${NODE_NVMRC/v/''} + echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + locales-test: name: Locales Test @@ -78,8 +84,10 @@ jobs: run: working-directory: apps/browser steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Testing locales - extName length run: | @@ -114,27 +122,24 @@ jobs: - locales-test env: _BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + node-version: ${{ env._NODE_VERSION }} - name: Print environment run: | node --version npm --version - node-gyp --version - name: Build sources for reviewers run: | @@ -163,168 +168,231 @@ jobs: zip -r browser-source.zip browser-source - - name: NPM setup - run: npm ci - working-directory: browser-source/ - - - name: Build - run: npm run dist - working-directory: browser-source/apps/browser - - # - name: Build Manifest v3 - # run: npm run dist:mv3 - # working-directory: browser-source/apps/browser - - - name: Gulp - run: gulp ci - working-directory: browser-source/apps/browser - - - name: Upload Opera artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: dist-opera-${{ env._BUILD_NUMBER }}.zip - path: browser-source/apps/browser/dist/dist-opera.zip - if-no-files-found: error - - # - name: Upload Opera MV3 artifact - # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - # with: - # name: dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip - # path: browser-source/apps/browser/dist/dist-opera-mv3.zip - # if-no-files-found: error - - - name: Upload Chrome artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: dist-chrome-${{ env._BUILD_NUMBER }}.zip - path: browser-source/apps/browser/dist/dist-chrome.zip - if-no-files-found: error - - # - name: Upload Chrome MV3 artifact - # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - # with: - # name: dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip - # path: browser-source/apps/browser/dist/dist-chrome-mv3.zip - # if-no-files-found: error - - - name: Upload Firefox artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: dist-firefox-${{ env._BUILD_NUMBER }}.zip - path: browser-source/apps/browser/dist/dist-firefox.zip - if-no-files-found: error - - - name: Upload Edge artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: dist-edge-${{ env._BUILD_NUMBER }}.zip - path: browser-source/apps/browser/dist/dist-edge.zip - if-no-files-found: error - - # - name: Upload Edge MV3 artifact - # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - # with: - # name: dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip - # path: browser-source/apps/browser/dist/dist-edge-mv3.zip - # if-no-files-found: error - - name: Upload browser source - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: browser-source-${{ env._BUILD_NUMBER }}.zip path: browser-source.zip if-no-files-found: error - - name: Upload coverage artifact - if: false - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + - name: NPM setup + run: npm ci + working-directory: browser-source/ + + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main with: - name: coverage-${{ env._BUILD_NUMBER }}.zip - path: browser-source/apps/browser/coverage/coverage-${{ env._BUILD_NUMBER }}.zip + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: browser-source/ + run: | + npm link ../sdk-internal + + - name: Build Chrome + run: npm run dist:chrome + working-directory: browser-source/apps/browser + + - name: Upload Chrome MV3 artifact + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-chrome.zip + if-no-files-found: error + + - name: Build Edge + run: npm run dist:edge + working-directory: browser-source/apps/browser + + - name: Upload Edge artifact + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: dist-edge-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-edge.zip + if-no-files-found: error + + - name: Build Edge (MV3) + run: npm run dist:edge:mv3 + working-directory: browser-source/apps/browser + + - name: Upload Edge MV3 artifact (DO NOT USE FOR PROD) + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: DO-NOT-USE-FOR-PROD-dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-edge.zip + if-no-files-found: error + + - name: Build Firefox + run: npm run dist:firefox + working-directory: browser-source/apps/browser + + - name: Upload Firefox artifact + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: dist-firefox-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-firefox.zip + if-no-files-found: error + + - name: Build Firefox (MV3) + run: npm run dist:firefox:mv3 + working-directory: browser-source/apps/browser + + - name: Upload Firefox MV3 artifact (DO NOT USE FOR PROD) + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: DO-NOT-USE-FOR-PROD-dist-firefox-MV3-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-firefox.zip + if-no-files-found: error + + - name: Build Opera + run: npm run dist:opera + working-directory: browser-source/apps/browser + + - name: Upload Opera artifact + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: dist-opera-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-opera.zip + if-no-files-found: error + + - name: Build Opera (MV3) + run: npm run dist:opera:mv3 + working-directory: browser-source/apps/browser + + - name: Upload Opera MV3 artifact (DO NOT USE FOR PROD) + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: DO-NOT-USE-FOR-PROD-dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip + path: browser-source/apps/browser/dist/dist-opera.zip if-no-files-found: error build-safari: name: Build Safari - runs-on: macos-11 + runs-on: macos-13 needs: - setup - locales-test env: _BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ env._NODE_VERSION }} - name: Print environment run: | node --version npm --version - - name: Decrypt secrets + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Download Provisioning Profiles secrets env: - DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + ACCOUNT_NAME: bitwardenci + CONTAINER_NAME: profiles run: | mkdir -p $HOME/secrets - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden-desktop-key.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/macdev-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_appstore.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --output none + + - name: Get certificates + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | + jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | + jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} - DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} - APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} - MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain security set-keychain-settings -lut 1200 build.keychain - security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + + security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + + security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: NPM setup run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + npm link ../sdk-internal + - name: Build Safari extension run: npm run dist:safari working-directory: apps/browser @@ -337,7 +405,7 @@ jobs: ls -la - name: Upload Safari artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: dist-safari-${{ env._BUILD_NUMBER }}.zip path: apps/browser/dist/dist-safari.zip @@ -345,36 +413,38 @@ jobs: crowdin-push: name: Crowdin Push - if: github.ref == 'refs/heads/master' + if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' runs-on: ubuntu-22.04 needs: - build - build-safari steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 + uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} CROWDIN_PROJECT_ID: "268134" with: config: apps/browser/crowdin.yml - crowdin_branch_name: master + crowdin_branch_name: main upload_sources: true upload_translations: false @@ -383,7 +453,6 @@ jobs: if: always() runs-on: ubuntu-22.04 needs: - - cloc - setup - locales-test - build @@ -391,31 +460,14 @@ jobs: - crowdin-push steps: - name: Check if any job failed - if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }} - env: - CLOC_STATUS: ${{ needs.cloc.result }} - SETUP_STATUS: ${{ needs.setup.result }} - LOCALES_TEST_STATUS: ${{ needs.locales-test.result }} - BUILD_STATUS: ${{ needs.build.result }} - SAFARI_BUILD_STATUS: ${{ needs.build-safari.result }} - CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }} - run: | - if [ "$CLOC_STATUS" = "failure" ]; then - exit 1 - elif [ "$SETUP_STATUS" = "failure" ]; then - exit 1 - elif [ "$LOCALES_TEST_STATUS" = "failure" ]; then - exit 1 - elif [ "$BUILD_STATUS" = "failure" ]; then - exit 1 - elif [ "$SAFARI_BUILD_STATUS" = "failure" ]; then - exit 1 - elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then - exit 1 - fi + if: | + github.event_name != 'pull_request_target' + && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-browser') + && contains(needs.*.result, 'failure') + run: exit 1 - name: Login to Azure - Prod Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 if: failure() with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} @@ -423,13 +475,13 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 + uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() env: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 9fa71cb24fe..d480879fb15 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -1,8 +1,8 @@ ---- name: Build CLI on: - pull_request: + pull_request_target: + types: [opened, synchronize] branches-ignore: - 'l10n_master' - 'cf-pages' @@ -13,9 +13,10 @@ on: - '!*.md' - '!*.txt' - '.github/workflows/build-cli.yml' + - 'bitwarden_license/bit-cli/**' push: branches: - - 'master' + - 'main' - 'rc' - 'hotfix-rc-cli' paths: @@ -25,61 +26,78 @@ on: - '!*.md' - '!*.txt' - '.github/workflows/build-cli.yml' + - 'bitwarden_license/bit-cli/**' workflow_dispatch: - inputs: {} + inputs: + sdk_branch: + description: "Custom SDK branch" + required: false + type: string defaults: run: working-directory: apps/cli jobs: - cloc: - name: CLOC - runs-on: ubuntu-22.04 - steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Set up cloc - run: | - sudo apt update - sudo apt -y install cloc - - - name: Print lines of code - run: cloc --include-lang TypeScript,JavaScript --vcs git - + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main setup: name: Setup runs-on: ubuntu-22.04 + needs: + - check-run outputs: - package_version: ${{ steps.retrieve-version.outputs.package_version }} + package_version: ${{ steps.retrieve-package-version.outputs.package_version }} + node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Get Package Version - id: retrieve-version + id: retrieve-package-version run: | PKG_VERSION=$(jq -r .version package.json) echo "package_version=$PKG_VERSION" >> $GITHUB_OUTPUT + - name: Get Node Version + id: retrieve-node-version + working-directory: ./ + run: | + NODE_NVMRC=$(cat .nvmrc) + NODE_VERSION=${NODE_NVMRC/v/''} + echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT cli: - name: Build CLI ${{ matrix.os }} + name: CLI ${{ matrix.os.base }} - ${{ matrix.license_type.readable }} strategy: matrix: - os: [ubuntu-22.04, macos-11] - runs-on: ${{ matrix.os }} + os: + [ + { base: "linux", distro: "ubuntu-22.04" }, + { base: "mac", distro: "macos-13" } + ] + license_type: + [ + { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, + { build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } + ] + runs-on: ${{ matrix.os.distro }} needs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} - _WIN_PKG_FETCH_VERSION: 18.5.0 - _WIN_PKG_VERSION: 3.4 + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + _WIN_PKG_FETCH_VERSION: 20.11.1 + _WIN_PKG_VERSION: 3.5 steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Setup Unix Vars run: | @@ -88,32 +106,47 @@ jobs: awk '{print tolower($0)}')" >> $GITHUB_ENV - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + node-version: ${{ env._NODE_VERSION }} - name: Install run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + - name: Build & Package Unix - run: npm run dist:${{ env.SHORT_RUNNER_OS }} --quiet + run: npm run dist:${{ matrix.license_type.build_prefix }}:${{ env.SHORT_RUNNER_OS }} --quiet - name: Zip Unix run: | - cd ./dist/${{ env.LOWER_RUNNER_OS }} - zip ../bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip ./bw + cd ./dist/${{ matrix.license_type.build_prefix }}/${{ env.LOWER_RUNNER_OS }} + zip ../../bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip ./bw - name: Version Test run: | - unzip "./dist/bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip" -d "./test" + unzip "./dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip" -d "./test" testVersion=$(./test/bw -v) echo "version: $_PACKAGE_VERSION" echo "testVersion: $testVersion" @@ -125,35 +158,46 @@ jobs: - name: Create checksums Unix run: | cd ./dist - shasum -a 256 bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip \ - | awk '{split($0, a); print a[1]}' > bw-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt + shasum -a 256 bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip \ + | awk '{split($0, a); print a[1]}' > bw${{ + matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt - name: Upload unix zip asset - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: - name: bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip - path: apps/cli/dist/bw-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip + name: bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip + path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - name: Upload unix checksum asset - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: - name: bw-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/bw-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt + name: bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt + path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt if-no-files-found: error cli-windows: - name: Build CLI Windows - runs-on: windows-2019 + name: Windows - ${{ matrix.license_type.readable }} + strategy: + matrix: + license_type: + [ + { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, + { build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } + ] + runs-on: windows-2022 needs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} - _WIN_PKG_FETCH_VERSION: 18.5.0 - _WIN_PKG_VERSION: 3.4 + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + _WIN_PKG_FETCH_VERSION: 20.11.1 + _WIN_PKG_VERSION: 3.5 steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Setup Windows builder run: | @@ -162,22 +206,17 @@ jobs: choco install nasm --no-progress - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + node-version: ${{ env._NODE_VERSION }} - name: Get pkg-fetch shell: pwsh run: | cd $HOME - $fetchedUrl = "https://github.com/vercel/pkg-fetch/releases/download/v$env:_WIN_PKG_VERSION/node-v$env:_WIN_PKG_FETCH_VERSION-win-x64" + $fetchedUrl = "https://github.com/yao-pkg/pkg-fetch/releases/download/v$env:_WIN_PKG_VERSION/node-v$env:_WIN_PKG_FETCH_VERSION-win-x64" New-Item -ItemType directory -Path .\.pkg-cache New-Item -ItemType directory -Path .\.pkg-cache\v$env:_WIN_PKG_VERSION Invoke-RestMethod -Uri $fetchedUrl ` @@ -232,26 +271,47 @@ jobs: run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + - name: Build & Package Windows - run: npm run dist:win --quiet + run: npm run dist:${{ matrix.license_type.build_prefix }}:win --quiet - name: Package Chocolatey shell: pwsh + if: ${{ matrix.license_type.build_prefix == 'bit' }} run: | Copy-Item -Path stores/chocolatey -Destination dist/chocolatey -Recurse - Copy-Item dist/windows/bw.exe -Destination dist/chocolatey/tools + Copy-Item dist/${{ matrix.license_type.build_prefix }}/windows/bw.exe -Destination dist/chocolatey/tools Copy-Item ${{ github.workspace }}/LICENSE.txt -Destination dist/chocolatey/tools choco pack dist/chocolatey/bitwarden-cli.nuspec --version ${{ env._PACKAGE_VERSION }} --out dist/chocolatey - name: Zip Windows shell: cmd - run: 7z a ./dist/bw-windows-%_PACKAGE_VERSION%.zip ./dist/windows/bw.exe + run: 7z a ./dist/bw${{ matrix.license_type.artifact_prefix}}-windows-%_PACKAGE_VERSION%.zip ./dist/${{ matrix.license_type.build_prefix }}/windows/bw.exe - name: Version Test run: | dir ./dist/ - Expand-Archive -Path "./dist/bw-windows-${env:_PACKAGE_VERSION}.zip" -DestinationPath "./test/windows" - $testVersion = Invoke-Expression '& ./test/windows/bw.exe -v' + Expand-Archive -Path "./dist/bw${{ matrix.license_type.artifact_prefix }}-windows-${env:_PACKAGE_VERSION}.zip" -DestinationPath "./test/${{ matrix.license_type.build_prefix }}/windows" + $testVersion = Invoke-Expression '& ./test/${{ matrix.license_type.build_prefix }}/windows/bw.exe -v' echo "version: $env:_PACKAGE_VERSION" echo "testVersion: $testVersion" if($testVersion -ne $env:_PACKAGE_VERSION) { @@ -260,46 +320,56 @@ jobs: - name: Create checksums Windows run: | - checksum -f="./dist/bw-windows-${env:_PACKAGE_VERSION}.zip" ` - -t sha256 | Out-File -Encoding ASCII ./dist/bw-windows-sha256-${env:_PACKAGE_VERSION}.txt + checksum -f="./dist/bw${{ matrix.license_type.artifact_prefix }}-windows-${env:_PACKAGE_VERSION}.zip" ` + -t sha256 | Out-File -Encoding ASCII ./dist/bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${env:_PACKAGE_VERSION}.txt - name: Upload windows zip asset - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: - name: bw-windows-${{ env._PACKAGE_VERSION }}.zip - path: apps/cli/dist/bw-windows-${{ env._PACKAGE_VERSION }}.zip + name: bw${{ matrix.license_type.artifact_prefix }}-windows-${{ env._PACKAGE_VERSION }}.zip + path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-windows-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - name: Upload windows checksum asset - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: - name: bw-windows-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/bw-windows-sha256-${{ env._PACKAGE_VERSION }}.txt + name: bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${{ env._PACKAGE_VERSION }}.txt + path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${{ env._PACKAGE_VERSION }}.txt if-no-files-found: error - name: Upload Chocolatey asset - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + if: matrix.license_type.build_prefix == 'bit' + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden-cli.${{ env._PACKAGE_VERSION }}.nupkg path: apps/cli/dist/chocolatey/bitwarden-cli.${{ env._PACKAGE_VERSION }}.nupkg if-no-files-found: error + - name: Zip NPM Build Artifact + run: Get-ChildItem -Path .\build | Compress-Archive -DestinationPath .\bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip + - name: Upload NPM Build Directory asset - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + if: matrix.license_type.build_prefix == 'bit' + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip - path: apps/cli/build + path: apps/cli/bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip if-no-files-found: error snap: name: Build Snap + # Note, before updating the ubuntu version of the workflow, ensure the snap base image + # is equal or greater than the new version. Otherwise there might be GLIBC version issues. + # The snap base for CLI is defined in `apps/cli/stores/snap/snapcraft.yaml` runs-on: ubuntu-22.04 needs: [setup, cli] env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Print environment run: | @@ -309,7 +379,7 @@ jobs: echo "BW Package Version: $_PACKAGE_VERSION" - name: Get bw linux cli - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: bw-linux-${{ env._PACKAGE_VERSION }}.zip path: apps/cli/dist/snap @@ -322,7 +392,7 @@ jobs: ls -alth - name: Build snap - uses: snapcore/action-build@2ee46bc29d163c9c836f2820cc46b39664bf0de2 # v1.1.3 + uses: snapcore/action-build@3bdaa03e1ba6bf59a65f84a751d943d549a54e79 # v1.3.0 with: path: apps/cli/dist/snap @@ -351,14 +421,14 @@ jobs: run: sudo snap remove bw - name: Upload snap asset - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bw_${{ env._PACKAGE_VERSION }}_amd64.snap path: apps/cli/dist/snap/bw_${{ env._PACKAGE_VERSION }}_amd64.snap if-no-files-found: error - name: Upload snap checksum asset - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt path: apps/cli/dist/snap/bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt @@ -370,7 +440,6 @@ jobs: if: always() runs-on: ubuntu-22.04 needs: - - cloc - setup - cli - cli-windows @@ -378,25 +447,14 @@ jobs: steps: - name: Check if any job failed working-directory: ${{ github.workspace }} - if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }} - env: - CLOC_STATUS: ${{ needs.cloc.result }} - SETUP_STATUS: ${{ needs.setup.result }} - CLI_STATUS: ${{ needs.cli.result }} - SNAP_STATUS: ${{ needs.snap.result }} - run: | - if [ "$CLOC_STATUS" = "failure" ]; then - exit 1 - elif [ "$SETUP_STATUS" = "failure" ]; then - exit 1 - elif [ "$CLI_STATUS" = "failure" ]; then - exit 1 - elif [ "$SNAP_STATUS" = "failure" ]; then - exit 1 - fi + if: | + github.event_name != 'pull_request_target' + && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-cli') + && contains(needs.*.result, 'failure') + run: exit 1 - name: Login to Azure - Prod Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 if: failure() with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} @@ -404,13 +462,13 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 + uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() env: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 6db1e59a3fa..dc15f841c2b 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -1,8 +1,8 @@ ---- name: Build Desktop on: - pull_request: + pull_request_target: + types: [opened, synchronize] branches-ignore: - 'l10n_master' - 'cf-pages' @@ -10,52 +10,47 @@ on: - 'apps/desktop/**' - 'libs/**' - '*' - - '!libs/importer' - '!*.md' - '!*.txt' - '.github/workflows/build-desktop.yml' push: branches: - - 'master' + - 'main' - 'rc' - 'hotfix-rc-desktop' paths: - 'apps/desktop/**' - 'libs/**' - '*' - - '!libs/importer' - '!*.md' - '!*.txt' - '.github/workflows/build-desktop.yml' workflow_dispatch: - inputs: {} + inputs: + sdk_branch: + description: "Custom SDK branch" + required: false + type: string defaults: run: shell: bash jobs: - cloc: - name: CLOC - runs-on: ubuntu-20.04 - steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Set up cloc - run: | - sudo apt-get update - sudo apt-get -y install cloc - - - name: Print lines of code - run: cloc --include-lang TypeScript,JavaScript,HTML,Sass,CSS --vcs git + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main electron-verify: name: Verify Electron Version - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 + needs: + - check-run steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Verify run: | @@ -71,19 +66,24 @@ jobs: setup: name: Setup - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 + needs: + - check-run outputs: package_version: ${{ steps.retrieve-version.outputs.package_version }} release_channel: ${{ steps.release-channel.outputs.channel }} build_number: ${{ steps.increment-version.outputs.build_number }} rc_branch_exists: ${{ steps.branch-check.outputs.rc_branch_exists }} hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }} + node_version: ${{ steps.retrieve-node-version.outputs.node_version }} defaults: run: working-directory: apps/desktop steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Get Package Version id: retrieve-version @@ -130,40 +130,47 @@ jobs: echo "hotfix_branch_exists=0" >> $GITHUB_OUTPUT fi + - name: Get Node Version + id: retrieve-node-version + working-directory: ./ + run: | + NODE_NVMRC=$(cat .nvmrc) + NODE_VERSION=${NODE_NVMRC/v/''} + echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT linux: name: Linux Build + # Note, before updating the ubuntu version of the workflow, ensure the snap base image + # is equal or greater than the new version. Otherwise there might be GLIBC version issues. + # The snap base for desktop is defined in `apps/desktop/electron-builder.json` + # We are currently running on 20.04 until the Ubuntu 24.04 release is available, as moving + # to 22.04 now breaks users who are on 20.04 due to mismatched GLIBC versions. runs-on: ubuntu-20.04 - needs: - - setup + needs: setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' - - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + node-version: ${{ env._NODE_VERSION }} - name: Set up environment run: | sudo apt-get update - sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm musl-dev musl-tools + sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm musl-dev musl-tools flatpak flatpak-builder - name: Set up Snap run: sudo snap install snapcraft --classic @@ -179,12 +186,33 @@ jobs: run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + - name: Cache Native Module - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 id: cache with: path: | - apps/desktop/desktop_native/*.node + apps/desktop/desktop_native/napi/*.node + apps/desktop/desktop_native/dist/* ${{ env.RUNNER_TEMP }}/.cargo/registry ${{ env.RUNNER_TEMP }}/.cargo/git key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }} @@ -198,57 +226,70 @@ jobs: TARGET: musl run: | rustup target add x86_64-unknown-linux-musl - npm run build:cross-platform + node build.js cross-platform - name: Build application run: npm run dist:lin - name: Upload .deb artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb if-no-files-found: error - name: Upload .rpm artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm if-no-files-found: error - name: Upload .freebsd artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd if-no-files-found: error - name: Upload .snap artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap path: apps/desktop/dist/bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap if-no-files-found: error - name: Upload .AppImage artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: ${{ needs.setup.outputs.release_channel }}-linux.yml path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-linux.yml if-no-files-found: error + - name: Build flatpak + working-directory: apps/desktop + run: | + sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + sudo npm run pack:lin:flatpak + + - name: Upload flatpak artifact + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: com.bitwarden.desktop.flatpak + path: apps/desktop/dist/com.bitwarden.desktop.flatpak + if-no-files-found: error + windows: name: Windows Build - runs-on: windows-2019 + runs-on: windows-2022 needs: - setup defaults: @@ -257,27 +298,23 @@ jobs: working-directory: apps/desktop env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' - - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + node-version: ${{ env._NODE_VERSION }} - name: Install AST - uses: bitwarden/gh-actions/install-ast@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + run: dotnet tool install --global AzureSignTool --version 4.0.1 - name: Set up environmentF run: choco install checksum --no-progress @@ -296,13 +333,13 @@ jobs: rustup show - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "code-signing-vault-url, @@ -315,17 +352,39 @@ jobs: run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + - name: Cache Native Module - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 id: cache with: - path: apps/desktop/desktop_native/*.node + path: | + apps/desktop/desktop_native/napi/*.node + apps/desktop/desktop_native/dist/* key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }} - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: npm run build:cross-platform + run: node build.js cross-platform - name: Build & Sign (dev) env: @@ -369,91 +428,91 @@ jobs: -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z - name: Upload portable exe artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe path: apps/desktop/dist/Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe if-no-files-found: error - name: Upload installer exe artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe path: apps/desktop/dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe if-no-files-found: error - name: Upload appx ia32 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx if-no-files-found: error - name: Upload store appx ia32 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx if-no-files-found: error - name: Upload NSIS ia32 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z if-no-files-found: error - name: Upload appx x64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx if-no-files-found: error - name: Upload store appx x64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx if-no-files-found: error - name: Upload NSIS x64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z if-no-files-found: error - name: Upload appx ARM64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx if-no-files-found: error - name: Upload store appx ARM64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx if-no-files-found: error - name: Upload NSIS ARM64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z if-no-files-found: error - name: Upload nupkg artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden.${{ env._PACKAGE_VERSION }}.nupkg path: apps/desktop/dist/chocolatey/bitwarden.${{ env._PACKAGE_VERSION }}.nupkg if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: ${{ needs.setup.outputs.release_channel }}.yml path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release_channel }}.yml @@ -462,32 +521,31 @@ jobs: macos-build: name: MacOS Build - runs-on: macos-11 + runs-on: macos-13 needs: - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ env._NODE_VERSION }} - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + - name: Set up Node-gyp + run: python3 -m pip install setuptools - name: Rust shell: pwsh @@ -503,70 +561,84 @@ jobs: - name: Cache Build id: build-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Cache Safari id: safari-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Decrypt secrets + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Download Provisioning Profiles secrets env: - DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + ACCOUNT_NAME: bitwardenci + CONTAINER_NAME: profiles run: | mkdir -p $HOME/secrets - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden-desktop-key.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/macdev-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_appstore.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --output none + + - name: Get certificates + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | + jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | + jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} - DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} - APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} - MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain security set-keychain-settings -lut 1200 build.keychain - security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + + security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + + security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles @@ -582,22 +654,45 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json + "### MacOS build number: $env:BUILD_NUMBER" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append - name: Install Node dependencies run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + - name: Cache Native Module - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 id: cache with: - path: apps/desktop/desktop_native/*.node + path: | + apps/desktop/desktop_native/napi/*.node + apps/desktop/desktop_native/dist/* key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }} - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: npm run build:cross-platform + run: node build.js cross-platform - name: Build application (dev) run: npm run build @@ -612,34 +707,33 @@ jobs: macos-package-github: name: MacOS Package GitHub Release Assets - runs-on: macos-11 + runs-on: macos-13 needs: - browser-build - macos-build - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ env._NODE_VERSION }} - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + - name: Set up Node-gyp + run: python3 -m pip install setuptools - name: Rust shell: pwsh @@ -655,70 +749,84 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Decrypt secrets + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Download Provisioning Profiles secrets env: - DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + ACCOUNT_NAME: bitwardenci + CONTAINER_NAME: profiles run: | mkdir -p $HOME/secrets - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden-desktop-key.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/macdev-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_appstore.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --output none + + - name: Get certificates + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | + jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | + jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} - DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} - APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} - MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain security set-keychain-settings -lut 1200 build.keychain - security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + + security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + + security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles @@ -734,29 +842,52 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json + Write-Output "### MacOS GitHub build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + - name: Cache Native Module - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 id: cache with: - path: apps/desktop/desktop_native/*.node + path: | + apps/desktop/desktop_native/napi/*.node + apps/desktop/desktop_native/dist/* key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }} - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: npm run build:cross-platform + run: node build.js cross-platform - name: Build if: steps.build-cache.outputs.cache-hit != 'true' run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -771,36 +902,44 @@ jobs: mkdir PlugIns cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/dmg/build/Release/safari.appex PlugIns/safari.appex + - name: Set up private auth key + run: | + mkdir ~/private_keys + cat << EOF > ~/private_keys/AuthKey_6TV9MKN3GP.p8 + ${{ secrets.APP_STORE_CONNECT_AUTH_KEY }} + EOF + - name: Build application (dist) env: - APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP + APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 CSC_FOR_PULL_REQUEST: true run: npm run pack:mac - name: Upload .zip artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip if-no-files-found: error - name: Upload .dmg artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg if-no-files-found: error - name: Upload .dmg blockmap artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: ${{ needs.setup.outputs.release_channel }}-mac.yml path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-mac.yml @@ -809,34 +948,33 @@ jobs: macos-package-mas: name: MacOS Package Prod Release Asset - runs-on: macos-11 + runs-on: macos-13 needs: - browser-build - macos-build - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ env._NODE_VERSION }} - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + - name: Set up Node-gyp + run: python3 -m pip install setuptools - name: Rust shell: pwsh @@ -852,70 +990,91 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Decrypt secrets + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve Slack secret + id: retrieve-slack-secret + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: bitwarden-ci + secrets: "slack-bot-token" + + - name: Download Provisioning Profiles secrets env: - DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + ACCOUNT_NAME: bitwardenci + CONTAINER_NAME: profiles run: | mkdir -p $HOME/secrets - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden-desktop-key.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/macdev-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_appstore.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --output none + + - name: Get certificates + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | + jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | + jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} - DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} - APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} - MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain security set-keychain-settings -lut 1200 build.keychain - security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + + security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + + security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles @@ -931,29 +1090,52 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json + Write-Output "### MacOS App Store build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + - name: Cache Native Module - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 id: cache with: - path: apps/desktop/desktop_native/*.node + path: | + apps/desktop/desktop_native/napi/*.node + apps/desktop/desktop_native/dist/* key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }} - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: npm run build:cross-platform + run: node build.js cross-platform - name: Build if: steps.build-cache.outputs.cache-hit != 'true' run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -968,64 +1150,98 @@ jobs: mkdir PlugIns cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/mas/build/Release/safari.appex PlugIns/safari.appex + - name: Set up private auth key + run: | + mkdir ~/private_keys + cat << EOF > ~/private_keys/AuthKey_6TV9MKN3GP.p8 + ${{ secrets.APP_STORE_CONNECT_AUTH_KEY }} + EOF + - name: Build application for App Store - run: npm run pack:mac:mas env: - APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP + APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 CSC_FOR_PULL_REQUEST: true + run: npm run pack:mac:mas - name: Upload .pkg artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg if-no-files-found: error - name: Deploy to TestFlight - env: - APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + id: testflight-deploy if: | - (github.ref == 'refs/heads/master' - && needs.setup.outputs.rc_branch_exists == 0 - && needs.setup.outputs.hotfix_branch_exists == 0) - || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0) - || github.ref == 'refs/heads/hotfix-rc-desktop' - run: npm run upload:mas + github.event_name != 'pull_request_target' + && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-desktop') + env: + APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP + run: | + xcrun altool \ + --upload-app \ + --type macos \ + --file "$(find ./dist/mas-universal/Bitwarden*.pkg)" \ + --apiKey $APP_STORE_CONNECT_AUTH_KEY \ + --apiIssuer $APP_STORE_CONNECT_TEAM_ISSUER + + - name: Post message to a Slack channel + id: slack-message + if: | + github.event_name != 'pull_request_target' + && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-desktop') + uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + with: + channel-id: C074F5UESQ0 + payload: | + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Desktop client v${{ env._PACKAGE_VERSION }} <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|build ${{ env.BUILD_NUMBER }}> success on *${{ github.ref_name }}*" + } + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ steps.retrieve-slack-secret.outputs.slack-bot-token }} + BUILD_NUMBER: ${{ needs.setup.outputs.build_number }} macos-package-dev: name: MacOS Package Dev Release Asset - if: false # We need to look into how code signing works for dev - runs-on: macos-11 + runs-on: macos-13 needs: - browser-build - macos-build - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ env._NODE_VERSION }} - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + - name: Set up Node-gyp + run: python3 -m pip install setuptools - name: Print environment run: | @@ -1036,70 +1252,84 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Decrypt secrets + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Download Provisioning Profiles secrets env: - DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + ACCOUNT_NAME: bitwardenci + CONTAINER_NAME: profiles run: | mkdir -p $HOME/secrets - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden-desktop-key.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/macdev-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_appstore.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --output none + + - name: Get certificates + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | + jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | + jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} - DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} - APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} - MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain security set-keychain-settings -lut 1200 build.keychain - security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + + security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + + security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles @@ -1115,29 +1345,52 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json + Write-Output "### MacOS Dev build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci working-directory: ./ + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + - name: Cache Native Module - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 id: cache with: - path: apps/desktop/desktop_native/*.node + path: | + apps/desktop/desktop_native/napi/*.node + apps/desktop/desktop_native/dist/* key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }} - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: npm run build:cross-platform + run: node build.js cross-platform - name: Build if: steps.build-cache.outputs.cache-hit != 'true' run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -1152,58 +1405,68 @@ jobs: mkdir PlugIns cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/masdev/build/Release/safari.appex PlugIns/safari.appex + - name: Set up private auth key + run: | + mkdir ~/private_keys + cat << EOF > ~/private_keys/AuthKey_6TV9MKN3GP.p8 + ${{ secrets.APP_STORE_CONNECT_AUTH_KEY }} + EOF + - name: Build dev application for App Store - run: npm run pack:mac:masdev env: - APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 + run: npm run pack:mac:masdev - name: Zip masdev asset - working-directory: ./dist/mas-dev-universal - run: zip -r Bitwarden-${{ env.PACKAGE_VERSION }}-masdev-universal.zip Bitwarden.app + run: | + cd dist/mas-dev-universal + zip -r Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip Bitwarden.app - name: Upload masdev artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip - path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip + path: apps/desktop/dist/mas-dev-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip if-no-files-found: error crowdin-push: name: Crowdin Push - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/main' needs: - linux - windows - macos-package-github - macos-package-mas - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 + uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} CROWDIN_PROJECT_ID: "299360" with: config: apps/desktop/crowdin.yml - crowdin_branch_name: master + crowdin_branch_name: main upload_sources: true upload_translations: false @@ -1211,9 +1474,8 @@ jobs: check-failures: name: Check for failures if: always() - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: - - cloc - electron-verify - browser-build - setup @@ -1225,43 +1487,14 @@ jobs: - crowdin-push steps: - name: Check if any job failed - if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }} - env: - CLOC_STATUS: ${{ needs.cloc.result }} - ELECTRON_VERIFY_STATUS: ${{ needs.electron-verify.result }} - BROWSER_BUILD_STATUS: ${{ needs.browser-build.result }} - SETUP_STATUS: ${{ needs.setup.result }} - LINUX_STATUS: ${{ needs.linux.result }} - WINDOWS_STATUS: ${{ needs.windows.result }} - MACOS_BUILD_STATUS: ${{ needs.macos-build.result }} - MACOS_PKG_GITHUB_STATUS: ${{ needs.macos-package-github.result }} - MACOS_PKG_MAS_STATUS: ${{ needs.macos-package-mas.result }} - CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }} - run: | - if [ "$CLOC_STATUS" = "failure" ]; then - exit 1 - elif [ "$ELECTRON_VERIFY_STATUS" = "failure" ]; then - exit 1 - elif [ "$BROWSER_BUILD_STATUS" = "failure" ]; then - exit 1 - elif [ "$SETUP_STATUS" = "failure" ]; then - exit 1 - elif [ "$LINUX_STATUS" = "failure" ]; then - exit 1 - elif [ "$WINDOWS_STATUS" = "failure" ]; then - exit 1 - elif [ "$MACOS_BUILD_STATUS" = "failure" ]; then - exit 1 - elif [ "$MACOS_PKG_GITHUB_STATUS" = "failure" ]; then - exit 1 - elif [ "$MACOS_PKG_MAS_STATUS" = "failure" ]; then - exit 1 - elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then - exit 1 - fi + if: | + github.event_name != 'pull_request_target' + && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-desktop') + && contains(needs.*.result, 'failure') + run: exit 1 - name: Login to Azure - Prod Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 if: failure() with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} @@ -1269,13 +1502,13 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 + uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() env: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index f5458448465..350835d0ec7 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -1,8 +1,8 @@ ---- name: Build Web on: - pull_request: + pull_request_target: + types: [opened, synchronize] branches-ignore: - 'l10n_master' - 'cf-pages' @@ -15,7 +15,7 @@ on: - '.github/workflows/build-web.yml' push: branches: - - 'master' + - 'main' - 'rc' - 'hotfix-rc-web' paths: @@ -25,52 +25,59 @@ on: - '!*.md' - '!*.txt' - '.github/workflows/build-web.yml' + release: + types: [published] workflow_dispatch: inputs: custom_tag_extension: description: "Custom image tag extension" required: false + sdk_branch: + description: "Custom SDK branch" + required: false + type: string env: _AZ_REGISTRY: bitwardenprod.azurecr.io jobs: - cloc: - name: CLOC - runs-on: ubuntu-22.04 - steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Set up cloc - run: | - sudo apt update - sudo apt -y install cloc - - - name: Print lines of code - working-directory: apps/web - run: cloc --include-lang TypeScript,JavaScript,HTML,Sass,CSS --vcs git - + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main setup: name: Setup runs-on: ubuntu-22.04 + needs: + - check-run outputs: version: ${{ steps.version.outputs.value }} + node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Get GitHub sha as version id: version run: echo "value=${GITHUB_SHA:0:7}" >> $GITHUB_OUTPUT + - name: Get Node Version + id: retrieve-node-version + run: | + NODE_NVMRC=$(cat .nvmrc) + NODE_VERSION=${NODE_NVMRC/v/''} + echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + build-artifacts: name: Build artifacts runs-on: ubuntu-22.04 - needs: setup + needs: + - setup env: _VERSION: ${{ needs.setup.outputs.version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} strategy: matrix: include: @@ -82,23 +89,31 @@ jobs: npm_command: "dist:bit:selfhost" - name: "cloud-QA" npm_command: "build:bit:qa" + git_metadata: true - name: "ee" npm_command: "build:bit:ee" + git_metadata: true - name: "cloud-euprd" npm_command: "build:bit:euprd" - name: "cloud-euqa" npm_command: "build:bit:euqa" + git_metadata: true + - name: "cloud-usdev" + npm_command: "build:bit:usdev" + git_metadata: true steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: "16" + node-version: ${{ env._NODE_VERSION }} - name: Print environment run: | @@ -113,9 +128,29 @@ jobs: - name: Install dependencies run: npm ci - - name: Setup QA metadata + - name: Download SDK Artifacts + if: ${{ inputs.sdk_branch != '' }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: build-wasm-internal.yml + workflow_conclusion: success + branch: ${{ inputs.sdk_branch }} + artifacts: sdk-internal + repo: bitwarden/sdk-internal + path: ../sdk-internal + if_no_artifact_found: fail + + - name: Override SDK + if: ${{ inputs.sdk_branch != '' }} + working-directory: ./ + run: | + ls -l ../ + npm link ../sdk-internal + + - name: Add Git metadata to build version working-directory: apps/web - if: matrix.name == 'cloud-QA' + if: matrix.git_metadata run: | VERSION=$( jq -r ".version" package.json) jq --arg version "$VERSION+${GITHUB_SHA:0:7}" '.version = $version' package.json > package.json.tmp @@ -130,7 +165,7 @@ jobs: run: zip -r web-${{ env._VERSION }}-${{ matrix.name }}.zip build - name: Upload ${{ matrix.name }} artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: web-${{ env._VERSION }}-${{ matrix.name }}.zip path: apps/web/web-${{ env._VERSION }}-${{ matrix.name }}.zip @@ -156,12 +191,14 @@ jobs: env: _VERSION: ${{ needs.setup.outputs.version }} steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Check Branch to Publish env: - PUBLISH_BRANCHES: "master,rc,hotfix-rc-web" + PUBLISH_BRANCHES: "main,rc,hotfix-rc-web" id: publish-branch-check run: | IFS="," read -a publish_branches <<< $PUBLISH_BRANCHES @@ -174,7 +211,7 @@ jobs: ########## ACRs ########## - name: Login to Prod Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} @@ -182,19 +219,19 @@ jobs: run: az acr login -n bitwardenprod - name: Login to Azure - CI Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve github PAT secrets id: retrieve-secret-pat - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "github-pat-bitwarden-devops-bot-repo-scope" - name: Download ${{ matrix.artifact_name }} artifact - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip path: apps/web @@ -203,13 +240,13 @@ jobs: - name: Generate Docker image tag id: tag run: | - if [[ $(grep "pull" <<< "${GITHUB_REF}") ]]; then + if [[ "${GITHUB_EVENT_NAME}" == "pull_request_target" ]]; then IMAGE_TAG=$(echo "${GITHUB_HEAD_REF}" | sed "s#/#-#g") else - IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g") + IMAGE_TAG=$(echo "${GITHUB_REF_NAME}" | sed "s#/#-#g") fi - if [[ "$IMAGE_TAG" == "master" ]]; then + if [[ "$IMAGE_TAG" == "main" ]]; then IMAGE_TAG=dev fi @@ -234,7 +271,7 @@ jobs: run: echo "name=$_AZ_REGISTRY/${PROJECT_NAME}:${IMAGE_TAG}" >> $GITHUB_OUTPUT - name: Build Docker image - uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 + uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 with: context: apps/web file: apps/web/Dockerfile @@ -250,74 +287,95 @@ jobs: crowdin-push: name: Crowdin Push - if: github.ref == 'refs/heads/master' - needs: build-artifacts + if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' + needs: + - build-artifacts runs-on: ubuntu-22.04 steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 + uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} CROWDIN_PROJECT_ID: "308189" with: config: apps/web/crowdin.yml - crowdin_branch_name: master + crowdin_branch_name: main upload_sources: true upload_translations: false + trigger-web-vault-deploy: + name: Trigger web vault deploy + if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' + runs-on: ubuntu-22.04 + needs: + - build-artifacts + steps: + - name: Login to Azure - CI Subscription + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve github PAT secrets + id: retrieve-secret-pat + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "github-pat-bitwarden-devops-bot-repo-scope" + + - name: Trigger web vault deploy using GitHub Run ID + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + github-token: ${{ steps.retrieve-secret-pat.outputs.github-pat-bitwarden-devops-bot-repo-scope }} + script: | + await github.rest.actions.createWorkflowDispatch({ + owner: 'bitwarden', + repo: 'clients', + workflow_id: 'deploy-web.yml', + ref: 'main', + inputs: { + 'environment': 'USDEV', + 'build-web-run-id': '${{ github.run_id }}' + } + }) check-failures: name: Check for failures if: always() runs-on: ubuntu-22.04 needs: - - cloc - setup - build-artifacts - build-containers - crowdin-push + - trigger-web-vault-deploy steps: - name: Check if any job failed - if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }} - env: - CLOC_STATUS: ${{ needs.cloc.result }} - SETUP_STATUS: ${{ needs.setup.result }} - ARTIFACT_STATUS: ${{ needs.build-artifacts.result }} - BUILD_CONTAINERS_STATUS: ${{ needs.build-containers.result }} - CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }} - run: | - if [ "$CLOC_STATUS" = "failure" ]; then - exit 1 - elif [ "$SETUP_STATUS" = "failure" ]; then - exit 1 - elif [ "$ARTIFACT_STATUS" = "failure" ]; then - exit 1 - elif [ "$BUILD_SELFHOST_STATUS" = "failure" ]; then - exit 1 - elif [ "$BUILD_CONTAINERS_STATUS" = "failure" ]; then - exit 1 - elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then - exit 1 - fi + if: | + github.event_name != 'pull_request_target' + && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-web') + && contains(needs.*.result, 'failure') + run: exit 1 - name: Login to Azure - Prod Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 if: failure() with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} @@ -325,13 +383,13 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 + uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() env: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 7f6d5cc11c4..0efd9d22f17 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -1,43 +1,62 @@ ---- name: Chromatic on: push: - paths-ignore: - - '.github/workflows/**' + branches: + - "main" + - "rc" + - "hotfix-rc" + pull_request_target: + types: [opened, synchronize] jobs: + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + chromatic: name: Chromatic - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 + needs: check-run + permissions: + contents: read + pull-requests: write steps: - - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 - with: - node-version: "16" - - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: + ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 - - name: Cache npm + - name: Get Node version + id: retrieve-node-version + run: | + NODE_NVMRC=$(cat .nvmrc) + NODE_VERSION=${NODE_NVMRC/v/''} + echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + + - name: Set up Node + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + with: + node-version: ${{ steps.retrieve-node-version.outputs.node_version }} + + - name: Cache NPM id: npm-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: "~/.npm" key: ${{ runner.os }}-npm-chromatic-${{ hashFiles('**/package-lock.json') }} - name: Install Node dependencies run: npm ci - - # Manual build the storybook to resolve a chromatic/storybook bug related to TurboSnap + + # Manually build the Storybook to resolve a bug related to TurboSnap - name: Build Storybook run: npm run build-storybook:ci - name: Publish to Chromatic - uses: chromaui/action@a45a922b9a7522a4cbb59a7bb7b288a768968924 + uses: chromaui/action@dd2eecb9bef44f54774581f4163b0327fd8cf607 # v11.16.3 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 d14938cc468..f99cecf91d6 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -1,4 +1,3 @@ ---- name: Crowdin Sync on: @@ -10,7 +9,7 @@ on: jobs: crowdin-sync: name: Autosync - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: @@ -23,29 +22,36 @@ jobs: crowdin_project_id: "308189" steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase" + + - name: Generate GH App token + uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 + id: app-token + with: + app-id: ${{ secrets.BW_GHAPP_ID }} + private-key: ${{ secrets.BW_GHAPP_KEY }} - name: Download translations - uses: bitwarden/gh-actions/crowdin@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/crowdin@main env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} CROWDIN_PROJECT_ID: ${{ matrix.crowdin_project_id }} with: config: crowdin.yml - crowdin_branch_name: master + crowdin_branch_name: main upload_sources: false upload_translations: false download_translations: true @@ -59,4 +65,3 @@ jobs: working_directory: apps/${{ matrix.app_name }} gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} gpg_passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} - diff --git a/.github/workflows/deploy-eu-prod-web.yml b/.github/workflows/deploy-eu-prod-web.yml deleted file mode 100644 index 523e0f44de7..00000000000 --- a/.github/workflows/deploy-eu-prod-web.yml +++ /dev/null @@ -1,60 +0,0 @@ ---- -name: Deploy Web to EU-PRD Cloud - -on: - workflow_dispatch: - inputs: - tag: - description: "Branch name to deploy (examples: 'master', 'feature/sm')" - required: true - type: string - default: master - -jobs: - azure-deploy: - name: Deploy to Azure - runs-on: ubuntu-22.04 - env: - _WEB_ARTIFACT: "web-*-cloud-euprd.zip" - steps: - - name: Login to Azure - EU Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_EU_PRD_SERVICE_PRINCIPAL }} - - - name: Retrieve Storage Account connection string - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: webvault-westeurope-prod - secrets: "sa-bitwarden-web-vault-dev-key-temp" - - - name: Download latest cloud asset - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-web.yml - path: apps/web - workflow_conclusion: success - branch: ${{ github.event.inputs.tag }} - artifacts: ${{ env._WEB_ARTIFACT }} - - - name: Unzip build asset - working-directory: apps/web - run: unzip ${{ env._WEB_ARTIFACT }} - - - name: Empty container in Storage Account - run: | - az storage blob delete-batch \ - --source '$web' \ - --pattern '*' \ - --connection-string "${{ steps.retrieve-secrets.outputs.sa-bitwarden-web-vault-dev-key-temp }}" - - - name: Deploy to Azure Storage Account - working-directory: apps/web - run: | - az storage blob upload-batch \ - --source "./build" \ - --destination '$web' \ - --connection-string "${{ steps.retrieve-secrets.outputs.sa-bitwarden-web-vault-dev-key-temp }}" \ - --overwrite \ - --no-progress diff --git a/.github/workflows/deploy-eu-qa-web.yml b/.github/workflows/deploy-eu-qa-web.yml deleted file mode 100644 index 2a1e271f18b..00000000000 --- a/.github/workflows/deploy-eu-qa-web.yml +++ /dev/null @@ -1,60 +0,0 @@ ---- -name: Deploy Web to EU-QA Cloud - -on: - workflow_dispatch: - inputs: - tag: - description: "Branch name to deploy (examples: 'master', 'feature/sm')" - required: true - type: string - default: master - -jobs: - azure-deploy: - name: Deploy to Azure - runs-on: ubuntu-22.04 - env: - _WEB_ARTIFACT: "web-*-cloud-euqa.zip" - steps: - - name: Login to Azure - EU Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_EU_QA_SERVICE_PRINCIPAL }} - - - name: Retrieve Storage Account connection string - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: webvaulteu-westeurope-qa - secrets: "sa-bitwarden-web-vault-dev-key-temp" - - - name: Download latest cloud asset - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-web.yml - path: apps/web - workflow_conclusion: success - branch: ${{ github.event.inputs.tag }} - artifacts: ${{ env._WEB_ARTIFACT }} - - - name: Unzip build asset - working-directory: apps/web - run: unzip ${{ env._WEB_ARTIFACT }} - - - name: Empty container in Storage Account - run: | - az storage blob delete-batch \ - --source '$web' \ - --pattern '*' \ - --connection-string "${{ steps.retrieve-secrets.outputs.sa-bitwarden-web-vault-dev-key-temp }}" - - - name: Deploy to Azure Storage Account - working-directory: apps/web - run: | - az storage blob upload-batch \ - --source "./build" \ - --destination '$web' \ - --connection-string "${{ steps.retrieve-secrets.outputs.sa-bitwarden-web-vault-dev-key-temp }}" \ - --overwrite \ - --no-progress diff --git a/.github/workflows/deploy-non-prod-web.yml b/.github/workflows/deploy-non-prod-web.yml deleted file mode 100644 index 78e0f12b7e9..00000000000 --- a/.github/workflows/deploy-non-prod-web.yml +++ /dev/null @@ -1,128 +0,0 @@ ---- -name: Deploy Web - Non-Prod -run-name: Deploy Web ${{ inputs.environment }} - -on: - workflow_dispatch: - inputs: - environment: - description: 'Environment' - default: 'QA' - type: choice - options: - - QA - - workflow_call: - inputs: - environment: - description: 'Environment' - default: 'QA' - type: string - -jobs: - setup: - name: Setup - runs-on: ubuntu-20.04 - outputs: - environment: ${{ steps.config.outputs.environment }} - environment-url: ${{ steps.config.outputs.environment-url }} - environment-name: ${{ steps.config.outputs.environment-name }} - environment-branch: ${{ steps.config.outputs.environment-branch }} - environment-artifact: ${{ steps.config.outputs.environment-artifact }} - steps: - - name: Configure - id: config - run: | - ENV_NAME_LOWER=$(echo "${{ inputs.environment }}" | awk '{print tolower($0)}') - echo "configuring the Web deploy for ${{ inputs.environment }}" - echo "environment=${{ inputs.environment }}" >> $GITHUB_OUTPUT - echo "environment-url=http://vault.$ENV_NAME_LOWER.bitwarden.pw" >> $GITHUB_OUTPUT - echo "environment-name=Web Vault - ${{ inputs.environment }}" >> $GITHUB_OUTPUT - echo "environment-branch=cf-pages-$ENV_NAME_LOWER" >> $GITHUB_OUTPUT - echo "environment-artifact=web-*-cloud-${{ inputs.environment }}.zip" >> $GITHUB_OUTPUT - - - cfpages-deploy: - name: Deploy Web Vault to ${{ inputs.environment }} CloudFlare Pages branch - needs: setup - runs-on: ubuntu-20.04 - env: - _ENVIRONMENT: ${{ needs.setup.outputs.environment }} - _ENVIRONMENT_URL: ${{ needs.setup.outputs.environment-url }} - _ENVIRONMENT_NAME: ${{ needs.setup.outputs.environment-name }} - _ENVIRONMENT_BRANCH: ${{ needs.setup.outputs.environment-branch }} - _ENVIRONMENT_ARTIFACT: ${{ needs.setup.outputs.environment-artifact }} - steps: - - name: Create GitHub deployment - uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 - id: deployment - with: - token: '${{ secrets.GITHUB_TOKEN }}' - initial-status: 'in_progress' - environment-url: ${{ env._ENVIRONMENT_URL }} - environment: ${{ env._ENVIRONMENT_NAME }} - description: 'Deployment from branch ${{ github.ref_name }}' - - - name: Checkout Repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Download latest cloud asset - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-web.yml - path: apps/web - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: ${{ env._ENVIRONMENT_ARTIFACT }} - - - name: Unzip cloud asset - working-directory: apps/web - run: unzip ${{ env._ENVIRONMENT_ARTIFACT }} - - - name: Checkout Repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - ref: ${{ env._ENVIRONMENT_BRANCH }} - path: deployment - - - name: Setup git config - run: | - git config --global user.name "GitHub Action Bot" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --global url."https://github.com/".insteadOf ssh://git@github.com/ - git config --global url."https://".insteadOf ssh:// - - - name: Deploy CloudFlare Pages - run: | - rm -rf ./* - cp -R ../apps/web/build/* . - working-directory: deployment - - - name: Push new ver to ${{ env._ENVIRONMENT_BRANCH }} - run: | - if [ -n "$(git status --porcelain)" ]; then - git add . - git commit -m "Deploy ${{ github.ref_name }} to ${{ env._ENVIRONMENT }} Cloudflare pages" - git push -u origin ${{ env._ENVIRONMENT_BRANCH }} - else - echo "No changes to commit!"; - fi - working-directory: deployment - - - name: Update deployment status to Success - if: ${{ success() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - environment-url: ${{ env._ENVIRONMENT_URL }} - state: 'success' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - - name: Update deployment status to Failure - if: ${{ failure() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - environment-url: ${{ env._ENVIRONMENT_URL }} - state: 'failure' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml new file mode 100644 index 00000000000..b5e84ff875b --- /dev/null +++ b/.github/workflows/deploy-web.yml @@ -0,0 +1,434 @@ +name: Deploy Web Vault +run-name: Deploy Web Vault to ${{ inputs.environment }} from ${{ inputs.branch-or-tag }} + +on: + workflow_dispatch: + inputs: + environment: + description: 'Environment' + default: 'USQA' + type: choice + options: + - USQA + - EUQA + - USPROD + - EUPROD + - USDEV + branch-or-tag: + description: "Branch or Tag name to deploy (examples: 'main', 'feature/sm', 'web-v2023.12.0')" + type: string + default: main + force-delete-destination: + description: "Delete remote files that are not found locally" + type: boolean + default: false + debug: + description: "Debug mode" + type: boolean + default: true + build-web-run-id: + description: "Build-web workflow Run ID to use for artifact download" + type: string + required: false + + workflow_call: + inputs: + environment: + description: 'Environment' + default: 'USQA' + type: string + branch-or-tag: + description: "Branch or Tag name to deploy (examples: 'main', 'feature/sm', 'web-v2023.12.0')" + type: string + default: main + force-delete-destination: + description: "Delete remote files that are not found locally" + type: boolean + default: false + debug: + description: "Debug mode" + type: boolean + default: true + build-web-run-id: + description: "Build-web workflow Run ID to use for artifact download" + type: string + required: false + +permissions: + deployments: write + +jobs: + setup: + name: Setup + runs-on: ubuntu-22.04 + outputs: + environment: ${{ steps.config.outputs.environment }} + environment-url: ${{ steps.config.outputs.environment-url }} + environment-name: ${{ steps.config.outputs.environment-name }} + environment-artifact: ${{ steps.config.outputs.environment-artifact }} + azure-login-creds: ${{ steps.config.outputs.azure-login-creds }} + retrieve-secrets-keyvault: ${{ steps.config.outputs.retrieve-secrets-keyvault }} + sync-utility: ${{ steps.config.outputs.sync-utility }} + sync-delete-destination-files: ${{ steps.config.outputs.sync-delete-destination-files }} + slack-channel-name: ${{ steps.config.outputs.slack-channel-name }} + steps: + - name: Configure + id: config + run: | + ENV_NAME_LOWER=$(echo "${{ inputs.environment }}" | awk '{print tolower($0)}') + echo "configuring the Web deploy for ${{ inputs.environment }}" + echo "environment=${{ inputs.environment }}" >> $GITHUB_OUTPUT + + case ${{ inputs.environment }} in + "USQA") + echo "azure-login-creds=AZURE_KV_US_QA_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT + echo "retrieve-secrets-keyvault=bw-webvault-rlktusqa-kv" >> $GITHUB_OUTPUT + echo "environment-artifact=web-*-cloud-QA.zip" >> $GITHUB_OUTPUT + echo "environment-name=Web Vault - US QA Cloud" >> $GITHUB_OUTPUT + echo "environment-url=http://vault.$ENV_NAME_LOWER.bitwarden.pw" >> $GITHUB_OUTPUT + echo "slack-channel-name=alerts-deploy-qa" >> $GITHUB_OUTPUT + ;; + "EUQA") + echo "azure-login-creds=AZURE_KV_EU_QA_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT + echo "retrieve-secrets-keyvault=webvaulteu-westeurope-qa" >> $GITHUB_OUTPUT + echo "environment-artifact=web-*-cloud-euqa.zip" >> $GITHUB_OUTPUT + echo "environment-name=Web Vault - EU QA Cloud" >> $GITHUB_OUTPUT + echo "environment-url=http://vault.$ENV_NAME_LOWER.bitwarden.pw" >> $GITHUB_OUTPUT + echo "slack-channel-name=alerts-deploy-qa" >> $GITHUB_OUTPUT + ;; + "USPROD") + echo "azure-login-creds=AZURE_KV_US_PROD_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT + echo "retrieve-secrets-keyvault=bw-webvault-klrt-kv" >> $GITHUB_OUTPUT + echo "environment-artifact=web-*-cloud-COMMERCIAL.zip" >> $GITHUB_OUTPUT + echo "environment-name=Web Vault - US Production Cloud" >> $GITHUB_OUTPUT + echo "environment-url=http://vault.bitwarden.com" >> $GITHUB_OUTPUT + echo "slack-channel-name=alerts-deploy-prd" >> $GITHUB_OUTPUT + ;; + "EUPROD") + echo "azure-login-creds=AZURE_KV_EU_PRD_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT + echo "retrieve-secrets-keyvault=webvault-westeurope-prod" >> $GITHUB_OUTPUT + echo "environment-artifact=web-*-cloud-euprd.zip" >> $GITHUB_OUTPUT + echo "environment-name=Web Vault - EU Production Cloud" >> $GITHUB_OUTPUT + echo "environment-url=http://vault.bitwarden.eu" >> $GITHUB_OUTPUT + echo "slack-channel-name=alerts-deploy-prd" >> $GITHUB_OUTPUT + ;; + "USDEV") + echo "azure-login-creds=AZURE_KV_US_DEV_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT + echo "retrieve-secrets-keyvault=webvault-eastus-dev" >> $GITHUB_OUTPUT + echo "environment-artifact=web-*-cloud-usdev.zip" >> $GITHUB_OUTPUT + echo "environment-name=Web Vault - US Development Cloud" >> $GITHUB_OUTPUT + echo "environment-url=http://vault.$ENV_NAME_LOWER.bitwarden.pw" >> $GITHUB_OUTPUT + echo "slack-channel-name=alerts-deploy-dev" >> $GITHUB_OUTPUT + ;; + esac + # Set the sync utility to use for deployment to the environment (az-sync or azcopy) + echo "sync-utility=azcopy" >> $GITHUB_OUTPUT + + - name: Environment Protection + env: + BUILD_WEB_RUN_ID: ${{ inputs.build-web-run-id }} + GH_TOKEN: ${{ github.token }} + run: | + BRANCH_OR_TAG_LOWER="" + if [[ "$BUILD_WEB_RUN_ID" == "" ]]; then + BRANCH_OR_TAG_LOWER=$(echo ${{ inputs.branch-or-tag }} | awk '{print tolower($0)}') + else + BRANCH_OR_TAG_LOWER=$(gh api /repos/bitwarden/clients/actions/runs/$BUILD_WEB_RUN_ID/artifacts --jq '.artifacts[0].workflow_run.head_branch' | awk '{print tolower($0)}') + fi + + echo "Branch/Tag: $BRANCH_OR_TAG_LOWER" + + PROD_ENV_PATTERN='USPROD|EUPROD' + PROD_ALLOWED_TAGS_PATTERN='web-v[0-9]+\.[0-9]+\.[0-9]+' + + QA_ENV_PATTERN='USQA|EUQA' + QA_ALLOWED_TAGS_PATTERN='.*' + + DEV_ENV_PATTERN='USDEV' + DEV_ALLOWED_TAGS_PATTERN='main' + + if [[ \ + ${{ inputs.environment }} =~ \.*($PROD_ENV_PATTERN)\.* && \ + ! "$BRANCH_OR_TAG_LOWER" =~ ^($PROD_ALLOWED_TAGS_PATTERN).* \ + ]] || [[ \ + ${{ inputs.environment }} =~ \.*($QA_ENV_PATTERN)\.* && \ + ! "$BRANCH_OR_TAG_LOWER" =~ ^($QA_ALLOWED_TAGS_PATTERN).* \ + ]] || [[ \ + ${{ inputs.environment }} =~ \.*($DEV_ENV_PATTERN)\.* && \ + $BRANCH_OR_TAG_LOWER != $DEV_ALLOWED_TAGS_PATTERN \ + ]]; then + echo "!Deployment blocked!" + echo "Attempting to deploy a tag that is not allowed in ${{ inputs.environment }} environment" + echo + echo "Environment: ${{ inputs.environment }}" + echo "Tag: $BRANCH_OR_TAG_LOWER" + exit 1 + else + echo "The input Branch/Tag: '$BRANCH_OR_TAG_LOWER' is allowed to deploy on ${{ inputs.environment }} environment" + fi + + approval: + name: Approval for Deployment to ${{ needs.setup.outputs.environment-name }} + needs: setup + runs-on: ubuntu-22.04 + environment: ${{ needs.setup.outputs.environment-name }} + steps: + - name: Success Code + run: exit 0 + + artifact-check: + name: Check if Web artifact is present + runs-on: ubuntu-22.04 + needs: setup + env: + _ENVIRONMENT_ARTIFACT: ${{ needs.setup.outputs.environment-artifact }} + outputs: + artifact-build-commit: ${{ steps.set-artifact-commit.outputs.commit }} + steps: + - name: 'Download latest cloud asset using GitHub Run ID: ${{ inputs.build-web-run-id }}' + if: ${{ inputs.build-web-run-id }} + uses: bitwarden/gh-actions/download-artifacts@main + id: download-latest-artifacts-run-id + continue-on-error: true + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + run_id: ${{ inputs.build-web-run-id }} + artifacts: ${{ env._ENVIRONMENT_ARTIFACT }} + + - name: 'Download latest cloud asset from branch/tag: ${{ inputs.branch-or-tag }}' + if: ${{ !inputs.build-web-run-id }} + uses: bitwarden/gh-actions/download-artifacts@main + id: download-latest-artifacts + continue-on-error: true + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + branch: ${{ inputs.branch-or-tag }} + artifacts: ${{ env._ENVIRONMENT_ARTIFACT }} + + - name: Login to Azure + if: ${{ steps.download-latest-artifacts.outcome == 'failure' }} + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets for Build trigger + if: ${{ steps.download-latest-artifacts.outcome == 'failure' }} + id: retrieve-secret + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "github-pat-bitwarden-devops-bot-repo-scope" + + - name: 'Trigger build web for missing branch/tag ${{ inputs.branch-or-tag }}' + if: ${{ steps.download-latest-artifacts.outcome == 'failure' }} + uses: convictional/trigger-workflow-and-wait@f69fa9eedd3c62a599220f4d5745230e237904be # v1.6.5 + id: trigger-build-web + with: + owner: bitwarden + repo: clients + github_token: ${{ steps.retrieve-secret.outputs.github-pat-bitwarden-devops-bot-repo-scope }} + workflow_file_name: build-web.yml + ref: ${{ inputs.branch-or-tag }} + wait_interval: 100 + + - name: Set artifact build commit + id: set-artifact-commit + env: + GH_TOKEN: ${{ github.token }} + run: | + # If run-id was used, get the commit from the download-latest-artifacts-run-id step + if [ "${{ inputs.build-web-run-id }}" ]; then + echo "commit=${{ steps.download-latest-artifacts-run-id.outputs.artifact-build-commit }}" >> $GITHUB_OUTPUT + + elif [ "${{ steps.download-latest-artifacts.outcome }}" == "failure" ]; then + # If the download-latest-artifacts step failed, query the GH API to get the commit SHA of the artifact that was just built with trigger-build-web. + commit=$(gh api /repos/bitwarden/clients/actions/runs/${{ steps.trigger-build-web.outputs.workflow_id }}/artifacts --jq '.artifacts[0].workflow_run.head_sha') + echo "commit=$commit" >> $GITHUB_OUTPUT + + else + # Set the commit to the output of step download-latest-artifacts. + echo "commit=${{ steps.download-latest-artifacts.outputs.artifact-build-commit }}" >> $GITHUB_OUTPUT + fi + + notify-start: + name: Notify Slack with start message + needs: + - approval + - setup + - artifact-check + runs-on: ubuntu-22.04 + if: ${{ always() && ( contains( inputs.environment , 'QA' ) || contains( inputs.environment , 'DEV' ) ) }} + outputs: + channel_id: ${{ steps.slack-message.outputs.channel_id }} + ts: ${{ steps.slack-message.outputs.ts }} + steps: + - name: Notify Slack with start message + uses: bitwarden/gh-actions/report-deployment-status-to-slack@main + id: slack-message + with: + project: Clients + environment: ${{ needs.setup.outputs.environment-name }} + tag: ${{ inputs.branch-or-tag }} + slack-channel: ${{ needs.setup.outputs.slack-channel-name }} + event: 'start' + commit-sha: ${{ needs.artifact-check.outputs.artifact-build-commit }} + url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }} + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + update-summary: + name: Display commit + needs: artifact-check + runs-on: ubuntu-22.04 + steps: + - name: Display commit SHA + run: | + REPO_URL="https://github.com/bitwarden/clients/commit" + COMMIT_SHA="${{ needs.artifact-check.outputs.artifact-build-commit }}" + echo ":steam_locomotive: View [commit]($REPO_URL/$COMMIT_SHA)" >> $GITHUB_STEP_SUMMARY + + azure-deploy: + name: Deploy Web Vault to ${{ inputs.environment }} Storage Account + needs: + - setup + - artifact-check + - approval + runs-on: ubuntu-22.04 + env: + _ENVIRONMENT: ${{ needs.setup.outputs.environment }} + _ENVIRONMENT_URL: ${{ needs.setup.outputs.environment-url }} + _ENVIRONMENT_NAME: ${{ needs.setup.outputs.environment-name }} + _ENVIRONMENT_ARTIFACT: ${{ needs.setup.outputs.environment-artifact }} + steps: + - name: Create GitHub deployment + uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 + id: deployment + with: + token: '${{ secrets.GITHUB_TOKEN }}' + initial-status: 'in_progress' + environment-url: ${{ env._ENVIRONMENT_URL }} + environment: ${{ env._ENVIRONMENT_NAME }} + task: 'deploy' + description: 'Deployment from branch/tag: ${{ inputs.branch-or-tag }}' + ref: ${{ needs.artifact-check.outputs.artifact-build-commit }} + + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets[needs.setup.outputs.azure-login-creds] }} + + - name: Retrieve Storage Account connection string for az sync + if: ${{ needs.setup.outputs.sync-utility == 'az-sync' }} + id: retrieve-secrets-az-sync + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: ${{ needs.setup.outputs.retrieve-secrets-keyvault }} + secrets: "sa-bitwarden-web-vault-dev-key-temp" + + - name: Retrieve Storage Account name and SPN credentials for azcopy + if: ${{ needs.setup.outputs.sync-utility == 'azcopy' }} + id: retrieve-secrets-azcopy + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: ${{ needs.setup.outputs.retrieve-secrets-keyvault }} + secrets: "sa-bitwarden-web-vault-name,sp-bitwarden-web-vault-password,sp-bitwarden-web-vault-appid,sp-bitwarden-web-vault-tenant" + + - name: 'Download latest cloud asset using GitHub Run ID: ${{ inputs.build-web-run-id }}' + if: ${{ inputs.build-web-run-id }} + uses: bitwarden/gh-actions/download-artifacts@main + id: download-latest-artifacts + continue-on-error: true + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + run_id: ${{ inputs.build-web-run-id }} + artifacts: ${{ env._ENVIRONMENT_ARTIFACT }} + + - name: 'Download cloud asset from branch/tag: ${{ inputs.branch-or-tag }}' + if: ${{ !inputs.build-web-run-id }} + uses: bitwarden/gh-actions/download-artifacts@main + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + branch: ${{ inputs.branch-or-tag }} + artifacts: ${{ env._ENVIRONMENT_ARTIFACT }} + + - name: Unzip build asset + working-directory: apps/web + run: unzip ${{ env._ENVIRONMENT_ARTIFACT }} + + - name: Sync to Azure Storage Account using az storage blob sync + if: ${{ needs.setup.outputs.sync-utility == 'az-sync' }} + working-directory: apps/web + run: | + az storage blob sync \ + --source "./build" \ + --container '$web' \ + --connection-string "${{ steps.retrieve-secrets-az-sync.outputs.sa-bitwarden-web-vault-dev-key-temp }}" \ + --delete-destination=${{ inputs.force-delete-destination }} + + - name: Sync to Azure Storage Account using azcopy + if: ${{ needs.setup.outputs.sync-utility == 'azcopy' }} + working-directory: apps/web + env: + AZCOPY_AUTO_LOGIN_TYPE: SPN + AZCOPY_SPA_APPLICATION_ID: ${{ steps.retrieve-secrets-azcopy.outputs.sp-bitwarden-web-vault-appid }} + AZCOPY_SPA_CLIENT_SECRET: ${{ steps.retrieve-secrets-azcopy.outputs.sp-bitwarden-web-vault-password }} + AZCOPY_TENANT_ID: ${{ steps.retrieve-secrets-azcopy.outputs.sp-bitwarden-web-vault-tenant }} + run: | + azcopy sync ./build 'https://${{ steps.retrieve-secrets-azcopy.outputs.sa-bitwarden-web-vault-name }}.blob.core.windows.net/$web/' \ + --delete-destination=${{ inputs.force-delete-destination }} --compare-hash="MD5" + + - name: Debug sync logs + if: ${{ inputs.debug }} + run: cat /home/runner/.azcopy/*.log + + - name: Debug index.html + if: ${{ inputs.debug }} + run: cat apps/web/build/index.html + + - name: Update deployment status to Success + if: success() + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + environment-url: ${{ env._ENVIRONMENT_URL }} + state: 'success' + deployment-id: ${{ steps.deployment.outputs.deployment_id }} + + - name: Update deployment status to Failure + if: failure() + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + environment-url: ${{ env._ENVIRONMENT_URL }} + state: 'failure' + deployment-id: ${{ steps.deployment.outputs.deployment_id }} + + notify: + name: Notify Slack with result + runs-on: ubuntu-22.04 + if: ${{ always() && ( contains( inputs.environment , 'QA' ) || contains( inputs.environment , 'DEV' ) ) }} + needs: + - setup + - notify-start + - azure-deploy + - artifact-check + steps: + - name: Notify Slack with result + uses: bitwarden/gh-actions/report-deployment-status-to-slack@main + with: + project: Clients + environment: ${{ needs.setup.outputs.environment-name }} + tag: ${{ inputs.branch-or-tag }} + slack-channel: ${{ needs.notify-start.outputs.channel_id }} + event: ${{ needs.azure-deploy.result }} + url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }} + commit-sha: ${{ needs.artifact-check.outputs.artifact-build-commit }} + update-ts: ${{ needs.notify-start.outputs.ts }} + AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} diff --git a/.github/workflows/enforce-labels.yml b/.github/workflows/enforce-labels.yml index 73092bb2e0d..40ddfe7739f 100644 --- a/.github/workflows/enforce-labels.yml +++ b/.github/workflows/enforce-labels.yml @@ -1,4 +1,3 @@ ---- name: Enforce PR labels on: @@ -8,7 +7,7 @@ on: jobs: enforce-label: name: EnforceLabel - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Enforce Label uses: yogevbd/enforce-label-action@a3c219da6b8fa73f6ba62b68ff09c469b3a1c024 # 2.2.2 diff --git a/.github/workflows/label-issue-pull-request.yml b/.github/workflows/label-issue-pull-request.yml deleted file mode 100644 index a83e9e569b4..00000000000 --- a/.github/workflows/label-issue-pull-request.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Runs creation of Pull Requests -# If the PR destination branch is master, add a needs-qa label ---- -name: Label Issue Pull Request - -on: - pull_request: - types: - - opened # Check when PR is opened - paths-ignore: - - .github/workflows/** # We don't need QA on workflow changes - branches: - - 'master' # We only want to check when PRs target master - -jobs: - add-needs-qa-label: - runs-on: ubuntu-latest - steps: - - name: Add label to pull request - uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 # 1.0.4 - if: ${{ !github.event.pull_request.head.repo.fork }} - with: - add-labels: "needs-qa" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a3c3efdd19d..9dc72c7fdda 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,4 +1,3 @@ ---- name: Lint on: @@ -18,10 +17,10 @@ defaults: jobs: lint: name: Lint - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Lint filenames (no capital characters) run: | @@ -35,15 +34,25 @@ jobs: ! -path "*/.DS_Store" \ ! -path "*/*locales/*" \ ! -path "./.github/*" \ + ! -path "*/Cargo.toml" \ + ! -path "*/Cargo.lock" \ + ! -path "./apps/desktop/macos/*" \ > tmp.txt diff <(sort .github/whitelist-capital-letters.txt) <(sort tmp.txt) + - name: Get Node Version + id: retrieve-node-version + run: | + NODE_NVMRC=$(cat .nvmrc) + NODE_VERSION=${NODE_NVMRC/v/''} + echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ steps.retrieve-node-version.outputs.node_version }} - name: Run linter run: | diff --git a/.github/workflows/locales-lint.yml b/.github/workflows/locales-lint.yml new file mode 100644 index 00000000000..8c9447ea50f --- /dev/null +++ b/.github/workflows/locales-lint.yml @@ -0,0 +1,33 @@ +name: Locales lint for Crowdin + +on: + pull_request: + branches-ignore: + - 'l10n_master' + - 'cf-pages' + paths: + - '**/messages.json' + +jobs: + lint: + name: Lint + runs-on: ubuntu-22.04 + steps: + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Checkout base branch repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.base.sha }} + path: base + - name: Install dependencies + run: npm ci + - name: Compare + run: | + npm run test:locales + if [ $? -eq 0 ]; then + echo "Lint check successful." + else + echo "Lint check failed." + exit 1 + fi diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml new file mode 100644 index 00000000000..0a561306797 --- /dev/null +++ b/.github/workflows/publish-cli.yml @@ -0,0 +1,233 @@ +name: Publish CLI +run-name: Publish CLI ${{ inputs.publish_type }} + +on: + workflow_dispatch: + inputs: + publish_type: + description: 'Publish Options' + required: true + default: 'Initial Publish' + type: choice + options: + - Initial Publish + - Republish + - Dry Run + version: + description: 'Version to publish (default: latest cli release)' + required: true + type: string + default: latest + snap_publish: + description: 'Publish to Snap store' + required: true + default: true + type: boolean + choco_publish: + description: 'Publish to Chocolatey store' + required: true + default: true + type: boolean + npm_publish: + description: 'Publish to npm registry' + required: true + default: true + type: boolean + +defaults: + run: + working-directory: apps/cli + +jobs: + setup: + name: Setup + runs-on: ubuntu-22.04 + outputs: + release-version: ${{ steps.version-output.outputs.version }} + deployment-id: ${{ steps.deployment.outputs.deployment_id }} + defaults: + run: + working-directory: . + steps: + - name: Branch check + if: ${{ inputs.publish_type != 'Dry Run' }} + run: | + if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-cli" ]]; then + echo "===================================" + echo "[!] Can only publish from the 'rc' or 'hotfix-rc-cli' branches" + echo "===================================" + exit 1 + fi + + - name: Version output + id: version-output + run: | + if [[ "${{ inputs.version }}" == "latest" || "${{ inputs.version }}" == "" ]]; then + VERSION=$(curl "https://api.github.com/repos/bitwarden/clients/releases" | jq -c '.[] | select(.tag_name | contains("cli")) | .tag_name' | head -1 | grep -ohE '20[0-9]{2}\.([1-9]|1[0-2])\.[0-9]+') + echo "Latest Released Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_OUTPUT + else + echo "Release Version: ${{ inputs.version }}" + echo "version=${{ inputs.version }}" >> $GITHUB_OUTPUT + fi + + - name: Create GitHub deployment + if: ${{ inputs.publish_type != 'Dry Run' }} + uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 + id: deployment + with: + token: '${{ secrets.GITHUB_TOKEN }}' + initial-status: 'in_progress' + environment: 'CLI - Production' + description: 'Deployment ${{ steps.version-output.outputs.version }} from branch ${{ github.ref_name }}' + task: release + + snap: + name: Deploy Snap + runs-on: ubuntu-22.04 + needs: setup + if: inputs.snap_publish + env: + _PKG_VERSION: ${{ needs.setup.outputs.release-version }} + steps: + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "snapcraft-store-token" + + - name: Install Snap + uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 + + - name: Download artifacts + run: wget https://github.com/bitwarden/clients/releases/download/cli-v${{ env._PKG_VERSION }}/bw_${{ env._PKG_VERSION }}_amd64.snap + + - name: Publish Snap & logout + if: ${{ inputs.publish_type != 'Dry Run' }} + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} + run: | + snapcraft upload bw_${{ env._PKG_VERSION }}_amd64.snap --release stable + snapcraft logout + + choco: + name: Deploy Choco + runs-on: windows-2022 + needs: setup + if: inputs.choco_publish + env: + _PKG_VERSION: ${{ needs.setup.outputs.release-version }} + steps: + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "cli-choco-api-key" + + - name: Setup Chocolatey + run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ + env: + CHOCO_API_KEY: ${{ steps.retrieve-secrets.outputs.cli-choco-api-key }} + + - name: Make dist dir + run: New-Item -ItemType directory -Path ./dist + + - name: Download artifacts + run: Invoke-WebRequest -Uri "https://github.com/bitwarden/clients/releases/download/cli-v${{ env._PKG_VERSION }}/bitwarden-cli.${{ env._PKG_VERSION }}.nupkg" -OutFile bitwarden-cli.${{ env._PKG_VERSION }}.nupkg + working-directory: apps/cli/dist + + - name: Push to Chocolatey + if: ${{ inputs.publish_type != 'Dry Run' }} + run: choco push --source=https://push.chocolatey.org/ + working-directory: apps/cli/dist + + npm: + name: Publish NPM + runs-on: ubuntu-22.04 + needs: setup + if: inputs.npm_publish + env: + _PKG_VERSION: ${{ needs.setup.outputs.release-version }} + steps: + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "npm-api-key" + + - name: Download and set up artifact + run: | + mkdir -p build + wget https://github.com/bitwarden/clients/releases/download/cli-v${{ env._PKG_VERSION }}/bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip + unzip bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip -d build + + - name: Setup NPM + run: | + echo 'registry="https://registry.npmjs.org/"' > ./.npmrc + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ./.npmrc + env: + NPM_TOKEN: ${{ steps.retrieve-secrets.outputs.npm-api-key }} + + - name: Install Husky + run: npm install -g husky + + - name: Publish NPM + if: ${{ inputs.publish_type != 'Dry Run' }} + run: npm publish --access public --regsitry=https://registry.npmjs.org/ --userconfig=./.npmrc + + update-deployment: + name: Update Deployment Status + runs-on: ubuntu-22.04 + needs: + - setup + - npm + - snap + - choco + if: ${{ always() && inputs.publish_type != 'Dry Run' }} + steps: + - name: Check if any job failed + if: contains(needs.*.result, 'failure') + run: exit 1 + + - name: Update deployment status to Success + if: ${{ inputs.publish_type != 'Dry Run' && success() }} + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + state: 'success' + deployment-id: ${{ needs.setup.outputs.deployment-id }} + + - name: Update deployment status to Failure + if: ${{ inputs.publish_type != 'Dry Run' && failure() }} + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + state: 'failure' + deployment-id: ${{ needs.setup.outputs.deployment-id }} diff --git a/.github/workflows/publish-desktop.yml b/.github/workflows/publish-desktop.yml new file mode 100644 index 00000000000..5ef378ad439 --- /dev/null +++ b/.github/workflows/publish-desktop.yml @@ -0,0 +1,295 @@ +name: Publish Desktop +run-name: Publish Desktop ${{ inputs.publish_type }} + +on: + workflow_dispatch: + inputs: + publish_type: + description: 'Publish Options' + required: true + default: 'Initial Publish' + type: choice + options: + - Initial Publish + - Republish + - Dry Run + version: + description: 'Version to publish (default: latest desktop release)' + required: true + type: string + default: latest + rollout_percentage: + description: 'Staged Rollout Percentage' + required: true + default: '10' + type: string + snap_publish: + description: 'Publish to Snap store' + required: true + default: true + type: boolean + choco_publish: + description: 'Publish to Chocolatey store' + required: true + default: true + type: boolean + +jobs: + setup: + name: Setup + runs-on: ubuntu-22.04 + outputs: + release-version: ${{ steps.version.outputs.version }} + release-channel: ${{ steps.release-channel.outputs.channel }} + tag-name: ${{ steps.version.outputs.tag_name }} + deployment-id: ${{ steps.deployment.outputs.deployment_id }} + steps: + - name: Branch check + if: ${{ inputs.publish_type != 'Dry Run' }} + run: | + if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-desktop" ]]; then + echo "===================================" + echo "[!] Can only publish from the 'rc' or 'hotfix-rc-desktop' branches" + echo "===================================" + exit 1 + fi + + - name: Check Publish Version + id: version + run: | + if [[ "${{ inputs.version }}" == "latest" || "${{ inputs.version }}" == "" ]]; then + TAG_NAME=$(curl "https://api.github.com/repos/bitwarden/clients/releases" | jq -c '.[] | select(.tag_name | contains("desktop")) | .tag_name' | head -1 | cut -d '"' -f 2) + VERSION=$(echo $TAG_NAME | sed "s/desktop-v//") + echo "Latest Released Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_OUTPUT + + echo "Tag name: $TAG_NAME" + echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT + else + echo "Release Version: ${{ inputs.version }}" + echo "version=${{ inputs.version }}" + + $TAG_NAME="desktop-v${{ inputs.version }}" + + echo "Tag name: $TAG_NAME" + echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT + fi + + - name: Get Version Channel + id: release-channel + run: | + case "${{ steps.version.outputs.version }}" in + *"alpha"*) + echo "channel=alpha" >> $GITHUB_OUTPUT + echo "[!] We do not yet support 'alpha'" + exit 1 + ;; + *"beta"*) + echo "channel=beta" >> $GITHUB_OUTPUT + ;; + *) + echo "channel=latest" >> $GITHUB_OUTPUT + ;; + esac + + - name: Create GitHub deployment + if: ${{ inputs.publish_type != 'Dry Run' }} + uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 + id: deployment + with: + token: '${{ secrets.GITHUB_TOKEN }}' + initial-status: 'in_progress' + environment: 'Desktop - Production' + description: 'Deployment ${{ steps.version.outputs.version }} to channel ${{ steps.release-channel.outputs.channel }} from branch ${{ github.ref_name }}' + task: release + + electron-blob: + name: Electron blob publish + runs-on: ubuntu-22.04 + needs: setup + env: + _PKG_VERSION: ${{ needs.setup.outputs.release-version }} + _RELEASE_TAG: ${{ needs.setup.outputs.tag-name }} + steps: + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "aws-electron-access-id, + aws-electron-access-key, + aws-electron-bucket-name" + + - name: Create artifacts directory + run: mkdir -p apps/desktop/artifacts + + - name: Download artifacts + env: + GH_TOKEN: ${{ github.token }} + working-directory: apps/desktop/artifacts + run: gh release download ${{ env._RELEASE_TAG }} -R bitwarden/clients + + - name: Set staged rollout percentage + env: + RELEASE_CHANNEL: ${{ needs.setup.outputs.release-channel }} + ROLLOUT_PCT: ${{ inputs.rollout_percentage }} + run: | + echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}.yml + echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-linux.yml + echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-mac.yml + + - name: Publish artifacts to S3 + if: ${{ inputs.publish_type != 'Dry Run' }} + env: + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }} + AWS_DEFAULT_REGION: 'us-west-2' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }} + working-directory: apps/desktop/artifacts + run: | + aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ + --acl "public-read" \ + --recursive \ + --quiet + + - name: Update deployment status to Success + if: ${{ inputs.publish_type != 'Dry Run' && success() }} + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + state: 'success' + deployment-id: ${{ needs.setup.outputs.deployment-id }} + + - name: Update deployment status to Failure + if: ${{ inputs.publish_type != 'Dry Run' && failure() }} + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + state: 'failure' + deployment-id: ${{ needs.setup.outputs.deployment-id }} + + snap: + name: Deploy Snap + runs-on: ubuntu-22.04 + needs: setup + if: inputs.snap_publish + env: + _PKG_VERSION: ${{ needs.setup.outputs.release-version }} + _RELEASE_TAG: ${{ needs.setup.outputs.tag-name }} + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "snapcraft-store-token" + + - name: Install Snap + uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 + + - name: Setup + run: mkdir dist + working-directory: apps/desktop + + - name: Download artifacts + working-directory: apps/desktop/dist + run: wget https://github.com/bitwarden/clients/releases/download/${{ env._RELEASE_TAG }}/bitwarden_${{ env._PKG_VERSION }}_amd64.snap + + - name: Deploy to Snap Store + if: ${{ inputs.publish_type != 'Dry Run' }} + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} + run: | + snapcraft upload bitwarden_${{ env._PKG_VERSION }}_amd64.snap --release stable + snapcraft logout + working-directory: apps/desktop/dist + + choco: + name: Deploy Choco + runs-on: windows-2022 + needs: setup + if: inputs.choco_publish + env: + _PKG_VERSION: ${{ needs.setup.outputs.release-version }} + _RELEASE_TAG: ${{ needs.setup.outputs.tag-name }} + steps: + - name: Checkout Repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Print Environment + run: | + dotnet --version + dotnet nuget --version + + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "cli-choco-api-key" + + - name: Setup Chocolatey + run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ + env: + CHOCO_API_KEY: ${{ steps.retrieve-secrets.outputs.cli-choco-api-key }} + + - name: Make dist dir + run: New-Item -ItemType directory -Path ./dist + working-directory: apps/desktop + + - name: Download artifacts + working-directory: apps/desktop/dist + run: Invoke-WebRequest -Uri "https://github.com/bitwarden/clients/releases/download/${{ env._RELEASE_TAG }}/bitwarden.${{ env._PKG_VERSION }}.nupkg" -OutFile bitwarden.${{ env._PKG_VERSION }}.nupkg + + - name: Push to Chocolatey + if: ${{ inputs.publish_type != 'Dry Run' }} + run: choco push --source=https://push.chocolatey.org/ + working-directory: apps/desktop/dist + + update-deployment: + name: Update Deployment Status + runs-on: ubuntu-22.04 + needs: + - setup + - electron-blob + - snap + - choco + if: ${{ always() && inputs.publish_type != 'Dry Run' }} + steps: + - name: Check if any job failed + if: contains(needs.*.result, 'failure') + run: exit 1 + + - name: Update deployment status to Success + if: ${{ inputs.publish_type != 'Dry Run' && success() }} + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + state: 'success' + deployment-id: ${{ needs.setup.outputs.deployment-id }} + + - name: Update deployment status to Failure + if: ${{ inputs.publish_type != 'Dry Run' && failure() }} + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + state: 'failure' + deployment-id: ${{ needs.setup.outputs.deployment-id }} diff --git a/.github/workflows/publish-web.yml b/.github/workflows/publish-web.yml new file mode 100644 index 00000000000..09f5ddc6318 --- /dev/null +++ b/.github/workflows/publish-web.yml @@ -0,0 +1,143 @@ +name: Publish Web +run-name: Publish Web ${{ inputs.publish_type }} + +on: + workflow_dispatch: + inputs: + publish_type: + description: 'Publish Options' + required: true + default: 'Initial Release' + type: choice + options: + - Initial Release + - Redeploy + - Dry Run + +env: + _AZ_REGISTRY: bitwardenprod.azurecr.io + +jobs: + setup: + name: Setup + runs-on: ubuntu-22.04 + outputs: + release_version: ${{ steps.version.outputs.version }} + tag_version: ${{ steps.version.outputs.tag }} + steps: + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Branch check + if: ${{ inputs.publish_type != 'Dry Run' }} + run: | + if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-web" ]]; then + echo "===================================" + echo "[!] Can only publish from the 'rc' or 'hotfix-rc-web' branches" + echo "===================================" + exit 1 + fi + + - name: Check Release Version + id: version + uses: bitwarden/gh-actions/release-version-check@main + with: + release-type: ${{ inputs.publish_type }} + project-type: ts + file: apps/web/package.json + monorepo: true + monorepo-project: web + + self-host: + name: Release self-host docker + runs-on: ubuntu-22.04 + needs: setup + env: + _BRANCH_NAME: ${{ github.ref_name }} + _RELEASE_VERSION: ${{ needs.setup.outputs.release_version }} + _RELEASE_OPTION: ${{ inputs.publish_type }} + steps: + - name: Print environment + run: | + whoami + docker --version + echo "GitHub ref: $GITHUB_REF" + echo "GitHub event: $GITHUB_EVENT" + echo "Github Release Option: $_RELEASE_OPTION" + + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + ########## ACR ########## + - name: Login to Azure - PROD Subscription + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + + - name: Login to Azure ACR + run: az acr login -n bitwardenprod + + - name: Create GitHub deployment + if: ${{ inputs.publish_type != 'Dry Run' }} + uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 + id: deployment + with: + token: '${{ secrets.GITHUB_TOKEN }}' + initial-status: 'in_progress' + environment-url: http://vault.bitwarden.com + environment: 'Web Vault - US Production Cloud' + description: 'Deployment ${{ needs.setup.outputs.release_version }} from branch ${{ github.ref_name }}' + task: release + + - name: Pull branch image + run: | + if [[ "${{ inputs.publish_type }}" == "Dry Run" ]]; then + docker pull $_AZ_REGISTRY/web:latest + else + docker pull $_AZ_REGISTRY/web:$_BRANCH_NAME + fi + + - name: Tag version + run: | + if [[ "${{ inputs.publish_type }}" == "Dry Run" ]]; then + docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web:dryrun + docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web-sh:dryrun + else + docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web:$_RELEASE_VERSION + docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web-sh:$_RELEASE_VERSION + docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web:latest + docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web-sh:latest + fi + + - name: Push version + run: | + if [[ "${{ inputs.publish_type }}" == "Dry Run" ]]; then + docker push $_AZ_REGISTRY/web:dryrun + docker push $_AZ_REGISTRY/web-sh:dryrun + else + docker push $_AZ_REGISTRY/web:$_RELEASE_VERSION + docker push $_AZ_REGISTRY/web-sh:$_RELEASE_VERSION + docker push $_AZ_REGISTRY/web:latest + docker push $_AZ_REGISTRY/web-sh:latest + fi + + - name: Update deployment status to Success + if: ${{ inputs.publish_type != 'Dry Run' && success() }} + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + environment-url: http://vault.bitwarden.com + state: 'success' + deployment-id: ${{ steps.deployment.outputs.deployment_id }} + + - name: Update deployment status to Failure + if: ${{ inputs.publish_type != 'Dry Run' && failure() }} + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 + with: + token: '${{ secrets.GITHUB_TOKEN }}' + environment-url: http://vault.bitwarden.com + state: 'failure' + deployment-id: ${{ steps.deployment.outputs.deployment_id }} + + - name: Log out of Docker + run: docker logout diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml index 5fd9441f14a..75442187516 100644 --- a/.github/workflows/release-browser.yml +++ b/.github/workflows/release-browser.yml @@ -1,4 +1,3 @@ ---- name: Release Browser run-name: Release Browser ${{ inputs.release_type }} @@ -27,7 +26,7 @@ jobs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -41,7 +40,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/release-version-check@main with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -56,7 +55,7 @@ jobs: needs: setup steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Testing locales - extName length run: | @@ -91,19 +90,9 @@ jobs: - setup - locales-test steps: - - name: Create GitHub deployment - uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 - id: deployment - with: - token: '${{ secrets.GITHUB_TOKEN }}' - initial-status: 'in_progress' - environment: 'Browser - Production' - description: 'Deployment ${{ needs.setup.outputs.release-version }} from branch ${{ github.ref_name }}' - task: release - - name: Download latest Release build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success @@ -114,13 +103,13 @@ jobs: dist-firefox-*.zip, dist-edge-*.zip' - - name: Dry Run - Download latest master build artifacts + - name: Dry Run - Download latest build artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success - branch: master + branch: main artifacts: 'browser-source-*.zip, dist-chrome-*.zip, dist-opera-*.zip, @@ -139,7 +128,7 @@ jobs: - name: Create release if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0 + uses: ncipollo/release-action@2c591bcc8ecdcd2db72b97d6147f871fcd833ba5 # v1.14.0 with: artifacts: 'browser-source-${{ needs.setup.outputs.release-version }}.zip, dist-chrome-${{ needs.setup.outputs.release-version }}.zip, @@ -152,19 +141,3 @@ jobs: body: "" token: ${{ secrets.GITHUB_TOKEN }} draft: true - - - name: Update deployment status to Success - if: ${{ success() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - state: 'success' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - - name: Update deployment status to Failure - if: ${{ failure() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - state: 'failure' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index 7c21cafcfd1..05c53f9752d 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -1,4 +1,3 @@ ---- name: Release CLI run-name: Release CLI ${{ inputs.release_type }} @@ -14,22 +13,6 @@ on: - Initial Release - Redeploy - Dry Run - snap_publish: - description: 'Publish to snap store' - required: true - default: true - type: boolean - choco_publish: - description: 'Publish to chocolatey store' - required: true - default: true - type: boolean - npm_publish: - description: 'Publish to npm registry' - required: true - default: true - type: boolean - defaults: run: @@ -38,15 +21,15 @@ defaults: jobs: setup: name: Setup - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 outputs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Branch check - if: ${{ github.event.inputs.release_type != 'Dry Run' }} + if: ${{ inputs.release_type != 'Dry Run' }} run: | if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-cli" ]]; then echo "===================================" @@ -57,28 +40,22 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/release-version-check@main with: - release-type: ${{ github.event.inputs.release_type }} + release-type: ${{ inputs.release_type }} project-type: ts file: apps/cli/package.json monorepo: true monorepo-project: cli - - name: Create GitHub deployment - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 - id: deployment - with: - token: '${{ secrets.GITHUB_TOKEN }}' - initial-status: 'in_progress' - environment: 'CLI - Production' - description: 'Deployment ${{ steps.version.outputs.version }} from branch ${{ github.ref_name }}' - task: release - + release: + name: Release + runs-on: ubuntu-22.04 + needs: setup + steps: - name: Download all Release artifacts - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + if: ${{ inputs.release_type != 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli @@ -86,220 +63,39 @@ jobs: branch: ${{ github.ref_name }} - name: Dry Run - Download all artifacts - if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + if: ${{ inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-cli.yml path: apps/cli workflow_conclusion: success - branch: master + branch: main - name: Create release - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0 + if: ${{ inputs.release_type != 'Dry Run' }} + uses: ncipollo/release-action@2c591bcc8ecdcd2db72b97d6147f871fcd833ba5 # v1.14.0 env: - PKG_VERSION: ${{ steps.version.outputs.version }} + PKG_VERSION: ${{ needs.setup.outputs.release-version }} with: - artifacts: "apps/cli/bw-windows-${{ env.PKG_VERSION }}.zip, + artifacts: "apps/cli/bw-oss-windows-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-oss-windows-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bw-windows-${{ env.PKG_VERSION }}.zip, apps/cli/bw-windows-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bw-oss-macos-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-oss-macos-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-macos-${{ env.PKG_VERSION }}.zip, apps/cli/bw-macos-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bw-oss-linux-${{ env.PKG_VERSION }}.zip, + apps/cli/bw-oss-linux-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-linux-${{ env.PKG_VERSION }}.zip, apps/cli/bw-linux-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bitwarden-cli.${{ env.PKG_VERSION }}.nupkg, apps/cli/bw_${{ env.PKG_VERSION }}_amd64.snap, - apps/cli/bw-snap-sha256-${{ env.PKG_VERSION }}.txt" + apps/cli/bw-snap-sha256-${{ env.PKG_VERSION }}.txt, + apps/cli/bitwarden-cli-${{ env.PKG_VERSION }}-npm-build.zip" commit: ${{ github.sha }} tag: cli-v${{ env.PKG_VERSION }} name: CLI v${{ env.PKG_VERSION }} body: "" token: ${{ secrets.GITHUB_TOKEN }} draft: true - - - name: Update deployment status to Success - if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - state: 'success' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - - name: Update deployment status to Failure - if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - state: 'failure' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - snap: - name: Deploy Snap - runs-on: ubuntu-20.04 - needs: setup - if: inputs.snap_publish - env: - _PKG_VERSION: ${{ needs.setup.outputs.release-version }} - steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: "bitwarden-ci" - secrets: "snapcraft-store-token" - - - name: Install Snap - uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 - with: - snapcraft_token: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} - - - name: Download artifacts - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-cli.yml - path: apps/cli - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: bw_${{ env._PKG_VERSION }}_amd64.snap - - - name: Dry Run - Download artifacts - if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-cli.yml - path: apps/cli - workflow_conclusion: success - branch: master - artifacts: bw_${{ env._PKG_VERSION }}_amd64.snap - - - name: Publish Snap & logout - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - env: - SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} - run: | - snapcraft push bw_${{ env._PKG_VERSION }}_amd64.snap --release stable - snapcraft logout - - choco: - name: Deploy Choco - runs-on: windows-2019 - needs: setup - if: inputs.choco_publish - env: - _PKG_VERSION: ${{ needs.setup.outputs.release-version }} - steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: "bitwarden-ci" - secrets: "cli-choco-api-key" - - - name: Setup Chocolatey - run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ - env: - CHOCO_API_KEY: ${{ steps.retrieve-secrets.outputs.cli-choco-api-key }} - - - name: Make dist dir - shell: pwsh - run: New-Item -ItemType directory -Path ./dist - - - name: Download artifacts - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-cli.yml - path: apps/cli/dist - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: bitwarden-cli.${{ env._PKG_VERSION }}.nupkg - - - name: Dry Run - Download artifacts - if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-cli.yml - path: apps/cli/dist - workflow_conclusion: success - branch: master - artifacts: bitwarden-cli.${{ env._PKG_VERSION }}.nupkg - - - name: Push to Chocolatey - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - shell: pwsh - run: | - cd dist - choco push --source=https://push.chocolatey.org/ - - npm: - name: Publish NPM - runs-on: ubuntu-20.04 - needs: setup - if: inputs.npm_publish - env: - _PKG_VERSION: ${{ needs.setup.outputs.release-version }} - steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: "bitwarden-ci" - secrets: "npm-api-key" - - - name: Download artifacts - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-cli.yml - path: apps/cli/build - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip - - - name: Dry Run - Download artifacts - if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-cli.yml - path: apps/cli/build - workflow_conclusion: success - branch: master - artifacts: bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip - - - name: Setup NPM - run: | - echo 'registry="https://registry.npmjs.org/"' > ./.npmrc - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ./.npmrc - env: - NPM_TOKEN: ${{ steps.retrieve-secrets.outputs.npm-api-key }} - - - name: Install Husky - run: npm install -g husky - - - name: Publish NPM - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - run: npm publish --access public --regsitry=https://registry.npmjs.org/ --userconfig=./.npmrc diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml index ce09a7d80ad..c1646997201 100644 --- a/.github/workflows/release-desktop-beta.yml +++ b/.github/workflows/release-desktop-beta.yml @@ -1,4 +1,3 @@ ---- name: Release Desktop Beta on: @@ -15,21 +14,22 @@ defaults: jobs: setup: name: Setup - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 outputs: release-version: ${{ steps.version.outputs.version }} release-channel: ${{ steps.release-channel.outputs.channel }} branch-name: ${{ steps.branch.outputs.branch-name }} build_number: ${{ steps.increment-version.outputs.build_number }} + node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Branch check run: | - if [[ "$GITHUB_REF" != "refs/heads/master" ]] && [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc" ]]; then + if [[ "$GITHUB_REF" != "refs/heads/main" ]] && [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc" ]]; then echo "===================================" - echo "[!] Can only release from the 'master', 'rc' or 'hotfix-rc' branches" + echo "[!] Can only release from the 'main', 'rc' or 'hotfix-rc' branches" echo "===================================" exit 1 fi @@ -47,7 +47,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/release-version-check@main with: release-type: 'Initial Release' project-type: ts @@ -104,35 +104,36 @@ jobs: echo "branch-name=$branch_name" >> $GITHUB_OUTPUT + - name: Get Node Version + id: retrieve-node-version + run: | + NODE_NVMRC=$(cat .nvmrc) + NODE_VERSION=${NODE_NVMRC/v/''} + echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT + linux: name: Linux Build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' - - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + node-version: ${{ env._NODE_VERSION }} - name: Set up environment run: | @@ -157,42 +158,42 @@ jobs: run: npm run dist:lin - name: Upload .deb artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb if-no-files-found: error - name: Upload .rpm artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm if-no-files-found: error - name: Upload .freebsd artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd if-no-files-found: error - name: Upload .snap artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap path: apps/desktop/dist/bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap if-no-files-found: error - name: Upload .AppImage artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: ${{ needs.setup.outputs.release-channel }}-linux.yml path: apps/desktop/dist/${{ needs.setup.outputs.release-channel }}-linux.yml @@ -201,7 +202,7 @@ jobs: windows: name: Windows Build - runs-on: windows-2019 + runs-on: windows-2022 needs: setup defaults: run: @@ -209,29 +210,23 @@ jobs: working-directory: apps/desktop env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' - - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + node-version: ${{ env._NODE_VERSION }} - name: Install AST - uses: bitwarden/gh-actions/install-ast@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + run: dotnet tool install --global AzureSignTool --version 4.0.1 - name: Set up environment run: choco install checksum --no-progress @@ -243,13 +238,13 @@ jobs: choco --version - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "code-signing-vault-url, @@ -304,91 +299,91 @@ jobs: -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z - name: Upload portable exe artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe path: apps/desktop/dist/Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe if-no-files-found: error - name: Upload installer exe artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe path: apps/desktop/dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe if-no-files-found: error - name: Upload appx ia32 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx if-no-files-found: error - name: Upload store appx ia32 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx if-no-files-found: error - name: Upload NSIS ia32 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z if-no-files-found: error - name: Upload appx x64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx if-no-files-found: error - name: Upload store appx x64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx if-no-files-found: error - name: Upload NSIS x64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z if-no-files-found: error - name: Upload appx ARM64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx if-no-files-found: error - name: Upload store appx ARM64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx if-no-files-found: error - name: Upload NSIS ARM64 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z if-no-files-found: error - name: Upload nupkg artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: bitwarden.${{ env._PACKAGE_VERSION }}.nupkg path: apps/desktop/dist/chocolatey/bitwarden.${{ env._PACKAGE_VERSION }}.nupkg if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: ${{ needs.setup.outputs.release-channel }}.yml path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release-channel }}.yml @@ -397,33 +392,30 @@ jobs: macos-build: name: MacOS Build - runs-on: macos-11 + runs-on: macos-13 needs: setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ env._NODE_VERSION }} - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + - name: Set up Node-gyp + run: python3 -m pip install setuptools - name: Print environment run: | @@ -434,70 +426,78 @@ jobs: - name: Cache Build id: build-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Cache Safari id: safari-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Decrypt secrets + - name: Download Provisioning Profiles secrets env: - DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + ACCOUNT_NAME: bitwardenci + CONTAINER_NAME: profiles run: | mkdir -p $HOME/secrets - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden-desktop-key.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/macdev-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_appstore.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --output none + + - name: Get certificates + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | + jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | + jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} - DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} - APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} - MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain security set-keychain-settings -lut 1200 build.keychain - security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + + security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles @@ -524,35 +524,32 @@ jobs: macos-package-github: name: MacOS Package GitHub Release Assets - runs-on: macos-11 + runs-on: macos-13 needs: - setup - macos-build env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ env._NODE_VERSION }} - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + - name: Set up Node-gyp + run: python3 -m pip install setuptools - name: Print environment run: | @@ -563,70 +560,84 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Decrypt secrets + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Download Provisioning Profiles secrets env: - DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + ACCOUNT_NAME: bitwardenci + CONTAINER_NAME: profiles run: | mkdir -p $HOME/secrets - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden-desktop-key.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/macdev-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_appstore.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --output none + + - name: Get certificates + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | + jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | + jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} - DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} - APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} - MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain security set-keychain-settings -lut 1200 build.keychain - security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + + security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + + security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles @@ -653,7 +664,7 @@ jobs: - name: Download artifact from hotfix-rc if: github.ref == 'refs/heads/hotfix-rc' - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success @@ -662,20 +673,20 @@ jobs: - name: Download artifact from rc if: github.ref == 'refs/heads/rc' - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success branch: rc path: ${{ github.workspace }}/browser-build-artifacts - - name: Download artifact from master + - name: Download artifacts from main if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc' }} - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success - branch: master + branch: main path: ${{ github.workspace }}/browser-build-artifacts - name: Unzip Safari artifact @@ -696,28 +707,28 @@ jobs: run: npm run pack:mac - name: Upload .zip artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip if-no-files-found: error - name: Upload .dmg artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg if-no-files-found: error - name: Upload .dmg blockmap artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: ${{ needs.setup.outputs.release-channel }}-mac.yml path: apps/desktop/dist/${{ needs.setup.outputs.release-channel }}-mac.yml @@ -726,35 +737,32 @@ jobs: macos-package-mas: name: MacOS Package Prod Release Asset - runs-on: macos-11 + runs-on: macos-13 needs: - setup - macos-build env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} + _NODE_VERSION: ${{ needs.setup.outputs.node_version }} + NODE_OPTIONS: --max_old_space_size=4096 defaults: run: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ env._NODE_VERSION }} - - name: Set Node options - run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV - - - name: Install node-gyp - run: | - npm install -g node-gyp - node-gyp install $(node -v) + - name: Set up Node-gyp + run: python3 -m pip install setuptools - name: Print environment run: | @@ -765,70 +773,79 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Decrypt secrets + - name: Download Provisioning Profiles secrets env: - DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} + ACCOUNT_NAME: bitwardenci + CONTAINER_NAME: profiles run: | mkdir -p $HOME/secrets - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden-desktop-key.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/appstore-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-app-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/devid-installer-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/macdev-cert.p12" \ - "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg" - gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ - --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \ - "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg" + + az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \ + --name bitwarden_desktop_appstore.provisionprofile \ + --file $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \ + --output none + + - name: Get certificates + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/bitwarden-desktop-key | + jq -r .value | base64 -d > $HOME/certificates/bitwarden-desktop-key.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-app-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/appstore-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/appstore-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-installer-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-installer-cert.p12 + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | + jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 - name: Set up keychain env: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }} - DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }} - APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }} - MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain security set-keychain-settings -lut 1200 build.keychain - security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \ + + security import "$HOME/certificates/bitwarden-desktop-key.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \ + + security import "$HOME/certificates/devid-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-app-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \ + + security import "$HOME/certificates/appstore-installer-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild - security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \ + + security import "$HOME/certificates/macdev-cert.p12" -k build.keychain -P "" \ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - name: Set up provisioning profiles @@ -855,7 +872,7 @@ jobs: - name: Download artifact from hotfix-rc if: github.ref == 'refs/heads/hotfix-rc' - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success @@ -864,20 +881,20 @@ jobs: - name: Download artifact from rc if: github.ref == 'refs/heads/rc' - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success branch: rc path: ${{ github.workspace }}/browser-build-artifacts - - name: Download artifact from master + - name: Download artifact from main if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc' }} - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-browser.yml workflow_conclusion: success - branch: master + branch: main path: ${{ github.workspace }}/browser-build-artifacts - name: Unzip Safari artifact @@ -898,7 +915,7 @@ jobs: APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - name: Upload .pkg artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg @@ -906,7 +923,7 @@ jobs: release: name: Release beta channel to S3 - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: - setup - linux @@ -916,7 +933,7 @@ jobs: - macos-package-mas steps: - name: Create GitHub deployment - uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 + uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 id: deployment with: token: '${{ secrets.GITHUB_TOKEN }}' @@ -926,25 +943,21 @@ jobs: task: release - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "aws-electron-access-id, aws-electron-access-key, - aws-electron-bucket-name, - r2-electron-access-id, - r2-electron-access-key, - r2-electron-bucket-name, - cf-prod-account" + aws-electron-bucket-name" - name: Download all artifacts - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: apps/desktop/artifacts @@ -967,23 +980,9 @@ jobs: --recursive \ --quiet - - name: Publish artifacts to R2 - env: - AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }} - AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }} - AWS_DEFAULT_REGION: 'us-east-1' - AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.r2-electron-bucket-name }} - CF_ACCOUNT: ${{ steps.retrieve-secrets.outputs.cf-prod-account }} - working-directory: apps/desktop/artifacts - run: | - aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ - --recursive \ - --quiet \ - --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com - - name: Update deployment status to Success if: ${{ success() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'success' @@ -991,7 +990,7 @@ jobs: - name: Update deployment status to Failure if: ${{ failure() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 + uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' state: 'failure' @@ -999,7 +998,7 @@ jobs: remove-branch: name: Remove branch - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 if: always() needs: - setup @@ -1011,7 +1010,7 @@ jobs: - release steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup git config run: | diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index f60020c7327..d9394347f60 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -1,4 +1,3 @@ ---- name: Release Desktop run-name: Release Desktop ${{ inputs.release_type }} @@ -6,39 +5,13 @@ on: workflow_dispatch: inputs: release_type: - description: 'Release Options' + description: 'Release Type' required: true - default: 'Initial Release' + default: 'Release' type: choice options: - - Initial Release - - Redeploy + - Release - Dry Run - rollout_percentage: - description: 'Staged Rollout Percentage' - required: true - default: '10' - type: string - snap_publish: - description: 'Publish to Snap store' - required: true - default: true - type: boolean - choco_publish: - description: 'Publish to Chocolatey store' - required: true - default: true - type: boolean - electron_publish: - description: 'Publish electron to S3 bucket' - required: true - default: true - type: boolean - github_release: - description: 'Publish github release' - required: true - default: true - type: boolean defaults: run: @@ -53,7 +26,7 @@ jobs: release-channel: ${{ steps.release-channel.outputs.channel }} steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -67,7 +40,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/release-version-check@main with: release-type: ${{ inputs.release_type }} project-type: ts @@ -92,38 +65,9 @@ jobs: ;; esac - - name: Create GitHub deployment - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 - id: deployment - with: - token: '${{ secrets.GITHUB_TOKEN }}' - initial-status: 'in_progress' - environment: 'Desktop - Production' - description: 'Deployment ${{ steps.version.outputs.version }} to channel ${{ steps.release-channel.outputs.channel }} from branch ${{ github.ref_name }}' - task: release - - - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: "bitwarden-ci" - secrets: "aws-electron-access-id, - aws-electron-access-key, - aws-electron-bucket-name, - r2-electron-access-id, - r2-electron-access-key, - r2-electron-bucket-name, - cf-prod-account" - - name: Download all artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-desktop.yml workflow_conclusion: success @@ -132,11 +76,11 @@ jobs: - name: Dry Run - Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-desktop.yml workflow_conclusion: success - branch: master + branch: main path: apps/desktop/artifacts - name: Rename .pkg to .pkg.archive @@ -145,54 +89,15 @@ jobs: working-directory: apps/desktop/artifacts run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive - - name: Set staged rollout percentage - if: ${{ github.event.inputs.electron_publish == 'true' }} - env: - RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }} - ROLLOUT_PCT: ${{ inputs.rollout_percentage }} - run: | - echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}.yml - echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-linux.yml - echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-mac.yml - - - name: Publish artifacts to S3 - if: ${{ github.event.inputs.release_type != 'Dry Run' && github.event.inputs.electron_publish == 'true' }} - env: - AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} - AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }} - AWS_DEFAULT_REGION: 'us-west-2' - AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }} - working-directory: apps/desktop/artifacts - run: | - aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ - --acl "public-read" \ - --recursive \ - --quiet - - - name: Publish artifacts to R2 - if: ${{ github.event.inputs.release_type != 'Dry Run' && github.event.inputs.electron_publish == 'true' }} - env: - AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }} - AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }} - AWS_DEFAULT_REGION: 'us-east-1' - AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.r2-electron-bucket-name }} - CF_ACCOUNT: ${{ steps.retrieve-secrets.outputs.cf-prod-account }} - working-directory: apps/desktop/artifacts - run: | - aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ - --recursive \ - --quiet \ - --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com - - name: Get checksum files - uses: bitwarden/gh-actions/get-checksum@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-checksum@main with: packages_dir: "apps/desktop/artifacts" file_path: "apps/desktop/artifacts/sha256-checksums.txt" - name: Create Release - uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0 - if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' && github.event.inputs.github_release == 'true' }} + uses: ncipollo/release-action@2c591bcc8ecdcd2db72b97d6147f871fcd833ba5 # v1.14.0 + if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' }} env: PKG_VERSION: ${{ steps.version.outputs.version }} RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }} @@ -228,145 +133,3 @@ jobs: body: "" token: ${{ secrets.GITHUB_TOKEN }} draft: true - - - name: Update deployment status to Success - if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - state: 'success' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - - name: Update deployment status to Failure - if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - state: 'failure' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - snap: - name: Deploy Snap - runs-on: ubuntu-22.04 - needs: setup - if: ${{ github.event.inputs.snap_publish == 'true' }} - env: - _PKG_VERSION: ${{ needs.setup.outputs.release-version }} - steps: - - name: Checkout Repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: "bitwarden-ci" - secrets: "snapcraft-store-token" - - - name: Install Snap - uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 - env: - SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} - - - name: Setup - run: mkdir dist - working-directory: apps/desktop - - - name: Download Snap artifact - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-desktop.yml - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: bitwarden_${{ env._PKG_VERSION }}_amd64.snap - path: apps/desktop/dist - - - name: Dry Run - Download Snap artifact - if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-desktop.yml - workflow_conclusion: success - branch: master - artifacts: bitwarden_${{ env._PKG_VERSION }}_amd64.snap - path: apps/desktop/dist - - - name: Deploy to Snap Store - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - env: - SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} - run: | - /snap/bin/snapcraft upload bitwarden_${{ env._PKG_VERSION }}_amd64.snap --release stable - /snap/bin/snapcraft logout - working-directory: apps/desktop/dist - - choco: - name: Deploy Choco - runs-on: windows-2019 - needs: setup - if: ${{ github.event.inputs.choco_publish == 'true' }} - env: - _PKG_VERSION: ${{ needs.setup.outputs.release-version }} - steps: - - name: Checkout Repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Print Environment - run: | - dotnet --version - dotnet nuget --version - - - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: "bitwarden-ci" - secrets: "cli-choco-api-key" - - - name: Setup Chocolatey - shell: pwsh - run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ - env: - CHOCO_API_KEY: ${{ steps.retrieve-secrets.outputs.cli-choco-api-key }} - - - name: Make dist dir - shell: pwsh - run: New-Item -ItemType directory -Path ./dist - working-directory: apps/desktop - - - name: Download choco artifact - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-desktop.yml - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: bitwarden.${{ env._PKG_VERSION }}.nupkg - path: apps/desktop/dist - - - name: Dry Run - Download choco artifact - if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-desktop.yml - workflow_conclusion: success - branch: master - artifacts: bitwarden.${{ env._PKG_VERSION }}.nupkg - path: apps/desktop/dist - - - name: Push to Chocolatey - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - shell: pwsh - run: choco push --source=https://push.chocolatey.org/ - working-directory: apps/desktop/dist diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 46113b94b40..faa398f6d67 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -1,4 +1,3 @@ ---- name: Release Web run-name: Release Web ${{ inputs.release_type }} @@ -15,9 +14,6 @@ on: - Redeploy - Dry Run -env: - _AZ_REGISTRY: bitwardenprod.azurecr.io - jobs: setup: name: Setup @@ -27,7 +23,7 @@ jobs: tag_version: ${{ steps.version.outputs.tag }} steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -41,7 +37,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/release-version-check@main with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -49,185 +45,15 @@ jobs: monorepo: true monorepo-project: web - self-host: - name: Release self-host docker - runs-on: ubuntu-22.04 - needs: setup - env: - _BRANCH_NAME: ${{ github.ref_name }} - _RELEASE_VERSION: ${{ needs.setup.outputs.release_version }} - _RELEASE_OPTION: ${{ github.event.inputs.release_type }} - steps: - - name: Print environment - run: | - whoami - docker --version - echo "GitHub ref: $GITHUB_REF" - echo "GitHub event: $GITHUB_EVENT" - echo "Github Release Option: $_RELEASE_OPTION" - - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - ########## ACR ########## - - name: Login to Azure - PROD Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - - - name: Login to Azure ACR - run: az acr login -n bitwardenprod - - - name: Pull branch image - run: | - if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - docker pull $_AZ_REGISTRY/web:latest - else - docker pull $_AZ_REGISTRY/web:$_BRANCH_NAME - fi - - - name: Tag version - run: | - if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web:dryrun - docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web-sh:dryrun - else - docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web:$_RELEASE_VERSION - docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web-sh:$_RELEASE_VERSION - docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web:latest - docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web-sh:latest - fi - - - name: Push version - run: | - if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - docker push $_AZ_REGISTRY/web:dryrun - docker push $_AZ_REGISTRY/web-sh:dryrun - else - docker push $_AZ_REGISTRY/web:$_RELEASE_VERSION - docker push $_AZ_REGISTRY/web-sh:$_RELEASE_VERSION - docker push $_AZ_REGISTRY/web:latest - docker push $_AZ_REGISTRY/web-sh:latest - fi - - - name: Log out of Docker - run: docker logout - - - ghpages-deploy: - name: Create Deploy PR for GitHub Pages - runs-on: ubuntu-22.04 - needs: setup - env: - _RELEASE_VERSION: ${{ needs.setup.outputs.release_version }} - _TAG_VERSION: ${{ needs.setup.outputs.tag_version }} - _BRANCH: "v${{ needs.setup.outputs.release_version }}-deploy" - steps: - - name: Login to Azure - CI Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve bot secrets - id: retrieve-bot-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: bitwarden-ci - secrets: "github-pat-bitwarden-devops-bot-repo-scope" - - - name: Checkout GH pages repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - repository: bitwarden/web-vault-pages - path: ghpages-deployment - token: ${{ steps.retrieve-bot-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} - - - name: Download latest cloud asset - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-web.yml - path: assets - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: web-*-cloud-COMMERCIAL.zip - - - name: Dry Run - Download latest cloud asset - if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - workflow: build-web.yml - path: assets - workflow_conclusion: success - branch: master - artifacts: web-*-cloud-COMMERCIAL.zip - - - name: Unzip build asset - working-directory: assets - run: unzip web-*-cloud-COMMERCIAL.zip - - - name: Create new branch - run: | - cd ${{ github.workspace }}/ghpages-deployment - git config user.name = "GitHub Action Bot" - git config user.email = "<>" - git config --global url."https://github.com/".insteadOf ssh://git@github.com/ - git config --global url."https://".insteadOf ssh:// - git checkout -b ${_BRANCH} - - - name: Copy build files - run: | - rm -rf ${{ github.workspace }}/ghpages-deployment/* - cp -Rf ${{ github.workspace }}/assets/build/* ghpages-deployment/ - - - name: Commit and push changes - working-directory: ghpages-deployment - run: | - git add . - git commit -m "Deploy Web v${_RELEASE_VERSION} to GitHub Pages" - git push --set-upstream origin ${_BRANCH} --force - - - name: Create GitHub Pages Deploy PR - working-directory: ghpages-deployment - env: - GITHUB_TOKEN: ${{ steps.retrieve-bot-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} - run: | - if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - gh pr create --title "Deploy v${_RELEASE_VERSION} to GitHub Pages" \ - --draft \ - --body "Deploying v${_RELEASE_VERSION}" \ - --base master \ - --head "${_BRANCH}" - else - gh pr create --title "Deploy v${_RELEASE_VERSION} to GitHub Pages" \ - --body "Deploying v${_RELEASE_VERSION}" \ - --base master \ - --head "${_BRANCH}" - fi - release: name: Create GitHub Release runs-on: ubuntu-22.04 needs: - setup - - self-host - - ghpages-deploy steps: - - name: Create GitHub deployment - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 - id: deployment - with: - token: '${{ secrets.GITHUB_TOKEN }}' - initial-status: 'in_progress' - environment-url: http://vault.bitwarden.com - environment: 'Web Vault - Production' - description: 'Deployment ${{ needs.setup.outputs.release_version }} from branch ${{ github.ref_name }}' - task: release - - name: Download latest build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-web.yml path: apps/web/artifacts @@ -238,12 +64,12 @@ jobs: - name: Dry Run - Download latest build artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/download-artifacts@main with: workflow: build-web.yml path: apps/web/artifacts workflow_conclusion: success - branch: master + branch: main artifacts: "web-*-selfhosted-COMMERCIAL.zip, web-*-selfhosted-open-source.zip" @@ -255,7 +81,7 @@ jobs: - name: Create release if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0 + uses: ncipollo/release-action@2c591bcc8ecdcd2db72b97d6147f871fcd833ba5 # v1.14.0 with: name: "Web v${{ needs.setup.outputs.release_version }}" commit: ${{ github.sha }} @@ -265,21 +91,3 @@ jobs: apps/web/artifacts/web-${{ needs.setup.outputs.release_version }}-selfhosted-open-source.zip" token: ${{ secrets.GITHUB_TOKEN }} draft: true - - - name: Update deployment status to Success - if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - environment-url: http://vault.bitwarden.com - state: 'success' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - - name: Update deployment status to Failure - if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - environment-url: http://vault.bitwarden.com - state: 'failure' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} diff --git a/.github/workflows/repository-management.yml b/.github/workflows/repository-management.yml new file mode 100644 index 00000000000..9935ef7674e --- /dev/null +++ b/.github/workflows/repository-management.yml @@ -0,0 +1,498 @@ +name: Repository management + +on: + workflow_dispatch: + inputs: + task: + default: "Version Bump" + description: "Task to execute" + options: + - "Version Bump" + - "Version Bump and Cut rc" + required: true + type: choice + bump_browser: + description: "Bump Browser version?" + type: boolean + default: false + bump_cli: + description: "Bump CLI version?" + type: boolean + default: false + bump_desktop: + description: "Bump Desktop version?" + type: boolean + default: false + bump_web: + description: "Bump Web version?" + type: boolean + default: false + target_ref: + default: "main" + description: "Branch/Tag to target for cut" + required: true + type: string + version_number_override: + description: "New version override (leave blank for automatic calculation, example: '2024.1.0')" + required: false + type: string + + +jobs: + setup: + name: Setup + runs-on: ubuntu-24.04 + outputs: + branch: ${{ steps.set-branch.outputs.branch }} + steps: + - name: Set branch + id: set-branch + env: + TASK: ${{ inputs.task }} + run: | + if [[ "$TASK" == "Version Bump" ]]; then + BRANCH="none" + elif [[ "$TASK" == "Version Bump and Cut rc" ]]; then + BRANCH="rc" + fi + + echo "branch=$BRANCH" >> $GITHUB_OUTPUT + + + cut_branch: + name: Cut branch + if: ${{ needs.setup.outputs.branch == 'rc' }} + needs: setup + runs-on: ubuntu-24.04 + steps: + - name: Generate GH App token + uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 + id: app-token + with: + app-id: ${{ secrets.BW_GHAPP_ID }} + private-key: ${{ secrets.BW_GHAPP_KEY }} + + - name: Check out target ref + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ inputs.target_ref }} + token: ${{ steps.app-token.outputs.token }} + + - name: Check if ${{ needs.setup.outputs.branch }} branch exists + env: + BRANCH_NAME: ${{ needs.setup.outputs.branch }} + run: | + if [[ $(git ls-remote --heads origin $BRANCH_NAME) ]]; then + echo "$BRANCH_NAME already exists! Please delete $BRANCH_NAME before running again." >> $GITHUB_STEP_SUMMARY + exit 1 + fi + + - name: Cut branch + env: + BRANCH_NAME: ${{ needs.setup.outputs.branch }} + run: | + git switch --quiet --create $BRANCH_NAME + git push --quiet --set-upstream origin $BRANCH_NAME + + + bump_version: + name: Bump Version + if: ${{ always() }} + runs-on: ubuntu-24.04 + needs: + - cut_branch + - setup + outputs: + version_browser: ${{ steps.set-final-version-output.outputs.version_browser }} + version_cli: ${{ steps.set-final-version-output.outputs.version_cli }} + version_desktop: ${{ steps.set-final-version-output.outputs.version_desktop }} + version_web: ${{ steps.set-final-version-output.outputs.version_web }} + steps: + - name: Validate version input format + if: ${{ inputs.version_number_override != '' }} + uses: bitwarden/gh-actions/version-check@main + with: + version: ${{ inputs.version_number_override }} + + - name: Generate GH App token + uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 + id: app-token + with: + app-id: ${{ secrets.BW_GHAPP_ID }} + private-key: ${{ secrets.BW_GHAPP_KEY }} + + - name: Check out branch + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: main + token: ${{ steps.app-token.outputs.token }} + + - name: Configure Git + run: | + git config --local user.email "actions@github.com" + git config --local user.name "Github Actions" + + ######################## + # VERSION BUMP SECTION # + ######################## + + ### Browser + - name: Get current Browser version + if: ${{ inputs.bump_browser == true }} + id: current-browser-version + run: | + CURRENT_VERSION=$(cat package.json | jq -r '.version') + echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT + working-directory: apps/browser + + - name: Browser - Verify input version + if: ${{ inputs.bump_browser == true && inputs.version_number_override != '' }} + env: + CURRENT_VERSION: ${{ steps.current-browser-version.outputs.version }} + NEW_VERSION: ${{ inputs.version_number_override }} + run: | + # Error if version has not changed. + if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then + echo "Version has not changed." + exit 1 + fi + + # Check if version is newer. + printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V + if [ $? -eq 0 ]; then + echo "Version check successful." + else + echo "Version check failed." + exit 1 + fi + working-directory: apps/browser + + - name: Calculate next Browser release version + if: ${{ inputs.bump_browser == true && inputs.version_number_override == '' }} + id: calculate-next-browser-version + uses: bitwarden/gh-actions/version-next@main + with: + version: ${{ steps.current-browser-version.outputs.version }} + + - name: Bump Browser Version - Version Override + if: ${{ inputs.bump_browser == true && inputs.version_number_override != '' }} + id: bump-browser-version-override + env: + VERSION: ${{ inputs.version_number_override }} + run: npm version --workspace=@bitwarden/browser $VERSION + + - name: Bump Browser Version - Automatic Calculation + if: ${{ inputs.bump_browser == true && inputs.version_number_override == '' }} + id: bump-browser-version-automatic + env: + VERSION: ${{ steps.calculate-next-browser-version.outputs.version }} + run: npm version --workspace=@bitwarden/browser $VERSION + + - name: Bump Browser Version - Manifest - Version Override + if: ${{ inputs.bump_browser == true && inputs.version_number_override != '' }} + uses: bitwarden/gh-actions/version-bump@main + with: + file_path: "apps/browser/src/manifest.json" + version: ${{ inputs.version_number_override }} + + - name: Bump Browser Version - Manifest - Automatic Calculation + if: ${{ inputs.bump_browser == true && inputs.version_number_override == '' }} + uses: bitwarden/gh-actions/version-bump@main + with: + file_path: "apps/browser/src/manifest.json" + version: ${{ steps.calculate-next-browser-version.outputs.version }} + + - name: Bump Browser Version - Manifest v3 - Version Override + if: ${{ inputs.bump_browser == true && inputs.version_number_override != '' }} + uses: bitwarden/gh-actions/version-bump@main + with: + file_path: "apps/browser/src/manifest.v3.json" + version: ${{ inputs.version_number_override }} + + - name: Bump Browser Version - Manifest v3 - Automatic Calculation + if: ${{ inputs.bump_browser == true && inputs.version_number_override == '' }} + uses: bitwarden/gh-actions/version-bump@main + with: + file_path: "apps/browser/src/manifest.v3.json" + version: ${{ steps.calculate-next-browser-version.outputs.version }} + + - name: Run Prettier after Browser Version Bump + if: ${{ inputs.bump_browser == true }} + run: | + npm install -g prettier + prettier --write apps/browser/src/manifest.json + prettier --write apps/browser/src/manifest.v3.json + + ### CLI + - name: Get current CLI version + if: ${{ inputs.bump_cli == true }} + id: current-cli-version + run: | + CURRENT_VERSION=$(cat package.json | jq -r '.version') + echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT + working-directory: apps/cli + + - name: CLI - Verify input version + if: ${{ inputs.bump_cli == true && inputs.version_number_override != '' }} + env: + CURRENT_VERSION: ${{ steps.current-cli-version.outputs.version }} + NEW_VERSION: ${{ inputs.version_number_override }} + run: | + # Error if version has not changed. + if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then + echo "Version has not changed." + exit 1 + fi + + # Check if version is newer. + printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V + if [ $? -eq 0 ]; then + echo "Version check successful." + else + echo "Version check failed." + exit 1 + fi + working-directory: apps/cli + + - name: Calculate next CLI release version + if: ${{ inputs.bump_cli == true && inputs.version_number_override == '' }} + id: calculate-next-cli-version + uses: bitwarden/gh-actions/version-next@main + with: + version: ${{ steps.current-cli-version.outputs.version }} + + - name: Bump CLI Version - Version Override + if: ${{ inputs.bump_cli == true && inputs.version_number_override != '' }} + id: bump-cli-version-override + env: + VERSION: ${{ inputs.version_number_override }} + run: npm version --workspace=@bitwarden/cli $VERSION + + - name: Bump CLI Version - Automatic Calculation + if: ${{ inputs.bump_cli == true && inputs.version_number_override == '' }} + id: bump-cli-version-automatic + env: + VERSION: ${{ steps.calculate-next-cli-version.outputs.version }} + run: npm version --workspace=@bitwarden/cli $VERSION + + ### Desktop + - name: Get current Desktop version + if: ${{ inputs.bump_desktop == true }} + id: current-desktop-version + run: | + CURRENT_VERSION=$(cat package.json | jq -r '.version') + echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT + working-directory: apps/desktop + + - name: Desktop - Verify input version + if: ${{ inputs.bump_desktop == true && inputs.version_number_override != '' }} + env: + CURRENT_VERSION: ${{ steps.current-desktop-version.outputs.version }} + NEW_VERSION: ${{ inputs.version_number_override }} + run: | + # Error if version has not changed. + if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then + echo "Version has not changed." + exit 1 + fi + + # Check if version is newer. + printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V + if [ $? -eq 0 ]; then + echo "Version check successful." + else + echo "Version check failed." + exit 1 + fi + working-directory: apps/desktop + + - name: Calculate next Desktop release version + if: ${{ inputs.bump_desktop == true && inputs.version_number_override == '' }} + id: calculate-next-desktop-version + uses: bitwarden/gh-actions/version-next@main + with: + version: ${{ steps.current-desktop-version.outputs.version }} + + - name: Bump Desktop Version - Root - Version Override + if: ${{ inputs.bump_desktop == true && inputs.version_number_override != '' }} + id: bump-desktop-version-override + env: + VERSION: ${{ inputs.version_number_override }} + run: npm version --workspace=@bitwarden/desktop $VERSION + + - name: Bump Desktop Version - Root - Automatic Calculation + if: ${{ inputs.bump_desktop == true && inputs.version_number_override == '' }} + id: bump-desktop-version-automatic + env: + VERSION: ${{ steps.calculate-next-desktop-version.outputs.version }} + run: npm version --workspace=@bitwarden/desktop $VERSION + + - name: Bump Desktop Version - App - Version Override + if: ${{ inputs.bump_desktop == true && inputs.version_number_override != '' }} + env: + VERSION: ${{ inputs.version_number_override }} + run: npm version $VERSION + working-directory: "apps/desktop/src" + + - name: Bump Desktop Version - App - Automatic Calculation + if: ${{ inputs.bump_desktop == true && inputs.version_number_override == '' }} + env: + VERSION: ${{ steps.calculate-next-desktop-version.outputs.version }} + run: npm version $VERSION + working-directory: "apps/desktop/src" + + ### Web + - name: Get current Web version + if: ${{ inputs.bump_web == true }} + id: current-web-version + run: | + CURRENT_VERSION=$(cat package.json | jq -r '.version') + echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT + working-directory: apps/web + + - name: Web - Verify input version + if: ${{ inputs.bump_web == true && inputs.version_number_override != '' }} + env: + CURRENT_VERSION: ${{ steps.current-web-version.outputs.version }} + NEW_VERSION: ${{ inputs.version_number_override }} + run: | + # Error if version has not changed. + if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then + echo "Version has not changed." + exit 1 + fi + + # Check if version is newer. + printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V + if [ $? -eq 0 ]; then + echo "Version check successful." + else + echo "Version check failed." + exit 1 + fi + working-directory: apps/web + + - name: Calculate next Web release version + if: ${{ inputs.bump_web == true && inputs.version_number_override == '' }} + id: calculate-next-web-version + uses: bitwarden/gh-actions/version-next@main + with: + version: ${{ steps.current-web-version.outputs.version }} + + - name: Bump Web Version - Version Override + if: ${{ inputs.bump_web == true && inputs.version_number_override != '' }} + id: bump-web-version-override + env: + VERSION: ${{ inputs.version_number_override }} + run: npm version --workspace=@bitwarden/web-vault $VERSION + + - name: Bump Web Version - Automatic Calculation + if: ${{ inputs.bump_web == true && inputs.version_number_override == '' }} + id: bump-web-version-automatic + env: + VERSION: ${{ steps.calculate-next-web-version.outputs.version }} + run: npm version --workspace=@bitwarden/web-vault $VERSION + + ######################## + + - name: Set final version output + id: set-final-version-output + env: + VERSION: ${{ inputs.version_number_override }} + run: | + if [[ "${{ steps.bump-browser-version-override.outcome }}" = "success" ]]; then + echo "version_browser=$VERSION" >> $GITHUB_OUTPUT + elif [[ "${{ steps.bump-browser-version-automatic.outcome }}" = "success" ]]; then + echo "version_browser=${{ steps.calculate-next-browser-version.outputs.version }}" >> $GITHUB_OUTPUT + fi + + if [[ "${{ steps.bump-cli-version-override.outcome }}" = "success" ]]; then + echo "version_cli=$VERSION" >> $GITHUB_OUTPUT + elif [[ "${{ steps.bump-cli-version-automatic.outcome }}" = "success" ]]; then + echo "version_cli=${{ steps.calculate-next-cli-version.outputs.version }}" >> $GITHUB_OUTPUT + fi + + if [[ "${{ steps.bump-desktop-version-override.outcome }}" = "success" ]]; then + echo "version_desktop=$VERSION" >> $GITHUB_OUTPUT + elif [[ "${{ steps.bump-desktop-version-automatic.outcome }}" = "success" ]]; then + echo "version_desktop=${{ steps.calculate-next-desktop-version.outputs.version }}" >> $GITHUB_OUTPUT + fi + + if [[ "${{ steps.bump-web-version-override.outcome }}" = "success" ]]; then + echo "version_web=$VERSION" >> $GITHUB_OUTPUT + elif [[ "${{ steps.bump-web-version-automatic.outcome }}" = "success" ]]; then + echo "version_web=${{ steps.calculate-next-web-version.outputs.version }}" >> $GITHUB_OUTPUT + fi + + - name: Check if version changed + id: version-changed + run: | + if [ -n "$(git status --porcelain)" ]; then + echo "changes_to_commit=TRUE" >> $GITHUB_OUTPUT + else + echo "changes_to_commit=FALSE" >> $GITHUB_OUTPUT + echo "No changes to commit!"; + fi + + - name: Commit files + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} + run: git commit -m "Bumped client version(s)" -a + + - name: Push changes + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} + run: git push + + + cherry_pick: + name: Cherry-Pick Commit(s) + if: ${{ needs.setup.outputs.branch == 'rc' }} + runs-on: ubuntu-24.04 + needs: + - bump_version + - setup + steps: + - name: Generate GH App token + uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 + id: app-token + with: + app-id: ${{ secrets.BW_GHAPP_ID }} + private-key: ${{ secrets.BW_GHAPP_KEY }} + + - name: Check out main branch + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: main + token: ${{ steps.app-token.outputs.token }} + + - name: Configure Git + run: | + git config --local user.email "actions@github.com" + git config --local user.name "Github Actions" + + - name: Perform cherry-pick(s) + run: | + # Function for cherry-picking + cherry_pick () { + local package_path="apps/$1/package.json" + local source_branch=$2 + local destination_branch=$3 + + # Get project commit/version from source branch + git switch $source_branch + SOURCE_COMMIT=$(git log --reverse --pretty=format:"%H" --max-count=1 $package_path) + SOURCE_VERSION=$(cat $package_path | jq -r '.version') + + # Get project commit/version from destination branch + git switch $destination_branch + DESTINATION_VERSION=$(cat $package_path | jq -r '.version') + + if [[ "$DESTINATION_VERSION" != "$SOURCE_VERSION" ]]; then + git cherry-pick --strategy-option=theirs -x $SOURCE_COMMIT + git push -u origin $destination_branch + fi + + # Cherry-pick from 'main' into 'rc' + cherry_pick browser main rc + cherry_pick cli main rc + cherry_pick desktop main rc + cherry_pick web main rc diff --git a/.github/workflows/retrieve-current-desktop-rollout.yml b/.github/workflows/retrieve-current-desktop-rollout.yml new file mode 100644 index 00000000000..2ab3072f566 --- /dev/null +++ b/.github/workflows/retrieve-current-desktop-rollout.yml @@ -0,0 +1,41 @@ +name: Retrieve Current Desktop Rollout + +on: + workflow_dispatch: + +defaults: + run: + shell: bash + +jobs: + rollout: + name: Retrieve Rollout Percentage + runs-on: ubuntu-22.04 + steps: + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "aws-electron-access-id, + aws-electron-access-key, + aws-electron-bucket-name" + + - name: Download channel update info files from S3 + env: + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }} + AWS_DEFAULT_REGION: 'us-west-2' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }} + run: aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest.yml . --quiet + + - name: Get current rollout percentage + run: | + CURRENT_PCT=$(sed -r -n "s/stagingPercentage:\s([0-9]+)/\1/p" latest.yml) + CURRENT_VERSION=$(sed -r -n "s/version:\s(.*)/\1/p" latest.yml) + echo "Desktop ${CURRENT_VERSION} rollout percentage is ${CURRENT_PCT}%" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml new file mode 100644 index 00000000000..bf17459c21c --- /dev/null +++ b/.github/workflows/scan.yml @@ -0,0 +1,80 @@ +name: Scan + +on: + workflow_dispatch: + push: + branches: + - "main" + - "rc" + - "hotfix-rc" + pull_request_target: + types: [opened, synchronize] + +jobs: + check-run: + name: Check PR run + uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + + sast: + name: SAST scan + runs-on: ubuntu-22.04 + needs: check-run + permissions: + contents: read + pull-requests: write + security-events: write + + steps: + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Scan with Checkmarx + uses: checkmarx/ast-github-action@f0869bd1a37fddc06499a096101e6c900e815d81 # 2.0.36 + env: + INCREMENTAL: "${{ contains(github.event_name, 'pull_request') && '--sast-incremental' || '' }}" + with: + project_name: ${{ github.repository }} + cx_tenant: ${{ secrets.CHECKMARX_TENANT }} + base_uri: https://ast.checkmarx.net/ + cx_client_id: ${{ secrets.CHECKMARX_CLIENT_ID }} + cx_client_secret: ${{ secrets.CHECKMARX_SECRET }} + additional_params: | + --report-format sarif \ + --filter "state=TO_VERIFY;PROPOSED_NOT_EXPLOITABLE;CONFIRMED;URGENT" \ + --output-path . ${{ env.INCREMENTAL }} + + - name: Upload Checkmarx results to GitHub + uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + with: + sarif_file: cx_result.sarif + + quality: + name: Quality scan + runs-on: ubuntu-22.04 + needs: check-run + permissions: + contents: read + pull-requests: write + + steps: + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Scan with SonarCloud + uses: sonarsource/sonarcloud-github-action@383f7e52eae3ab0510c3cb0e7d9d150bbaeab838 # v3.1.0 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: > + -Dsonar.organization=${{ github.repository_owner }} + -Dsonar.projectKey=${{ github.repository_owner }}_${{ github.event.repository.name }} + -Dsonar.tests=. + -Dsonar.sources=. + -Dsonar.test.inclusions=**/*.spec.ts + -Dsonar.exclusions=**/*.spec.ts diff --git a/.github/workflows/staged-rollout-desktop.yml b/.github/workflows/staged-rollout-desktop.yml index b0c57e1a1be..91250a443f2 100644 --- a/.github/workflows/staged-rollout-desktop.yml +++ b/.github/workflows/staged-rollout-desktop.yml @@ -1,4 +1,3 @@ ---- name: Staged Rollout Desktop on: @@ -20,40 +19,32 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: keyvault: "bitwarden-ci" secrets: "aws-electron-access-id, aws-electron-access-key, - aws-electron-bucket-name, - r2-electron-access-id, - r2-electron-access-key, - r2-electron-bucket-name, - cf-prod-account" + aws-electron-bucket-name" - - name: Download channel update info files from R2 + - name: Download channel update info files from S3 env: - AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }} - AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }} - AWS_DEFAULT_REGION: 'us-east-1' - AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.r2-electron-bucket-name }} - CF_ACCOUNT: ${{ steps.retrieve-secrets.outputs.cf-prod-account }} + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }} + AWS_DEFAULT_REGION: 'us-west-2' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }} run: | aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest.yml . \ - --quiet \ - --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com + --quiet aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest-linux.yml . \ - --quiet \ - --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com + --quiet aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest-mac.yml . \ - --quiet \ - --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com + --quiet - name: Check new rollout percentage env: @@ -95,20 +86,3 @@ jobs: aws s3 cp latest-mac.yml $AWS_S3_BUCKET_NAME/desktop/ \ --acl "public-read" - - - name: Publish channel update info files to R2 - env: - AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }} - AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }} - AWS_DEFAULT_REGION: 'us-east-1' - AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.r2-electron-bucket-name }} - CF_ACCOUNT: ${{ steps.retrieve-secrets.outputs.cf-prod-account }} - run: | - aws s3 cp latest.yml $AWS_S3_BUCKET_NAME/desktop/ \ - --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com - - aws s3 cp latest-linux.yml $AWS_S3_BUCKET_NAME/desktop/ \ - --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com - - aws s3 cp latest-mac.yml $AWS_S3_BUCKET_NAME/desktop/ \ - --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index 98f3b9d1722..6caa7b99331 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -1,4 +1,3 @@ ---- name: 'Close stale issues and PRs' on: workflow_dispatch: @@ -8,10 +7,10 @@ on: jobs: stale: name: 'Check for stale issues and PRs' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: 'Run stale action' - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0 + uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 with: stale-issue-label: 'needs-reply' stale-pr-label: 'needs-changes' @@ -27,4 +26,4 @@ jobs: If you’re still working on this, please respond here after you’ve made the changes we’ve requested and our team will re-open it for further review. - Please make sure to resolve any conflicts with the master branch before requesting another review. + Please make sure to resolve any conflicts with the main branch before requesting another review. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 55363a329ea..72bc3594beb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,38 +1,60 @@ ---- -name: Run tests +name: Testing on: workflow_dispatch: + push: + branches: + - "main" + - "rc" + - "hotfix-rc-*" pull_request: - branches-ignore: - - 'l10n_master' - - 'cf-pages' - paths: - - 'apps/**' - - 'libs/**' - - '*' - - '!*.md' - - '!*.txt' - - '.github/workflows/test.yml' - -defaults: - run: - shell: bash + types: [opened, synchronize] jobs: - test: + check-test-secrets: + name: Check for test secrets + runs-on: ubuntu-22.04 + outputs: + available: ${{ steps.check-test-secrets.outputs.available }} + permissions: + contents: read + + steps: + - name: Check + id: check-test-secrets + run: | + if [ "${{ secrets.CODECOV_TOKEN }}" != '' ]; then + echo "available=true" >> $GITHUB_OUTPUT; + else + echo "available=false" >> $GITHUB_OUTPUT; + fi + + testing: name: Run tests runs-on: ubuntu-22.04 + needs: check-test-secrets + permissions: + checks: write + contents: read + pull-requests: write + steps: - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Get Node Version + id: retrieve-node-version + run: | + NODE_NVMRC=$(cat .nvmrc) + NODE_VERSION=${NODE_NVMRC/v/''} + echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' - node-version: '18' + node-version: ${{ steps.retrieve-node-version.outputs.node_version }} - name: Print environment run: | @@ -49,30 +71,46 @@ jobs: run: npm run test:types - name: Run tests - run: npm run test + # maxWorkers is a workaround for a memory leak that crashes tests in CI: + # https://github.com/facebook/jest/issues/9430#issuecomment-1149882002 + run: npm test -- --coverage --maxWorkers=3 - name: Report test results - uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 # v1.6.0 - if: always() + uses: dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5 # v1.9.1 + if: ${{ needs.check-test-secrets.outputs.available == 'true' && !cancelled() }} with: name: Test Results path: "junit.xml" reporter: jest-junit fail-on-error: true + - name: Upload coverage to codecov.io + uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + if: ${{ needs.check-test-secrets.outputs.available == 'true' }} + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + - name: Upload results to codecov.io + uses: codecov/test-results-action@9739113ad922ea0a9abb4b2c0f8bf6a4aa8ef820 # v1.0.1 + if: ${{ needs.check-test-secrets.outputs.available == 'true' }} + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + rust: - name: rust - ${{ matrix.os }} - runs-on: ${{ matrix.os || 'ubuntu-latest' }} + name: Run Rust tests on ${{ matrix.os }} + runs-on: ${{ matrix.os || 'ubuntu-22.04' }} + permissions: + contents: read strategy: matrix: os: - - ubuntu-latest + - ubuntu-22.04 - macos-latest - windows-latest steps: - - name: Rust version check + - name: Check Rust version run: rustup --version - name: Install gnome-keyring @@ -81,8 +119,8 @@ jobs: sudo apt-get update sudo apt-get install -y gnome-keyring dbus-x11 - - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Build working-directory: ./apps/desktop/desktop_native @@ -99,7 +137,12 @@ jobs: eval "$(printf '\n' | /usr/bin/gnome-keyring-daemon --start)" cargo test -- --test-threads=1 - - name: Test Windows / macOS - if: ${{ matrix.os!='ubuntu-latest' }} + - name: Test macOS + if: ${{ matrix.os=='macos-latest' }} working-directory: ./apps/desktop/desktop_native run: cargo test -- --test-threads=1 + + - name: Test Windows + if: ${{ matrix.os=='windows-latest'}} + working-directory: ./apps/desktop/desktop_native/core + run: cargo test -- --test-threads=1 diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index 7b1a787d946..f41261cb39a 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -1,48 +1,62 @@ ---- -name: Version Auto Bump +name: Auto Bump Desktop Version on: push: tags: - desktop-v** -defaults: - run: - shell: bash - jobs: - setup: - name: "Setup" - runs-on: ubuntu-22.04 - outputs: - version_number: ${{ steps.version.outputs.new-version }} + bump-version: + name: Bump Desktop Version + runs-on: ubuntu-24.04 steps: - - name: Checkout Branch - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Generate GH App token + uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 + id: app-token + with: + app-id: ${{ secrets.BW_GHAPP_ID }} + private-key: ${{ secrets.BW_GHAPP_KEY }} - - name: Calculate bumped version - id: version - env: - RELEASE_TAG: ${{ github.ref }} + - name: Check out target ref + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: main + token: ${{ steps.app-token.outputs.token }} + + - name: Configure Git run: | - CURR_MAJOR=$(echo $RELEASE_TAG | sed -r 's/refs\/tags\/[a-z]*-v([0-9]{4}\.[0-9]{1,2})\.([0-9]{1,2})/\1/') - CURR_PATCH=$(echo $RELEASE_TAG | sed -r 's/refs\/tags\/[a-z]*-v([0-9]{4}\.[0-9]{1,2})\.([0-9]{1,2})/\2/') - echo "Current Major: $CURR_MAJOR" - echo "Current Patch: $CURR_PATCH" + git config --local user.email "actions@github.com" + git config --local user.name "Github Actions" - NEW_PATCH=$((CURR_PATCH+1)) + - name: Get current Desktop version + id: current-desktop-version + run: | + CURRENT_VERSION=$(cat package.json | jq -r '.version') + echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT + working-directory: apps/desktop - echo "New patch: $NEW_PATCH" + - name: Calculate next Desktop release version + id: calculate-next-desktop-version + uses: bitwarden/gh-actions/version-next@main + with: + version: ${{ steps.current-desktop-version.outputs.version }} - NEW_VER=$CURR_MAJOR.$NEW_PATCH - echo "New Version: $NEW_VER" - echo "new-version=$NEW_VER" >> $GITHUB_OUTPUT + - name: Bump Desktop Version - Root - Automatic Calculation + id: bump-desktop-version-automatic + env: + VERSION: ${{ steps.calculate-next-desktop-version.outputs.version }} + run: npm version --workspace=@bitwarden/desktop $VERSION - trigger_version_bump: - name: Bump version to ${{ needs.setup.outputs.version_number }} - needs: setup - uses: ./.github/workflows/version-bump.yml - with: - version_number: ${{ needs.setup.outputs.version_number }} - bump_desktop: true - secrets: inherit + - name: Bump Desktop Version - App - Automatic Calculation + env: + VERSION: ${{ steps.calculate-next-desktop-version.outputs.version }} + run: npm version $VERSION + working-directory: "apps/desktop/src" + + - name: Commit files + env: + VERSION: ${{ steps.calculate-next-desktop-version.outputs.version }} + run: git commit -m "Bumped Desktop client to $VERSION" -a + + - name: Push changes + run: git push diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml deleted file mode 100644 index f50a6fe6cd5..00000000000 --- a/.github/workflows/version-bump.yml +++ /dev/null @@ -1,287 +0,0 @@ ---- -name: Version Bump -run-name: Version Bump - ${{ github.ref_name }} - -on: - workflow_dispatch: - inputs: - bump_browser: - description: "Browser Project Version Bump" - type: boolean - default: false - bump_cli: - description: "CLI Project Version Bump" - type: boolean - default: false - bump_desktop: - description: "Desktop Project Version Bump" - type: boolean - default: false - bump_web: - description: "Web Project Version Bump" - type: boolean - default: false - version_number: - description: "New Version" - required: true - - workflow_call: - inputs: - version_number: - required: true - type: string - bump_desktop: - description: "Desktop Project Version Bump" - type: boolean - default: false - -defaults: - run: - shell: bash - -jobs: - bump_version: - name: "Bump Version" - runs-on: ubuntu-22.04 - steps: - - name: Checkout Branch - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Login to Azure - Prod Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - keyvault: "bitwarden-ci" - secrets: "github-gpg-private-key, github-gpg-private-key-passphrase" - - - name: Import GPG key - uses: crazy-max/ghaction-import-gpg@72b6676b71ab476b77e676928516f6982eef7a41 # v5.3.0 - with: - gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} - passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} - git_user_signingkey: true - git_commit_gpgsign: true - - - name: Create Version Branch - id: branch - env: - VERSION: ${{ inputs.version_number }} - run: | - CLIENTS=() - if [[ ${{ inputs.bump_browser }} == true ]]; then - CLIENTS+=("browser") - fi - if [[ ${{ inputs.bump_cli }} == true ]]; then - CLIENTS+=("cli") - fi - if [[ ${{ inputs.bump_desktop }} == true ]]; then - CLIENTS+=("desktop") - fi - if [[ ${{ inputs.bump_web }} == true ]]; then - CLIENTS+=("web") - fi - printf -v joined '%s,' "${CLIENTS[@]}" - echo "client=${joined%,}" >> $GITHUB_OUTPUT - - BRANCH=version_bump_${VERSION}_${GITHUB_SHA:0:7} - echo "branch=$BRANCH" >> $GITHUB_OUTPUT - git switch -c ${BRANCH} - - ######################## - # VERSION BUMP SECTION # - ######################## - - ### Browser - - name: Browser - Verify input version - if: ${{ inputs.bump_browser == true }} - env: - NEW_VERSION: ${{ inputs.version_number }} - run: | - CURRENT_VERSION=$(cat package.json | jq -r '.version') - - # Error if version has not changed. - if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then - echo "Version has not changed." - exit 1 - fi - - # Check if version is newer. - printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V - if [ $? -eq 0 ]; then - echo "Version check successful." - fi - working-directory: apps/browser - - - name: Bump Browser Version - if: ${{ inputs.bump_browser == true }} - env: - VERSION: ${{ inputs.version_number }} - run: npm version --workspace=@bitwarden/browser ${VERSION} - - - name: Bump Browser Version - Manifest - if: ${{ inputs.bump_browser == true }} - uses: bitwarden/gh-actions/version-bump@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - version: ${{ inputs.version_number }} - file_path: "apps/browser/src/manifest.json" - - - name: Bump Browser Version - Manifest v3 - if: ${{ inputs.bump_browser == true }} - uses: bitwarden/gh-actions/version-bump@62d1bf7c3e31c458cc7236b1e69a475d235cd78f - with: - version: ${{ inputs.version_number }} - file_path: "apps/browser/src/manifest.v3.json" - - - name: Run Prettier after Browser Version Bump - if: ${{ inputs.bump_browser == true }} - run: | - npm install -g prettier - prettier --write apps/browser/src/manifest.json - prettier --write apps/browser/src/manifest.v3.json - - ### CLI - - name: CLI - Verify input version - if: ${{ inputs.bump_cli == true }} - env: - NEW_VERSION: ${{ inputs.version_number }} - run: | - CURRENT_VERSION=$(cat package.json | jq -r '.version') - - # Error if version has not changed. - if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then - echo "Version has not changed." - exit 1 - fi - - # Check if version is newer. - printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V - if [ $? -eq 0 ]; then - echo "Version check successful." - fi - working-directory: apps/cli - - - name: Bump CLI Version - if: ${{ inputs.bump_cli == true }} - env: - VERSION: ${{ inputs.version_number }} - run: npm version --workspace=@bitwarden/cli ${VERSION} - - ### Desktop - - name: Desktop - Verify input version - if: ${{ inputs.bump_desktop == true }} - env: - NEW_VERSION: ${{ inputs.version_number }} - run: | - CURRENT_VERSION=$(cat package.json | jq -r '.version') - - # Error if version has not changed. - if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then - echo "Version has not changed." - exit 1 - fi - - # Check if version is newer. - printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V - if [ $? -eq 0 ]; then - echo "Version check successful." - fi - working-directory: apps/desktop - - - name: Bump Desktop Version - Root - if: ${{ inputs.bump_desktop == true }} - env: - VERSION: ${{ inputs.version_number }} - run: npm version --workspace=@bitwarden/desktop ${VERSION} - - - name: Bump Desktop Version - App - if: ${{ inputs.bump_desktop == true }} - env: - VERSION: ${{ inputs.version_number }} - run: npm version ${VERSION} - working-directory: "apps/desktop/src" - - ### Web - - name: Web - Verify input version - if: ${{ inputs.bump_web == true }} - env: - NEW_VERSION: ${{ inputs.version_number }} - run: | - CURRENT_VERSION=$(cat package.json | jq -r '.version') - - # Error if version has not changed. - if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then - echo "Version has not changed." - exit 1 - fi - - # Check if version is newer. - printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V - if [ $? -eq 0 ]; then - echo "Version check successful." - fi - working-directory: apps/web - - - name: Bump Web Version - if: ${{ inputs.bump_web == true }} - env: - VERSION: ${{ inputs.version_number }} - run: npm version --workspace=@bitwarden/web-vault ${VERSION} - - ######################## - - - name: Setup git - run: | - git config --local user.email "106330231+bitwarden-devops-bot@users.noreply.github.com" - git config --local user.name "bitwarden-devops-bot" - - - name: Check if version changed - id: version-changed - run: | - if [ -n "$(git status --porcelain)" ]; then - echo "changes_to_commit=TRUE" >> $GITHUB_OUTPUT - else - echo "changes_to_commit=FALSE" >> $GITHUB_OUTPUT - echo "No changes to commit!"; - fi - - - name: Commit files - if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} - env: - CLIENT: ${{ steps.branch.outputs.client }} - VERSION: ${{ inputs.version_number }} - run: git commit -m "Bumped ${CLIENT} version to ${VERSION}" -a - - - name: Push changes - if: ${{ (github.ref == 'refs/heads/master') && (steps.version-changed.outputs.changes_to_commit == 'TRUE') }} - env: - BRANCH: ${{ steps.branch.outputs.branch }} - run: git push -u origin ${BRANCH} - - - name: Create Bump Version PR - if: ${{ (github.ref == 'refs/heads/master') && (steps.version-changed.outputs.changes_to_commit == 'TRUE') }} - env: - BASE_BRANCH: master - BRANCH: ${{ steps.branch.outputs.branch }} - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - TITLE: "Bump ${{ steps.branch.outputs.client }} version to ${{ inputs.version_number }}" - run: | - gh pr create --title "$TITLE" \ - --base "$BASE_BRANCH" \ - --head "$BRANCH" \ - --label "version update" \ - --label "automated pr" \ - --body " - ## Type of change - - [ ] Bug fix - - [ ] New feature development - - [ ] Tech debt (refactoring, code cleanup, dependency upgrades, etc) - - [ ] Build/deploy pipeline (DevOps) - - [X] Other - - ## Objective - Automated ${{ steps.branch.outputs.client }} version bump to ${{ inputs.version_number }}" diff --git a/.github/workflows/workflow-linter.yml b/.github/workflows/workflow-linter.yml deleted file mode 100644 index f38d228dda6..00000000000 --- a/.github/workflows/workflow-linter.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Workflow Linter - -on: - pull_request: - paths: - - .github/workflows/** - -jobs: - call-workflow: - uses: bitwarden/gh-actions/.github/workflows/workflow-linter.yml@62d1bf7c3e31c458cc7236b1e69a475d235cd78f diff --git a/.gitignore b/.gitignore index 11a4d4c80ff..d0d8edd596c 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,9 @@ npm-debug.log dist build .angular/cache +.flatpak +.flatpak-repo +.flatpak-builder # Testing coverage @@ -42,3 +45,6 @@ junit.xml documentation.json .eslintcache storybook-static + +# Local app configuration +apps/**/config/local.json diff --git a/.husky/pre-commit b/.husky/pre-commit index 36af219892f..2312dc587f6 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - npx lint-staged diff --git a/.nvmrc b/.nvmrc index 3f430af82b3..9a2a0e219c9 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18 +v20 diff --git a/.prettierignore b/.prettierignore index 986cadd3d59..cd8eb201f3f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,7 +9,6 @@ storybook-static # External libraries / auto synced locales apps/browser/src/_locales apps/browser/src/auth/scripts/duo.js -apps/browser/src/autofill/content/autofill.js apps/browser/src/safari apps/desktop/src/locales diff --git a/.storybook/main.ts b/.storybook/main.ts index acc6e2a56db..454da4377dc 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,21 +1,33 @@ +import { dirname, join } from "path"; import { StorybookConfig } from "@storybook/angular"; import TsconfigPathsPlugin from "tsconfig-paths-webpack-plugin"; import remarkGfm from "remark-gfm"; const config: StorybookConfig = { stories: [ + "../libs/auth/src/**/*.mdx", + "../libs/auth/src/**/*.stories.@(js|jsx|ts|tsx)", + "../libs/tools/send/send-ui/src/**/*.mdx", + "../libs/tools/send/send-ui/src/**/*.stories.@(js|jsx|ts|tsx)", + "../libs/vault/src/**/*.mdx", + "../libs/vault/src/**/*.stories.@(js|jsx|ts|tsx)", "../libs/components/src/**/*.mdx", "../libs/components/src/**/*.stories.@(js|jsx|ts|tsx)", "../apps/web/src/**/*.mdx", "../apps/web/src/**/*.stories.@(js|jsx|ts|tsx)", + "../apps/browser/src/**/*.mdx", + "../apps/browser/src/**/*.stories.@(js|jsx|ts|tsx)", "../bitwarden_license/bit-web/src/**/*.mdx", "../bitwarden_license/bit-web/src/**/*.stories.@(js|jsx|ts|tsx)", + "../libs/tools/card/src/**/*.mdx", + "../libs/tools/card/src/**/*.stories.@(js|jsx|ts|tsx)", ], addons: [ - "@storybook/addon-links", - "@storybook/addon-essentials", - "@storybook/addon-a11y", - "@storybook/addon-designs", + getAbsolutePath("@storybook/addon-links"), + getAbsolutePath("@storybook/addon-essentials"), + getAbsolutePath("@storybook/addon-a11y"), + getAbsolutePath("@storybook/addon-designs"), + getAbsolutePath("@storybook/addon-interactions"), { name: "@storybook/addon-docs", options: { @@ -28,7 +40,7 @@ const config: StorybookConfig = { }, ], framework: { - name: "@storybook/angular", + name: getAbsolutePath("@storybook/angular"), options: {}, }, core: { @@ -36,9 +48,7 @@ const config: StorybookConfig = { }, env: (config) => ({ ...config, - FLAGS: JSON.stringify({ - secretsManager: true, - }), + FLAGS: JSON.stringify({}), }), webpackFinal: async (config, { configType }) => { if (config.resolve) { @@ -46,9 +56,12 @@ const config: StorybookConfig = { } return config; }, - docs: { - autodocs: true, - }, + docs: {}, }; export default config; + +// Recommended for mono-repositories +function getAbsolutePath(value: string): any { + return dirname(require.resolve(join(value, "package.json"))); +} diff --git a/.storybook/manager.js b/.storybook/manager.js new file mode 100644 index 00000000000..409f93ec505 --- /dev/null +++ b/.storybook/manager.js @@ -0,0 +1,63 @@ +import { addons } from "@storybook/manager-api"; +import { create } from "@storybook/theming/create"; + +const lightTheme = create({ + base: "light", + //logo and Title + brandTitle: "Bitwarden Component Library", + brandUrl: "/", + brandImage: + "https://github.com/bitwarden/brand/blob/51942f8d6e55e96a078a524e0f739efbf1997bcf/logos/logo-horizontal-blue.png?raw=true", + brandTarget: "_self", + + //Colors + colorPrimary: "#6D757E", + colorSecondary: "#175DDC", + + // UI + appBg: "#f9fBff", + appContentBg: "#ffffff", + appBorderColor: "#CED4DC", + + // Text colors + textColor: "#212529", + textInverseColor: "#ffffff", + + // Toolbar default and active colors + barTextColor: "#6D757E", + barSelectedColor: "#175DDC", + barBg: "#ffffff", + + // Form colors + inputBg: "#ffffff", + inputBorder: "#6D757E", + inputTextColor: "#6D757E", +}); + +const darkTheme = create({ + base: "dark", + + //logo and Title + brandTitle: "Bitwarden Component Library", + brandUrl: "/", + brandImage: + "https://github.com/bitwarden/brand/blob/51942f8d6e55e96a078a524e0f739efbf1997bcf/logos/logo-horizontal-white.png?raw=true", + brandTarget: "_self", + + //Colors + colorSecondary: "#6A99F0", + barSelectedColor: "#6A99F0", +}); + +export const getPreferredColorScheme = () => { + if (!globalThis || !globalThis.matchMedia) return "light"; + + const isDarkThemePreferred = globalThis.matchMedia("(prefers-color-scheme: dark)").matches; + if (isDarkThemePreferred) return "dark"; + + return "light"; +}; + +addons.setConfig({ + theme: getPreferredColorScheme() === "dark" ? darkTheme : lightTheme, +}); diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 0bc9fc5bacb..d1ba27e108d 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -48,7 +48,7 @@ const decorator = componentWrapperDecorator( }, ({ globals }) => { return { theme: `${globals["theme"]}` }; - } + }, ); const preview: Preview = { @@ -92,7 +92,6 @@ const preview: Preview = { }, }, parameters: { - actions: { argTypesRegex: "^on[A-Z].*" }, controls: { matchers: { color: /(background|color)$/i, @@ -107,6 +106,7 @@ const preview: Preview = { }, docs: { source: { type: "dynamic", excludeDecorators: true } }, }, + tags: ["autodocs"], }; export default preview; diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json index 113cc5bcde5..34acc9a740c 100644 --- a/.storybook/tsconfig.json +++ b/.storybook/tsconfig.json @@ -1,12 +1,10 @@ { "extends": "../tsconfig", "compilerOptions": { - "types": ["node", "jest", "chrome"], "allowSyntheticDefaultImports": true }, - "exclude": ["../src/test.setup.ts", "../apps/src/**/*.spec.ts", "../libs/**/*.spec.ts"], + "exclude": ["../src/test.setup.ts", "../apps/**/*.spec.ts", "../libs/**/*.spec.ts"], "files": [ - "./typings.d.ts", "./preview.tsx", "../libs/components/src/main.ts", "../libs/components/src/polyfills.ts" diff --git a/.storybook/typings.d.ts b/.storybook/typings.d.ts deleted file mode 100644 index c94d67b1a26..00000000000 --- a/.storybook/typings.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module "*.md" { - const content: string; - export default content; -} diff --git a/.vscode/settings.json b/.vscode/settings.json index 27e3a9b293a..3a70af3481d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,5 +5,6 @@ "**/locales/*[^n]/messages.json": true, "**/_locales/[^e]*/messages.json": true, "**/_locales/*[^n]/messages.json": true - } + }, + "rust-analyzer.linkedProjects": ["apps/desktop/desktop_native/Cargo.toml"] } diff --git a/README.md b/README.md index df1f22a0949..22c8d329f1c 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,12 @@

- Bitwarden + Bitwarden

- - Github Workflow browser build on master - - - Github Workflow CLI build on master - - - Github Workflow desktop build on master - - - Github Workflow web build on master - - - gitter chat - + GitHub Workflow browser build on main + GitHub Workflow CLI build on main + GitHub Workflow desktop build on main + GitHub Workflow web build on main + gitter chat

--- @@ -30,7 +20,8 @@ Please refer to the [Clients section](https://contributing.bitwarden.com/getting ## Related projects: - [bitwarden/server](https://github.com/bitwarden/server): The core infrastructure backend (API, database, Docker, etc). -- [bitwarden/mobile](https://github.com/bitwarden/mobile): The mobile app vault (iOS and Android). +- [bitwarden/ios](https://github.com/bitwarden/ios): Bitwarden mobile app for iOS. +- [bitwarden/android](https://github.com/bitwarden/android): Bitwarden mobile app for Android. - [bitwarden/directory-connector](https://github.com/bitwarden/directory-connector): A tool for syncing a directory (AD, LDAP, Azure, G Suite, Okta) to an organization. # We're Hiring! @@ -39,6 +30,6 @@ Interested in contributing in a big way? Consider joining our team! We're hiring # Contribute -Code contributions are welcome! Please commit any pull requests against the `master` branch. Learn more about how to contribute by reading the [Contributing Guidelines](https://contributing.bitwarden.com/contributing/). Check out the [Contributing Documentation](https://contributing.bitwarden.com/) for how to get started with your first contribution. +Code contributions are welcome! Please commit any pull requests against the `main` branch. Learn more about how to contribute by reading the [Contributing Guidelines](https://contributing.bitwarden.com/contributing/). Check out the [Contributing Documentation](https://contributing.bitwarden.com/) for how to get started with your first contribution. Security audits and feedback are welcome. Please open an issue or email us privately if the report is sensitive in nature. You can read our security policy in the [`SECURITY.md`](SECURITY.md) file. diff --git a/angular.json b/angular.json index 4b62c771cbf..7053050262e 100644 --- a/angular.json +++ b/angular.json @@ -128,10 +128,10 @@ "builder": "@angular-devkit/build-angular:dev-server", "configurations": { "production": { - "browserTarget": "test-storybook:build:production" + "buildTarget": "test-storybook:build:production" }, "development": { - "browserTarget": "test-storybook:build:development" + "buildTarget": "test-storybook:build:development" } }, "defaultConfiguration": "development" @@ -142,7 +142,15 @@ "configDir": ".storybook", "browserTarget": "components:build", "compodoc": true, - "compodocArgs": ["-p", "./tsconfig.json", "-e", "json", "-d", "."], + "compodocArgs": [ + "-p", + "./tsconfig.json", + "-e", + "json", + "-d", + ".", + "--disableRoutesGraph" + ], "port": 6006 } }, @@ -152,7 +160,15 @@ "configDir": ".storybook", "browserTarget": "components:build", "compodoc": true, - "compodocArgs": ["-e", "json", "-d", "."], + "compodocArgs": [ + "-p", + "./tsconfig.json", + "-e", + "json", + "-d", + ".", + "--disableRoutesGraph" + ], "outputDir": "storybook-static" } } diff --git a/apps/browser/.eslintrc.json b/apps/browser/.eslintrc.json new file mode 100644 index 00000000000..ba960511839 --- /dev/null +++ b/apps/browser/.eslintrc.json @@ -0,0 +1,26 @@ +{ + "env": { + "browser": true, + "webextensions": true + }, + "overrides": [ + { + "files": ["src/**/*.ts"], + "excludedFiles": [ + "src/**/{content,popup,spec}/**/*.ts", + "src/**/autofill/{notification,overlay}/**/*.ts", + "src/**/autofill/**/{autofill-overlay-content,collect-autofill-content,dom-element-visibility,insert-autofill-content}.service.ts", + "src/**/*.spec.ts" + ], + "rules": { + "no-restricted-globals": [ + "error", + { + "name": "window", + "message": "The `window` object is not available in service workers and may not be available within the background script. Consider using `self`, `globalThis`, or another global property instead." + } + ] + } + } + ] +} diff --git a/apps/browser/.gitignore b/apps/browser/.gitignore index 7a689bdb9f0..87b21b97308 100644 --- a/apps/browser/.gitignore +++ b/apps/browser/.gitignore @@ -1,3 +1,5 @@ +config/local.json + # Safari dist-safari !src/safari/safari/app/popup/index.html diff --git a/apps/browser/README.md b/apps/browser/README.md index 2cd1615a112..c99d0844a09 100644 --- a/apps/browser/README.md +++ b/apps/browser/README.md @@ -4,13 +4,13 @@ # Bitwarden Browser Extension - + - - + + The Bitwarden browser extension is written using the Web Extension API and Angular. diff --git a/apps/browser/config/base.json b/apps/browser/config/base.json index 81b11cd38b7..02bdc5d22af 100644 --- a/apps/browser/config/base.json +++ b/apps/browser/config/base.json @@ -1,6 +1,7 @@ { - "dev_flags": {}, + "devFlags": {}, "flags": { - "showPasswordless": true + "accountSwitching": false, + "sdk": true } } diff --git a/apps/browser/config/development.json b/apps/browser/config/development.json index 972812a9c59..042a98c2c39 100644 --- a/apps/browser/config/development.json +++ b/apps/browser/config/development.json @@ -1,11 +1,11 @@ { "devFlags": { - "storeSessionDecrypted": false, "managedEnvironment": { "base": "https://localhost:8080" - } + }, + "skipWelcomeOnInstall": true }, "flags": { - "showPasswordless": true + "accountSwitching": true } } diff --git a/apps/browser/config/production.json b/apps/browser/config/production.json index b04d1531a2f..a43eee1d5c9 100644 --- a/apps/browser/config/production.json +++ b/apps/browser/config/production.json @@ -1,3 +1,5 @@ { - "flags": {} + "flags": { + "accountSwitching": true + } } diff --git a/apps/browser/gulpfile.js b/apps/browser/gulpfile.js deleted file mode 100644 index 2f672ffcdd4..00000000000 --- a/apps/browser/gulpfile.js +++ /dev/null @@ -1,236 +0,0 @@ -const child = require("child_process"); -const fs = require("fs"); - -const del = require("del"); -const gulp = require("gulp"); -const filter = require("gulp-filter"); -const gulpif = require("gulp-if"); -const jeditor = require("gulp-json-editor"); -const replace = require("gulp-replace"); -const zip = require("gulp-zip"); - -const manifest = require("./src/manifest.json"); - -const paths = { - build: "./build/", - dist: "./dist/", - coverage: "./coverage/", - node_modules: "./node_modules/", - popupDir: "./src/popup/", - cssDir: "./src/popup/css/", - safari: "./src/safari/", -}; - -const filters = { - fonts: [ - "!build/popup/fonts/*", - "build/popup/fonts/Open_Sans*.woff", - "build/popup/fonts/bwi-font.woff2", - "build/popup/fonts/bwi-font.woff", - "build/popup/fonts/bwi-font.ttf", - ], - safari: ["!build/safari/**/*"], -}; - -function buildString() { - var build = ""; - if (process.env.MANIFEST_VERSION) { - build = `-mv${process.env.MANIFEST_VERSION}`; - } - if (process.env.BUILD_NUMBER && process.env.BUILD_NUMBER !== "") { - build = `-${process.env.BUILD_NUMBER}`; - } - return build; -} - -function distFileName(browserName, ext) { - return `dist-${browserName}${buildString()}.${ext}`; -} - -function dist(browserName, manifest) { - return gulp - .src(paths.build + "**/*") - .pipe(filter(["**"].concat(filters.fonts).concat(filters.safari))) - .pipe(gulpif("popup/index.html", replace("__BROWSER__", "browser_" + browserName))) - .pipe(gulpif("manifest.json", jeditor(manifest))) - .pipe(zip(distFileName(browserName, "zip"))) - .pipe(gulp.dest(paths.dist)); -} - -function distFirefox() { - return dist("firefox", (manifest) => { - delete manifest.storage; - return manifest; - }); -} - -function distOpera() { - return dist("opera", (manifest) => { - delete manifest.applications; - return manifest; - }); -} - -function distChrome() { - return dist("chrome", (manifest) => { - delete manifest.applications; - delete manifest.sidebar_action; - delete manifest.commands._execute_sidebar_action; - return manifest; - }); -} - -function distEdge() { - return dist("edge", (manifest) => { - delete manifest.applications; - delete manifest.sidebar_action; - delete manifest.commands._execute_sidebar_action; - return manifest; - }); -} - -function distSafariMas(cb) { - return distSafariApp(cb, "mas"); -} - -function distSafariMasDev(cb) { - return distSafariApp(cb, "masdev"); -} - -function distSafariDmg(cb) { - return distSafariApp(cb, "dmg"); -} - -function distSafariApp(cb, subBuildPath) { - const buildPath = paths.dist + "Safari/" + subBuildPath + "/"; - const builtAppexPath = buildPath + "build/Release/safari.appex"; - const builtAppexFrameworkPath = buildPath + "build/Release/safari.appex/Contents/Frameworks/"; - const entitlementsPath = paths.safari + "safari/safari.entitlements"; - var args = [ - "--verbose", - "--force", - "-o", - "runtime", - "--sign", - "Developer ID Application: 8bit Solutions LLC", - "--entitlements", - entitlementsPath, - ]; - if (subBuildPath !== "dmg") { - args = [ - "--verbose", - "--force", - "--sign", - subBuildPath === "mas" - ? "3rd Party Mac Developer Application: Bitwarden Inc" - : "E661AB6249AEB60B0F47ABBD7326B2877D2575B0", - "--entitlements", - entitlementsPath, - ]; - } - - return del([buildPath + "**/*"]) - .then(() => safariCopyAssets(paths.safari + "**/*", buildPath)) - .then(() => safariCopyBuild(paths.build + "**/*", buildPath + "safari/app")) - .then(() => { - const proc = child.spawn("xcodebuild", [ - "-project", - buildPath + "desktop.xcodeproj", - "-alltargets", - "-configuration", - "Release", - ]); - stdOutProc(proc); - return new Promise((resolve) => proc.on("close", resolve)); - }) - .then(() => { - const libs = fs - .readdirSync(builtAppexFrameworkPath) - .filter((p) => p.endsWith(".dylib")) - .map((p) => builtAppexFrameworkPath + p); - const libPromises = []; - libs.forEach((i) => { - const proc = child.spawn("codesign", args.concat([i])); - stdOutProc(proc); - libPromises.push(new Promise((resolve) => proc.on("close", resolve))); - }); - return Promise.all(libPromises); - }) - .then(() => { - const proc = child.spawn("codesign", args.concat([builtAppexPath])); - stdOutProc(proc); - return new Promise((resolve) => proc.on("close", resolve)); - }) - .then( - () => { - return cb; - }, - () => { - return cb; - } - ); -} - -function safariCopyAssets(source, dest) { - return new Promise((resolve, reject) => { - gulp - .src(source) - .on("error", reject) - .pipe(gulpif("safari/Info.plist", replace("0.0.1", manifest.version))) - .pipe( - gulpif("safari/Info.plist", replace("0.0.2", process.env.BUILD_NUMBER || manifest.version)) - ) - .pipe(gulpif("desktop.xcodeproj/project.pbxproj", replace("../../../build", "../safari/app"))) - .pipe(gulp.dest(dest)) - .on("end", resolve); - }); -} - -function safariCopyBuild(source, dest) { - return new Promise((resolve, reject) => { - gulp - .src(source) - .on("error", reject) - .pipe(filter(["**"].concat(filters.fonts))) - .pipe(gulpif("popup/index.html", replace("__BROWSER__", "browser_safari"))) - .pipe( - gulpif( - "manifest.json", - jeditor((manifest) => { - delete manifest.sidebar_action; - delete manifest.commands._execute_sidebar_action; - delete manifest.optional_permissions; - manifest.permissions.push("nativeMessaging"); - return manifest; - }) - ) - ) - .pipe(gulp.dest(dest)) - .on("end", resolve); - }); -} - -function stdOutProc(proc) { - proc.stdout.on("data", (data) => console.log(data.toString())); - proc.stderr.on("data", (data) => console.error(data.toString())); -} - -function ciCoverage(cb) { - return gulp - .src(paths.coverage + "**/*") - .pipe(filter(["**", "!coverage/coverage*.zip"])) - .pipe(zip(`coverage${buildString()}.zip`)) - .pipe(gulp.dest(paths.coverage)); -} - -exports["dist:firefox"] = distFirefox; -exports["dist:chrome"] = distChrome; -exports["dist:opera"] = distOpera; -exports["dist:edge"] = distEdge; -exports["dist:safari"] = gulp.parallel(distSafariMas, distSafariMasDev, distSafariDmg); -exports["dist:safari:mas"] = distSafariMas; -exports["dist:safari:masdev"] = distSafariMasDev; -exports["dist:safari:dmg"] = distSafariDmg; -exports.dist = gulp.parallel(distFirefox, distChrome, distOpera, distEdge); -exports["ci:coverage"] = ciCoverage; -exports.ci = ciCoverage; diff --git a/apps/browser/jest.config.js b/apps/browser/jest.config.js index cde02cd9959..73f5ada287a 100644 --- a/apps/browser/jest.config.js +++ b/apps/browser/jest.config.js @@ -9,7 +9,10 @@ module.exports = { ...sharedConfig, preset: "jest-preset-angular", setupFilesAfterEnv: ["/test.setup.ts"], - moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, { - prefix: "/", - }), + moduleNameMapper: pathsToModuleNameMapper( + { "@bitwarden/common/spec": ["../../libs/common/spec"], ...(compilerOptions?.paths ?? {}) }, + { + prefix: "/", + }, + ), }; diff --git a/apps/browser/package.json b/apps/browser/package.json index fb7b8ad19bf..ed0a8d36342 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,24 +1,34 @@ { "name": "@bitwarden/browser", - "version": "2023.9.1", + "version": "2024.11.1", "scripts": { - "build": "webpack", - "build:mv3": "cross-env MANIFEST_VERSION=3 webpack", - "build:watch": "webpack --watch", - "build:watch:mv3": "cross-env MANIFEST_VERSION=3 webpack --watch", - "build:prod": "cross-env NODE_ENV=production webpack", - "build:prod:watch": "cross-env NODE_ENV=production webpack --watch", - "dist": "npm run build:prod && gulp dist", - "dist:mv3": "cross-env MANIFEST_VERSION=3 npm run build:prod && cross-env MANIFEST_VERSION=3 gulp dist", - "dist:chrome": "npm run build:prod && gulp dist:chrome", - "dist:firefox": "npm run build:prod && gulp dist:firefox", - "dist:opera": "npm run build:prod && gulp dist:opera", - "dist:safari": "npm run build:prod && gulp dist:safari", - "dist:safari:mas": "npm run build:prod && gulp dist:safari:mas", - "dist:safari:masdev": "npm run build:prod && gulp dist:safari:masdev", - "dist:safari:dmg": "npm run build:prod && gulp dist:safari:dmg", + "build": "npm run build:chrome", + "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 webpack", + "build:edge": "cross-env BROWSER=edge webpack", + "build:firefox": "cross-env BROWSER=firefox webpack", + "build:opera": "cross-env BROWSER=opera webpack", + "build:safari": "cross-env BROWSER=safari webpack", + "build:watch": "npm run build:watch:chrome", + "build:watch:chrome": "npm run build:chrome -- --watch", + "build:watch:edge": "npm run build:edge -- --watch", + "build:watch:firefox": "npm run build:firefox -- --watch", + "build:watch:opera": "npm run build:opera -- --watch", + "build:watch:safari": "npm run build:safari -- --watch", + "build:prod:chrome": "cross-env NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" npm run build:chrome", + "build:prod:edge": "cross-env NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" npm run build:edge", + "build:prod:firefox": "cross-env NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" npm run build:firefox", + "build:prod:opera": "cross-env NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" npm run build:opera", + "build:prod:safari": "cross-env NODE_ENV=production NODE_OPTIONS=\"--max-old-space-size=4096\" npm run build:safari", + "dist:chrome": "npm run build:prod:chrome && mkdir -p dist && ./scripts/compress.ps1 dist-chrome.zip", + "dist:edge": "npm run build:prod:edge && mkdir -p dist && ./scripts/compress.ps1 dist-edge.zip", + "dist:firefox": "npm run build:prod:firefox && mkdir -p dist && ./scripts/compress.ps1 dist-firefox.zip", + "dist:opera": "npm run build:prod:opera && mkdir -p dist && ./scripts/compress.ps1 dist-opera.zip", + "dist:safari": "npm run build:prod:safari && ./scripts/package-safari.ps1", + "dist:edge:mv3": "cross-env MANIFEST_VERSION=3 npm run dist:edge", + "dist:firefox:mv3": "cross-env MANIFEST_VERSION=3 npm run dist:firefox", + "dist:opera:mv3": "cross-env MANIFEST_VERSION=3 npm run dist:opera", + "dist:safari:mv3": "cross-env MANIFEST_VERSION=3 npm run dist:safari", "test": "jest", - "test:coverage": "jest --coverage --coverageDirectory=coverage", "test:watch": "jest --watch", "test:watch:all": "jest --watchAll" } diff --git a/apps/browser/scripts/compress.ps1 b/apps/browser/scripts/compress.ps1 new file mode 100755 index 00000000000..981a07c3c8c --- /dev/null +++ b/apps/browser/scripts/compress.ps1 @@ -0,0 +1,30 @@ +#!/usr/bin/env pwsh + +#### +# Compress the build directory into a zip file. +#### + +param ( + [Parameter(Mandatory = $true)] + [String] $fileName +) + +$buildDir = Join-Path $PSScriptRoot "../build" +$distDir = Join-Path $PSScriptRoot "../dist" + +# Create dist directory if it doesn't exist +if (-not (Test-Path $distDir)) { + New-Item -ItemType Directory -Path $distDir +} + +$distPath = Join-Path -Path $distDir -ChildPath $fileName + +if (Test-Path $distPath) { + Remove-Item $distPath +} + +# Compress build directory +if (Test-Path $buildDir) { + Compress-Archive -Path (Join-Path $buildDir "*") -DestinationPath $distPath + Write-Output "Zipped $buildDir into $distPath" +} diff --git a/apps/browser/scripts/package-safari.ps1 b/apps/browser/scripts/package-safari.ps1 new file mode 100755 index 00000000000..075ed606070 --- /dev/null +++ b/apps/browser/scripts/package-safari.ps1 @@ -0,0 +1,112 @@ +#!/usr/bin/env pwsh + +#### +# Builds the safari appex. +#### + +$buildDir = Join-Path $PSScriptRoot "../build" +$distDir = Join-Path $PSScriptRoot "../dist" + +Write-Output $PSScriptRoot + +if (-not (Test-Path $buildDir)) { + Write-Output "No build directory found. Exiting..." + exit +} + +# Create dist directory if it doesn't exist +if (-not (Test-Path $distDir)) { + New-Item -ItemType Directory -Path $distDir +} + +$subBuildPaths = @("mas", "masdev", "dmg") +$safariSrc = Join-Path $PSScriptRoot "../src/safari" +$safariDistPath = Join-Path -Path $distDir -ChildPath "Safari" + +if (-not (Test-Path $safariDistPath)) { + New-Item -ItemType Directory -Path $safariDistPath +} + +# Delete old safari dists +Remove-Item -LiteralPath $safariDistPath -Force -Recurse + +foreach ($subBuildPath in $subBuildPaths) { + $safariBuildPath = Join-Path -Path $safariDistPath -ChildPath $subBuildPath + $builtAppexPath = Join-Path -Path $safariBuildPath -ChildPath "build/Release/safari.appex" + $builtAppexFrameworkPath = Join-Path -Path $safariBuildPath -ChildPath "build/Release/safari.appex/Contents/Frameworks/" + $entitlementsPath = Join-Path -Path $safariSrc -ChildPath "safari/safari.entitlements" + + switch ($subBuildPath) { + "mas" { + $codesignArgs = @( + "--verbose", + "--force", + "--sign", + '"3rd Party Mac Developer Application: Bitwarden Inc"', + "--entitlements", + $entitlementsPath + ) + } + "masdev" { + $codesignArgs = @( + "--verbose", + "--force", + "--sign", + "E7C9978F6FBCE0553429185C405E61F5380BE8EB", + "--entitlements", + $entitlementsPath + ) + } + "dmg" { + $codesignArgs = @( + "--verbose", + "--force", + "-o", + "runtime", + "--sign", + '"Developer ID Application: 8bit Solutions LLC"', + "--entitlements", + $entitlementsPath + ) + } + } + + # Copy safari src + Copy-Item -Path $safariSrc -Destination $safariBuildPath -Recurse + + # Copy build + $target = Join-Path -Path $safariBuildPath -ChildPath "safari/app" + Copy-Item -Path $buildDir -Destination $target -Recurse + + # Update versions + $jsonFilePath = Join-Path $buildDir "manifest.json" + $jsonContent = Get-Content -Path $jsonFilePath -Raw + $jsonObject = $jsonContent | ConvertFrom-Json + + $infoFile = Join-Path -Path $safariBuildPath -ChildPath "safari/Info.plist" + (Get-Content $infoFile).Replace('0.0.1', $jsonObject.version).Replace('0.0.2', $jsonObject.version) | Set-Content $infoFile + + $projectFile = Join-Path -Path $safariBuildPath -ChildPath "desktop.xcodeproj/project.pbxproj" + (Get-Content $projectFile).Replace('../../../build', "../safari/app") | Set-Content $projectFile + + # Build using xcode + $xcodeBuildArgs = @( + "-project", + (Join-Path $safariBuildPath "desktop.xcodeproj"), + "-alltargets", + "-configuration", + "Release" + ) + $proc = Start-Process "xcodebuild" -ArgumentList $xcodeBuildArgs -NoNewWindow -PassThru + $proc.WaitForExit() + + # Codesign + $libs = Get-ChildItem -Path $builtAppexFrameworkPath -Filter "*.dylib" + foreach ($lib in $libs) { + $proc = Start-Process "codesign" -ArgumentList ($codesignArgs + $lib.FullName) -NoNewWindow -PassThru + $proc.WaitForExit() + } + + $proc = Start-Process "codesign" -ArgumentList ($codesignArgs + $builtAppexPath) -NoNewWindow -PassThru + $proc.WaitForExit() +} diff --git a/apps/browser/spec/mock-port.spec-util.ts b/apps/browser/spec/mock-port.spec-util.ts new file mode 100644 index 00000000000..b5f7825d8e9 --- /dev/null +++ b/apps/browser/spec/mock-port.spec-util.ts @@ -0,0 +1,29 @@ +import { mockDeep } from "jest-mock-extended"; + +/** + * Mocks a chrome.runtime.Port set up to send messages through `postMessage` to `onMessage.addListener` callbacks. + * @param name - The name of the port. + * @param immediateOnConnectExecution - Whether to immediately execute the onConnect callbacks against the new port. + * Defaults to false. If true, the creator of the port will not have had a chance to set up listeners yet. + * @returns a mock chrome.runtime.Port + */ +export function mockPorts() { + // notify listeners of a new port + (chrome.runtime.connect as jest.Mock).mockImplementation((portInfo) => { + const port = mockDeep(); + port.name = portInfo.name; + + // set message broadcast + (port.postMessage as jest.Mock).mockImplementation((message) => { + (port.onMessage.addListener as jest.Mock).mock.calls.forEach(([callbackFn]) => { + callbackFn(message, port); + }); + }); + + (chrome.runtime.onConnect.addListener as jest.Mock).mock.calls.forEach(([callbackFn]) => { + callbackFn(port); + }); + + return port; + }); +} diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index be4eaca46f7..54952f5e733 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Ų…Ø¯ŲŠØą ŲƒŲ„Ų…Ø§ØĒ Ų…ØąŲˆØą Ų…ØŦØ§Ų†ŲŠ", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Ų…Ø¯ŲŠØą ŲƒŲ„Ų…Ø§ØĒ Ų…ØąŲˆØą Ų…ØŦØ§Ų†ŲŠ ؈ØĸŲ…Ų† Ų„ØŦŲ…ŲŠØš ØŖØŦŲ‡Ø˛ØĒ؃.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Ų‚Ų… Ø¨Ø§Ų„ØĒØŗØŦŲŠŲ„ ØŖŲˆ ØĨŲ†Ø´Ø§ØĄ Ø­ØŗØ§Ø¨ ØŦØ¯ŲŠØ¯ Ų„Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ ØŽØ˛Ų†ØĒ؃ Ø§Ų„ØĸŲ…Ų†ØŠ." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "ØĨŲ†Ø´Ø§ØĄ Ø­ØŗØ§Ø¨" }, - "login": { - "message": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø§Ų„ØŖŲØ­Ø§Ø¯ŲŠ Ų„Ų„Ų…Ø¤ØŗØŗØ§ØĒ – SSO" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ŲŠŲ…ŲƒŲ† ØŖŲ† ŲŠØŗØ§ØšØ¯Ųƒ ØĒŲ„Ų…ŲŠØ­ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ؁؊ ØĒØ°ŲƒØą ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ ؁؊ Ø­Ø§Ų„ Ų†ØŗŲŠØĒŲ‡Ø§." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "ØŖØšŲØ¯ ØĨØ¯ØŽØ§Ų„ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ" }, "masterPassHint": { "message": "ØĒŲ„Ų…ŲŠØ­ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ (ØĨØŽØĒŲŠØ§ØąŲŠ)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "ØšŲ„Ø§Ų…ØŠ ØĒØ¨ŲˆŲŠØ¨" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Ų†ØŗØŽ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Ų†ØŗØŽ Ø§Ų„Ų…Ų„Ø§Ø­Ø¸ØŠ" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Ų†ØŗØŽ ØąŲ…Ø˛ Ø§Ų„ØŖŲ…Ø§Ų†" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Ø§Ų„ØĒؚبØĻØŠ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ" }, + "autoFillLogin": { + "message": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ ØĨŲ„Ų‰ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊" + }, + "autoFillCard": { + "message": "Ø¨ØˇØ§Ų‚ØŠ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊" + }, + "autoFillIdentity": { + "message": "Ų‡ŲˆŲŠØŠ Ø§Ų„ØĒؚبØĻØŠ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ" + }, "generatePasswordCopied": { "message": "ØĨŲ†Ø´Ø§ØĄ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą (ØĒŲ… Ø§Ų„Ų†ØŗØŽ)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Ų„Ø§ ØĒ؈ØŦد ØĒØŗØŦŲŠŲ„Ø§ØĒ Ø¯ØŽŲˆŲ„ Ų…ØˇØ§Ø¨Ų‚ØŠ." }, + "noCards": { + "message": "Ų„Ø§ ØĒ؈ØŦد Ø¨ØˇØ§Ų‚Ø§ØĒ" + }, + "noIdentities": { + "message": "Ų„Ø§ ØĒ؈ØŦد Ų‡ŲˆŲŠØ§ØĒ" + }, + "addLoginMenu": { + "message": "ØĨØļØ§ŲØŠ ØĒØŗØŦŲŠŲ„ Ø¯ØŽŲˆŲ„ ØŦØ¯ŲŠØ¯" + }, + "addCardMenu": { + "message": "ØĨØļØ§ŲØŠ Ø¨ØˇØ§Ų‚ØŠ" + }, + "addIdentityMenu": { + "message": "ØĨØļØ§ŲØŠ Ų‡ŲˆŲŠØŠ" + }, "unlockVaultMenu": { "message": "Ø§ŲØĒØ­ ØŽØ˛Ų†ØĒ؃" }, @@ -115,6 +231,18 @@ "addItem": { "message": "ØĨØļØ§ŲØŠ ØšŲ†ØĩØą" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ØĒŲ„Ų…ŲŠØ­ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Ų‚Ų… بØĒØŖŲƒŲŠØ¯ Ų‡ŲˆŲŠØĒ؃ Ų„Ų„Ų…ØĒابؚ؊." }, - "account": { - "message": "Ø§Ų„Ø­ØŗØ§Ø¨" - }, "changeMasterPassword": { "message": "ØĒØēŲŠŲŠØą ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "ØšØ¨Ø§ØąØŠ بØĩŲ…ØŠ Ø§Ų„ØĨØĩبؚ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "ØšŲ† Ø§Ų„ØĒØˇØ¨ŲŠŲ‚" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Ø§Ų„ØĨØĩØ¯Ø§Øą" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "ØĒØ­ØąŲŠØą Ø§Ų„Ų…ØŦŲ„Ų‘Ø¯" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Ø­Ø°Ų Ø§Ų„Ų…ØŦŲ„Ų‘Ø¯" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Ø§Ų„Ų…ŲˆŲ„Ų‘Ø¯", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Ų‚Ų… بØĨŲ†Ø´Ø§ØĄ ŲƒŲ„Ų…Ø§ØĒ Ų…ØąŲˆØą Ų‚ŲˆŲŠØŠ ŲˆŲØąŲŠØ¯ØŠ Ų„ØĒØŗØŦŲŠŲ„Ø§ØĒ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ." }, - "bitWebVault": { - "message": "ØŽØ˛Ų†ØŠ Ø§Ų„ŲˆŲŠØ¨ Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Ø§ØŗØĒŲŠØąØ§Ø¯ Ø§Ų„ØšŲ†Ø§ØĩØą" @@ -235,6 +435,9 @@ "generatePassword": { "message": "ØĒŲˆŲ„ŲŠØ¯ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "ØĨؚاد؊ ØĒŲˆŲ„ŲŠØ¯ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą" }, @@ -244,17 +447,60 @@ "length": { "message": "Ø§Ų„ØˇŲˆŲ„" }, + "passwordMinLength": { + "message": "Ø§Ų„Ø­Ø¯ Ø§Ų„ØŖØ¯Ų†Ų‰ Ų„ØˇŲˆŲ„ ŲƒŲ„Ų…ØŠ Ø§Ų„ØŗØą" + }, "uppercase": { - "message": "ØŖØ­ØąŲ ŲƒØ¨ŲŠØąØŠ (Ų…Ų† A ØĨŲ„Ų‰ Z)" + "message": "ØŖØ­ØąŲ ŲƒØ¨ŲŠØąØŠ (Ų…Ų† A ØĨŲ„Ų‰ Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "ØŖØ­ØąŲ ŲƒØ¨ŲŠØąØŠ (Ų…Ų† a ØĨŲ„Ų‰ z)" + "message": "ØŖØ­ØąŲ ŲƒØ¨ŲŠØąØŠ (Ų…Ų† a ØĨŲ„Ų‰ z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Ø§Ų„ØŖØąŲ‚Ø§Ų… (Ų…Ų† 0 Ø§Ų„Ų‰ 9)" + "message": "Ø§Ų„ØŖØąŲ‚Ø§Ų… (Ų…Ų† 0 Ø§Ų„Ų‰ 9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Ø§Ų„ØŖØ­ØąŲ Ø§Ų„ØŽØ§ØĩØŠ (!@#$%^&*)" + "message": "Ø§Ų„ØŖØ­ØąŲ Ø§Ų„ØŽØ§ØĩØŠ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ؚدد Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ" @@ -276,7 +522,16 @@ "message": "Ø§Ų„Ø­Ø¯ Ø§Ų„ØŖØ¯Ų†Ų‰ Ų…Ų† Ø§Ų„ØŖØ­ØąŲ Ø§Ų„ØŽØ§ØĩØŠ" }, "avoidAmbChar": { - "message": "ØĒØŦŲ†Ø¨ Ø§Ų„ØŖØ­ØąŲ Ø§Ų„ØēØ§Ų…ØļØŠ" + "message": "ØĒØŦŲ†Ø¨ Ø§Ų„ØŖØ­ØąŲ Ø§Ų„ØēØ§Ų…ØļØŠ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Ø§Ų„Ø¨Ø­ØĢ ؁؊ Ø§Ų„ØŽØ˛Ų†ØŠ" @@ -299,15 +554,30 @@ "password": { "message": "ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą" }, + "totp": { + "message": "ØŗØą Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ" + }, "passphrase": { "message": "Ø§Ų„ØšØ¨Ø§ØąØŠ Ø§Ų„ØŗØąŲŠØŠ" }, "favorite": { "message": "Ø§Ų„Ų…ŲØļŲ„Ø§ØĒ" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Ø§Ų„Ų…Ų„Ø§Ø­Ø¸Ø§ØĒ" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Ø§Ų„Ų…Ų„Ø§Ø­Ø¸ØŠ" }, @@ -326,6 +596,18 @@ "launch": { "message": "Ø¨Ø¯ØĄ" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Ø§Ų„Ų…ŲˆŲ‚Øš Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ" }, @@ -338,8 +620,23 @@ "other": { "message": "Ø§Ų„ØŖØŽØąŲ‰" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "ØŖØšØ¯Ų†Ų‘ ØˇØąŲŠŲ‚ØŠ ØĨŲ„ØēØ§ØĄ Ø§Ų„Ų‚ŲŲŲ’Ų„ Ų„ØĒØēŲŠŲŠØą ØĨØŦØąØ§ØĄ Ų…Ų‡Ų„ØŠ Ø§Ų„Ų…ØŽØ˛Ų† Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ." + }, + "unlockMethodNeeded": { + "message": "ØĨؚداد ØˇØąŲŠŲ‚ØŠ ØĨŲ„ØēØ§ØĄ Ø§Ų„Ų‚ŲŲ„ ؁؊ Ø§Ų„ØĨؚداداØĒ" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" }, "rateExtension": { "message": "Ų‚ŲŠŲ‘ŲŲ… Ų‡Ø°Ų‡ Ø§Ų„ØĨØļØ§ŲØŠ" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "ØŽØ˛Ų†ØĒ؃ Ų…Ų‚ŲŲ„ØŠ. Ų‚Ų… بØĒØŖŲƒŲŠØ¯ Ų‡ŲˆŲŠØĒ؃ Ų„Ų„Ų…ØĒابؚ؊." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "ØĨŲ„ØēØ§ØĄ Ø§Ų„Ų‚ŲŲ„" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Ų†ŲØ° ŲˆŲ‚ØĒ Ø§Ų„ØŽØ˛Ų†ØŠ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "ØĨ؂؁؄ Ø§Ų„ØĸŲ†" }, + "lockAll": { + "message": "؂؁؄ Ø§Ų„ŲƒŲ„" + }, "immediately": { "message": "Ø­Ø§Ų„Ø§Ų‹" }, @@ -426,6 +738,18 @@ "security": { "message": "Ø§Ų„ØŖŲ…Ø§Ų†" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "Ų„Ų‚Ø¯ حدØĢ ØŽØˇØŖ Ų…Ø§" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "ØĒŲ… ØĨŲ†Ø´Ø§ØĄ Ø­ØŗØ§Ø¨Ųƒ Ø§Ų„ØŦØ¯ŲŠØ¯! ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØĸŲ† ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "ØŗØŦŲ„ØĒŲŽ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ų†ØŦاح" + }, + "youMayCloseThisWindow": { + "message": "ŲŠŲ…ŲƒŲ†Ųƒ ØĨØēŲ„Ø§Ų‚ Ų‡Ø°Ų‡ Ø§Ų„Ų†Ø§ŲØ°ØŠ" + }, "masterPassSent": { "message": "Ų„Ų‚Ø¯ ØŖØąØŗŲ„Ų†Ø§ Ų„Ųƒ ØąØŗØ§Ų„ØŠ Ø¨ØąŲŠØ¯ ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ ØĒØ­ØĒ؈؊ ØšŲ„Ų‰ ØĒŲ„Ų…ŲŠØ­ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ." }, "verificationCodeRequired": { "message": "ØąŲ…Ø˛ Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…ØˇŲ„ŲˆØ¨." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "ØąŲ…Ø˛ Ø§Ų„ØĒØ­Ų‚Ų‚ ØēŲŠØą ØĩØ§Ų„Ø­" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "ØēŲŠØą Ų‚Ø§Ø¯Øą ØšŲ„Ų‰ Ų…Ų„ØĄ Ø§Ų„ØšŲ†ØĩØą Ø§Ų„Ų…Ø­Ø¯Ø¯ ØĒŲ„Ų‚Ø§ØĻŲŠØ§Ų‹ ؁؊ Ų‡Ø°Ų‡ Ø§Ų„ØĩŲØ­ØŠ. ŲŠØąØŦŲ‰ Ų†ØŗØŽ ŲˆŲ„ØĩŲ‚ Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ ŲŠØ¯ŲˆŲŠØ§Ų‹." }, + "totpCaptureError": { + "message": "ØēŲŠØą Ų‚Ø§Ø¯Øą ØšŲ„Ų‰ Ų…ØŗØ­ ØąŲ…Ø˛ QR Ų…Ų† ØĩŲØ­ØŠ Ø§Ų„ŲˆŲŠØ¨ Ø§Ų„Ø­Ø§Ų„ŲŠØŠ" + }, + "totpCaptureSuccess": { + "message": "ØĒŲ… ØĨØļØ§ŲØŠ ؅؁ØĒاح Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ" + }, + "totpCapture": { + "message": "Ų…ØŗØ­ ØąŲ…Ø˛ QR Ų„Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ Ų…Ų† ØĩŲØ­ØŠ Ø§Ų„ŲˆŲŠØ¨ Ø§Ų„Ø­Ø§Ų„ŲŠØŠ" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Ų†ØŗØŽ ؅؁ØĒاح Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ (TOTP)" + }, "loggedOut": { "message": "ØĒŲ… ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Ø§Ų†ØĒŲ‡ØĒ ØĩŲ„Ø§Ø­ŲŠØŠ ØŦŲ„ØŗØŠ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ؟" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "ØŖŲØļ؊؁ Ø§Ų„Ų…ØŦŲ„Ø¯" }, - "changeMasterPass": { - "message": "ØĒØēŲŠŲŠØą ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ" - }, - "changeMasterPasswordConfirmation": { - "message": "ŲŠŲ…ŲƒŲ†Ųƒ ØĒØēŲŠŲŠØą ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ų…Ų† ØŽØ˛Ų†ØŠ Ø§Ų„ŲˆŲŠØ¨ ؁؊ bitwarden.com. Ų‡Ų„ ØĒØąŲŠØ¯ Ø˛ŲŠØ§ØąØŠ Ø§Ų„Ų…ŲˆŲ‚Øš Ø§Ų„ØĸŲ†ØŸ" - }, "twoStepLoginConfirmation": { "message": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨ØŽØˇŲˆØĒŲŠŲ† ؊ØŦØšŲ„ Ø­ØŗØ§Ø¨Ųƒ ØŖŲƒØĢØą ØŖŲ…Ų†Ø§ Ų…Ų† ØŽŲ„Ø§Ų„ Ų…ØˇØ§Ų„Ø¨ØĒ؃ Ø¨Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… ØŦŲ‡Ø§Ø˛ ØĸØŽØą Ų…ØĢŲ„ ؅؁ØĒاح Ø§Ų„ØŖŲ…Ø§Ų†ØŒ ØĒØˇØ¨ŲŠŲ‚ Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠØŒ Ø§Ų„ØąØŗØ§ØĻŲ„ Ø§Ų„Ų‚ØĩŲŠØąØŠØŒ Ø§Ų„Ų…ŲƒØ§Ų„Ų…ØŠ Ø§Ų„Ų‡Ø§ØĒŲŲŠØŠØŒ ØŖŲˆ Ø§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ. ŲŠŲ…ŲƒŲ† ØĒŲ…ŲƒŲŠŲ† ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨ØŽØˇŲˆØĒŲŠŲ† ØšŲ„Ų‰ ØŽØ˛Ų†ØŠ Ø§Ų„ŲˆŲŠØ¨ bitwarden.com. Ų‡Ų„ ØĒØąŲŠØ¯ Ø˛ŲŠØ§ØąØŠ Ø§Ų„Ų…ŲˆŲ‚Øš Ø§Ų„ØĸŲ†ØŸ" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Ø­ŲŲØ¸ Ø§Ų„Ų…ØŦŲ„Ø¯" }, @@ -552,6 +936,10 @@ "newUri": { "message": "ØąØ§Ø¨Øˇ ØŦØ¯ŲŠØ¯" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "ØĒŲ…ØĒ ØĨØļØ§ŲØŠ Ø§Ų„ØšŲ†ØĩØą" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Ø§ØˇŲ„Ø¨ ØĨØļØ§ŲØŠ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ø§ØˇŲ„Ø¨ ØĨØļØ§ŲØŠ ØšŲ†ØĩØą ØĨذا Ų„Ų… ŲŠŲØšØĢØą ØšŲ„ŲŠŲ‡ ؁؊ ØŽØ˛Ų†ØĒ؃." }, + "addLoginNotificationDescAlt": { + "message": "Ø§ØˇŲ„Ø¨ ØĨØļØ§ŲØŠ ØšŲ†ØĩØą ØĨذا Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ ØšŲ†ØĩØą ؁؊ Ø§Ų„Ų…ØŽØ˛Ų† Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ. ŲŠŲ†ØˇØ¨Ų‚ ØšŲ„Ų‰ ØŦŲ…ŲŠØš Ø­ØŗØ§Ø¨Ø§ØĒ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "ØŖØ¸Ų‡Øą Ø§Ų„Ø¨ØˇØ§Ų‚Ø§ØĒ ؁؊ ØĩŲØ­ØŠ Ø§Ų„ØĒØ¨ŲˆŲŠØ¨Ø§ØĒ" }, "showCardsCurrentTabDesc": { "message": "Ų‚Ø§ØĻŲ…ØŠ ØšŲ†Ø§ØĩØą Ø§Ų„Ø¨ØˇØ§Ų‚ØŠ ؁؊ ØĩŲØ­ØŠ Ø§Ų„ØĒØ¨ŲˆŲŠØ¨ Ų„ØŗŲ‡ŲˆŲ„ØŠ Ø§Ų„ØĒؚبØĻØŠ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "ØĨØ¸Ų‡Ø§Øą Ø§Ų„Ų‡ŲˆŲŠØ§ØĒ ØšŲ„Ų‰ ØĩŲØ­ØŠ Ø§Ų„ØĒØ¨ŲˆŲŠØ¨" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ø§ØŗØŖŲ„ ØšŲ† ØĒØ­Ø¯ŲŠØĢ ŲƒŲ„Ų…ØŠ Ø§Ų„ØŗØą ØšŲ†Ø¯ Ø§ŲƒØĒØ´Ø§Ų ØĒØēŲŠŲŠØą ØšŲ„Ų‰ Ø§Ų„Ų…ŲˆŲ‚Øš Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ." }, + "changedPasswordNotificationDescAlt": { + "message": "Ø§ØˇŲ„Ø¨ ØĒØ­Ø¯ŲŠØĢ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ ØšŲ†Ø¯Ų…Ø§ ؊ØĒŲ… Ø§ŲƒØĒØ´Ø§Ų ØĒØēŲŠŲŠØą ØšŲ„Ų‰ Ų…ŲˆŲ‚Øš. ŲŠŲ†ØˇØ¨Ų‚ ØšŲ„Ų‰ ØŦŲ…ŲŠØš Ø­ØŗØ§Ø¨Ø§ØĒ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„." + }, + "enableUsePasskeys": { + "message": "Ø§ØˇŲ„Ø¨ Ø­ŲØ¸ ŲˆØ§ØŗØĒØŽØ¯Ø§Ų… Ų…ŲØ§ØĒŲŠØ­ Ø§Ų„Ų…ØąŲˆØą" + }, + "usePasskeysDesc": { + "message": "Ø§ØˇŲ„Ø¨ Ø­ŲØ¸ Ų…ŲØ§ØĒŲŠØ­ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŦØ¯ŲŠØ¯ØŠ ØŖŲˆ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… Ų…ŲØ§ØĒŲŠØ­ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„Ų…ØŽØ˛Ų†ØŠ ؁؊ Ų…ØŗØĒŲˆØ¯Øš Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ. ŲŠŲ†ØˇØ¨Ų‚ Ų‡Ø°Ø§ ØšŲ„Ų‰ ØŦŲ…ŲŠØš Ø§Ų„Ø­ØŗØ§Ø¨Ø§ØĒ Ø§Ų„Ų…ØŗØŦŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ų‡Ø§." + }, "notificationChangeDesc": { "message": "Ų‡Ų„ ØĒØąŲŠØ¯ ØĒØ­Ø¯ŲŠØĢ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų‡Ø°Ų‡ ؁؊ Bitwarden؟" }, @@ -634,10 +1043,13 @@ "message": "ØĒØ­Ø¯ŲŠØĢ" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Ø§ŲØĒØ­ Ų…ØŽØ˛Ų† Bitwarden Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ Ų„ØĨŲƒŲ…Ø§Ų„ ØˇŲ„Ø¨ Ø§Ų„ØĒؚبØĻØŠ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ." }, "notificationUnlock": { - "message": "Unlock" + "message": "ØĨŲ„ØēØ§ØĄ Ø§Ų„Ų‚ŲŲ„" + }, + "additionalOptions": { + "message": "Additional options" }, "enableContextMenuItem": { "message": "ØĨØ¸Ų‡Ø§Øą ØŽŲŠØ§ØąØ§ØĒ Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„ØŗŲŠØ§Ų‚" @@ -645,9 +1057,12 @@ "contextMenuItemDesc": { "message": "Ø§ØŗØĒØŽØ¯Ų… Ų†Ų‚ØąØŠ ØĢØ§Ų†ŲˆŲŠØŠ Ų„Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ ØĒŲˆŲ„ŲŠØ¯ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą ŲˆŲ…ØˇØ§Ø¨Ų‚ØŠ ØĒØŗØŦŲŠŲ„Ø§ØĒ Ø§Ų„Ø¯ØŽŲˆŲ„ Ų„Ų„Ų…ŲˆŲ‚Øš. " }, + "contextMenuItemDescAlt": { + "message": "Ø§ØŗØĒØŽØ¯Ų… Ų†Ų‚ØąØŠ ØĢØ§Ų†ŲˆŲŠØŠ Ų„Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ų‚ØŗŲ… ØĒŲˆŲ„ŲŠØ¯ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą ŲˆŲ…ØˇØ§Ø¨Ų‚ØŠ ØĒØŗØŦŲŠŲ„Ø§ØĒ Ø§Ų„Ø¯ØŽŲˆŲ„ Ų„Ų„Ų…ŲˆŲ‚Øš. ŲŠŲ†ØˇØ¨Ų‚ Ų‡Ø°Ø§ ØšŲ„Ų‰ ØŦŲ…ŲŠØš Ø§Ų„Ø­ØŗØ§Ø¨Ø§ØĒ Ø§Ų„Ų…ØŗØŦŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ų‡Ø§." + }, "defaultUriMatchDetection": { "message": "Ø§Ų„ŲƒØ´Ų Ø§Ų„Ø§ŲØĒØąØ§Øļ؊ ØšŲ† ØĒØˇØ§Ø¨Ų‚ URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "ا؎ØĒØą Ø§Ų„ØˇØąŲŠŲ‚ØŠ Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ Ø§Ų„ØĒ؊ ؊ØĒŲ… Ø§Ų„ØĒØšØ§Ų…Ų„ Ø¨Ų‡Ø§ Ų…Øš Ø§Ų„ŲƒØ´Ų ØšŲ† Ų…ØˇØ§Ø¨Ų‚ØŠ URI Ų„ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ ØšŲ†Ø¯ ØĒŲ†ŲŲŠØ° ØĨØŦØąØ§ØĄØ§ØĒ Ų…ØĢŲ„ Ø§Ų„ØĒؚبØĻØŠ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ØĒØēŲŠŲŠØą ØŗŲ…ØŠ Ų„ŲˆŲ† Ø§Ų„ØĒØˇØ¨ŲŠŲ‚." }, + "themeDescAlt": { + "message": "ØĒØēŲŠŲŠØą ØŗŲ…ØŠ Ų„ŲˆŲ† Ø§Ų„ØĒØˇØ¨ŲŠŲ‚. ŲŠŲ†ØˇØ¨Ų‚ ØšŲ„Ų‰ ØŦŲ…ŲŠØš Ø§Ų„Ø­ØŗØ§Ø¨Ø§ØĒ Ø§Ų„Ų…ØŗØŦŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ų‡Ø§." + }, "dark": { "message": "Ø¯Ø§ŲƒŲ†", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Ø¯Ø§ŲƒŲ† Ų…ŲØ´Ų…Øŗ", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "ØĒØĩØ¯ŲŠØą Ø§Ų„ØŽØ˛Ų†ØŠ" }, "fileFormat": { "message": "Øĩ؊ØēØŠ Ø§Ų„Ų…Ų„Ų" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "ØĒØ­Ø°ŲŠØą", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Ų…Ø´ØĒØąŲƒ" }, - "learnOrg": { - "message": "ØĒØšØąŲ ØšŲ„Ų‰ Ø§Ų„Ų…Ø¤ØŗØŗØ§ØĒ" - }, - "learnOrgConfirmation": { - "message": "ŲŠØŗŲ…Ø­ Ų„Ųƒ Bitwarden Ø¨Ų…Ø´Ø§ØąŲƒØŠ ØšŲ†Ø§ØĩØą ØŽØ˛Ų†ØĒ؃ Ų…Øš Ø§Ų„ØĸØŽØąŲŠŲ† Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… Ø­ØŗØ§Ø¨ Ø§Ų„Ų…Ø¤ØŗØŗØŠ. Ų‡Ų„ ØĒØąØēب ؁؊ Ø˛ŲŠØ§ØąØŠ Ų…ŲˆŲ‚Øš bitwarden.com Ų„Ų…ØšØąŲØŠ Ø§Ų„Ų…Ø˛ŲŠØ¯ØŸ" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Ø§Ų„Ø§Ų†ØĒŲ‚Ø§Ų„ ØĨŲ„Ų‰ Ų…Ø¤ØŗØŗØŠ" @@ -762,6 +1204,9 @@ "file": { "message": "Ø§Ų„Ų…Ų„Ų" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "حدد Ų…Ų„ŲŲ‹Ø§" }, @@ -772,7 +1217,7 @@ "message": "Ø§Ų„Ų…ŲŠØ˛ØŠ ØēŲŠØą Ų…ØĒŲˆŲØąØŠ" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Ų…ØˇŲ„ŲˆØ¨ Ų†Ų‚Ų„ ؅؁ØĒاح Ø§Ų„ØĒØ´ŲŲŠØą. Ø§Ų„ØąØŦØ§ØĄ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨ŲˆØ§ØŗØˇØŠ Ų…ØŽØ˛Ų† Ø§Ų„ŲˆŲŠØ¨ Ų„ØĒØ­Ø¯ŲŠØĢ ؅؁ØĒاح Ø§Ų„ØĒØ´ŲŲŠØą Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ." }, "premiumMembership": { "message": "Ø§Ų„ØšØļŲˆŲŠØŠ Ø§Ų„Ų…Ų…ŲŠØ˛ØŠ" @@ -795,11 +1240,14 @@ "ppremiumSignUpStorage": { "message": "1 ØŦ؊ØēØ§Ø¨Ø§ŲŠØĒ ŲˆØ­Ø¯ØŠ ØĒØŽØ˛ŲŠŲ† Ų…Ø´ŲØąØŠ Ų„Ų…ØąŲŲ‚Ø§ØĒ Ø§Ų„Ų…Ų„ŲØ§ØĒ." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "ØŽŲŠØ§ØąØ§ØĒ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨ØŽØˇŲˆØĒŲŠŲ† Ø§Ų„Ų…Ų…Ų„ŲˆŲƒØŠ Ų„ØŦŲ‡Ø§ØĒ Ø§ØŽØąŲ‰ Ų…ØĢŲ„ YubiKey ؈ Duo." }, "ppremiumSignUpReports": { - "message": "Ų†Ø¸Ø§ŲØŠ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØąØŒ Øĩح؊ Ø§Ų„Ø­ØŗØ§Ø¨ØŒ ؈ØĒŲ‚Ø§ØąŲŠØą ØŽØąŲ‚ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ų„Ų„Ø­ŲØ§Ø¸ ØšŲ„Ų‰ ØŗŲ„Ø§Ų…ØŠ ØŽØ˛Ų†ØĒ؃." + "message": "Ų†Ø¸Ø§ŲØŠ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØąØŒ Øĩح؊ Ø§Ų„Ø­ØŗØ§Ø¨ØŒ ؈ØĒŲ‚Ø§ØąŲŠØą ØĒØŗØąŲŠØ¨Ø§ØĒ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ų„Ų„Ø­ŲØ§Ø¸ ØšŲ„Ų‰ ØŗŲ„Ø§Ų…ØŠ ØŽØ˛Ų†ØĒ؃." }, "ppremiumSignUpTotp": { "message": "Ų…ŲˆØąØ¯ ØąŲ…Ø˛ Ø§Ų„ØĒØ­Ų‚Ų‚ (2FA) Ų„ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ ؁؊ ØŽØ˛Ų†ØĒ؃." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "ŲŠŲ…ŲƒŲ†Ųƒ Ø´ØąØ§ØĄ Ø§Ų„ØšØļŲˆŲŠØŠ Ø§Ų„Ų…ØĒŲ…ŲŠØ˛ØŠ ØšŲ„Ų‰ bitwarden.com ØšŲ„Ų‰ ØŽØ˛Ø§Ų†ØŠ Ø§Ų„ŲˆŲŠØ¨. Ų‡Ų„ ØĒØąŲŠØ¯ Ø˛ŲŠØ§ØąØŠ Ø§Ų„Ų…ŲˆŲ‚Øš Ø§Ų„ØĸŲ†ØŸ" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "ØŖŲ†ØĒ ØšØļ؈ Ų…Ų…ŲŠØ˛!" }, "premiumCurrentMemberThanks": { "message": "Ø´ŲƒØąØ§ Ų„Ųƒ ØšŲ„Ų‰ Ø¯ØšŲ… Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "Ø§Ų„ŲƒŲ„ ŲŲ‚Øˇ Ø¨Ų€ $PRICE$ /ØŗŲ†ØŠ!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Ø§ŲƒØĒŲ…Ų„ Ø§Ų„ØĒØ­Ø¯ŲŠØĢ" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "ØĒØˇØ¨ŲŠŲ‚ Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ" }, - "authenticatorAppDesc": { - "message": "Ø§ØŗØĒØŽØ¯Ø§Ų… ØĒØˇØ¨ŲŠŲ‚ Ų…ØĩØ§Ø¯Ų‚ØŠ (Ų…ØĢŲ„ Authy ØŖŲˆ Google Authenticator) Ų„ØĨŲ†Ø´Ø§ØĄ ØąŲ…ŲˆØ˛ ØĒØ­Ų‚Ų‚ Ų…ØŗØĒŲ†Ø¯ØŠ ØĨŲ„Ų‰ Ø§Ų„ŲˆŲ‚ØĒ.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "؅؁ØĒاح ØŖŲ…Ø§Ų† YubiKey OTP" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Ø§ØŗØĒØŽØ¯Ų… YubiKey Ų„Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ Ø­ØŗØ§Ø¨Ųƒ. ŲŠØšŲ…Ų„ Ų…Øš YubiKey 4 ،4 Nano ،4C، ŲˆØŖØŦŲ‡Ø˛ØŠ NEO." }, - "duoDesc": { - "message": "Ø§Ų„ØĒØ­Ų‚Ų‚ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… Ų†Ø¸Ø§Ų… Ø§Ų„Ø­Ų…Ø§ŲŠØŠ Ø§Ų„ØĢŲ†Ø§ØĻ؊ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… ØĒØˇØ¨ŲŠŲ‚ Duo Mobile ØŖŲˆ Ø§Ų„ØąØŗØ§ØĻŲ„ Ø§Ų„Ų‚ØĩŲŠØąØŠ ØŖŲˆ Ø§Ų„Ų…ŲƒØ§Ų„Ų…ØŠ Ø§Ų„Ų‡Ø§ØĒŲŲŠØŠ ØŖŲˆ ؅؁ØĒاح Ø§Ų„ØŖŲ…Ø§Ų† U2F.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Ø§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ" }, - "emailDesc": { - "message": "ØŗŲŠØĒŲ… ØĨØąØŗØ§Ų„ ØąŲ…Ø˛ Ø§Ų„ØĒØ­Ų‚Ų‚ ØĨŲ„ŲŠŲƒ Ø¨Ø§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Ø§Ų„Ø¨ŲŠØĻØŠ Ø§Ų„Ų…ØŗØĒØļØ§ŲØŠ ذاØĒŲŠØ§" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "حدد ØšŲ†ŲˆØ§Ų† URL Ø§Ų„ØŖØŗØ§ØŗŲŠ Ų„ØĒØĢØ¨ŲŠØĒ Bitwarden Ø§Ų„Ų…ØŗØĒØļØ§Ų Ų…Ø­Ų„ŲŠŲ‹Ø§." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Ø¨ŲŠØĻØŠ Ų…ØŽØĩØĩØŠ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "ØąØ§Ø¨Øˇ Ø§Ų„ØŽØ§Ø¯Ų…" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "ØąØ§Ø¨Øˇ ØŽØ§Ø¯Ų… API" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "ØąŲˆØ§Ø¨Øˇ Ø§Ų„Ø¨ŲŠØĻØŠ Ø§Ų„Ų…Ø­ŲŲˆØ¸ØŠ" }, + "showAutoFillMenuOnFormFields": { + "message": "ØĨØ¸Ų‡Ø§Øą Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ ؁؊ Ø­Ų‚ŲˆŲ„ Ø§Ų„Ų†Ų…ŲˆØ°ØŦ", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "ØĨŲŠŲ‚Ø§Ų ØĒØ´ØēŲŠŲ„ ØĨؚداداØĒ Ų…Ø¯ŲŠØą ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„Ø§ŲØĒØąØ§Øļ؊ ؁؊ Ų…ØĒØĩŲØ­Ųƒ Ų„ØĒØŦŲ†Ø¨ Ø§Ų„ØĒØļØ§ØąØ¨." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "ØĒØšØ¯ŲŠŲ„ ØĨؚداداØĒ Ø§Ų„Ų…ØĒØĩŲØ­." + }, + "autofillOverlayVisibilityOff": { + "message": "ØĨŲŠŲ‚Ø§Ų", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "ØšŲ†Ø¯Ų…Ø§ ؊ØĒŲ… ØĒØ­Ø¯ŲŠØ¯ Ø§Ų„Ø­Ų‚Ų„ (ØšŲ„Ų‰ Ø§Ų„ØĒØąŲƒŲŠØ˛)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "ØšŲ†Ø¯Ų…Ø§ ؊ØĒŲ… ا؎ØĒŲŠØ§Øą Ø§ŲŠŲ‚ŲˆŲ†ØŠ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Ų…Ų„ØĄ ØĒŲ„Ų‚Ø§ØĻ؊ ØšŲ†Ø¯ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲØ­ØŠ" }, "enableAutoFillOnPageLoadDesc": { "message": "ØĨذا ØĒŲ… Ø§ŲƒØĒØ´Ø§Ų Ų†Ų…ŲˆØ°ØŦ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ØŒ ؊ØĒŲ… Ø§Ų„ØĒؚبØĻØŠ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ ØšŲ†Ø¯ ØĒØ­Ų…ŲŠŲ„ ØĩŲØ­ØŠ Ø§Ų„ŲˆŲŠØ¨." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Ų…ŲˆØ§Ų‚Øš Ø§Ų„Ų…ØŗØ§ŲˆŲ…ØŠ ØŖŲˆ ØēŲŠØą Ø§Ų„Ų…ŲˆØĢŲˆŲ‚ Ø¨Ų‡Ø§ ŲŠŲ…ŲƒŲ† ØŖŲ† ØĒØŗØĒØēŲ„ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ ؁؊ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲØ­ØŠ." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "ØĒØšØąŲ ØšŲ„Ų‰ Ø§Ų„Ų…Ø˛ŲŠØ¯ Ø­ŲˆŲ„ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "؁ØĒØ­ Ø§Ų„Ų…ØŽØ˛Ų† ؁؊ Ø§Ų„Ø´ØąŲŠØˇ Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ" }, - "commandAutofillDesc": { - "message": "Ų…Ų„ØĄ ØĒŲ„Ų‚Ø§ØĻ؊ Ų„ØĸØŽØą ØĒØŗØŦŲŠŲ„ Ø¯ØŽŲˆŲ„ Ų…ØŗØĒØŽØ¯Ų… Ų„Ų„Ų…ŲˆŲ‚Øš Ø§Ų„Ø­Ø§Ų„ŲŠ" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "ØĨŲ†Ø´Ø§ØĄ ŲˆØ§ØŗØĒŲ†ØŗØ§ØŽ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØšØ´ŲˆØ§ØĻŲŠØŠ ØŦØ¯ŲŠØ¯ØŠ ØĨŲ„Ų‰ Ø§Ų„Ø­Ø§ŲØ¸ØŠ" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "؂؁؄ Ø§Ų„Ų…ØŽØ˛Ų†" }, - "privateModeWarning": { - "message": "Ø¯ØšŲ… Ø§Ų„ŲˆØļØš Ø§Ų„ØŽØ§Øĩ ØĒØŦØąŲŠØ¨ŲŠ ŲˆØ¨ØšØļ Ø§Ų„Ų…ŲŠØ˛Ø§ØĒ Ų…Ø­Ø¯ŲˆØ¯ØŠ." - }, "customFields": { "message": "Ø§Ų„Ø­Ų‚ŲˆŲ„ Ø§Ų„Ų…ØŽØĩØĩØŠ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Ų‚ŲŠŲ…ØŠ Ų…Ų†ØˇŲ‚ŲŠØŠ" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Ų…ØąØĒØ¨Øˇ", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ØĨØ¸Ų‡Ø§Øą ØĩŲˆØąØŠ Ų‚Ø§Ø¨Ų„ØŠ Ų„Ų„ØĒØšØąŲ بØŦØ§Ų†Ø¨ ŲƒŲ„ ØĒØŗØŦŲŠŲ„ Ø¯ØŽŲˆŲ„." }, + "faviconDescAlt": { + "message": "ØĨØ¸Ų‡Ø§Øą ØĩŲˆØąØŠ Ų‚Ø§Ø¨Ų„ØŠ Ų„Ų„ØĒØšØąŲ بØŦØ§Ų†Ø¨ ŲƒŲ„ ØĒØŗØŦŲŠŲ„ Ø¯ØŽŲˆŲ„. ØĒŲ†ØˇØ¨Ų‚ ØšŲ„Ų‰ ØŦŲ…ŲŠØš Ø­ØŗØ§Ø¨Ø§ØĒ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„." + }, "enableBadgeCounter": { "message": "ØĨØ¸Ų‡Ø§Øą ؚداد Ø§Ų„Ø´Ø§ØąØ§ØĒ" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Ø§Ų„Ų‡ŲˆŲŠØŠ" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "ØŗØŦŲ„ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "ØąØŦŲˆØš" }, "collections": { "message": "Ø§Ų„Ų…ØŦŲ…ŲˆØšØ§ØĒ" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Ø§Ų„Ų…ŲØļŲ„Ø§ØĒ" }, @@ -1267,7 +1859,7 @@ "message": "ØĒØ­Ų‚Ų‚ Ų…Ų…Ø§ ØĨذا ØĒŲ… Ø§Ų„ŲƒØ´Ų ØšŲ† ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą." }, "passwordExposed": { - "message": "ØĒŲ… Ø§Ų„ŲƒØ´Ų ØšŲ† ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų‡Ø°Ų‡ $VALUE$ Ų…ØąŲ‘ØŠ (اØĒ) ؁؊ ØŽØąŲˆŲ‚Ø§ØĒ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ. ؊ØŦب ØšŲ„ŲŠŲƒ ØĒØēŲŠŲŠØąŲ‡Ø§.", + "message": "ØĒŲ… Ø§Ų„ŲƒØ´Ų ØšŲ† ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų‡Ø°Ų‡ $VALUE$ Ų…ØąŲ‘ØŠ(اØĒ) ؁؊ ØĒØŗØąŲŠØ¨Ø§ØĒ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ. ؊ØŦب ØšŲ„ŲŠŲƒ ØĒØēŲŠŲŠØąŲ‡Ø§.", "placeholders": { "value": { "content": "$1", @@ -1276,12 +1868,16 @@ } }, "passwordSafe": { - "message": "Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų‡Ø°Ų‡ ؁؊ ØŖŲŠ ØšŲ…Ų„ŲŠØ§ØĒ ا؎ØĒØąØ§Ų‚ Ų…ØšØąŲˆŲØŠ Ų„Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ. Ų…Ų† Ø§Ų„Ų…ŲØĒØąØļ ØŖŲ† ØĒŲƒŲˆŲ† ØĸŲ…Ų†ØŠ Ų„Ų„Ø§ØŗØĒØŽØ¯Ø§Ų…." + "message": "Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų‡Ø°Ų‡ ؁؊ ØŖŲŠ ØšŲ…Ų„ŲŠØ§ØĒ ØĒØŗØąŲŠØ¨Ø§ØĒ Ų„Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ų…ØšØąŲˆŲØŠ. Ų…Ų† Ø§Ų„Ų…ŲØĒØąØļ ØŖŲ† ØĒŲƒŲˆŲ† ØĸŲ…Ų†ØŠ Ų„Ų„Ø§ØŗØĒØŽØ¯Ø§Ų…." }, "baseDomain": { "message": "Ø§Ų„Ų†ØˇØ§Ų‚ Ø§Ų„ØŖØŗØ§ØŗŲŠ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ØĨØŗŲ… Ø§Ų„Ų†ØˇØ§Ų‚", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ŲƒØ´Ų Ø§Ų„Ų…ØˇØ§Ø¨Ų‚ØŠ", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Ø§Ų„ŲƒØ´Ų Ø§Ų„Ø§ŲØĒØąØ§Øļ؊ ØšŲ† Ø§Ų„Ų…ØˇØ§Ø¨Ų‚ØŠ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„ØĒØ¨Ø¯ŲŠŲ„" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Ų„Ø§ ØĒ؈ØŦد ŲƒŲ„Ų…Ø§ØĒ Ų…ØąŲˆØą Ų„Ų„ØšØąØļ." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "ØĨØ˛Ø§Ų„ØŠ" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "؁ØĒØ­ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… ØąŲ…Ø˛ PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "ØĒØšŲŠŲŠŲ† ØąŲ…Ø˛ PIN Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ Ų„ØĨŲ„ØēØ§ØĄ ؂؁؄ Bitwarden. ØŗŲŠØĒŲ… ØĨؚاد؊ ØĒØšŲŠŲŠŲ† ØĨؚداداØĒ PIN Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ ØĨذا Ų‚Ų…ØĒ بØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ Ø¨Ø§Ų„ŲƒØ§Ų…Ų„ Ų…Ų† Ø§Ų„ØĒØˇØ¨ŲŠŲ‚." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "ØąŲ…Ø˛ PIN Ų…ØˇŲ„ŲˆØ¨." }, "invalidPin": { "message": "ØąŲ…Ø˛ PIN ØēŲŠØą ØĩØ§Ų„Ø­." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Ø§Ų„ØšØ¯ŲŠØ¯ Ų…Ų† Ų…Ø­Ø§ŲˆŲ„Ø§ØĒ ØĨØ¯ØŽØ§Ų„ ØąŲ‚Ų… Ø§Ų„ØĒØšØąŲŠŲ Ø§Ų„Ø´ØŽØĩ؊ ØēŲŠØą Ø§Ų„ØĩØ§Ų„Ø­ØŠ. ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ." + }, "unlockWithBiometrics": { "message": "؁ØĒØ­ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "؁؊ Ø§Ų†ØĒØ¸Ø§Øą Ø§Ų„ØĒØŖŲƒŲŠØ¯ Ų…Ų† ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "؂؁؄ Ų…Øš ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ØšŲ†Ø¯ ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ Ø§Ų„Ų…ØĒØĩŲØ­" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "؊ØŦب ØšŲ„ŲŠŲƒ ØĒØ­Ø¯ŲŠØ¯ Ų…ØŦŲ…ŲˆØšØŠ ŲˆØ§Ø­Ø¯ØŠ ØšŲ„Ų‰ Ø§Ų„ØŖŲ‚Ų„." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "ŲˆØ§Ø­Ø¯ØŠ ØŖŲˆ ØŖŲƒØĢØą Ų…Ų† ØŗŲŠØ§ØŗØ§ØĒ Ø§Ų„Ų…Ø¤ØŗØŗØŠ ØĒؤØĢØą ØšŲ„Ų‰ ØĨؚداداØĒ Ø§Ų„Ų…ŲˆŲ„Ø¯Ø§ØĒ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ØĨØŦØąØ§ØĄ Ų…Ų‡Ų„ØŠ Ø§Ų„Ų…ØŽØ˛Ų†" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "؂؁؄", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ØŗŲ„ØŠ Ø§Ų„Ų…Ų‡Ų…Ų„Ø§ØĒ", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ØĒŲ… Ø§ØŗØĒؚاد؊ Ø§Ų„ØšŲ†ØĩØą" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "ØŗŲŠØ¤Ø¯ŲŠ ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ ØĨŲ„Ų‰ ØĨØ˛Ø§Ų„ØŠ ØŦŲ…ŲŠØš ØĨŲ…ŲƒØ§Ų†ŲŠØŠ Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ ØŽØ˛Ų†ØĒ؃ ؈؊ØĒØˇŲ„Ø¨ Ø§Ų„Ų…ØĩØ§Ø¯Ų‚ØŠ ØšØ¨Øą Ø§Ų„ØĨŲ†ØĒØąŲ†ØĒ بؚد Ø§Ų†ØĒŲ‡Ø§ØĄ Ø§Ų„Ų…Ų‡Ų„ØŠ. Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ†Ųƒ ØĒØąŲŠØ¯ Ø§ØŗØĒØŽØ¯Ø§Ų… Ų‡Ø°Ø§ Ø§Ų„ØĨؚداد؟" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Ø§Ų„ØĒؚبØĻØŠ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ ŲˆØ§Ų„Ø­ŲØ¸" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "ØĒŲ… ØĒؚبØĻØŠ Ø§Ų„ØšŲ†ØĩØą ØĒŲ„Ų‚Ø§ØĻŲŠØ§Ų‹ ŲˆØ­ŲØ¸ ØšŲ†ŲˆØ§Ų† URI" }, @@ -1539,108 +2194,186 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ø§Ų„ØŦØ¯ŲŠØ¯ØŠ Ų„Ø§ ØĒ؁؊ Ø¨Ų…ØĒØˇŲ„Ø¨Ø§ØĒ Ø§Ų„ØŗŲŠØ§ØŗØŠ Ø§Ų„ØšØ§Ų…ØŠ." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "Ų…Ų† ØŽŲ„Ø§Ų„ ØĒØ­Ø¯ŲŠØ¯ Ų‡Ø°Ø§ Ø§Ų„Ų…ØąØ¨Øš ؁ØĨŲ†Ųƒ ØĒŲˆØ§ŲŲ‚ ØšŲ„Ų‰ Ų…Ø§ ŲŠŲ„ŲŠ:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "Ų„Ų… ؊ØĒŲ… Ø§Ų„Ø§ØšØĒØąØ§Ų Ø¨Ø´ØąŲˆØˇ Ø§Ų„ØŽØ¯Ų…ØŠ ŲˆØŗŲŠØ§ØŗØŠ Ø§Ų„ØŽØĩ؈ØĩŲŠØŠ." }, "termsOfService": { - "message": "Terms of Service" + "message": "Ø´ØąŲˆØˇ Ø§Ų„ØŽØ¯Ų…ØŠ" }, "privacyPolicy": { "message": "ØŗŲŠØ§ØŗØŠ Ø§Ų„ØŽØĩ؈ØĩŲŠØŠ" }, "hintEqualsPassword": { - "message": "Your password hint cannot be the same as your password." + "message": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØŖŲ† ŲŠŲƒŲˆŲ† ØĒŲ„Ų…ŲŠØ­ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų†ŲØŗ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ." }, "ok": { "message": "Ų…ŲˆØ§ŲŲ‚" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { - "message": "Desktop sync verification" + "message": "Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† Ų…Ø˛Ø§Ų…Ų†ØŠ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Ø§Ų„ØąØŦØ§ØĄ Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† ØŖŲ† ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب ŲŠØ¸Ų‡Øą بØĩŲ…ØŠ Ø§Ų„ØĨØĩبؚ Ų‡Ø°Ų‡: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not set up" + "message": "Ų„Ų… ؊ØĒŲ… ØĨؚداد ØĒŲƒØ§Ų…Ų„ Ø§Ų„Ų…ØĒØĩŲØ­" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." + "message": "Ų„Ų… ؊ØĒŲ… ØĨؚداد ØĒŲƒØ§Ų…Ų„ Ø§Ų„Ų…ØĒØĩŲØ­ ؁؊ ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب Bitwarden. Ø§Ų„ØąØŦØ§ØĄ ØĨØšØ¯Ø§Ø¯Ų‡ ؁؊ Ø§Ų„ØĨؚداداØĒ Ø¯Ø§ØŽŲ„ ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب." }, "startDesktopTitle": { - "message": "Start the Bitwarden desktop application" + "message": "Ø¨Ø¯ØĄ ØĒØ´ØēŲŠŲ„ ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب Bitwarden" }, "startDesktopDesc": { - "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + "message": "؊ØŦب ØŖŲ† ŲŠØ¨Ø¯ØŖ ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب Bitwarden Ų‚Ø¨Ų„ ØŖŲ† ŲŠŲ…ŲƒŲ† ؁ØĒØ­ Ø§Ų„Ų‚ŲŲ„ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ." }, "errorEnableBiometricTitle": { - "message": "Unable to set up biometrics" + "message": "ØēŲŠØą Ų‚Ø§Ø¯Øą ØšŲ„Ų‰ ØĨؚداد Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ" }, "errorEnableBiometricDesc": { - "message": "Action was canceled by the desktop application" + "message": "ØĒŲ… ØĨŲ„ØēØ§ØĄ Ø§Ų„ØĨØŦØąØ§ØĄ Ø¨ŲˆØ§ØŗØˇØŠ ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + "message": "ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب Ų„Ų… ŲŠŲ‚Ø¨Ų„ Ų‚Ų†Ø§ØŠ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø§Ų„ØĸŲ…Ų†ØŠ. ŲŠØąØŦŲ‰ ØĨؚاد؊ Ų…Ø­Ø§ŲˆŲ„ØŠ Ų‡Ø°Ų‡ Ø§Ų„ØšŲ…Ų„ŲŠØŠ" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Desktop communication interrupted" + "message": "ØĒŲ… Ø§Ų†Ų‚ØˇØ§Øš اØĒØĩØ§Ų„ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب" }, "nativeMessagingWrongUserDesc": { - "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + "message": "ØĒŲ… ØĒØŗØŦŲŠŲ„ Ø¯ØŽŲˆŲ„ ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب ØĨŲ„Ų‰ Ø­ØŗØ§Ø¨ Ų…ØŽØĒ؄؁. Ø§Ų„ØąØŦØ§ØĄ Ø§Ų„ØĒØŖŲƒØ¯ Ų…Ų† ØĒØŗØŦŲŠŲ„ Ø¯ØŽŲˆŲ„ ŲƒŲ„Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ŲŠŲ† ØĨŲ„Ų‰ Ų†ŲØŗ Ø§Ų„Ø­ØŗØ§Ø¨." }, "nativeMessagingWrongUserTitle": { - "message": "Account missmatch" + "message": "ØšØ¯Ų… ØĒØˇØ§Ø¨Ų‚ Ø§Ų„Ø­ØŗØ§Ø¨" + }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." }, "biometricsNotEnabledTitle": { - "message": "Biometrics not set up" + "message": "Ų„Ų… ؊ØĒŲ… ØĨؚداد Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + "message": "Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ Ų„Ų„Ų…ØĒØĩŲØ­ ØĒØĒØˇŲ„Ø¨ Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ Ų„ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب Ų„ŲŠØĒŲ… ØĨØšØ¯Ø§Ø¯Ų‡Ø§ ؁؊ Ø§Ų„ØĨؚداداØĒ ØŖŲˆŲ„Ø§Ų‹." }, "biometricsNotSupportedTitle": { - "message": "Biometrics not supported" + "message": "Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ ØēŲŠØą Ų…Ø¯ØšŲˆŲ…ØŠ" }, "biometricsNotSupportedDesc": { - "message": "Browser biometrics is not supported on this device." + "message": "Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ Ų„Ų„Ų…ØĒØĩŲØ­ ØēŲŠØą Ų…Ø¯ØšŲˆŲ…ØŠ ØšŲ„Ų‰ Ų‡Ø°Ø§ Ø§Ų„ØŦŲ‡Ø§Ø˛." + }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "ŲØ´Ų„ Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØĨŲƒŲ…Ø§Ų„ Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠØŒ ŲŲƒØą ؁؊ Ø§ØŗØĒØŽØ¯Ø§Ų… ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØąØĻŲŠØŗŲŠØŠ ØŖŲˆ ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ. ØĨذا Ø§ØŗØĒŲ…Øą Ø°Ų„ŲƒØŒ ŲŠØąØŦŲ‰ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø¨Ø¯ØšŲ… Bitwarden." }, "nativeMessaginPermissionErrorTitle": { - "message": "Permission not provided" + "message": "Ø§Ų„ØĨØ°Ų† ØēŲŠØą Ų…ØĒŲˆŲØą" }, "nativeMessaginPermissionErrorDesc": { - "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + "message": "Ø¨Ø¯ŲˆŲ† ØĨØ°Ų† Ų„Ų„ØĒŲˆØ§ØĩŲ„ Ų…Øš ØĒØˇØ¨ŲŠŲ‚ ØŗØˇØ­ Ø§Ų„Ų…ŲƒØĒب Bitwarden Ų„Ø§ ŲŠŲ…ŲƒŲ†Ų†Ø§ ØĒŲˆŲŲŠØą Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ ؁؊ Ų…Ų„Ø­Ų‚ Ø§Ų„Ų…ØĒØĩŲØ­. Ø§Ų„ØąØŦØ§ØĄ Ø§Ų„Ų…Ø­Ø§ŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Permission request error" + "message": "ØŽØˇØŖ ؁؊ ØˇŲ„Ø¨ Ø§Ų„ØĨØ°Ų†" }, "nativeMessaginPermissionSidebarDesc": { - "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + "message": "Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§Ų„Ų‚ŲŠØ§Ų… Ø¨Ų‡Ø°Ø§ Ø§Ų„ØĨØŦØąØ§ØĄ ؁؊ Ø§Ų„Ø´ØąŲŠØˇ Ø§Ų„ØŦØ§Ų†Ø¨ŲŠØŒ ŲŠØąØŦŲ‰ ØĨؚاد؊ Ų…Ø­Ø§ŲˆŲ„ØŠ Ø§Ų„ØĨØŦØąØ§ØĄ ؁؊ Ø§Ų„Ų†Ø§ŲØ°ØŠ Ø§Ų„Ų…Ų†Ø¨ØĢŲ‚ØŠ ØŖŲˆ Ø§Ų„Ų…Ų†Ø¨ØĢŲ‚ØŠ." }, "personalOwnershipSubmitError": { - "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available collections." + "message": "Ø¨ØŗØ¨Ø¨ ØŗŲŠØ§ØŗØŠ Ø§Ų„Ų…Ø¤ØŗØŗØŠØŒ ŲŠŲ…Ų†Øš ØšŲ„ŲŠŲƒ Ø­ŲØ¸ Ø§Ų„ØšŲ†Ø§ØĩØą ؁؊ ØŽØ˛Ø§Ų†ØĒ؃ Ø§Ų„Ø´ØŽØĩŲŠØŠ. ØēŲŠŲ‘Øą ØŽŲŠØ§Øą Ø§Ų„Ų…Ų„ŲƒŲŠØŠ ØĨŲ„Ų‰ Ų…Ø¤ØŗØŗØŠ ŲˆØ§ØŽØĒØą Ų…Ų† Ø§Ų„Ų…ØŦŲ…ŲˆØšØ§ØĒ Ø§Ų„Ų…ØĒاح؊." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Ø§Ų„Ų†ØˇØ§Ų‚Ø§ØĒ Ø§Ų„Ų…ØŗØĒبؚد؊" }, "excludedDomainsDesc": { "message": "Bitwarden Ų„Ų† ŲŠØˇŲ„Ø¨ Ø­ŲØ¸ ØĒŲØ§ØĩŲŠŲ„ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ų„Ų‡Ø°Ų‡ Ø§Ų„Ų†ØˇØ§Ų‚Ø§ØĒ. ؊ØŦب ØšŲ„ŲŠŲƒ ØĒØ­Ø¯ŲŠØĢ Ø§Ų„ØĩŲØ­ØŠ Ø­ØĒŲ‰ ØĒØĩبح Ø§Ų„ØĒØēŲŠŲŠØąØ§ØĒ ØŗØ§ØąŲŠØŠ Ø§Ų„Ų…ŲØšŲˆŲ„." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ Ų†ØˇØ§Ų‚ ØēŲŠØą ØĩØ§Ų„Ø­", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "ØĨØąØŗØ§Ų„", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1657,15 +2394,21 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "Ų†Øĩ" + }, + "sendTypeTextToShare": { + "message": "Text to share" }, "sendTypeFile": { - "message": "File" + "message": "؅؄؁" }, "allSends": { "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1701,10 +2447,10 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Disabled" + "message": "Ų…ØšØˇŲ‘Ų„" }, "removePasswordConfirmation": { - "message": "Are you sure you want to remove the password?" + "message": "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĨØ˛Ø§Ų„ØŠ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØąØŸ" }, "deleteSend": { "message": "Delete Send", @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1730,12 +2480,16 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion date" + "message": "ØĒØ§ØąŲŠØŽ Ø§Ų„Ø­Ø°Ų" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "ØĒØ§ØąŲŠØŽ Ø§Ų†ØĒŲ‡Ø§ØĄ Ø§Ų„ØĩŲ„Ø§Ø­ŲŠØŠ" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,11 +2625,14 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { - "message": "Before you start" + "message": "Ų‚Ø¨Ų„ ØŖŲ† ØĒØ¨Ø¯ØŖ" }, "sendFirefoxCustomDatePopoutMessage1": { - "message": "To use a calendar style date picker", + "message": "Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… Ų…Ų†ØĒŲ‚ŲŠ Ø§Ų„ØĒØ§ØąŲŠØŽ ØšŲ„Ų‰ Ų†Ų…Øˇ Ø§Ų„ØĒŲ‚ŲˆŲŠŲ…", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage2": { @@ -1835,14 +2640,14 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage3": { - "message": "to pop out your window.", + "message": "ØŖŲ† ŲŠØŽØąØŦ Ų…Ų† Ø§Ų„Ų†Ø§ŲØ°ØŠ.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "ØĩŲ„Ø§Ø­ŲŠØŠ ØĒØ§ØąŲŠØŽ Ø§Ų„Ø§Ų†ØĒŲ‡Ø§ØĄ Ø§Ų„Ų…Ų‚Ø¯Ų‘Ų… ØēŲŠØą ØĩØ­ŲŠØ­." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "ØĩŲ„Ø§Ø­ŲŠØŠ ØĒØ§ØąŲŠØŽ Ø§Ų„Ø­Ø°Ų Ø§Ų„Ų…Ų‚Ø¯Ų‘Ų… ØēŲŠØą ØĩØ­ŲŠØ­." }, "expirationDateAndTimeRequired": { "message": "An expiration date and time are required." @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ØĒØŖŲƒŲŠØ¯ Ø§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ Ų…ØˇŲ„ŲˆØ¨" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "؊ØŦب ØšŲ„ŲŠŲƒ ØĒØŖŲƒŲŠØ¯ Ø¨ØąŲŠØ¯Ųƒ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ. ŲŠŲ…ŲƒŲ†Ųƒ ØĒØŖŲƒŲŠØ¯ Ø¨ØąŲŠØ¯Ųƒ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ ؁؊ ØŽØ˛Ų†ØŠ Ø§Ų„ŲˆŲŠØ¨." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Ø§Ų„ØĒØŗØŦŲŠŲ„ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "Ų…Ų† ØŖØŦŲ„ ØĨŲƒŲ…Ø§Ų„ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… SSO، ŲŠØąØŦŲ‰ ØĒØšŲŠŲŠŲ† ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ų„Ų„ŲˆØĩŲˆŲ„ Ų„ØŽØ˛Ų†ØĒ؃ ŲˆØ­Ų…Ø§ŲŠØĒŲ‡Ø§." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…ØˇŲ„ŲˆØ¨", + "description": "Default title for the user verification dialog." }, "hours": { "message": "ØŗØ§ØšØ§ØĒ" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Ø¯Ų‚Ø§ØĻŲ‚" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "ØŗŲŠØ§ØŗØ§ØĒ Ų…Ø¤ØŗØŗØĒ؃ ØĒؤØĢØą ØšŲ„Ų‰ Ų…Ų‡Ų„ØŠ Ø§Ų„ØŽØ˛Ų†ØŠ Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ. Ø§Ų„Ø­Ø¯ Ø§Ų„ØŖŲ‚ØĩŲ‰ Ø§Ų„Ų…ØŗŲ…ŲˆØ­ Ø¨Ų‡ Ų„Ų…Ų‡Ų„ØŠ Ø§Ų„ØŽØ˛Ų†ØŠ Ų‡Ųˆ $HOURS$ ØŗØ§ØšØŠ/ØŗØ§ØšØ§ØĒ ؈ $MINUTES$ Ø¯Ų‚ŲŠŲ‚ØŠ/Ø¯Ų‚Ø§ØĻŲ‚", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "ØŽØˇØŖ" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ØĨŲ†Ø´Ø§ØĄ Ø§ØŗŲ… Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Ų†ŲˆØš Ø§ØŗŲ… Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "ØĨŲ†Ø´Ø§ØĄ Ø¨ØąŲŠØ¯ ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ Ų…ØŗØĒØšØ§Øą Ų…Øš ØŽØ¯Ų…ØŠ ØĨؚاد؊ ØĒ؈ØŦŲŠŲ‡ ØŽØ§ØąØŦŲŠØŠ." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Ø§ØŗŲ… Ø§Ų„Ų…Øļ؊؁", "description": "Part of a URL." @@ -2129,55 +3133,55 @@ "message": "New around here?" }, "rememberEmail": { - "message": "Remember email" + "message": "ØĒØ°ŲƒØą Ø§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ" }, "loginWithDevice": { - "message": "Log in with device" + "message": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ø§Ų„ØŦŲ‡Ø§Ø˛" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "؊ØŦب ØĨؚداد ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ø§Ų„ØŦŲ‡Ø§Ø˛ ؁؊ ØĨؚداداØĒ ØĒØˇØ¨ŲŠŲ‚ Bitwarden. Ų‡Ų„ ØĒØ­ØĒاØŦ ØĨŲ„Ų‰ ØŽŲŲŠØ§Øą ØĸØŽØąØŸ" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "ØšØ¨Ø§ØąØŠ بØĩŲ…ØŠ Ø§Ų„ØĨØĩبؚ" }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + "message": "Ø§Ų„ØąØŦØ§ØĄ Ø§Ų„ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ† Ø§Ų„ØŽØ˛Ų†ØŠ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ ØēŲŠØą Ų…Ų‚ŲŲ„ØŠ ŲˆØŖŲ† ØšØ¨Ø§ØąØŠ بØĩŲ…ØŠ Ø§Ų„ØĨØĩبؚ ØĒØĒØˇØ§Ø¨Ų‚ ØšŲ„Ų‰ Ø§Ų„ØŦŲ‡Ø§Ø˛ Ø§Ų„ØĸØŽØą." }, "resendNotification": { - "message": "Resend notification" + "message": "ØĨؚاد؊ ØĨØąØŗØ§Ų„ Ø§Ų„ØĨØ´ØšØ§Øą" }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "ØšØąØļ ØŦŲ…ŲŠØš ØŽŲŠØ§ØąØ§ØĒ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„" }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "ØĒŲ… ØĨØąØŗØ§Ų„ ØĨØ´ØšØ§Øą ØĨŲ„Ų‰ ØŦŲ‡Ø§Ø˛Ųƒ." }, "loginInitiated": { - "message": "Login initiated" + "message": "Ø¨ŲŽØ¯Ų’ØĄ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ų…ŲƒØ´ŲˆŲØŠ" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų…ŲˆØŦŲˆØ¯ØŠ ؁؊ ØĒØŗØąŲŠØ¨Ø§ØĒ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ. Ø§ØŗØĒØŽØ¯Ų… ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ŲØąŲŠØ¯ØŠ Ų„Ø­Ų…Ø§ŲŠØŠ Ø­ØŗØ§Ø¨Ųƒ. Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ†Ųƒ ØĒØąŲŠØ¯ Ø§ØŗØĒØŽØ¯Ø§Ų… ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ų…ŲƒØ´ŲˆŲØŠØŸ" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ØļØšŲŠŲØŠ ŲˆŲ…ŲƒØ´ŲˆŲØŠ" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "ØĒŲ… ØĒØ­Ø¯ŲŠØ¯ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØļØšŲŠŲØŠ ؈ Ų…ŲˆØŦŲˆØ¯ØŠ ؁؊ ØĒØŗØąŲŠØ¨Ø§ØĒ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ. Ø§ØŗØĒØŽØ¯Ų… ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ų‚ŲˆŲŠØŠ ŲˆŲØąŲŠØ¯ØŠ Ų„Ø­Ų…Ø§ŲŠØŠ Ø­ØŗØ§Ø¨Ųƒ. Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ†Ųƒ ØĒØąŲŠØ¯ Ø§ØŗØĒØŽØ¯Ø§Ų… ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų‡Ø°Ų‡ØŸ" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "ØĒØ­Ų‚Ų‚ Ų…Ų† ØĒØŗØąŲŠØ¨Ø§ØĒ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų…ØšØąŲˆŲØŠ Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ų‡Ø°Ų‡" }, "important": { - "message": "Important:" + "message": "Ų…Ų‡Ų…:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§ØŗØĒؚاد؊ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ØĨذا Ų†ØŗŲŠØĒŲ‡Ø§!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ Ø­ØąŲ ØŖØ¯Ų†Ų‰", "placeholders": { "length": { "content": "$1", @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "ØŗŲŠØ§ØŗØ§ØĒ Ų…Ø¤ØŗØŗØĒ؃ Ø´ØēŲ„ØĒ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ ؁؊ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲØ­ØŠ." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "ŲƒŲŠŲŲŠØŠ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "حدد ØšŲ†ØĩØą Ų…Ų† Ų‡Ø°Ų‡ Ø§Ų„Ø´Ø§Ø´ØŠØŒ ŲˆØ§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ø§ØŽØĒØĩØ§Øą $COMMAND$، ØŖŲˆ Ø§ØŗØĒŲƒØ´Ø§Ų ØŽŲŠØ§ØąØ§ØĒ ØŖØŽØąŲ‰ ؁؊ Ø§Ų„ØĨؚداداØĒ.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { - "message": "Got it" + "message": "؁؇؅ØĒ" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "ØĨؚداداØĒ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Ų…Ų„ØĄ ØĒŲ„Ų‚Ø§ØĻ؊ Ų„Ø§ØŽØĒØĩØ§Øą Ų„ŲˆØ­ØŠ Ø§Ų„Ų…ŲØ§ØĒŲŠØ­" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,43 +3246,55 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "ØĒŲŲØĒØ­ ؁؊ Ų†Ø§ŲØ°ØŠ ØŦØ¯ŲŠØ¯ØŠ" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "Ų…ŲˆØ§ŲŲ‚ØŠ Ø§Ų„ØŦŲ‡Ø§Ø˛ Ų…ØˇŲ„ŲˆØ¨ØŠ. Ø­Ø¯Ų‘Ø¯ ØŽŲŠØ§Øą Ø§Ų„Ų…ŲˆØ§ŲŲ‚ØŠ ØŖØ¯Ų†Ø§Ų‡:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "ØĒØ°ŲƒØą Ų‡Ø°Ø§ Ø§Ų„ØŦŲ‡Ø§Ø˛" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "ØĨŲ„ØēØ§ØĄ ØĒØ­Ø¯ŲŠØ¯ ØšŲ†Ø¯ Ø§ØŗØĒØŽØ¯Ø§Ų… ØŦŲ‡Ø§Ø˛ ØšØ§Ų…" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Ø§Ų„Ų…ŲˆØ§ŲŲ‚ØŠ Ų…Ų† ØŦŲ‡Ø§Ø˛Ųƒ Ø§Ų„ØĸØŽØą" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "ØˇŲ„Ø¨ Ų…ŲˆØ§ŲŲ‚ØŠ Ø§Ų„Ų…Ø¯ŲŠØą" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Ø§Ų„Ų…ŲˆØ§ŲŲ‚ØŠ Ø¨ŲˆØ§ØŗØˇØŠ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ" }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { - "message": "EU", + "message": "Ø§Ų„Ø§ØĒحاد Ø§Ų„ØŖŲˆØąŲˆØ¨ŲŠ", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Ø§ØŗØĒŲŠØąØ§Ø¯ Ø¨ŲŠØ§Ų†Ø§ØĒ؃ ØĨŲ„Ų‰ Bitwarden؟", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Ø­Ų…Ø§ŲŠØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ؃ Ø§Ų„ØŖØŽŲŠØąØŠ ŲˆØ§ØŗØĒŲŠØąØ§Ø¯Ųƒ ØĨŲ„Ų‰ Bitwarden؟", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Ø­ŲØ¸ ŲƒŲ…Ų„Ų ØēŲŠØą Ų…Ø´ŲØą", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Ø§ØŗØĒŲŠØąØ§Ø¯ ØĨŲ„Ų‰ Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ØŦØ§ØąŲ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Ų„Ų‚Ø¯ ØĒŲ… Ø§ØŗØĒŲŠØąØ§Ø¯ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø¨Ų†ØŦاح!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "ØŽØˇØŖ ؁؊ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯. ØĒØ­Ų‚Ų‚ Ų…Ų† ŲˆØ­Ø¯ØŠ Ø§Ų„ØĒØ­ŲƒŲ… Ų„Ų„Ø­ØĩŲˆŲ„ ØšŲ„Ų‰ Ø§Ų„ØĒŲØ§ØĩŲŠŲ„.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "ØĒŲ… Ų…ŲˆØ§ØŦŲ‡ØŠ ØŽØˇØŖ ؁؊ Ø§Ų„Ø´Ø¨ŲƒØŠ ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Ø§Ų„Ø§ØŗŲ… Ø§Ų„Ø¨Ø¯ŲŠŲ„ Ų„Ų„Ų†ØˇØ§Ų‚" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Ø§Ų„ØšŲ†Ø§ØĩØą Ų…Øš ØĨؚاد؊ ØˇŲ„Ø¨ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ų„Ø§ ŲŠŲ…ŲƒŲ† Ų…Ų„ØĻŲ‡Ø§ ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§ ØšŲ†Ø¯ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲØ­ØŠ. Ø§Ų„ØĒؚبØĻØŠ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ ØšŲ†Ø¯ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲØ­ØŠ.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Ų…Ų„ØĄ ØĒŲ„Ų‚Ø§ØĻ؊ ØšŲ†Ø¯ ØĒØšŲŠŲŠŲ† ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ØĩŲØ­ØŠ Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„ØĨؚداد Ø§Ų„Ø§ŲØĒØąØ§Øļ؊.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "ØĨŲŠŲ‚Ø§Ų ØĒØ´ØēŲŠŲ„ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ Ų„ØĒØ­ØąŲŠØą Ų‡Ø°Ø§ Ø§Ų„Ø­Ų‚Ų„", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "ØĒØŽØˇŲŠ ØĨŲ„Ų‰ Ø§Ų„Ų…Ø­ØĒŲˆŲ‰" + }, + "bitwardenOverlayButton": { + "message": "Ø˛Øą Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "ØĒØ¨Ø¯ŲŠŲ„ Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ Ų„Ų€ Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Ø§ŲØĒØ­ Ø­ØŗØ§Ø¨Ųƒ Ų„ØšØąØļ ØĒØŗØŦŲŠŲ„Ø§ØĒ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø§Ų„Ų…ØˇØ§Ø¨Ų‚ØŠ", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "؁ØĒØ­ Ø§Ų„Ø­ØŗØ§Ø¨", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Ų…Ų„ØĄ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ø§ØšØĒŲ…Ø§Ø¯ Ų„Ų€", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Ø§ØŗŲ… Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… Ø§Ų„ØŦØ˛ØĻ؊", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Ų„Ø§ ØĒ؈ØŦد ØšŲ†Ø§ØĩØą Ų„ØĨØ¸Ų‡Ø§ØąŲ‡Ø§", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "ØšŲ†ØĩØą ØŦØ¯ŲŠØ¯", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "ØĨØļØ§ŲØŠ ØšŲ†ØĩØą Ų…ØŽØ˛Ų† ØŦØ¯ŲŠØ¯", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "ØĒØĒŲˆŲØą Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ų…Ų„ØĄ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ Ų„Bitwarden. اØļØēØˇ ØšŲ„Ų‰ ؅؁ØĒاح Ø§Ų„ØŗŲ‡Ų… Ų„ØŖØŗŲŲ„ Ų„Ų„ØĒØ­Ø¯ŲŠØ¯.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ŲØšŲ‘Ų„" + }, + "ignore": { + "message": "ØĒØŦØ§Ų‡Ų„" + }, + "importData": { + "message": "Ø§ØŗØĒŲŠØąØ§Ø¯ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "ØŽØˇØŖ ؁؊ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯" + }, + "importErrorDesc": { + "message": "حدØĢØĒ Ų…Ø´ŲƒŲ„ØŠ ؁؊ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒ؊ Ø­Ø§ŲˆŲ„ØĒ Ø§ØŗØĒŲŠØąØ§Ø¯Ų‡Ø§. Ø§Ų„ØąØŦØ§ØĄ Ø­Ų„ Ø§Ų„ØŖØŽØˇØ§ØĄ Ø§Ų„Ų…Ø¯ØąØŦØŠ ØŖØ¯Ų†Ø§Ų‡ ؁؊ Ø§Ų„Ų…Ų„Ų Ø§Ų„Ų…ØĩØ¯Øą Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ ŲˆØ­Ø§ŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Ø­ŲŲ„ Ø§Ų„ØŖØŽØˇØ§ØĄ ØŖØ¯Ų†Ø§Ų‡ ØĢŲ… Ø­Ø§ŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰." + }, + "description": { + "message": "Ø§Ų„ŲˆØĩ؁" + }, + "importSuccess": { + "message": "ØĒŲ… Ø§ØŗØĒŲŠØąØ§Ø¯ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø¨Ų†ØŦاح" + }, + "importSuccessNumberOfItems": { + "message": "ØĒŲ… Ø§ØŗØĒŲŠØąØ§Ø¯ Ų…ØŦŲ…ŲˆØš Ø§Ų„ØšŲ†Ø§ØĩØą $AMOUNT$.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Ø­Ø§ŲˆŲ„ Ų…ØŦØ¯Ø¯Ų‹Ø§" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…ØˇŲ„ŲˆØ¨ Ų„Ų‡Ø°Ø§ Ø§Ų„ØĨØŦØąØ§ØĄ. ØšŲŠŲ‘Ų† ØąŲ…Ø˛ PIN Ų„Ų„Ų…ØĒابؚ؊." + }, + "setPin": { + "message": "ØšŲŠŲ‘Ų† PIN" + }, + "verifyWithBiometrics": { + "message": "Ø§Ų„ØĒØ­Ų‚Ų‚ Ø¨ŲˆØ§ØŗØˇØŠ Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ" + }, + "awaitingConfirmation": { + "message": "؁؊ Ø§Ų†ØĒØ¸Ø§Øą ØĒØŖŲƒŲŠØ¯" + }, + "couldNotCompleteBiometrics": { + "message": "Ų„Ø§ ŲŠŲ…ŲƒŲ† ØĨŲƒŲ…Ø§Ų„ Ø§Ų„Ų‚ŲŠØ§ØŗØ§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ." + }, + "needADifferentMethod": { + "message": "Ų‡Ų„ ØĒØ­ØĒاØŦ ØĨŲ„Ų‰ ØˇØąŲŠŲ‚ØŠ Ų…ØŽØĒŲ„ŲØŠØŸ" + }, + "useMasterPassword": { + "message": "Ø§ØŗØĒØŽØ¯Ø§Ų… ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØąØĻŲŠØŗŲŠØŠ" + }, + "usePin": { + "message": "Ø§ØŗØĒØŽØ¯Ų… PIN" + }, + "useBiometrics": { + "message": "Ø§ØŗØĒØŽØ¯Ų… Ø§Ų„ØŗŲŠØ§Ų‚Ø§ØĒ Ø§Ų„Ø­ŲŠŲˆŲŠØŠ" + }, + "enterVerificationCodeSentToEmail": { + "message": "ØŖØ¯ØŽŲŲ„ ØąŲ…Ø˛ Ø§Ų„ØĒØ­Ų‚Ų‚ Ø§Ų„Ø°ŲŠ ØŖØąØŗŲ„ ØĨŲ„Ų‰ Ø¨ØąŲŠØ¯Ųƒ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ." + }, + "resendCode": { + "message": "ØŖØšŲØ¯ ØĨØąØŗØ§Ų„ Ø§Ų„ØąŲ…Ø˛" + }, + "total": { + "message": "Ø§Ų„Ų…ØŦŲ…ŲˆØš" + }, + "importWarning": { + "message": "ØŖŲ†ØĒ ØĒØŗØĒŲˆØąØ¯ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ ØĨŲ„Ų‰ $ORGANIZATION$. Ų‚Ø¯ ؊ØĒŲ… Ų…Ø´Ø§ØąŲƒØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ؃ Ų…Øš ØŖØšØļØ§ØĄ Ų‡Ø°Ų‡ Ø§Ų„Ų…Ø¤ØŗØŗØŠ. Ų‡Ų„ ØĒØąŲŠØ¯ Ø§Ų„Ų…ØĒابؚ؊؟", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Ų‚Ų… بØĒØ´ØēŲŠŲ„ Duo ŲˆØ§ØĒبؚ Ø§Ų„ØŽØˇŲˆØ§ØĒ Ų„ØĨŲ†Ų‡Ø§ØĄ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„." + }, + "duoRequiredForAccount": { + "message": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ų„Ų€ Duo Ų…Ų† ØŽØˇŲˆØĒŲŠŲ† Ų…ØˇŲ„ŲˆØ¨ Ų„Ø­ØŗØ§Ø¨Ųƒ." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Ø§Ų†Ø¨ØĢŲ‚ Ø§Ų„Ø§Ų…ØĒداد Ų„ØĨŲƒŲ…Ø§Ų„ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„." + }, + "popoutExtension": { + "message": "ØĒŲ…Ø¯ŲŠØ¯ Ų…Ų†Ø¨ØĢŲ‚" + }, + "launchDuo": { + "message": "ØĒØ´ØēŲŠŲ„ Duo" + }, + "importFormatError": { + "message": "Ų„Ų… ؊ØĒŲ… ØĒŲ†ØŗŲŠŲ‚ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø¨Ø´ŲƒŲ„ ØĩØ­ŲŠØ­. Ø§Ų„ØąØŦØ§ØĄ Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† ؅؄؁ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯ Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ ŲˆØ­Ø§ŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰." + }, + "importNothingError": { + "message": "Ų„Ų… ؊ØĒŲ… Ø§ØŗØĒŲŠØąØ§Ø¯ ØŖŲŠ Ø´ŲŠØĄ." + }, + "importEncKeyError": { + "message": "ØŽØˇØŖ ؁؊ ؁؃ ØĒØ´ŲŲŠØą Ø§Ų„Ų…Ų„Ų Ø§Ų„Ų…ØĩØ¯Øą. ؅؁ØĒاح Ø§Ų„ØĒØ´ŲŲŠØą Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ Ų„Ø§ ؊ØĒØˇØ§Ø¨Ų‚ Ų…Øš ؅؁ØĒاح Ø§Ų„ØĒØ´ŲŲŠØą Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… ØšŲ†Ø¯ ØĒØĩØ¯ŲŠØą Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ." + }, + "invalidFilePassword": { + "message": "ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ø§Ų„Ų…Ų„Ų ØēŲŠØą ØĩØ§Ų„Ø­ØŠØŒ Ø§Ų„ØąØŦØ§ØĄ Ø§ØŗØĒØŽØ¯Ø§Ų… ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą Ø§Ų„ØĒ؊ ØŖØ¯ØŽŲ„ØĒŲ‡Ø§ ØšŲ†Ø¯ ØĨŲ†Ø´Ø§ØĄ ؅؄؁ Ø§Ų„ØĒØĩØ¯ŲŠØą." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "ØĒØšØąŲ ØšŲ„Ų‰ ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯ Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ" + }, + "selectImportFolder": { + "message": "ا؎ØĒØą Ų…ØŦŲ„Ø¯Ų‹Ø§" + }, + "selectImportCollection": { + "message": "ا؎ØĒØą Ų…ØŦŲ…ŲˆØšØŠ" + }, + "importTargetHint": { + "message": "حدد Ų‡Ø°Ø§ Ø§Ų„ØŽŲŠØ§Øą ØĨذا ŲƒŲ†ØĒ ØĒØąŲŠØ¯ Ų†Ų‚Ų„ Ų…Ø­ØĒŲˆŲŠØ§ØĒ Ø§Ų„Ų…Ų„Ų Ø§Ų„Ų…ØŗØĒŲˆØąØ¯ ØĨŲ„Ų‰ $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Ø§Ų„Ų…Ų„Ų ŲŠØ­ØĒ؈؊ ØšŲ„Ų‰ ØšŲ†Ø§ØĩØą ØēŲŠØą Ų…ØŗŲ†Ø¯ØŠ." + }, + "selectFormat": { + "message": "حدد ØĒŲ†ØŗŲŠŲ‚ ؅؄؁ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯" + }, + "selectImportFile": { + "message": "حدد ؅؄؁ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯" + }, + "chooseFile": { + "message": "ا؎ØĒØą ؅؄؁" + }, + "noFileChosen": { + "message": "Ų„Ų… ؊ØĒŲ… ا؎ØĒŲŠØ§Øą ؅؄؁" + }, + "orCopyPasteFileContents": { + "message": "ØŖŲˆ Ø§Ų†ØŗØŽ/Ø§Ų„ØĩŲ‚ Ų…Ø­ØĒŲˆŲŠØ§ØĒ ؅؄؁ Ø§Ų„Ø§ØŗØĒŲŠØąØ§Ø¯" + }, + "instructionsFor": { + "message": "ØĒØšŲ„ŲŠŲ…Ø§ØĒ $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "ØĒØŖŲƒŲŠØ¯ ØĒØĩØ¯ŲŠØą Ø§Ų„ØŽØ˛Ų†ØŠ" + }, + "confirmVaultImportDesc": { + "message": "Ų‡Ø°Ø§ Ø§Ų„Ų…Ų„Ų Ų…Ø­Ų…ŲŠ Ø¨ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą. Ø§Ų„ØąØŦØ§ØĄ ØĨØ¯ØŽØ§Ų„ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ø§Ų„Ų…Ų„Ų Ų„Ø§ØŗØĒŲŠØąØ§Ø¯ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ." + }, + "confirmFilePassword": { + "message": "ØĒØŖŲƒŲŠØ¯ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ø§Ų„Ų…Ų„Ų" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Ų„Ų† ؊ØĒŲ… Ų†ØŗØŽ Passkey" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "ØĒØŖŲƒŲŠØ¯" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØēŲŠØą ØĩØ­ŲŠØ­ØŠ" + }, + "incorrectCode": { + "message": "ØąŲ…Ø˛ ØēŲŠØą ØĩØ­ŲŠØ­" + }, + "incorrectPin": { + "message": "ØąŲ…Ø˛ PIN ØēŲŠØą ØĩØ­ŲŠØ­" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "Ø¨ØąŲŠØ¯ LastPass Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ" + }, + "importingYourAccount": { + "message": "ØŦØ§ØąŲ Ø§ØŗØĒŲŠØąØ§Ø¯ Ø­ØŗØ§Ø¨Ųƒ..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 774e3fd64cd..a3fefa68d4e 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Ödənişsiz Parol Meneceri", + "message": "Bitwarden Parol Meneceri", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "BÃŧtÃŧn cihazlarÄąnÄąz ÃŧçÃŧn gÃŧvənli və Ãļdənişsiz bir parol meneceri.", - "description": "Extension description" + "message": "Bitwarden evdə və ya işdə olarkən bÃŧtÃŧn parol, keçid açarÄą və həssas məlumatlarÄąnÄązÄą asanlÄąqla qoruyur", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "GÃŧvənli anbarÄąnÄąza mÃŧraciət etmək ÃŧçÃŧn giriş edin və ya yeni bir hesab yaradÄąn." + "message": "GÃŧvənli seyfinizə mÃŧraciət etmək ÃŧçÃŧn giriş edin və ya yeni bir hesab yaradÄąn." + }, + "inviteAccepted": { + "message": "Dəvət qəbul edildi" }, "createAccount": { "message": "Hesab yarat" }, - "login": { - "message": "Giriş et" + "newToBitwarden": { + "message": "Bitwarden-də yenisiniz?" + }, + "logInWithPasskey": { + "message": "Keçid açarÄą ilə giriş et" + }, + "useSingleSignOn": { + "message": "Tək daxil olma Ãŧsulunu istifadə et" + }, + "welcomeBack": { + "message": "Yenidən xoş gəlmisiniz" + }, + "setAStrongPassword": { + "message": "GÃŧclÃŧ bir parol təyin et" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Bir parol təyin edərək hesabÄąnÄązÄą yaratmağı başa çatdÄąrÄąn" }, "enterpriseSingleSignOn": { "message": "MÃŧəssisə ÃŧçÃŧn tək daxil olma" @@ -38,34 +56,62 @@ "message": "Ana parol" }, "masterPassDesc": { - "message": "Ana parol, anbarÄąnÄąza mÃŧraciət etmək ÃŧçÃŧn istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. UnutsanÄąz, parolu bərpa etməyin heç bir yolu yoxdur." + "message": "Ana parol, seyfinizə mÃŧraciət etmək ÃŧçÃŧn istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. UnutsanÄąz, parolu bərpa etməyin heç bir yolu yoxdur." }, "masterPassHintDesc": { "message": "Ana parol məsləhəti, unutduğunuz parolunuzu xatÄąrlamağınÄąza kÃļmək edir." }, + "masterPassHintText": { + "message": "Parolunuzu unutsanÄąz, parol ipucu e-poçtunuza gÃļndərilə bilər. Maksimum $CURRENT$/$MAXIMUM$ simvol.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Ana parolu yenidən yaz" }, "masterPassHint": { - "message": "Ana parol məsləhəti (ixtiyari)" + "message": "Ana parol ipucu (ixtiyari)" + }, + "joinOrganization": { + "message": "Təşkilata qoşul" + }, + "joinOrganizationName": { + "message": "$ORGANIZATIONNAME$ - qoşul", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Bu ana parol təyin edərək bu təşkilata qoşulmağı tamamlayÄąn." }, "tab": { "message": "Vərəq" }, "vault": { - "message": "Anbar" + "message": "Seyf" }, "myVault": { - "message": "AnbarÄąm" + "message": "Seyfim" }, "allVaults": { - "message": "BÃŧtÃŧn anbarlar" + "message": "BÃŧtÃŧn seyflər" }, "tools": { "message": "Alətlər" }, "settings": { - "message": "Tənzimləmələr" + "message": "Ayarlar" }, "currentTab": { "message": "HazÄąrkÄą vərəq" @@ -73,8 +119,11 @@ "copyPassword": { "message": "Parolu kopyala" }, + "copyPassphrase": { + "message": "Keçid ifadəsini kopyala" + }, "copyNote": { - "message": "Qeydi kopyala" + "message": "Notu kopyala" }, "copyUri": { "message": "URI-ni kopyala" @@ -88,23 +137,90 @@ "copySecurityCode": { "message": "GÃŧvənlik kodunu kopyala" }, + "copyName": { + "message": "AdÄą kopyala" + }, + "copyCompany": { + "message": "Şirkəti kopyala" + }, + "copySSN": { + "message": "Sosial gÃŧvənlik nÃļmrəsini kopyala" + }, + "copyPassportNumber": { + "message": "Pasport nÃļmrəsini kopyala" + }, + "copyLicenseNumber": { + "message": "Lisenziya nÃļmrəsini kopyala" + }, + "copyPrivateKey": { + "message": "Private açarÄą kopyala" + }, + "copyPublicKey": { + "message": "Public açarÄą kopyala" + }, + "copyFingerprint": { + "message": "Barmaq izini kopyala" + }, + "copyCustomField": { + "message": "$FIELD$ - kopyala", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Veb saytÄą kopyala" + }, + "copyNotes": { + "message": "NotlarÄą kopyala" + }, + "fill": { + "message": "Doldur", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Avto-doldurma" }, + "autoFillLogin": { + "message": "Girişi avto-doldur" + }, + "autoFillCard": { + "message": "KartÄą avto-doldur" + }, + "autoFillIdentity": { + "message": "Kimliyi avto-doldur" + }, "generatePasswordCopied": { "message": "Parol yarat (kopyalandÄą)" }, "copyElementIdentifier": { - "message": "Özəl sahə adÄąnÄą kopyala" + "message": "Özəl xana adÄąnÄą kopyala" }, "noMatchingLogins": { - "message": "Uyğun gələn hesab yoxdur." + "message": "Uyuşan giriş məlumatlarÄą yoxdur" + }, + "noCards": { + "message": "Kart yoxdur" + }, + "noIdentities": { + "message": "Kimlik yoxdur" + }, + "addLoginMenu": { + "message": "Giriş əlavə et" + }, + "addCardMenu": { + "message": "Kart əlavə et" + }, + "addIdentityMenu": { + "message": "Kimlik əlavə et" }, "unlockVaultMenu": { - "message": "AnbarÄąn kilidini aÃ§Äąn" + "message": "Seyfinizin kilidini aÃ§Äąn" }, "loginToVaultMenu": { - "message": "AnbarÄąnÄąza giriş edin" + "message": "Seyfinizə giriş edin" }, "autoFillInfo": { "message": "HazÄąrkÄą brauzer vərəqi ÃŧçÃŧn avto-doldurulacaq giriş məlumatlarÄą yoxdur." @@ -115,20 +231,32 @@ "addItem": { "message": "Element əlavə et" }, + "accountEmail": { + "message": "Hesab e-poçtu" + }, + "requestHint": { + "message": "İpucu tələb et" + }, + "requestPasswordHint": { + "message": "Parol ipucusu tələb et" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "HesabÄąnÄązÄąn e-poçt ÃŧnvanÄąnÄą daxil edin və parolunuz ÃŧçÃŧn ipucu sizə gÃļndəriləcək" + }, "passwordHint": { - "message": "Parol məsləhəti" + "message": "Parol ipucu" }, "enterEmailToGetHint": { - "message": "Ana parol məsləhətini alacağınÄąz hesabÄąnÄązÄąn e-poçt ÃŧnvanÄąnÄą daxil edin." + "message": "Ana parol ipucunuzu alacağınÄąz hesabÄąnÄązÄąn e-poçt ÃŧnvanÄąnÄą daxil edin." }, "getMasterPasswordHint": { - "message": "Ana parol ÃŧçÃŧn məsləhət alÄąn" + "message": "Ana parol ÃŧçÃŧn ipucu alÄąn" }, "continue": { "message": "Davam" }, "sendVerificationCode": { - "message": "E-poçtunuza bir təsdiqləmə kodu gÃļndərin" + "message": "Doğrulama kodunu e-poçtunuza gÃļndərin" }, "sendCode": { "message": "Kod gÃļndər" @@ -137,17 +265,35 @@ "message": "Kod gÃļndərildi" }, "verificationCode": { - "message": "Təsdiqləmə kodu" + "message": "Doğrulama kodu" }, "confirmIdentity": { "message": "Davam etmək ÃŧçÃŧn kimliyinizi təsdiqləyin." }, - "account": { - "message": "Hesab" - }, "changeMasterPassword": { "message": "Ana parolu dəyişdir" }, + "continueToWebApp": { + "message": "Veb tətbiqlə davam edilsin?" + }, + "continueToWebAppDesc": { + "message": "Veb tətbiqində Bitwarden hesabÄąnÄązÄąn daha çox Ãļzəlliyini kəşf edin." + }, + "continueToHelpCenter": { + "message": "KÃļmək Mərkəzi ilə davam edilsin?" + }, + "continueToHelpCenterDesc": { + "message": "KÃļmək Mərkəzində Bitwarden-in necə istifadə ediləcəyi ilə bağlÄą ətraflÄą Ãļyrənin." + }, + "continueToBrowserExtensionStore": { + "message": "Brauzer uzantÄąsÄąnÄą mağazasÄąna gedirsiniz?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "BaşqalarÄąnÄąn Bitwarden-in onlar ÃŧçÃŧn uyğun olub-olmadığınÄą Ãļyrənməkdə kÃļmək edin. Brauzerin uzantÄą mağazasÄąnÄą ziyarət edin və qiymətləndirin." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Ana parolunuzu Bitwarden veb tətbiqində dəyişdirə bilərsiniz." + }, "fingerprintPhrase": { "message": "Barmaq izi ifadəsi", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -157,14 +303,50 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "İki mərhələli giriş" + "message": "İki addÄąmlÄą giriş" }, "logOut": { "message": "Ã‡ÄąxÄąÅŸ" }, + "aboutBitwarden": { + "message": "Bitwarden haqqÄąnda" + }, "about": { "message": "HaqqÄąnda" }, + "moreFromBitwarden": { + "message": "\"Bitwarden\"dən daha çoxu" + }, + "continueToBitwardenDotCom": { + "message": "bitwarden.com ilə davam edilsin?" + }, + "bitwardenForBusiness": { + "message": "Biznes ÃŧçÃŧn Bitwarden" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator, kimlik doğrulama açarlarÄąnÄą saxlamağınÄąza və 2 addÄąmlÄą doğrulama axÄąnlarÄą ÃŧçÃŧn TOTP kodlarÄąnÄą yaratmağınÄąza imkan verir. Daha ətraflÄą bitwarden.com veb saytÄąnda Ãļyrənə bilərsiniz" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Sirr Meneceri" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bitwarden Sirr Meneceri ilə developer sirlərini gÃŧvənli bir şəkildə saxlayÄąn, idarə edin və paylaÅŸÄąn. Daha ətraflÄą bitwarden.com veb saytÄąnda Ãļyrənə bilərsiniz." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Passwordless.dev ilə ənənəvi parollardan azad, problemsiz və gÃŧvənli giriş təcrÃŧbələri yaradÄąn. Daha ətraflÄą bitwarden.com veb saytÄąnda Ãļyrənə bilərsiniz." + }, + "freeBitwardenFamilies": { + "message": "Ödənişsiz Bitwarden Ailələri" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Ödənişsiz Bitwarden Ailələri ÃŧçÃŧn uyğunsunuz. Bu təklifdən veb tətbiqdən yararlanÄąn." + }, "version": { "message": "Versiya" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Qovluğa dÃŧzəliş et" }, + "newFolder": { + "message": "Yeni qovluq" + }, + "folderName": { + "message": "Qovluq adÄą" + }, + "folderHintText": { + "message": "Ana qovluğun adÄąndan sonra \"/\" əlavə edərək qovluğu ardÄącÄąl yerləşdirin. NÃŧmunə: Social/Forums" + }, + "noFoldersAdded": { + "message": "Heç bir qovluq əlavə edilmədi" + }, + "createFoldersToOrganize": { + "message": "Seyf elementlərinizi təşkil etmək ÃŧçÃŧn qovluq yaradÄąn" + }, + "deleteFolderPermanently": { + "message": "Bu qovluğu həmişəlik silmək istədiyinizə əminsiniz?" + }, "deleteFolder": { "message": "Qovluğu sil" }, @@ -190,44 +390,44 @@ "message": "Qovluqlar" }, "noFolders": { - "message": "SiyahÄąlanacaq heç bir qovluq yoxdur." + "message": "Sadalanacaq heç bir qovluq yoxdur." }, "helpFeedback": { - "message": "KÃļmək və əks əlaqə" + "message": "KÃļmək və əks-əlaqə" }, "helpCenter": { - "message": "Bitwarden KÃļmək mərkəzi" + "message": "Bitwarden KÃļmək Mərkəzi" }, "communityForums": { "message": "Bitwarden cəmiyyət forumlarÄąnÄą kəşf et" }, "contactSupport": { - "message": "Bitwarden dəstəyi ilə əlaqə saxla" + "message": "Bitwarden dəstəyi ilə əlaqə" }, "sync": { - "message": "Eyniləşdirmə" + "message": "Sinxr" }, "syncVaultNow": { - "message": "AnbarÄą indi eyniləşdir" + "message": "Seyfi indi sinxronlaşdÄąr" }, "lastSync": { - "message": "Son eyniləşdirmə:" + "message": "Son sinxr:" }, "passGen": { "message": "Parol yaradÄącÄą" }, "generator": { "message": "YaradÄącÄą", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "HesablarÄąnÄąz ÃŧçÃŧn avtomatik olaraq gÃŧclÃŧ, unikal parollar yaradÄąn." }, - "bitWebVault": { - "message": "Bitwarden veb anbarÄą" + "bitWebVaultApp": { + "message": "Bitwarden veb tətbiqi" }, "importItems": { - "message": "Elementləri idxal et" + "message": "Elementləri daxilə kÃļçÃŧr" }, "select": { "message": "Seçin" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Parol yarat" }, + "generatePassphrase": { + "message": "Keçid ifadələri yarat" + }, "regeneratePassword": { "message": "Parolu yenidən yarat" }, @@ -244,17 +447,60 @@ "length": { "message": "Uzunluq" }, + "passwordMinLength": { + "message": "Minimal parol uzunluğu" + }, "uppercase": { - "message": "BÃļyÃŧk hərf (A-Z)" + "message": "BÃļyÃŧk hərf (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Kiçik hərf (a-z)" + "message": "Kiçik hərf (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Rəqəmlər (0-9)" + "message": "Rəqəmlər (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "XÃŧsusi simvollar (!@#$%^&*)" + "message": "XÃŧsusi simvollar (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Daxil et", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "BÃļyÃŧk hərf xarakterlərini daxil et", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Kiçik hərf xarakterlərini daxil et", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Rəqəmləri daxil et", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "XÃŧsusi xarakterləri daxil et", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "SÃļz sayÄą" @@ -276,10 +522,19 @@ "message": "Minimum simvol" }, "avoidAmbChar": { - "message": "AnlaÅŸÄąlmaz simvollardan çəkinin" + "message": "AnlaÅŸÄąlmaz simvollardan çəkinin", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "AnlaÅŸÄąlmaz xarakterlərdən çəkin", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "MÃŧəssisə siyasət tələbləri, yaradÄącÄą seçimlərinizə tətbiq edildi.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { - "message": "Anbarda axtar" + "message": "Seyfdə axtar" }, "edit": { "message": "DÃŧzəliş et" @@ -288,7 +543,7 @@ "message": "Bax" }, "noItemsInList": { - "message": "SiyahÄąlanacaq heç bir element yoxdur." + "message": "Sadalanacaq heç bir element yoxdur." }, "itemInformation": { "message": "Element məlumatlarÄą" @@ -299,17 +554,32 @@ "password": { "message": "Parol" }, + "totp": { + "message": "Kimlik doğrulayÄącÄą sirri" + }, "passphrase": { - "message": "Uzun ifadə" + "message": "Parol ifadəsi" }, "favorite": { "message": "Sevimli" }, + "unfavorite": { + "message": "Sevimlilərdən sil" + }, + "itemAddedToFavorites": { + "message": "Element sevimlilərə əlavə edildi" + }, + "itemRemovedFromFavorites": { + "message": "Element sevimlilərdən Ã§ÄąxarÄąldÄą" + }, "notes": { - "message": "Qeydlər" + "message": "Notlar" + }, + "privateNote": { + "message": "Şəxsi not" }, "note": { - "message": "Qeyd" + "message": "Not" }, "editItem": { "message": "Elementə dÃŧzəliş et" @@ -326,6 +596,18 @@ "launch": { "message": "Başlat" }, + "launchWebsite": { + "message": "Veb saytÄą başlat" + }, + "launchWebsiteName": { + "message": "$ITEMNAME$ veb saytÄąnÄą başlat", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Veb sayt" }, @@ -338,11 +620,26 @@ "other": { "message": "Digər" }, + "unlockMethods": { + "message": "Kilid açma seçimləri" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Anbar vaxt bitməsi əməliyyatÄąnÄązÄą dəyişdirmək ÃŧçÃŧn bir kilid açma Ãŧsulu quraşdÄąrÄąn." + "message": "Seyf vaxt bitmə əməliyyatÄąnÄązÄą dəyişdirmək ÃŧçÃŧn bir kilid açma Ãŧsulu qurun." + }, + "unlockMethodNeeded": { + "message": "Ayarlarda bir kilid açma Ãŧsulu qurun" + }, + "sessionTimeoutHeader": { + "message": "Seans vaxt bitməsi" + }, + "vaultTimeoutHeader": { + "message": "Seyf vaxtÄąnÄąn bitməsi" + }, + "otherOptions": { + "message": "Digər seçimlər" }, "rateExtension": { - "message": "Genişləndirməni qiymətləndir" + "message": "UzantÄąnÄą qiymətləndir" }, "rateExtensionDesc": { "message": "GÃļzəl bir rəy ilə bizə dəstək ola bilərsiniz!" @@ -351,10 +648,19 @@ "message": "Veb brauzeriniz lÃļvhəyə kopyalamağı dəstəkləmir. Əvəzində əllə kopyalayÄąn." }, "verifyIdentity": { - "message": "Kimliyi təsdiqləyin" + "message": "Kimliyi doğrula" }, "yourVaultIsLocked": { - "message": "AnbarÄąnÄąz kilidlənib. Davam etmək ÃŧçÃŧn ana parolunuzu təsdiqləyin." + "message": "Seyfiniz kilidlənib. Davam etmək ÃŧçÃŧn kimliyinizi doğrulayÄąn." + }, + "yourVaultIsLockedV2": { + "message": "Seyfiniz kilidlənib" + }, + "yourAccountIsLocked": { + "message": "HesabÄąnÄąz kilidlənib" + }, + "or": { + "message": "və ya" }, "unlock": { "message": "Kilidi aç" @@ -376,11 +682,17 @@ "message": "YararsÄąz ana parol" }, "vaultTimeout": { - "message": "Anbara mÃŧraciət bitəcək" + "message": "Seyf vaxtÄąnÄąn bitməsi" + }, + "vaultTimeout1": { + "message": "Vaxt bitmə" }, "lockNow": { "message": "İndi kilidlə" }, + "lockAll": { + "message": "HamÄąsÄąnÄą kilidlə" + }, "immediately": { "message": "Dərhal" }, @@ -426,20 +738,32 @@ "security": { "message": "GÃŧvənlik" }, + "confirmMasterPassword": { + "message": "Ana parolu təsdiqlə" + }, + "masterPassword": { + "message": "Ana parol" + }, + "masterPassImportant": { + "message": "UnutsanÄąz, ana parolunuz geri qaytarÄąla bilməz!" + }, + "masterPassHintLabel": { + "message": "Ana parol ipucusu" + }, "errorOccurred": { "message": "Bir xəta baş verdi" }, "emailRequired": { - "message": "E-poçt ÃŧnvanÄą lazÄąmdÄąr." + "message": "E-poçt ÃŧnvanÄą tələb olunur." }, "invalidEmail": { "message": "YararsÄąz e-poçt ÃŧnvanÄą." }, "masterPasswordRequired": { - "message": "Ana parol lazÄąmdÄąr." + "message": "Ana parol tələb olunur." }, "confirmMasterPasswordRequired": { - "message": "Ana parolun yenidən yazÄąlmasÄą lazÄąmdÄąr." + "message": "Ana parolun yenidən yazÄąlmasÄą tələb olunur." }, "masterPasswordMinlength": { "message": "Ana parol ən azÄą $VALUE$ simvol uzunluğunda olmalÄądÄąr.", @@ -452,19 +776,34 @@ } }, "masterPassDoesntMatch": { - "message": "Ana parol təsdiqləməsi uyğun gəlmir." + "message": "Ana parolun təsdiqi uyuşmur." }, "newAccountCreated": { "message": "Yeni hesabÄąnÄąz yaradÄąldÄą! İndi giriş edə bilərsiniz." }, + "newAccountCreated2": { + "message": "Yeni hesabÄąnÄąz yaradÄąldÄą!" + }, + "youHaveBeenLoggedIn": { + "message": "Giriş etdiniz!" + }, + "youSuccessfullyLoggedIn": { + "message": "Uğurla giriş etdiniz" + }, + "youMayCloseThisWindow": { + "message": "Bu pəncərəni bağlaya bilərsiniz" + }, "masterPassSent": { - "message": "Ana parol məsləhətini ehtiva edən bir e-poçt gÃļndərdik." + "message": "Sizə ana parol ipucunuz olan bir e-poçt gÃļndərdik." }, "verificationCodeRequired": { - "message": "Təsdiq kodu lazÄąmdÄąr." + "message": "Doğrulama kodu tələb olunur." + }, + "webauthnCancelOrTimeout": { + "message": "Kimlik doğrulama ləğv edildi və ya çox uzun çəkdi. LÃŧtfən yenidən sÄąnayÄąn." }, "invalidVerificationCode": { - "message": "YararsÄąz təsdiqləmə kodu" + "message": "YararsÄąz doğrulama kodu" }, "valueCopied": { "message": "$VALUE$ kopyalandÄą", @@ -477,13 +816,58 @@ } }, "autofillError": { - "message": "Bu səhifədə seçilən element avto-doldurulmur. Əvəzində məlumatlarÄą kopyalayÄąb yapÄąÅŸdÄąrÄąn." + "message": "Bu səhifədə seçilmiş element avto-doldurulmur. Əvəzində məlumatlarÄą kopyalayÄąb yapÄąÅŸdÄąrÄąn." + }, + "totpCaptureError": { + "message": "HazÄąrkÄą veb səhifədən QR kodu skan edilə bilmir" + }, + "totpCaptureSuccess": { + "message": "Kimlik doğrulayÄącÄą açarÄą əlavə edildi" + }, + "totpCapture": { + "message": "HazÄąrkÄą veb sahifədən kimlik doğrulayÄącÄą QR kodunu skan et" + }, + "totpHelperTitle": { + "message": "2 addÄąmlÄą doğrulama problemsiz edin" + }, + "totpHelper": { + "message": "Bitwarden, 2 addÄąmlÄą doğrulama kodlarÄąnÄą saxlaya və doldura bilər. AçarÄą kopyalayÄąb bu xanaya yapÄąÅŸdÄąrÄąn." + }, + "totpHelperWithCapture": { + "message": "Bitwarden, 2 addÄąmlÄą doğrulama kodlarÄąnÄą saxlaya və doldura bilər. Bu veb sayt kimlik doğrulayÄącÄą QR kodunun ekran şəklini çəkmək ÃŧçÃŧn kamera ikonunu seçin, ya da açarÄą kopyalayÄąb bu xanaya yapÄąÅŸdÄąrÄąn." + }, + "learnMoreAboutAuthenticators": { + "message": "Kimlik doğrulayÄącÄąlar haqqÄąnda daha ətraflÄą" + }, + "copyTOTP": { + "message": "Kimlik doğrulayÄącÄą açarÄąnÄą kopyala (TOTP)" }, "loggedOut": { "message": "Ã‡ÄąxÄąÅŸ edildi" }, + "loggedOutDesc": { + "message": "HesabÄąnÄązdan Ã§ÄąxÄąÅŸ etmisiniz." + }, "loginExpired": { - "message": "SeansÄąn mÃŧddəti bitdi." + "message": "Giriş seansÄąnÄązÄąn mÃŧddəti bitdi." + }, + "logIn": { + "message": "Giriş et" + }, + "logInToBitwarden": { + "message": "Bitwarden-ə giriş edin" + }, + "restartRegistration": { + "message": "QeydiyyatÄą yenidən başlat" + }, + "expiredLink": { + "message": "VaxtÄą bitmiş keçid" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "LÃŧtfən qeydiyyatÄą yenidən başladÄąn və ya giriş etməyə çalÄąÅŸÄąn." + }, + "youMayAlreadyHaveAnAccount": { + "message": "ArtÄąq bir hesabÄąnÄąz ola bilər" }, "logOutConfirmation": { "message": "Ã‡ÄąxÄąÅŸ etmək istədiyinizə əminsiniz?" @@ -495,25 +879,25 @@ "message": "Xeyr" }, "unexpectedError": { - "message": "GÃļzlənilməz bir səhv baş verdi" + "message": "GÃļzlənilməz bir xəta baş verdi." }, "nameRequired": { - "message": "Ad lazÄąmdÄąr." + "message": "Ad tələb olunur." }, "addedFolder": { "message": "Qovluq əlavə edildi" }, - "changeMasterPass": { - "message": "Ana parolu dəyişdir" - }, - "changeMasterPasswordConfirmation": { - "message": "Ana parolunuzu bitwarden.com veb anbarÄąnda dəyişdirə bilərsiniz. İndi saytÄą ziyarət etmək istəyirsiniz?" - }, "twoStepLoginConfirmation": { - "message": "İki mərhələli giriş, gÃŧvənlik açarÄą, kimlik təsdiqləyici tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi təsdiqləməyinizi tələb edərək hesabÄąnÄązÄą daha da gÃŧvənli edir. İki mərhələli giriş, bitwarden.com veb anbarÄąnda fəallaşdÄąrÄąla bilər. Veb saytÄą indi ziyarət etmək istəyirsiniz?" + "message": "İki addÄąmlÄą giriş, gÃŧvənlik açarÄą, kimlik doğrulayÄącÄą tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi doğrulamanÄązÄą tələb edərək hesabÄąnÄązÄą daha da gÃŧvənli edir. İki addÄąmlÄą giriş, bitwarden.com veb seyfində qurula bilər. Veb saytÄą indi ziyarət etmək istəyirsiniz?" + }, + "twoStepLoginConfirmationContent": { + "message": "Bitwarden veb tətbiqində iki addÄąmlÄą girişi quraraq hesabÄąnÄązÄą daha gÃŧvənli edin." + }, + "twoStepLoginConfirmationTitle": { + "message": "Veb tətbiqlə davam edilsin?" }, "editedFolder": { - "message": "Qovluğa dÃŧzəliş edildi" + "message": "Qovluğ saxlanÄąldÄą" }, "deleteFolderConfirmation": { "message": "Bu qovluğu silmək istədiyinizə əminsiniz?" @@ -525,13 +909,13 @@ "message": "Başlanğıc təlimatÄą" }, "gettingStartedTutorialVideo": { - "message": "Brauzer genişləndirməsindən necə daha yaxÅŸÄą faydalanmağı Ãļyrənmək ÃŧçÃŧn başlanğıc təlimatÄąna baxa bilərsiniz." + "message": "Brauzer uzantÄąsÄąndan necə daha yaxÅŸÄą faydalanmağı Ãļyrənmək ÃŧçÃŧn başlanğıc təlimatÄąna baxa bilərsiniz." }, "syncingComplete": { - "message": "Eyniləşdirmə tamamlandÄą" + "message": "Sinxr tamamlandÄą" }, "syncingFailed": { - "message": "Uğursuz eyniləşdirmə" + "message": "Sinxr uğursuz oldu" }, "passwordCopied": { "message": "Parol kopyalandÄą" @@ -552,11 +936,15 @@ "newUri": { "message": "Yeni URI" }, + "addDomain": { + "message": "Domen əlavə et", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Element əlavə edildi" }, "editedItem": { - "message": "Elementə dÃŧzəliş edildi" + "message": "Element saxlanÄąldÄą" }, "deleteItemConfirmation": { "message": "Həqiqətən tullantÄą qutusuna gÃļndərmək istəyirsiniz?" @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Giriş əlavə etmək ÃŧçÃŧn soruş" }, + "vaultSaveOptionsTitle": { + "message": "Seyf seçimlərində saxla" + }, "addLoginNotificationDesc": { - "message": "\"Hesab əlavə et bildirişi\", ilk dəfə giriş edəndə yeni giriş məlumatlarÄąnÄą anbarda saxlamaq istəyib-istəmədiyinizi avtomatik olaraq soruşur." + "message": "Seyfinizdə tapÄąlmayan elementin əlavə edilməsi soruşulsun." + }, + "addLoginNotificationDescAlt": { + "message": "Seyfinizdə tapÄąlmayan elementin əlavə edilməsi soruşulsun. Giriş etmiş bÃŧtÃŧn hesablara aiddir." + }, + "showCardsInVaultView": { + "message": "KartlarÄą, Seyf gÃļrÃŧnÃŧşÃŧndə Avto-doldurma təklifləri olaraq gÃļstər" }, "showCardsCurrentTab": { - "message": "KartlarÄą vərəq səhifəsində gÃļstər" + "message": "KartlarÄą Vərəq səhifəsində gÃļstər" }, "showCardsCurrentTabDesc": { - "message": "Asan avto-doldurma ÃŧçÃŧn Vərəq səhifəsində kart elementlərini siyahÄąlayÄąn." + "message": "Asan avto-doldurma ÃŧçÃŧn Vərəq səhifəsində kart elementlərini sadalayÄąn." + }, + "showIdentitiesInVaultView": { + "message": "Kimlikləri, Seyf gÃļrÃŧnÃŧşÃŧndə Avto-doldurma təklifləri olaraq gÃļstər" }, "showIdentitiesCurrentTab": { "message": "Vərəq səhifəsində kimlikləri gÃļstər" }, "showIdentitiesCurrentTabDesc": { - "message": "Asan avto-doldurma ÃŧçÃŧn Vərəq səhifəsində kimlik elementlərini siyahÄąlayÄąn." + "message": "Asan avto-doldurma ÃŧçÃŧn Vərəq səhifəsində kimlik elementlərini sadalayÄąn." }, "clearClipboard": { "message": "LÃļvhəni təmizlə", @@ -619,13 +1019,22 @@ "message": "Bitwarden sizin ÃŧçÃŧn bu parolu xatÄąrlasÄąn?" }, "notificationAddSave": { - "message": "Bəli, indi saxla" + "message": "Saxla" }, "enableChangedPasswordNotification": { "message": "MÃļvcud girişin gÃŧncəllənməsini soruş" }, "changedPasswordNotificationDesc": { - "message": "Bir veb saytda dəyişiklik aşkarlananda giriş parolunun gÃŧncəllənməsini soruşun." + "message": "Bir veb saytda bir dəyişiklik aşkarlandÄąqda giriş parolunun gÃŧncəllənməsini soruşulsun." + }, + "changedPasswordNotificationDescAlt": { + "message": "Bir veb saytda bir dəyişiklik aşkarlandÄąqda giriş parolunun gÃŧncəllənməsini soruşulsun. Giriş etmiş bÃŧtÃŧn hesablara aiddir." + }, + "enableUsePasskeys": { + "message": "Keçid açarlarÄąnÄą saxlamağı və istifadə etməyi soruş" + }, + "usePasskeysDesc": { + "message": "Yeni keçid açarlarÄąnÄą saxlamağı və ya seyfinizdə saxlanÄąlan keçid açarlarÄą ilə giriş etmək soruşulsun. Giriş etmiş bÃŧtÃŧn hesablara aiddir." }, "notificationChangeDesc": { "message": "Bu parolu \"Bitwarden\"də gÃŧncəlləmək istəyirsiniz?" @@ -634,23 +1043,29 @@ "message": "GÃŧncəllə" }, "notificationUnlockDesc": { - "message": "Avto-doldurma tələblərini tamamlamaq ÃŧçÃŧn Bitwarden anbarÄąnÄązÄąn kilidini aÃ§Äąn." + "message": "Avto-doldurma tələblərini tamamlamaq ÃŧçÃŧn Bitwarden seyfinizin kilidini aÃ§Äąn." }, "notificationUnlock": { "message": "Kilidi aç" }, + "additionalOptions": { + "message": "Əlavə seçimlər" + }, "enableContextMenuItem": { "message": "Konteks menyu seçimlərini gÃļstər" }, "contextMenuItemDesc": { - "message": "Veb sayt ÃŧçÃŧn parol yaratmaq və uyğunlaşan giriş məlumatlarÄąna mÃŧraciət etmək ÃŧçÃŧn ikinci klikləməni istifadə edin. " + "message": "Veb sayt ÃŧçÃŧn parol yaratmaq və uyuşan giriş məlumatlarÄąna mÃŧraciət etmək ÃŧçÃŧn sağ klikləməni istifadə edin." + }, + "contextMenuItemDescAlt": { + "message": "Veb sayt ÃŧçÃŧn parol yaratmaq və uyuşan giriş məlumatlarÄąna mÃŧraciət etmək ÃŧçÃŧn sağ klikləməni istifadə edin. Giriş etmiş bÃŧtÃŧn hesablara aiddir." }, "defaultUriMatchDetection": { - "message": "İlkin URI uyğunluq aşkarlamasÄą", - "description": "Default URI match detection for auto-fill." + "message": "İlkin URI uyuşma aşkarlamasÄą", + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Avto-doldurma kimi əməliyyatlarÄą icra edərkən giriş etmə prosesi ÃŧçÃŧn URI uyğunluq aşkarlamasÄąnÄąn ilkin yolunu seçin." + "message": "Avto-doldurma kimi əməliyyatlarÄą icra edərkən giriş etmə prosesi ÃŧçÃŧn URI uyuşma aşkarlamasÄąnÄąn idarə ediləcəyi ilkin yolu seçin." }, "theme": { "message": "Tema" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Tətbiqin rəng temasÄąnÄą dəyişdirin." }, + "themeDescAlt": { + "message": "Tətbiqin rəng temasÄąnÄą dəyişdirin. Giriş etmiş bÃŧtÃŧn hesablara aiddir." + }, "dark": { "message": "TÃŧnd", "description": "Dark color" @@ -670,39 +1088,63 @@ "message": "GÃŧnəşli tÃŧnd", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Buradan xaricə kÃļçÃŧr" + }, "exportVault": { - "message": "AnbarÄą ixrac et" + "message": "Seyfi xaricə kÃļçÃŧr" }, "fileFormat": { "message": "Fayl formatÄą" }, + "fileEncryptedExportWarningDesc": { + "message": "Bu faylÄąn xaricə kÃļçÃŧrÃŧlməsi, parolla qorunacaq və şifrəsini açmaq ÃŧçÃŧn fayl parolu tələb olunacaq." + }, + "filePassword": { + "message": "Fayl parolu" + }, + "exportPasswordDescription": { + "message": "Bu parol, bu faylÄą daxilə və xaricə kÃļçÃŧrmək ÃŧçÃŧn istifadə olunacaq" + }, + "accountRestrictedOptionDescription": { + "message": "Xaricə kÃļçÃŧrməni şifrələmək və daxilə kÃļçÃŧrməni yalnÄąz mÃļvcud Bitwarden hesabÄą ilə məhdudlaşdÄąrmaq ÃŧçÃŧn hesabÄąnÄązÄąn istifadəçi adÄą və Ana Parolundan əldə edilən hesab şifrələmə açarÄąnÄązÄą istifadə edin." + }, + "passwordProtectedOptionDescription": { + "message": "Xaricə kÃļçÃŧrməni şifrələmək ÃŧçÃŧn bir fayl parolu təyin edin və şifrəni açma parolunu istifadə edərək bunu istənilən Bitwarden hesabÄąna kÃļçÃŧrÃŧn." + }, + "exportTypeHeading": { + "message": "Xaricə kÃļçÃŧrmə nÃļvÃŧ" + }, + "accountRestricted": { + "message": "Hesab məhdudlaşdÄąrÄąldÄą" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Fayl parolu\" və \"Fayl parolunu təsdiqlə\" uyuşmur." + }, "warning": { "message": "XƏBƏRDARLIQ", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "AnbarÄąn ixracÄąnÄą təsdiqləyin" + "message": "Seyfi xaricə kÃļçÃŧrməyi təsdiqlə" }, "exportWarningDesc": { - "message": "Bu ixrac faylÄąndakÄą anbar verilənləriniz şifrələnməmiş formatdadÄąr. İxrac edilən faylÄą, gÃŧvənli olmayan kanallar Ãŧzərində saxlamamalÄą və ya gÃļndərməməlisiniz (e-poçt kimi). Bu faylÄą işiniz bitdikdən sonra dərhal silin." + "message": "Xaricə kÃļçÃŧrdÃŧyÃŧnÃŧz bu fayldakÄą datanÄąz şifrələnməmiş formatdadÄąr. Bu faylÄą gÃŧvənli olmayan kanallar (e-poçt kimi) Ãŧzərində saxlamamalÄą və ya gÃļndərməməlisiniz. İşiniz bitdikdən sonra faylÄą dərhal silin." }, "encExportKeyWarningDesc": { - "message": "Bu ixrac faylÄą, hesabÄąnÄązÄąn şifrələmə açarÄąnÄą istifadə edərək verilənlərinizi şifrələyir. HesabÄąnÄązÄąn şifrələmə açarÄąnÄą dÃļndərsəniz, bu ixrac faylÄąnÄąn şifrəsini aça bilməyəcəyiniz ÃŧçÃŧn yenidən ixrac etməli olacaqsÄąnÄąz." + "message": "Xaricə kÃļçÃŧrdÃŧyÃŧnÃŧz bu fayldakÄą data, hesabÄąnÄązÄąn şifrələmə açarÄą istifadə edilərək şifrələnir. HesabÄąnÄązÄąn şifrələmə açarÄąnÄą dəyişdirsəniz, bu faylÄąn şifrəsini aça bilməyəcəksiniz və onu yenidən xaricə kÃļçÃŧrməli olacaqsÄąnÄąz." }, "encExportAccountWarningDesc": { - "message": "Hesab şifrələmə açarlarÄą, hər Bitwarden istifadəçi hesabÄą ÃŧçÃŧn unikaldÄąr, buna gÃļrə də şifrələnmiş bir ixracÄą, fərqli bir hesaba idxal edə bilməzsiniz." + "message": "Hesab şifrələmə açarlarÄą, hər Bitwarden istifadəçi hesabÄą ÃŧçÃŧn unikaldÄąr, buna gÃļrə də şifrələnmiş bir xaricə kÃļçÃŧrməni, fərqli bir hesaba kÃļçÃŧrə bilməzsiniz." }, "exportMasterPassword": { - "message": "Anbar verilənlərinizi ixrac etmək ÃŧçÃŧn ana parolunuzu daxil edin." + "message": "Seyf datanÄązÄą xaricə kÃļçÃŧrmək ÃŧçÃŧn ana parolunuzu daxil edin." }, "shared": { "message": "PaylaÅŸÄąlan" }, - "learnOrg": { - "message": "Təşkilatlar barədə daha ətraflÄą" - }, - "learnOrgConfirmation": { - "message": "Bitwarden, bir təşkilat hesabÄą istifadə edərək anbar elementlərinizi başqalarÄą ilə paylaşmağınÄąza icazə verər. Daha ətraflÄą məlumat ÃŧçÃŧn bitwarden.com saytÄąnÄą ziyarət etmək istəyirsiniz?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business, bir təşkilatÄą istifadə edərək seyf elementlərinizi başqalarÄą ilə paylaşmağınÄąza imkan verir. Daha ətraflÄą məlumat ÃŧçÃŧn bitwarden.com saytÄąnÄą ziyarət edin." }, "moveToOrganization": { "message": "Təşkilata daÅŸÄą" @@ -711,7 +1153,7 @@ "message": "Paylaş" }, "movedItemToOrg": { - "message": "$ITEMNAME$ $ORGNAME$ şirkətinə daÅŸÄąndÄą", + "message": "$ITEMNAME$, $ORGNAME$ şirkətinə daÅŸÄąndÄą", "placeholders": { "itemname": { "content": "$1", @@ -730,13 +1172,13 @@ "message": "Daha ətraflÄą" }, "authenticatorKeyTotp": { - "message": "Kimlik təsdiqləyici açarÄą (TOTP)" + "message": "Kimlik doğrulayÄącÄą açarÄą (TOTP)" }, "verificationCodeTotp": { - "message": "Təsdiqləmə kodu (TOTP)" + "message": "Doğrulama kodu (TOTP)" }, "copyVerificationCode": { - "message": "Təsdiqləmə kodunu kopyala" + "message": "Doğrulama kodunu kopyala" }, "attachments": { "message": "Qoşmalar" @@ -762,8 +1204,11 @@ "file": { "message": "Fayl" }, + "fileToShare": { + "message": "PaylaÅŸÄąlacaq fayl" + }, "selectFile": { - "message": "Fayl seçin." + "message": "Bir fayl seçin" }, "maxFileSize": { "message": "Maksimal fayl həcmi 500 MB-dÄąr" @@ -772,7 +1217,7 @@ "message": "Özəllik əlçatmazdÄąr" }, "encryptionKeyMigrationRequired": { - "message": "Şifrələmə açarÄąnÄąn daÅŸÄąnmasÄą tələb olunur. Şifrələmə açarÄąnÄązÄą gÃŧncəlləmək ÃŧçÃŧn zəhmət olmasa veb anbar Ãŧzərindən giriş edin." + "message": "Şifrələmə açarÄąnÄąn daÅŸÄąnmasÄą tələb olunur. Şifrələmə açarÄąnÄązÄą gÃŧncəlləmək ÃŧçÃŧn lÃŧtfən veb seyfinizə giriş edin." }, "premiumMembership": { "message": "Premium ÃŧzvlÃŧk" @@ -781,7 +1226,7 @@ "message": "ÜzvlÃŧyÃŧ idarə edin" }, "premiumManageAlert": { - "message": "ÜzvlÃŧyÃŧnÃŧzÃŧ bitwarden.com veb anbarÄąnda idarə edə bilərsiniz. İndi saytÄą ziyarət etmək istəyirsiniz?" + "message": "ÜzvlÃŧyÃŧnÃŧzÃŧ bitwarden.com veb seyfində idarə edə bilərsiniz. İndi saytÄą ziyarət etmək istəyirsiniz?" }, "premiumRefresh": { "message": "ÜzvlÃŧyÃŧ təzələ" @@ -793,16 +1238,19 @@ "message": "Premium ÃŧzvlÃŧk ÃŧçÃŧn qeydiyyatdan keçin və bunlarÄą əldə edin:" }, "ppremiumSignUpStorage": { - "message": "Fayl qoşmalarÄą ÃŧçÃŧn 1 GB şifrələnmiş saxlama sahəsi" + "message": "Fayl qoşmalarÄą ÃŧçÃŧn 1 GB şifrələnmiş anbar sahəsi" + }, + "premiumSignUpEmergency": { + "message": "FÃļvqəladə hal mÃŧraciəti" }, "premiumSignUpTwoStepOptions": { "message": "YubiKey və Duo kimi mÃŧlkiyyətçi iki addÄąmlÄą giriş seçimləri." }, "ppremiumSignUpReports": { - "message": "AnbarÄąnÄązÄąn təhlÃŧkəsiyini təmin etmək ÃŧçÃŧn parol gigiyenasÄą, hesab sağlamlığı və verilənlərin pozulmasÄą hesabatlarÄą." + "message": "Seyfinizi gÃŧvəndə saxlamaq ÃŧçÃŧn parol gigiyenasÄą, hesab sağlamlığı və data pozuntusu hesabatlarÄą." }, "ppremiumSignUpTotp": { - "message": "AnbarÄąnÄązdakÄą hesablar ÃŧçÃŧn TOTP təsdiqləmə kodu (2FA) yaradÄącÄąsÄą." + "message": "Seyfinizdəki girişlər ÃŧçÃŧn TOTP doğrulama kodu (2FA) yaradÄącÄąsÄą." }, "ppremiumSignUpSupport": { "message": "Prioritet mÃŧştəri dəstəyi." @@ -814,7 +1262,10 @@ "message": "Premium satÄąn al" }, "premiumPurchaseAlert": { - "message": "Premium ÃŧzvlÃŧyÃŧ bitwarden.com veb anbarÄąnda satÄąn ala bilərsiniz. İndi saytÄą ziyarət etmək istəyirsiniz?" + "message": "Premium ÃŧzvlÃŧyÃŧ bitwarden.com veb seyfində satÄąn ala bilərsiniz. İndi saytÄą ziyarət etmək istəyirsiniz?" + }, + "premiumPurchaseAlertV2": { + "message": "Bitwarden veb tətbiqindəki hesab ayarlarÄąnÄązda Premium satÄąn ala bilərsiniz." }, "premiumCurrentMember": { "message": "Premium ÃŧzvsÃŧnÃŧz!" @@ -822,6 +1273,9 @@ "premiumCurrentMemberThanks": { "message": "Bitwarden-i dəstəklədiyiniz ÃŧçÃŧn təşəkkÃŧrlər!" }, + "premiumFeatures": { + "message": "Premium-a yÃŧksəlt və bunlarÄą əldə et:" + }, "premiumPrice": { "message": "HamÄąsÄą sadəcə ildə $PRICE$!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "HamÄąsÄą sadəcə ildə $PRICE$!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Təzələmə tamamlandÄą" }, @@ -838,10 +1301,10 @@ "message": "TOTP-ni avtomatik kopyala" }, "disableAutoTotpCopyDesc": { - "message": "HesabÄąnÄąza əlavə edilən kimlik təsdiqləyici açarÄą varsa, giriş məlumatlarÄą avto-doldurulanda TOTP təsdiqləmə kodu da avtomatik olaraq lÃļvhəyə kopyalanacaq." + "message": "HesabÄąnÄąza əlavə edilən kimlik doğrulayÄącÄą açarÄą varsa, giriş məlumatlarÄą avto-doldurulanda TOTP doğrulama kodu da avtomatik olaraq lÃļvhəyə kopyalanacaq." }, "enableAutoBiometricsPrompt": { - "message": "AÃ§ÄąlÄąÅŸda biometrik təsdiqləmə soruş" + "message": "AÃ§ÄąlÄąÅŸda biometrik soruşulsun" }, "premiumRequired": { "message": "Premium ÃŧzvlÃŧk lazÄąmdÄąr" @@ -850,10 +1313,10 @@ "message": "Bu Ãļzəlliyi istifadə etmək ÃŧçÃŧn premium ÃŧzvlÃŧk lazÄąmdÄąr." }, "enterVerificationCodeApp": { - "message": "Kimlik təsdiqləyici tətbiqindən 6 rəqəmli təsdiqləmə kodunu daxil edin." + "message": "Kimlik doğrulayÄącÄą tətbiqindən 6 rəqəmli doğrulama kodunu daxil edin." }, "enterVerificationCodeEmail": { - "message": "$EMAIL$ ÃŧnvanÄąna gÃļndərilən e-poçtdakÄą 6 rəqəmli təsdiqləmə kodunu daxil edin.", + "message": "$EMAIL$ ÃŧnvanÄąna gÃļndərilən e-poçtdakÄą 6 rəqəmli doğrulama kodunu daxil edin.", "placeholders": { "email": { "content": "$1", @@ -862,7 +1325,7 @@ } }, "verificationCodeEmailSent": { - "message": "Təsdiqləmə poçtu $EMAIL$ ÃŧnvanÄąna gÃļndərildi.", + "message": "Doğrulama poçtu $EMAIL$ ÃŧnvanÄąna gÃļndərildi.", "placeholders": { "email": { "content": "$1", @@ -874,82 +1337,91 @@ "message": "Məni xatÄąrla" }, "sendVerificationCodeEmailAgain": { - "message": "Təsdiqləmə kodu olan e-poçtu yenidən gÃļndər" + "message": "Doğrulama kodu olan e-poçtu yenidən gÃļndər" }, "useAnotherTwoStepMethod": { - "message": "Başqa bir iki mərhələli giriş metodu istifadə edin" + "message": "Başqa bir iki addÄąmlÄą giriş Ãŧsulu istifadə edin" }, "insertYubiKey": { "message": "\"YubiKey\"i kompÃŧterinizin USB portuna taxÄąn, daha sonra dÃŧyməsinə toxunun." }, "insertU2f": { - "message": "GÃŧvənlik açarÄąnÄą kompÃŧterinizin USB portun taxÄąn. DÃŧyməsi varsa toxunun." + "message": "GÃŧvənlik açarÄąnÄą kompÃŧterinizin USB portuna taxÄąn. DÃŧyməsi varsa toxunun." }, "webAuthnNewTab": { - "message": "WebAuthn 2FA təsdiqləməsini başladÄąn. Yeni bir vərəq açmaq ÃŧçÃŧn aşağıdakÄą dÃŧyməyə klikləyin və yeni vərəqdəki təlimatlarÄą izləyin." + "message": "WebAuthn 2FA doğrulamasÄąnÄą başladÄąn. Yeni bir vərəq açmaq ÃŧçÃŧn aşağıdakÄą dÃŧyməyə klikləyin və yeni vərəqdəki təlimatlarÄą izləyin." }, "webAuthnNewTabOpen": { "message": "Yeni vərəq aç" }, "webAuthnAuthenticate": { - "message": "WebAuthn təsdiqləmə" + "message": "WebAuthn kimlik doğrulama" }, "loginUnavailable": { "message": "Giriş edilə bilmir" }, "noTwoStepProviders": { - "message": "Bu hesabÄąn iki mərhələli giriş Ãļzəlliyi fəaldÄąr, ancaq, konfiqurasiya edilmiş iki mərhələli provayderlərin heç biri bu brauzer tərəfindən dəstəklənmir." + "message": "Bu hesabÄąn iki addÄąmlÄą giriş Ãļzəlliyi qurulub, ancaq, konfiqurasiya edilmiş iki addÄąmlÄą provayderlərin heç biri bu brauzer tərəfindən dəstəklənmir." }, "noTwoStepProviders2": { - "message": "Zəhmət olmasa (Chrome kimi) dəstəklənən bir veb brauzer istifadə edin və/və ya veb brauzerlərə (kimlik təsdiqləyici tətbiq kimi) daha yaxÅŸÄą dəstəklənən provayderlər əlavə edin." + "message": "LÃŧtfən (Chrome kimi) dəstəklənən bir veb brauzer istifadə edin və/və ya veb brauzerlərə (kimlik doğrulayÄącÄą tətbiq kimi) daha yaxÅŸÄą dəstəklənən provayderlər əlavə edin." }, "twoStepOptions": { - "message": "İki mərhələli giriş seçimləri" + "message": "İki addÄąmlÄą giriş seçimləri" }, "recoveryCodeDesc": { - "message": "İki mərhələli təsdiqləmə provayderlərinə mÃŧraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabÄąnÄązdakÄą bÃŧtÃŧn iki mərhələli provayderləri sÄąradan Ã§Äąxara bilərsiniz." + "message": "İki faktorlu provayderlərinə mÃŧraciəti itirmisiniz? Geri qaytarma kodunuzu istifadə edərək hesabÄąnÄązdakÄą bÃŧtÃŧn iki faktorlu provayderləri sÄąradan Ã§Äąxarda bilərsiniz." }, "recoveryCodeTitle": { - "message": "Bərpa kodu" + "message": "Geri qaytarma kodu" }, "authenticatorAppTitle": { - "message": "Kimlik təsdiqləyici tətbiqi" + "message": "Kimlik doğrulayÄącÄą tətbiqi" }, - "authenticatorAppDesc": { - "message": "Vaxt əsaslÄą təsdiqləmə kodlarÄą yaratmaq ÃŧçÃŧn (Authy və ya Google Authenticator kimi) kimlik təsdiqləyici tətbiq istifadə edin.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Bitwarden Authenticator kimi bir kimlik doğrulama tətbiqi tərəfindən yaradÄąlan kodu daxil edin.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP gÃŧvənlik açarÄą" + "yubiKeyTitleV2": { + "message": "Yubico OTP GÃŧvənlik AçarÄą" }, "yubiKeyDesc": { "message": "HesabÄąnÄąza mÃŧraciət etmək ÃŧçÃŧn bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazlarÄą ilə işləyir." }, - "duoDesc": { - "message": "Duo Security ilə təsdiqləmək ÃŧçÃŧn Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F gÃŧvənlik açarÄąnÄą istifadə edin.", + "duoDescV2": { + "message": "Duo Security tərəfindən yaradÄąlan kodu daxil edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "TəşkilatÄąnÄązÄąnÄą Duo Security ilə təsdiqləmək ÃŧçÃŧn Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F gÃŧvənlik açarÄąnÄą istifadə edin.", + "message": "TəşkilatÄąnÄązÄąnÄą Duo Security ilə doğrulamaq ÃŧçÃŧn Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F gÃŧvənlik açarÄąnÄą istifadə edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "HesabÄąnÄąza mÃŧraciət etmək ÃŧçÃŧn istənilən bir WebAuthn fəallaşdÄąrÄąlmÄąÅŸ gÃŧvənlik açarÄą istifadə edin." + "message": "HesabÄąnÄąza mÃŧraciət etmək ÃŧçÃŧn WebAuthn Ãļzəllikli istənilən bir gÃŧvənlik açarÄą istifadə edin." }, "emailTitle": { "message": "E-poçt" }, - "emailDesc": { - "message": "Təsdiqləmə kodlarÄą e-poçt ÃŧnvanÄąnÄąza gÃļndəriləcək." + "emailDescV2": { + "message": "E-poçtunuza gÃļndərilən kodu daxil edin." }, "selfHostedEnvironment": { - "message": "Öz-ÃļzÃŧnə sahiblik edən mÃŧhit" + "message": "Self-hosted mÃŧhit" }, "selfHostedEnvironmentFooter": { - "message": "Öz-ÃļzÃŧnə sahiblik edən Bitwarden quraşdÄąrmasÄąnÄąn baza URL-sini mÃŧəyyənləşdirin." + "message": "Öz-ÃļzÃŧnə sahiblik edən Bitwarden quraşdÄąrmasÄąnÄąn təməl URL-sini mÃŧəyyənləşdirin." + }, + "selfHostedBaseUrlHint": { + "message": "Öz-ÃļzÃŧnə sahiblik edən Bitwarden quraşdÄąrmasÄąnÄąn təməl URL-sini mÃŧəyyənləşdirin. NÃŧmunə: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "QabaqcÄąl konfiqurasiya ÃŧçÃŧn hər xidmətin təməl URL-sini mÃŧstəqil olaraq qeyd edə bilərsiniz." + }, + "selfHostedEnvFormInvalid": { + "message": "Təməl server URL-sini və ya ən azÄą bir Ãļzəl mÃŧhiti əlavə etməlisiniz." }, "customEnvironment": { "message": "Özəl mÃŧhit" @@ -960,11 +1432,15 @@ "baseUrl": { "message": "Server URL-si" }, + "selfHostBaseUrl": { + "message": "Self-host server URL-si", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL-si" }, "webVaultUrl": { - "message": "Veb anbar server URL-si" + "message": "Veb seyf server URL-si" }, "identityUrl": { "message": "Kimlik server URL-si" @@ -973,34 +1449,93 @@ "message": "Bildiriş server URL-si" }, "iconsUrl": { - "message": "Nişan server URL-si" + "message": "İkon server URL-si" }, "environmentSaved": { "message": "MÃŧhit URL-ləri saxlanÄąldÄą." }, + "showAutoFillMenuOnFormFields": { + "message": "Form xanalarÄąnda avto-doldurma menyusunu gÃļstər", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Avto-doldurma təklifləri" + }, + "showInlineMenuLabel": { + "message": "Avto-doldurma təkliflərini form xanalarÄąnda gÃļstər" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Kimlikləri təklif kimi gÃļstər" + }, + "showInlineMenuCardsLabel": { + "message": "KartlarÄą təklif kimi gÃļstər" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "İkon seçildikdə təklifləri gÃļstər" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Giriş etmiş bÃŧtÃŧn hesablara aiddir." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Ziddiyyətləri Ãļnləmək ÃŧçÃŧn brauzerinizin daxili parol meneceri ayarlarÄąnÄą sÃļndÃŧrÃŧn." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Brauzer ayarlarÄąna dÃŧzəliş et." + }, + "autofillOverlayVisibilityOff": { + "message": "BağlÄą", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Xana seçildikdə (fokusda)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Avto-doldurma ikonu seçiləndə", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Səhifə yÃŧklənəndə avto-doldur" + }, "enableAutoFillOnPageLoad": { "message": "Səhifə yÃŧklənəndə avto-doldurmanÄą fəallaşdÄąr" }, "enableAutoFillOnPageLoadDesc": { "message": "Giriş formu aşkarlananda, səhifə yÃŧklənən zaman formu avto-doldurma icra edilsin." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$XəbərdarlÄąq:$CLOSETAG$ TəhlÃŧkəsizliyi pozulmuş və ya gÃŧvənilməyən veb saytlar, səhifə yÃŧklənəndə avto-doldurmanÄą istifadə edə bilər.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "TəhlÃŧkəli və ya gÃŧvənilməyən veb saytlar, səhifə yÃŧklənərkən avto-doldurmanÄą istifadə edə bilər." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Risklər haqqÄąnda daha ətraflÄą" + }, "learnMoreAboutAutofill": { "message": "Avto-doldurma haqqÄąnda daha ətraflÄą" }, "defaultAutoFillOnPageLoad": { - "message": "Giriş məlumatlarÄą ÃŧçÃŧn ilkin avto-doldurma tənzimləməsi" + "message": "Giriş elementləri ÃŧçÃŧn ilkin avto-doldurma ayarÄą" }, "defaultAutoFillOnPageLoadDesc": { - "message": "\"Səhifə yÃŧklənəndə avto-doldur\"u fəal etdikdən sonra, fərdi giriş elementləri ÃŧçÃŧn Ãļzəlliyi fəallaşdÄąra və ya sÄąradan Ã§Äąxarda bilərsiniz. Bu ayrÄą-ayrÄą konfiqurasiya edilməmiş giriş elementləri ÃŧçÃŧn ilkin tənzimləmədir." + "message": "Fərdi giriş elementləri ÃŧçÃŧn \"Səhifə yÃŧklənəndə avto-doldur\"u elementin DÃŧzəliş et gÃļrÃŧnÃŧşÃŧndən sÃļndÃŧrə bilərsiniz." }, "itemAutoFillOnPageLoad": { "message": "Səhifə yÃŧklənəndə avto-doldur (Seçimlərdə fəallaşdÄąrÄąlÄąbsa)" }, "autoFillOnPageLoadUseDefault": { - "message": "İlkin tənzimləməni istifadə et" + "message": "İlkin ayarÄą istifadə et" }, "autoFillOnPageLoadYes": { "message": "Səhifə yÃŧklənəndə avto-doldur" @@ -1009,25 +1544,28 @@ "message": "Səhifə yÃŧklənəndə avto-doldurma" }, "commandOpenPopup": { - "message": "Anbar aÃ§Äąlan pəncərədə aç" + "message": "Seyfi pəncərədə aç" }, "commandOpenSidebar": { - "message": "Anbar yan sətirdə aç" + "message": "Seyfi yan çubuqda aç" }, - "commandAutofillDesc": { - "message": "HazÄąrkÄą veb sayt ÃŧçÃŧn son istifadə edilən giriş məlumatlarÄąnÄą avto-doldur" + "commandAutofillLoginDesc": { + "message": "HazÄąrkÄą veb sayt ÃŧçÃŧn son istifadə edilən girişi avto-doldur" + }, + "commandAutofillCardDesc": { + "message": "HazÄąrkÄą veb sayt ÃŧçÃŧn son istifadə edilən kartÄą avto-doldur" + }, + "commandAutofillIdentityDesc": { + "message": "HazÄąrkÄą veb sayt ÃŧçÃŧn son istifadə edilən kimliyi avto-doldur" }, "commandGeneratePasswordDesc": { "message": "TəsadÃŧfi yeni bir parol yarat və lÃļvhəyə kopyala" }, "commandLockVaultDesc": { - "message": "AnbarÄą kilidlə" - }, - "privateModeWarning": { - "message": "Gizli rejim dəstəyi təcrÃŧbidir və bəzi Ãļzəlliklər limitlidir." + "message": "Seyfi kilidlə" }, "customFields": { - "message": "Özəl sahələr" + "message": "Özəl xanalar" }, "copyValue": { "message": "Dəyəri kopyala" @@ -1036,10 +1574,10 @@ "message": "Dəyər" }, "newCustomField": { - "message": "Yeni Ãļzəl sahə" + "message": "Yeni Ãļzəl xana" }, "dragToSort": { - "message": "SÄąralamaq ÃŧçÃŧn sÃŧrÃŧşdÃŧrÃŧn" + "message": "SÄąralamaq ÃŧçÃŧn sÃŧrÃŧklə" }, "cfTypeText": { "message": "Mətn" @@ -1050,26 +1588,32 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "YoxlanÄąÅŸ qutusu" + }, "cfTypeLinked": { - "message": "Əlaqə yaradÄąldÄą", + "message": "Əlaqələndirildi", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Əlaqəli dəyər", + "message": "Əlaqələndirilmiş dəyər", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Təsdiqləmə kodunu alacağınÄąz e-poçtu yoxlamaq ÃŧçÃŧn bu pəncərə xaricində bir yerə klikləsəniz bu pəncərə bağlanacaq. Bu pəncərənin bağlanmamasÄą ÃŧçÃŧn yeni bir pəncərədə açmaq istəyirsiniz?" + "message": "Doğrulama kodunu alacağınÄąz e-poçtu yoxlamaq ÃŧçÃŧn bu pəncərə xaricində bir yerə klikləsəniz bu pəncərə bağlanacaq. Bu pəncərənin bağlanmamasÄą ÃŧçÃŧn yeni bir pəncərədə açmaq istəyirsiniz?" }, "popupU2fCloseMessage": { "message": "Bu brauzer bu aÃ§Äąlan pəncərədə U2F tələblərini emal edə bilmir. U2F istifadə edərək giriş etmək ÃŧçÃŧn bu aÃ§Äąlan pəncərəni yeni bir pəncərədə açmaq istəyirsiniz?" }, "enableFavicon": { - "message": "Veb sayt nişanlarÄąnÄą gÃļstər" + "message": "Veb sayt ikonlarÄąnÄą gÃļstər" }, "faviconDesc": { "message": "Hər girişin yanÄąnda tanÄąna bilən təsvir gÃļstər." }, + "faviconDescAlt": { + "message": "Hər bir giriş elementinin yanÄąnda tanÄąna bilən bir təsvir gÃļstər. Giriş etmiş bÃŧtÃŧn hesablara aiddir." + }, "enableBadgeCounter": { "message": "Nişan sayğacÄąnÄą gÃļstər" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Kimlik" }, + "typeSshKey": { + "message": "SSH açarÄą" + }, + "newItemHeader": { + "message": "Yeni $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ - dÃŧzəliş et", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "$TYPE$ - bax", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Parol tarixçəsi" }, + "generatorHistory": { + "message": "YaradÄącÄą tarixçəsi" + }, + "clearGeneratorHistoryTitle": { + "message": "YaradÄącÄą tarixçəsini təmizlə" + }, + "cleargGeneratorHistoryDescription": { + "message": "Davam etsəniz, yaradÄącÄą tarixçəsindəki bÃŧtÃŧn girişlər həmişəlik silinəcək. Davam etmək istədiyinizə əminsiniz?" + }, "back": { "message": "Geri" }, "collections": { "message": "Kolleksiyalar" }, + "nCollections": { + "message": "$COUNT$ kolleksiya", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Sevimlilər" }, @@ -1264,7 +1856,7 @@ "description": "To clear something out. example: To clear browser history." }, "checkPassword": { - "message": "Parolunuzun oğurlanÄąb oğurlanmadığınÄą yoxlayÄąn." + "message": "Parolun ifşalanÄąb ifşalanmadığınÄą yoxlayÄąn." }, "passwordExposed": { "message": "Bu parol, məlumat pozuntularÄąnda $VALUE$ dəfə Ãŧzə Ã§ÄąxÄąb. Dəyişdirməyi məsləhət gÃļrÃŧrÃŧk.", @@ -1282,6 +1874,10 @@ "message": "Baza domeni", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Baza domeni (tÃļvsiyə edilən)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domen adÄą", "description": "Domain name. Ex. website.com" @@ -1301,12 +1897,12 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Uyğunluq aşkarlamasÄą", - "description": "URI match detection for auto-fill." + "message": "UyuşmanÄą aşkarlama", + "description": "URI match detection for autofill." }, "defaultMatchDetection": { - "message": "İlkin uyğunluq aşkarlamasÄą", - "description": "Default URI match detection for auto-fill." + "message": "İlkin uyuşma aşkarlamasÄą", + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Seçimləri aç/bağla" @@ -1330,7 +1926,16 @@ "message": "BÃŧtÃŧn elementlər" }, "noPasswordsInList": { - "message": "SiyahÄąlanacaq heç bir parol yoxdur." + "message": "Sadalanacaq heç bir parol yoxdur." + }, + "clearHistory": { + "message": "Tarixçəni təmizlə" + }, + "nothingToShow": { + "message": "GÃļstəriləcək heç nə yoxdur" + }, + "nothingGeneratedRecently": { + "message": "Təzəlikcə heç nə yaratmamÄąsÄąnÄąz" }, "remove": { "message": "Ã‡Äąxart" @@ -1351,13 +1956,13 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "\"Heç vaxt\" seçimini istifadə etmək istədiyinizə əminsiniz? Kilid seçimini \"Heç vaxt\" olaraq tənzimləsəniz, anbarÄąnÄązÄąn şifrələmə açarÄą cihazÄąnÄązda saxlanÄąlacaq. Bu seçimi istifadə etsəniz, cihazÄąnÄązÄą daha yaxÅŸÄą mÃŧhafizə etməlisiniz." + "message": "\"Heç vaxt\"i seçmək istədiyinizə əminsiniz? Kilid seçimini \"Heç vaxt\" olaraq ayarlasanÄąz, seyfinizin şifrələmə açarÄą cihazÄąnÄązda saxlanÄąlacaq. Bu seçimi istifadə etsəniz, cihazÄąnÄązÄą daha yaxÅŸÄą mÃŧhafizə etdiyinizə əmin olmalÄąsÄąnÄąz." }, "noOrganizationsList": { "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə gÃŧvənli şəkildə paylaşmağınÄązÄą təmin edir." }, "noCollectionsInList": { - "message": "SiyahÄąlanacaq heç bir kolleksiya yoxdur." + "message": "Sadalanacaq heç bir kolleksiya yoxdur." }, "ownership": { "message": "Sahiblik" @@ -1390,8 +1995,17 @@ "unlockWithPin": { "message": "PIN ilə kilidi aÃ§Äąn" }, + "setYourPinTitle": { + "message": "PIN təyin et" + }, + "setYourPinButton": { + "message": "PIN təyin et" + }, "setYourPinCode": { - "message": "Bitwarden-in kilidini açmaq ÃŧçÃŧn PIN kod tənzimləyin. Hər tətbiqdən tam Ã§ÄąxÄąÅŸ edəndə PIN tənzimləmələriniz sÄąfÄąrlanacaq." + "message": "Bitwarden-in kilidini açmaq ÃŧçÃŧn PIN kodunuzu ayarlayÄąn. Tətbiqdən tam Ã§ÄąxÄąÅŸ etdikdə PIN ayarlarÄąnÄąz sÄąfÄąrlanacaq." + }, + "setYourPinCode1": { + "message": "Bitwarden kilidini açmaq ÃŧçÃŧn ana parolunuzun əvəzinə PIN-iniz istifadə ediləcək. Bitwarden-dən tamamilə Ã§ÄąxÄąÅŸ etdikdə PIN-iniz sÄąfÄąrlanacaq." }, "pinRequired": { "message": "PIN kod lazÄąmdÄąr." @@ -1399,18 +2013,27 @@ "invalidPin": { "message": "YararsÄąz PIN kod." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Həddən artÄąq yararsÄąz PIN giriş cəhdi. Ã‡ÄąxÄąÅŸ edilir." + }, "unlockWithBiometrics": { - "message": "Biometriklərlə kilidi aÃ§Äąn" + "message": "Kilidi biometriklə aÃ§Äąn" + }, + "unlockWithMasterPassword": { + "message": "Ana parolla kilidi aç" }, "awaitDesktop": { "message": "MasaÃŧstÃŧndən təsdiq gÃļzlənilir" }, "awaitDesktopDesc": { - "message": "Brauzer ÃŧçÃŧn biometrikləri fəallaşdÄąrmaq ÃŧçÃŧn zəhmət olmasa Bitwarden masaÃŧstÃŧ tətbiqində biometrik istifadəsini təsdiqləyin." + "message": "Brauzer Ãŧzrə biometrikləri qurmaq ÃŧçÃŧn lÃŧtfən Bitwarden masaÃŧstÃŧ tətbiqində biometrik istifadəsini təsdiqləyin." }, "lockWithMasterPassOnRestart": { "message": "Brauzer yenidən başladÄąlanda ana parolla kilidlə" }, + "lockWithMasterPassOnRestart1": { + "message": "Brauzer yenidən başladÄąlanda ana parolu tələb et" + }, "selectOneCollection": { "message": "Ən azÄą bir kolleksiya seçməlisiniz." }, @@ -1421,14 +2044,40 @@ "message": "Klonla" }, "passwordGeneratorPolicyInEffect": { - "message": "Bir və ya daha çox təşkilat siyasətləri yaradÄącÄą seçimlərinizə təsir edir." + "message": "Bir və ya daha çox təşkilat siyasəti yaradÄącÄą ayarlarÄąnÄąza təsir edir." + }, + "passwordGenerator": { + "message": "Parol yaradÄącÄą" + }, + "usernameGenerator": { + "message": "İstifadəçi adÄą yaradÄącÄą" + }, + "useThisPassword": { + "message": "Bu parolu istifadə et" + }, + "useThisUsername": { + "message": "Bu istifadəçi adÄąnÄą istifadə et" + }, + "securePasswordGenerated": { + "message": "GÃŧvənli parol yaradÄąldÄą! Həmçinin veb saytdakÄą parolunuzu gÃŧncəlləməyi unutmayÄąn." + }, + "useGeneratorHelpTextPartOne": { + "message": "YaradÄącÄą istifadə et", + "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": "Daha unikal parollar yarat", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { - "message": "Anbara mÃŧraciət vaxtÄąnÄąn bitmə əməliyyatÄą" + "message": "Seyf vaxtÄąnÄąn bitmə əməliyyatÄą" + }, + "vaultTimeoutAction1": { + "message": "Vaxt bitmə əməliyyatÄą" }, "lock": { "message": "Kilidlə", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "TullantÄą qutusu", @@ -1452,8 +2101,11 @@ "restoredItem": { "message": "Element bərpa edildi" }, + "alreadyHaveAccount": { + "message": "ArtÄąq hesabÄąnÄąz var?" + }, "vaultTimeoutLogOutConfirmation": { - "message": "Ã‡ÄąxÄąÅŸ edəndə, anbarÄąnÄąza bÃŧtÃŧn mÃŧraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik təsdiqləməsi tələb olunacaq. Bu tənzimləməni istifadə etmək istədiyinizə əminsiniz?" + "message": "Ã‡ÄąxÄąÅŸ etdikdə, seyfinizə bÃŧtÃŧn mÃŧraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik doğrulamasÄą tələb olunacaq. Bu ayarÄą istifadə etmək istədiyinizə əminsiniz?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Vaxt bitmə əməliyyat təsdiqi" @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Avto-doldur və saxla" }, + "fillAndSave": { + "message": "Doldur və saxla" + }, "autoFillSuccessAndSavedUri": { "message": "Element avto-dolduruldu və URI saxlanÄąldÄą" }, @@ -1474,10 +2129,10 @@ "message": "Hələ də bu girişi doldurmaq istəyirsiniz?" }, "autofillIframeWarning": { - "message": "Form sahibliyi, saxlanÄąlmÄąÅŸ girişinizin URI-Äąndan fərqli bir domen tərəfindən həyata keçirilir. Yenə də avto-doldurmaq ÃŧçÃŧn \"Oldu\"ya, dayandÄąrmaq ÃŧçÃŧn \"İmtina\"ya basÄąn." + "message": "Form sahibliyi, saxlanÄąlmÄąÅŸ girişinizin URI-sindən fərqli bir domen tərəfindən edilir. Yenə də avto-doldurmaq ÃŧçÃŧn \"Oldu\"ya, dayandÄąrmaq ÃŧçÃŧn \"İmtina\"ya basÄąn." }, "autofillIframeWarningTip": { - "message": "Gələcəkdə bu xəbərdarlığın qarÅŸÄąsÄąnÄą almaq ÃŧçÃŧn, $HOSTNAME$ URI-nÄą bu sayt ÃŧçÃŧn Bitwarden giriş elementinizdə saxlayÄąn.", + "message": "Gələcəkdə bu xəbərdarlığı Ãļnləmək ÃŧçÃŧn, $HOSTNAME$ URI-nÄą bu sayt ÃŧçÃŧn Bitwarden giriş elementinizdə saxlayÄąn.", "placeholders": { "hostname": { "content": "$1", @@ -1486,7 +2141,7 @@ } }, "setMasterPassword": { - "message": "Ana parolu tənzimlə" + "message": "Ana parolu ayarla" }, "currentMasterPass": { "message": "HazÄąrkÄą ana parol" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Yeni ana parolunuz siyasət tələblərini qarÅŸÄąlamÄąr." }, + "receiveMarketingEmailsV2": { + "message": "Bitwarden-in tÃļvsiyə, elan və araşdÄąrma imkanlarÄąnÄą gələn qutunuzda əldə edin." + }, + "unsubscribe": { + "message": "Abunəlikdən Ã§Äąx" + }, + "atAnyTime": { + "message": "istənilən vaxt." + }, + "byContinuingYouAgreeToThe": { + "message": "Davam edərək, bunlarla razÄąlaÅŸÄąrsÄąnÄąz" + }, + "and": { + "message": "və" + }, "acceptPolicies": { "message": "Bu qutunu işarələyərək aşağıdakÄąlarla razÄąlaÅŸÄąrsÄąnÄąz:" }, @@ -1552,52 +2222,64 @@ "message": "Gizlilik Siyasəti" }, "hintEqualsPassword": { - "message": "Parol məsləhəti, parolunuzla eyni ola bilməz." + "message": "Parol ipucusu, parolunuzla eyni ola bilməz." }, "ok": { "message": "Oldu" }, + "errorRefreshingAccessToken": { + "message": "MÃŧraciət tokeni təzələmə xətasÄą" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Təzələmə tokeni və ya API açarlar tapÄąlmadÄą. LÃŧtfən Ã§ÄąxÄąÅŸ edib yenidən giriş etməyə çalÄąÅŸÄąn." + }, "desktopSyncVerificationTitle": { - "message": "MasaÃŧstÃŧ eyniləşdirmə təsdiqləməsi" + "message": "MasaÃŧstÃŧ sinxr doğrulamasÄą" }, "desktopIntegrationVerificationText": { - "message": "Zəhmət olmasa masaÃŧstÃŧ tətbiqin bu barmaq izini gÃļrdÃŧyÃŧnÃŧ təsdiqləyin:" + "message": "LÃŧtfən masaÃŧstÃŧ tətbiqin bu barmaq izini gÃļrdÃŧyÃŧnÃŧ doğrulayÄąn: " }, "desktopIntegrationDisabledTitle": { - "message": "Brauzer inteqrasiyasÄą fəal deyil" + "message": "Brauzer inteqrasiyasÄą qurulmayÄąb" }, "desktopIntegrationDisabledDesc": { - "message": "Brauzer inteqrasiyasÄą Bitwarden masaÃŧstÃŧ tətbiqində fəal deyil. Zəhmət olmasa masaÃŧstÃŧ tətbiqinin tənzimləmələrində fəallaşdÄąrÄąn." + "message": "Brauzer inteqrasiyasÄą Bitwarden masaÃŧstÃŧ tətbiqində qurulmayÄąb. LÃŧtfən bunu masaÃŧstÃŧ tətbiqinin ayarlarÄąnda qurun." }, "startDesktopTitle": { "message": "Bitwarden masaÃŧstÃŧ tətbiqini başlat" }, "startDesktopDesc": { - "message": "Bu funksiyanÄąn istifadə edilə bilməsi ÃŧçÃŧn Bitwarden masaÃŧstÃŧ tətbiqi başladÄąlmalÄądÄąr." + "message": "Biometriklə kilidi aça bilmək ÃŧçÃŧn Bitwarden masaÃŧstÃŧ tətbiqi başladÄąlmalÄądÄąr." }, "errorEnableBiometricTitle": { - "message": "Biometriklər fəallaşdÄąrÄąla bilmədi" + "message": "Biometriklər qurula bilmir" }, "errorEnableBiometricDesc": { "message": "Əməliyyat, masaÃŧstÃŧ tətbiqi tərəfindən ləğv edildi" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "MasaÃŧstÃŧ tətbiqi, gÃŧvənli rabitə kanalÄąnÄą yararsÄąz etdi. Bu əməliyyatÄą yenidən icra edin" + "message": "MasaÃŧstÃŧ tətbiqi, gÃŧvənli rabitə kanalÄąnÄą yararsÄąz etdi. LÃŧtfən bu əməliyyatÄą yenidən icra edin" }, "nativeMessagingInvalidEncryptionTitle": { "message": "MasaÃŧstÃŧ rabitə əlaqəsi kəsildi" }, "nativeMessagingWrongUserDesc": { - "message": "MasaÃŧstÃŧ tətbiqdə fərqli bir hesabla giriş edilib. Hər iki tətbiqin eyni hesabla giriş etdiyinə əmin olun." + "message": "MasaÃŧstÃŧ tətbiqdə fərqli bir hesaba giriş edilib. LÃŧtfən hər iki tətbiqin eyni hesaba giriş etdiyinə əmin olun." }, "nativeMessagingWrongUserTitle": { - "message": "Hesablar uyğunlaşmÄąr" + "message": "Hesablar uyuşmur" + }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometrik açarÄą uyuşmazlığı" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrik ilə kilid açma uğursuz oldu. Biometrik sirr açarÄą seyfin kilidini aça bilmədi. LÃŧtfən biometriki yenidən qurmağa çalÄąÅŸÄąn." }, "biometricsNotEnabledTitle": { - "message": "Biometriklə fəal deyil" + "message": "Biometriklər qurulmayÄąb" }, "biometricsNotEnabledDesc": { - "message": "Brauzer biometrikləri, əvvəlcə tənzimləmələrdə masaÃŧstÃŧ biometriklərinin fəallaşdÄąrÄąlmasÄąnÄą tələb edir." + "message": "Brauzer biometrikləri, əvvəlcə ayarlarda masaÃŧstÃŧ biometriklərinin qurulmasÄąnÄą tələb edir." }, "biometricsNotSupportedTitle": { "message": "Biometriklər dəstəklənmir" @@ -1605,42 +2287,93 @@ "biometricsNotSupportedDesc": { "message": "Brauzer biometrikləri bu cihazda dəstəklənmir." }, + "biometricsNotUnlockedTitle": { + "message": "İstifadəçi kilidlənib və ya hesabdan Ã§ÄąxÄąÅŸ edib" + }, + "biometricsNotUnlockedDesc": { + "message": "LÃŧtfən bu istifadəçinin kilidini masaÃŧstÃŧ tətbiqində aÃ§Äąb yenidən sÄąnayÄąn." + }, + "biometricsNotAvailableTitle": { + "message": "Biometrik kilidi açma əlçatmazdÄąr" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrik kilidi açma hazÄąrda əlçatmazdÄąr. LÃŧtfən daha sonra yenidən sÄąnayÄąn." + }, "biometricsFailedTitle": { "message": "Biometrik uğursuzdur" }, "biometricsFailedDesc": { - "message": "Biometriklər tamamlana bilmir, ana parol istifadə etməyi dÃŧşÃŧnÃŧn və ya Ã§ÄąxÄąÅŸ edin. Bu problem davam edərsə, zəhmət olmasa Bitwarden dəstəyi ilə əlaqə saxlayÄąn." + "message": "Biometriklər tamamlana bilmir, ana parol istifadə etməyi dÃŧşÃŧnÃŧn və ya Ã§ÄąxÄąÅŸ edin. Bu problem davam edərsə, lÃŧtfən Bitwarden dəstəyi ilə əlaqə saxlayÄąn." }, "nativeMessaginPermissionErrorTitle": { "message": "İcazə verilmədi" }, "nativeMessaginPermissionErrorDesc": { - "message": "Bitwarden masaÃŧstÃŧ tətbiqi ilə əlaqə qurma icazəsi olmadan, brauzer genişləndirməsində biometrikləri təmin edə bilmərik. Zəhmət olmasa yenidən sÄąnayÄąn." + "message": "Bitwarden masaÃŧstÃŧ tətbiqi ilə əlaqə qurma icazəsi olmadan, brauzer uzantÄąsÄąnda biometrikləri təmin edə bilmirik. LÃŧtfən yenidən sÄąnayÄąn." }, "nativeMessaginPermissionSidebarTitle": { "message": "İcazə tələb xətasÄą" }, "nativeMessaginPermissionSidebarDesc": { - "message": "Bu əməliyyatÄą yan sətirdən edə bilməzsiniz. Zəhmət olmasa aÃ§Äąlan pəncərədə yenidən cəhd edin." + "message": "Bu əməliyyat yan çubuqda icra edilə bilməz. LÃŧtfən aÃ§Äąlan pəncərədə yenidən sÄąnayÄąn." }, "personalOwnershipSubmitError": { - "message": "MÃŧəssisə Siyasətinə gÃļrə, elementləri şəxsi anbarÄąnÄązda saxlamağınÄąz məhdudlaşdÄąrÄąlÄąb. Sahiblik seçimini təşkilat olaraq dəyişdirin və mÃļvcud kolleksiyalar arasÄąndan seçim edin." + "message": "MÃŧəssisə Siyasətinə gÃļrə, elementləri şəxsi seyfinizdə saxlamağınÄąz məhdudlaşdÄąrÄąlÄąb. Sahiblik seçimini təşkilat olaraq dəyişdirin və mÃļvcud kolleksiyalar arasÄąndan seçim edin." }, "personalOwnershipPolicyInEffect": { "message": "Bir təşkilat siyasəti, sahiblik seçimlərinizə təsir edir." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Bir təşkilat siyasəti, elementlərin fərdi seyfinizə kÃļçÃŧrÃŧlməsini əngəllədi." + }, + "domainsTitle": { + "message": "Domenlər", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "İstisna edilən domenlər" }, "excludedDomainsDesc": { - "message": "Bitwarden bu domenlər ÃŧçÃŧn giriş təfsilatlarÄąnÄą saxlamağı soruşmayacaq. Dəyişikliklərin təsirli olmasÄą ÃŧçÃŧn səhifəni təzələməlisiniz." + "message": "Bitwarden, bu domenlər ÃŧçÃŧn giriş detallarÄąnÄą saxlamağı soruşmayacaq. Dəyişikliklərin qÃŧvvəyə minməsi ÃŧçÃŧn səhifəni təzələməlisiniz." + }, + "excludedDomainsDescAlt": { + "message": "Bitwarden, giriş etmiş bÃŧtÃŧn hesablar ÃŧçÃŧn bu domenlərin giriş detallarÄąnÄą saxlamağı soruşmayacaq. Dəyişikliklərin qÃŧvvəyə minməsi ÃŧçÃŧn səhifəni təzələməlisiniz." + }, + "websiteItemLabel": { + "message": "Veb sayt $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ etibarlÄą bir domen deyil", + "message": "$DOMAIN$ yararlÄą bir domen deyil", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "İstisna domen dəyişikliyi saxlanÄąldÄą" + }, + "limitSendViews": { + "message": "BaxÄąÅŸlarÄą limitlə" + }, + "limitSendViewsHint": { + "message": "Limitə çatdÄąqdan sonra bu Send-ə heç kim baxa bilməz.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ baxÄąÅŸ qaldÄą", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send detallarÄą", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "\"Send\"ləri axtar", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Mətn" }, + "sendTypeTextToShare": { + "message": "PaylaÅŸÄąlacaq mətn" + }, "sendTypeFile": { "message": "Fayl" }, @@ -1666,6 +2406,9 @@ "message": "BÃŧtÃŧn \"Send\"lər", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Mətni ilkin olaraq gizlət" + }, "maxAccessCountReached": { "message": "Maksimal mÃŧraciət sayÄąna çatÄąldÄą", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,12 +2422,15 @@ "passwordProtected": { "message": "Parolla qorunan" }, + "copyLink": { + "message": "Keçidi kopyala" + }, "copySendLink": { - "message": "\"Send\" bağlantÄąsÄąnÄą kopyala", + "message": "\"Send\" keçidini kopyala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Parolu Ã§Äąxart" + "message": "Parolu sil" }, "delete": { "message": "Sil" @@ -1697,14 +2443,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "\"Send\" bağlantÄąsÄą", + "message": "\"Send\" keçidi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { "message": "SÄąradan Ã§ÄąxarÄąldÄą" }, "removePasswordConfirmation": { - "message": "Parolu Ã§Äąxartmaq istədiyinizə əminsiniz?" + "message": "Parolu silmək istədiyinizə əminsiniz?" }, "deleteSend": { "message": "\"Send\"i sil", @@ -1714,6 +2460,10 @@ "message": "Bu \"Send\"i silmək istədiyinizə əminsiniz?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Bu Send-i həmişəlik silmək istədiyinizə əminsiniz?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "\"Send\"ə dÃŧzəliş et", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,11 +2486,15 @@ "message": "\"Send\" gÃļstərilən tarix və saatda birdəfəlik silinəcək.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send, bu tarixdə həmişəlik silinəcək.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Bitmə tarixi" }, "expirationDateDesc": { - "message": "Əgər tənzimlənsə, gÃļstərilən tarix və vaxtda \"Send\"ə mÃŧraciət başa çatacaq.", + "message": "Əgər ayarlanÄąbsa, gÃļstərilən tarix və vaxtda \"Send\"ə mÃŧraciət başa çatacaq.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { @@ -1762,23 +2516,27 @@ "message": "Maksimal mÃŧraciət sayÄą" }, "maximumAccessCountDesc": { - "message": "Əgər tənzimlənsə, istifadəçilər maksimal mÃŧraciət sayÄąna çatdÄąqdan sonra bu \"Send\"ə mÃŧraciət edə bilməyəcək.", + "message": "Əgər ayarlanÄąbsa, istifadəçilər maksimal mÃŧraciət sayÄąna çatdÄąqdan sonra bu \"Send\"ə mÃŧraciət edə bilməyəcək.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { "message": "İstəyinizə gÃļrə istifadəçilərdən bu \"Send\"ə mÃŧraciət edərkən parol tələb edə bilərsiniz.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "AlÄącÄąlarÄąn bu \"Send\"ə mÃŧraciət etməsi ÃŧçÃŧn ixtiyari bir parol əlavə edin.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { - "message": "Bu \"Send\" ilə bağlÄą gizli qeydlər.", + "message": "Bu \"Send\" ilə bağlÄą gizli notlar.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Heç kimin mÃŧraciət edə bilməməsi ÃŧçÃŧn bu \"Send\"i sÄąradan Ã§Äąxart.", + "message": "Heç kimin mÃŧraciət edə bilməməsi ÃŧçÃŧn bu \"Send\"i deaktiv et.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "SaxladÄąqdan sonra \"Send\"in bağlantÄąsÄąnÄą lÃļvhəyə kopyala.", + "message": "SaxladÄąqdan sonra \"Send\"in keçidini lÃļvhəyə kopyala.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -1792,14 +2550,14 @@ "message": "HazÄąrkÄą mÃŧraciət sayÄą" }, "createSend": { - "message": "Yeni \"Send\" yarat", + "message": "Yeni \"Send\"", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Yeni parol" }, "sendDisabled": { - "message": "Send sÄąradan Ã§ÄąxarÄąldÄą", + "message": "Send silindi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1810,18 +2568,65 @@ "message": "Send yaradÄąldÄą", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send uğurla yaradÄąldÄą!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send, nÃļvbəti 1 saat ərzində keçidə sahib olan hər kəsə əlçatan olacaq.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Send, nÃļvbəti $HOURS$ saat ərzində keçidə sahib olan hər kəsə əlçatan olacaq.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send, nÃļvbəti 1 gÃŧn ərzində keçidə sahib olan hər kəsə əlçatan olacaq.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Send, nÃļvbəti $DAYS$ gÃŧn ərzində keçidə sahib olan hər kəsə əlçatan olacaq.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send keçidi kopyalandÄą", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { - "message": "\"Send\"ə dÃŧzəliş edildi", + "message": "\"Send\" saxlanÄąldÄą", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogText": { + "message": "UzantÄą yeni pəncərədə aÃ§ÄąlsÄąn?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Bir fayl \"Send\"i yaratmaq ÃŧçÃŧn uzantÄąnÄą yeni bir pəncərədə açmalÄąsÄąnÄąz.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { - "message": "Fayl seçmək ÃŧçÃŧn (mÃŧmkÃŧnsə) genişləndirməni yan sətirdə aÃ§Äąn və ya bu bannerə klikləyərək yeni bir pəncərədə aÃ§Äąn." + "message": "Bir fayl seçmək ÃŧçÃŧn (mÃŧmkÃŧnsə) yan çubuqdakÄą uzantÄąnÄą aÃ§Äąn və ya bu bannerə klikləyərək yeni bir pəncərədə aÃ§Äąn." }, "sendFirefoxFileWarning": { - "message": "Firefox istifadə edərək fayl seçmək ÃŧçÃŧn genişləndirməni yan sətirdə aÃ§Äąn və ya bu bannerə klikləyərək yeni bir pəncərədə aÃ§Äąn." + "message": "Firefox istifadə edərək bir fayl seçmək ÃŧçÃŧn yan çubuqdakÄą uzantÄąnÄą aÃ§Äąn və ya bu bannerə klikləyərək yeni bir pəncərədə aÃ§Äąn." }, "sendSafariFileWarning": { - "message": "Safari istifadə edərək fayl seçmək ÃŧçÃŧn bu bannerə klikləyərək yeni bir pəncərədə aÃ§Äąn." + "message": "Safari istifadə edərək bir fayl seçmək ÃŧçÃŧn bu bannerə klikləyərək yeni bir pəncərədə aÃ§Äąn." + }, + "popOut": { + "message": "Pəncərədə aç" }, "sendFileCalloutHeader": { "message": "Başlamazdan əvvəl" @@ -1839,16 +2644,16 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "GÃļstərilən son istifadə tarixi etibarsÄązdÄąr." + "message": "GÃļstərilən son istifadə tarixi yararsÄązdÄąr." }, "deletionDateIsInvalid": { - "message": "GÃļstərilən silinmə tarixi etibarsÄązdÄąr." + "message": "GÃļstərilən silinmə tarixi yararsÄązdÄąr." }, "expirationDateAndTimeRequired": { - "message": "Son istifadə tarixi və vaxtÄą lazÄąmdÄąr." + "message": "Son istifadə tarixi və vaxtÄą tələb olunur." }, "deletionDateAndTimeRequired": { - "message": "Silinmə tarixi və vaxtÄą lazÄąmdÄąr." + "message": "Silinmə tarixi və vaxtÄą tələb olunur." }, "dateParsingError": { "message": "Silinmə və son istifadə tarixlərini saxlayarkən xəta baş verdi." @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "E-poçt ÃŧnvanÄąmÄą alÄącÄąlardan gizlət." }, + "hideYourEmail": { + "message": "E-poçt ÃŧnvanÄąnÄąz baxanlardan gizlədilsin." + }, "sendOptionsPolicyInEffect": { "message": "Bir və ya daha çox təşkilat siyasətləri \"Send\" seçimlərinizə təsir edir." }, @@ -1866,13 +2674,16 @@ "message": "Ana parol təsdiqi" }, "passwordConfirmationDesc": { - "message": "Bu əməliyyat qorumalÄądÄąr, davam etmək ÃŧçÃŧn zəhmət olmasa kimliyinizi təsdiqləmək ÃŧçÃŧn ana parolunuzu təkrar daxil edin." + "message": "Bu əməliyyat qorumalÄądÄąr, davam etmək ÃŧçÃŧn lÃŧtfən kimliyinizi doğrulamaq məqsədilə ana parolunuzu yenidən daxil edin." }, "emailVerificationRequired": { - "message": "E-poçt təsdiqləməsi tələb olunur" + "message": "E-poçt doğrulamasÄą tələb olunur" + }, + "emailVerifiedV2": { + "message": "E-poçt doğrulandÄą" }, "emailVerificationRequiredDesc": { - "message": "Bu Ãļzəlliyi istifadə etmək ÃŧçÃŧn e-poçtunuzu təsdiqləməlisiniz. E-poçtunuzu veb anbarÄąnda təsdiqləyə bilərsiniz." + "message": "Bu Ãļzəlliyi istifadə etmək ÃŧçÃŧn e-poçtunuzu doğrulamalÄąsÄąnÄąz. E-poçtunuzu veb seyfdə doğrulaya bilərsiniz." }, "updatedMasterPassword": { "message": "GÃŧncəllənmiş ana parol" @@ -1881,22 +2692,47 @@ "message": "Ana parolu gÃŧncəllə" }, "updateMasterPasswordWarning": { - "message": "Ana parolunuz təzəlikcə təşkilatÄąnÄązdakÄą bir administrator tərəfindən dəyişdirildi. Anbara mÃŧraciət ÃŧçÃŧn indi gÃŧncəlləməlisiniz. Davam etsəniz, hazÄąrkÄą seansdan Ã§ÄąxÄąÅŸ etmiş və təkrar giriş etməli olacaqsÄąnÄąz. Digər cihazlardakÄą aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təzəlikcə təşkilatÄąnÄązdakÄą bir administrator tərəfindən dəyişdirildi. Seyfə mÃŧraciət etmək ÃŧçÃŧn onu indi gÃŧncəlləməlisiniz. Davam etsəniz, hazÄąrkÄą seansdan Ã§ÄąxÄąÅŸ edəcəksiniz və təkrar giriş etməli olacaqsÄąnÄąz. Digər cihazlardakÄą aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "updateWeakMasterPasswordWarning": { - "message": "Ana parolunuz təşkilatÄąnÄązdakÄą siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Anbara mÃŧraciət ÃŧçÃŧn ana parolunuzu indi gÃŧncəlləməlisiniz. Davam etsəniz, hazÄąrkÄą seansdan Ã§ÄąxÄąÅŸ etmiş və təkrar giriş etməli olacaqsÄąnÄąz. Digər cihazlardakÄą aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təşkilatÄąnÄązdakÄą siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Seyfə mÃŧraciət ÃŧçÃŧn ana parolunuzu indi gÃŧncəlləməlisiniz. Davam etsəniz, hazÄąrkÄą seansdan Ã§ÄąxÄąÅŸ etmiş və təkrar giriş etməli olacaqsÄąnÄąz. Digər cihazlardakÄą aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + }, + "tdeDisabledMasterPasswordRequired": { + "message": "TəşkilatÄąnÄąz, gÃŧvənli cihaz şifrələməsini sÄąradan Ã§ÄąxartdÄą. Seyfinizə mÃŧraciət etmək ÃŧçÃŧn lÃŧtfən ana parol təyin edin." }, "resetPasswordPolicyAutoEnroll": { - "message": "Avtomatik qeydiyyat" + "message": "Avtomatik yazÄąlma" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Bu təşkilat, sizi \"parol sÄąfÄąrlama\"da avtomatik olaraq qeydiyyata alan mÃŧəssisə siyasətinə sahibdir. Qeydiyyat, təşkilat administratorlarÄąna ana parolunuzu dəyişdirmə icazəsi verəcək." + "message": "Bu təşkilatÄąn sizi \"parol sÄąfÄąrlama\" əməliyyatÄąna avtomatik olaraq yazacaq olan mÃŧəssisə siyasəti var. YazÄąlma, təşkilat administratorlarÄąna ana parolunuzu dəyişdirmə icazəsi verəcək." }, "selectFolder": { "message": "Qovluq seçin..." }, - "ssoCompleteRegistration": { - "message": "SSO ilə giriş prosesini tamamlamaq ÃŧçÃŧn zəhmət olmasa anbarÄąnÄąza mÃŧraciət etmək və onu qorumaq ÃŧçÃŧn bir ana parol tənzimləyin." + "noFoldersFound": { + "message": "Heç bir qovluq tapÄąlmadÄą", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "TəşkilatÄąnÄązÄąn icazələri gÃŧncəlləndi və bir ana parol ayarlamağınÄązÄą tələb edir.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "TəşkilatÄąnÄąz bir ana parol ayarlamağı tələb edir.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "/$TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Doğrulama tələb olunur", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Saat" @@ -1904,8 +2740,37 @@ "minutes": { "message": "Dəqiqə" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "MÃŧəssisə siyasət tələbləri, vaxt bitmə seçimlərinizə tətbiq edildi" + }, "vaultTimeoutPolicyInEffect": { - "message": "TəşkilatÄąnÄązÄąn siyasətləri, anbarÄąnÄązÄąn vaxt bitişinə təsir edir. Anbar vaxt bitişi ÃŧçÃŧn icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir", + "message": "TəşkilatÄąnÄązÄąn siyasətləri, icazə verilən maksimum seyf bitmə vaxtÄąnÄą $HOURS$ saat $MINUTES$ dəqiqə olaraq ayarladÄą.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maksimum $HOURS$ saat və $MINUTES$ dəqiqə.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Vaxt bitməsinə təyin olunan vaxt, təşkilatÄąnÄąz tərəfindən ayarlanan məhdudiyyəti aÅŸÄąr: Maksimum $HOURS$ saat və $MINUTES$ dəqiqə", "placeholders": { "hours": { "content": "$1", @@ -1918,7 +2783,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "TəşkilatÄąnÄązÄąn siyasətləri, anbarÄąnÄązÄąn vaxt bitişinə təsir edir. Anbar vaxt bitişi ÃŧçÃŧn icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir. Anbar vaxt bitişi əməliyyatÄą $ACTION$ olaraq tənzimləndi.", + "message": "TəşkilatÄąnÄązÄąn siyasətləri, seyfinizin bitmə vaxtÄąna təsir edir. İcazə verilən maksimum seyf bitmə vaxtÄą $HOURS$ saat $MINUTES$ dəqiqədir. Seyf vaxt bitmə əməliyyatÄą $ACTION$ olaraq ayarlandÄą.", "placeholders": { "hours": { "content": "$1", @@ -1935,7 +2800,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "TəşkilatÄąnÄązÄąn siyasətləri, anbar vaxt bitişi əməliyyatÄąnÄązÄą $ACTION$ olaraq tənzimlədi.", + "message": "TəşkilatÄąnÄązÄąn siyasətləri, seyfinizin vaxt bitmə əməliyyatÄąnÄą $ACTION$ olaraq ayarladÄą.", "placeholders": { "action": { "content": "$1", @@ -1944,22 +2809,22 @@ } }, "vaultTimeoutTooLarge": { - "message": "Anbar vaxt bitişi, təşkilatÄąnÄąz tərəfindən tənzimlənən məhdudiyyətləri aÅŸÄąr." + "message": "Seyfin bitmə vaxtÄą, təşkilatÄąnÄąz tərəfindən ayarlanan məhdudiyyətləri aÅŸÄąr." }, "vaultExportDisabled": { - "message": "Anbar ixracÄą sÄąradan Ã§ÄąxarÄąldÄą" + "message": "Seyfin xaricə kÃļçÃŧrÃŧlməsi əlçatmazdÄąr" }, "personalVaultExportPolicyInEffect": { - "message": "Bir və ya daha çox təşkilat siyasəti, fərdi anbarÄąnÄązÄą ixrac etməyinizin qarÅŸÄąsÄąnÄą alÄąr." + "message": "Bir və ya daha çox təşkilat siyasəti, fərdi seyfi xaricə kÃļçÃŧrməyinizi əngəlləyir." }, "copyCustomFieldNameInvalidElement": { - "message": "EtibarlÄą form elementi mÃŧəyyənləşdirilə bilmir. Bunun əvəzinə HTML-i nəzərdən keçirməyi sÄąnayÄąn." + "message": "YararlÄą bir form elementi mÃŧəyyənləşdirilə bilmir. Bunun əvəzinə HTML-i incələməyi sÄąnayÄąn." }, "copyCustomFieldNameNotUnique": { "message": "Unikal identifikator tapÄąlmadÄą." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$, Ãļz-ÃļzÃŧnə sahiblik edən açar serveri ilə SSO istifadə edir. Bu təşkilatÄąn Ãŧzvlərinin giriş etməsi ÃŧçÃŧn artÄąq ana parol tələb edilməyəcək.", + "message": "$ORGANIZATION$, self-hosted açar serveri ilə SSO istifadə edir. Bu təşkilatÄąn Ãŧzvlərinin giriş etməsi ÃŧçÃŧn artÄąq ana parol tələb edilməyəcək.", "placeholders": { "organization": { "content": "$1", @@ -1986,13 +2851,13 @@ "message": "Simvol sayÄąnÄą dəyişdir" }, "sessionTimeout": { - "message": "SeansÄąnÄązÄąn vaxtÄą bitdi. Zəhmət olmasa geri qayÄądÄąb yenidən giriş etməyə cəhd edin." + "message": "SeansÄąnÄązÄąn vaxtÄą bitdi. LÃŧtfən geri qayÄądÄąb yenidən giriş etməyə cəhd edin." }, "exportingPersonalVaultTitle": { - "message": "Şəxsi anbarÄąn ixracÄą" + "message": "Fərdi seyfin xaricə kÃļçÃŧrÃŧlməsi" }, "exportingIndividualVaultDescription": { - "message": "YalnÄąz $EMAIL$ ilə əlaqələndirilmiş fərdi anbar elementləri xaricə kÃļçÃŧrÃŧləcək. Təşkilat anbar elementləri daxil edilməyəcək. YalnÄąz anbar element məlumatlarÄą xaricə kÃļçÃŧrÃŧləcək və əlaqələndirilmiş qoşmalar daxil edilməyəcək.", + "message": "YalnÄąz $EMAIL$ ilə əlaqələndirilmiş fərdi seyf elementləri xaricə kÃļçÃŧrÃŧləcək. Təşkilat seyf elementləri daxil edilməyəcək. YalnÄąz seyf element məlumatlarÄą xaricə kÃļçÃŧrÃŧləcək və əlaqələndirilmiş qoşmalar daxil edilməyəcək.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Təşkilat seyfini xaricə kÃļçÃŧrmə" + }, + "exportingOrganizationVaultDesc": { + "message": "YalnÄąz $ORGANIZATION$ ilə əlaqələndirilmiş təşkilat seyfi xaricə kÃļçÃŧrÃŧləcək. Fərdi seyfdə və digər təşkilatlardakÄą elementlər daxil edilməyəcək.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Xəta" }, @@ -2009,21 +2886,38 @@ "generateUsername": { "message": "İstifadəçi adÄą yarat" }, + "generateEmail": { + "message": "E-poçt yarat" + }, + "generatorBoundariesHint": { + "message": "Dəyər $MIN$-$MAX$ arasÄąnda olmalÄądÄąr", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "İstifadəçi adÄą nÃļvÃŧ" }, "plusAddressedEmail": { - "message": "Plyus ÃŧnvanlÄą e-poçt", + "message": "Üstəgəl ÃŧnvanlÄą e-poçt", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "E-poçt provayderinizin alt Ãŧnvan Ãļzəlliklərini istifadə et." + "message": "E-poçt provayderinizin alt Ãŧnvanlama imkanlarÄąnÄą istifadə edin." }, "catchallEmail": { - "message": "Catch-all E-poçt" + "message": "Catch-all e-poçt" }, "catchallEmailDesc": { - "message": "Domeninizin konfiqurasiya edilmiş hamÄąsÄąnÄą yaxalama gələn qutusunu istifadə edin." + "message": "Domeninizin konfiqurasiyalÄą catch-all gələn qutusunu istifadə edin." }, "random": { "message": "TəsadÃŧfi" @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Xarici yÃļnləndirmə xidməti ilə e-poçt ləqəbi yaradÄąn." }, + "forwarderDomainName": { + "message": "E-poçt domeni", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Seçilmiş xidmət tərəfindən dəstəklənən bir domen seçin", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ xətasÄą: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden tərəfindən yaradÄąlÄąb.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Veb sayt: $WEBSITE$. Bitwarden tərəfindən yaradÄąlÄąb.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "YararsÄąz $SERVICENAME$ API jetonu", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "YararsÄąz $SERVICENAME$ API jetonu: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ maskalÄą e-poçt hesab kimliyi alÄąna bilmir.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "YararsÄąz $SERVICENAME$ domeni.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "YararsÄąz $SERVICENAME$ url-si.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Bilinməyən $SERVICENAME$ xətasÄą baş verdi.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Bilinməyən yÃļnləndirici: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Host adÄą", "description": "Part of a URL." @@ -2066,10 +3070,10 @@ "message": "Premium abunəlik tələb olunur" }, "organizationIsDisabled": { - "message": "Təşkilat sÄąradan Ã§ÄąxarÄąldÄą." + "message": "Təşkilat dayandÄąrÄąldÄą." }, "disabledOrganizationFilterError": { - "message": "SÄąradan Ã§ÄąxarÄąlmÄąÅŸ TəşkilatlardakÄą elementlərə mÃŧraciət edilə bilmir. KÃļmək ÃŧçÃŧn TəşkilatÄąnÄązÄąn sahibi ilə əlaqə saxlayÄąn." + "message": "DayandÄąrÄąlmÄąÅŸ TəşkilatlardakÄą elementlərə mÃŧraciət edilə bilmir. KÃļmək ÃŧçÃŧn TəşkilatÄąnÄązÄąn sahibi ilə əlaqə saxlayÄąn." }, "loggingInTo": { "message": "$DOMAIN$ domeninə giriş edilir", @@ -2081,25 +3085,25 @@ } }, "settingsEdited": { - "message": "Tənzimləmələrə dÃŧzəliş edildi" + "message": "Ayarlara dÃŧzəliş edildi" }, "environmentEditedClick": { "message": "Bura klikləyin" }, "environmentEditedReset": { - "message": "Ãļn konfiqurasiyalÄą tənzimləmələri sÄąfÄąrlamaq ÃŧçÃŧn" + "message": "Ãļn konfiqurasiyalÄą ayarlarÄą sÄąfÄąrlamaq ÃŧçÃŧn" }, "serverVersion": { - "message": "Server VersiyasÄą" + "message": "Server versiyasÄą" }, "selfHostedServer": { - "message": "Ãļz-ÃļzÃŧnə sahiblik edən" + "message": "self-hosted" }, "thirdParty": { "message": "ÜçÃŧncÃŧ tərəf" }, "thirdPartyServerMessage": { - "message": "ÜçÃŧncÃŧ tərəf server tətbiqetməsi ilə bağlantÄą quruldu, $SERVERNAME$. Zəhmət olmasa rəsmi serveri istifadə edərək xətalarÄą təsdiqləyin və ya onlarÄą ÃŧçÃŧncÃŧ tərəf serverə bildirin.", + "message": "$SERVERNAME$ ÃŧçÃŧncÃŧ tərəf server tətbiqinə bağlandÄą. LÃŧtfən rəsmi serveri istifadə edərək xətalarÄą doğrulayÄąn və ya onlarÄą ÃŧçÃŧncÃŧ tərəf serverə bildirin.", "placeholders": { "servername": { "content": "$1", @@ -2108,7 +3112,7 @@ } }, "lastSeenOn": { - "message": "son gÃļrÃŧnmə $DATE$", + "message": "son gÃļrÃŧnmə: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2135,19 +3139,19 @@ "message": "Cihazla giriş et" }, "loginWithDeviceEnabledInfo": { - "message": "Cihazla giriş etmə, Bitwarden tətbiqinin tənzimləmələrində quraşdÄąrÄąlmalÄądÄąr. Başqa bir seçimə ehtiyacÄąnÄąz var?" + "message": "Cihazla giriş, Bitwarden tətbiqinin ayarlarÄąnda qurulmalÄądÄąr. Başqa bir seçimə ehtiyacÄąnÄąz var?" }, "fingerprintPhraseHeader": { "message": "Barmaq izi ifadəsi" }, "fingerprintMatchInfo": { - "message": "Zəhmət olmasa anbarÄąnÄązÄąn kilidinin aÃ§Äąq olduğuna və Barmaq izi ifadəsinin digər cihazda uyğun gəldiyinə əmin olun." + "message": "LÃŧtfən seyfinizin kilidinin aÃ§Äąq olduğuna və Barmaq izi ifadəsinin digər cihazla uyuşduğuna əmin olun." }, "resendNotification": { "message": "Bildirişi təkrar gÃļndər" }, "viewAllLoginOptions": { - "message": "BÃŧtÃŧn giriş etmə seçimlərinə bax" + "message": "BÃŧtÃŧn giriş seçimlərinə bax" }, "notificationSentDevice": { "message": "CihazÄąnÄąza bir bildiriş gÃļndərildi." @@ -2174,7 +3178,7 @@ "message": "Vacib:" }, "masterPasswordHint": { - "message": "UnutsanÄąz, ana parolunuz bərpa edilə bilməz!" + "message": "UnutsanÄąz, ana parolunuz geri qaytarÄąla bilməz!" }, "characterMinimum": { "message": "Minimum $LENGTH$ simvol", @@ -2192,7 +3196,7 @@ "message": "Avto-doldurma necə edilir" }, "autofillSelectInfoWithCommand": { - "message": "Bu səhifədən bir element seçin və ya qÄąsayolu istifadə edin: $COMMAND$", + "message": "Bu ekrandan bir element seçin, $COMMAND$ qÄąsayolunu istifadə edin və ya ayarlardakÄą digər seçimləri kəşf edin.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Bu səhifədən bir element seçin və ya tənzimləmələrdə bir qÄąsayol tənzimləyin." + "message": "Bu ekrandan bir element seçin və ya ayarlardakÄą digər seçimləri kəşf edin." }, "gotIt": { "message": "AnladÄąm" }, "autofillSettings": { - "message": "Avto-doldurma tənzimləmələri" + "message": "Avto-doldurma ayarlarÄą" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Avto-doldurma qÄąsayolu" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "QÄąsayolu dəyişdir" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "QÄąsayollarÄą idarə et" }, "autofillShortcut": { "message": "Avto-doldurma klaviatura qÄąsayolu" }, - "autofillShortcutNotSet": { - "message": "Avto-doldurma qÄąsayolu tənzimlənməyib. Bunu brauzerin tənzimləmələrində dəyişdirin." + "autofillLoginShortcutNotSet": { + "message": "Avto-doldurma giriş qÄąsayolu ayarlanmayÄąb. Bunu brauzerin ayarlarÄąnda dəyişdirin." }, - "autofillShortcutText": { - "message": "Avto-doldurma qÄąsayolu: $COMMAND$. Bunu brauzerin tənzimləmələrində dəyişdirin.", + "autofillLoginShortcutText": { + "message": "Girişin avto-doldurma qÄąsayolu: $COMMAND$. BÃŧtÃŧn qÄąsayollarÄą brauzerin ayarlarÄąnda idarə edin.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Giriş edilir" - }, "opensInANewWindow": { "message": "Yeni bir pəncərədə aÃ§ÄąlÄąr" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Təşkilat SSO identifikatoru tələb olunur." }, + "creatingAccountOn": { + "message": "Hesab yaradÄąlÄąr" + }, + "checkYourEmail": { + "message": "E-poçtunuzu yoxlayÄąn" + }, + "followTheLinkInTheEmailSentTo": { + "message": "GÃļndərilən e-poçtdakÄą keçidi izləyin" + }, + "andContinueCreatingYourAccount": { + "message": "və hesabÄąnÄązÄą yaratmağa davam edin." + }, + "noEmail": { + "message": "E-poçt yoxdur?" + }, + "goBack": { + "message": "Geri qayÄąt" + }, + "toEditYourEmailAddress": { + "message": "və e-poçt ÃŧnvanÄąna dÃŧzəliş et." + }, "eu": { "message": "AB", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "MÃŧraciət rədd edildi. Bu səhifəyə baxmaq ÃŧçÃŧn icazəniz yoxdur." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Cihaz gÃŧvənlidir" }, + "sendsNoItemsTitle": { + "message": "Aktiv \"Send\" yoxdur", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Şifrələnmiş məlumatlarÄą hər kəslə gÃŧvənli şəkildə paylaşmaq ÃŧçÃŧn \"Send\"i istifadə edin.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Giriş lazÄąmdÄąr." }, @@ -2368,7 +3401,7 @@ "message": "Giriş, bir e-poçt ÃŧnvanÄą deyil." }, "fieldsNeedAttention": { - "message": "YuxarÄądakÄą $COUNT$ sahənin diqqətinizə ehtiyacÄą var.", + "message": "YuxarÄądakÄą $COUNT$ xananÄąn diqqətinizə ehtiyacÄą var.", "placeholders": { "count": { "content": "$1", @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 xananÄąn diqqətinizə ehtiyacÄą var." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ xananÄąn diqqətinizə ehtiyacÄą var.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Seç --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "YığcamlaşdÄąrmanÄą aç/bağla", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "DatanÄąz Bitwarden-ə kÃļçÃŧrÃŧlsÃŧn?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "LastPass datanÄązÄą qoruyub Bitwarden-ə kÃļçÃŧrÃŧrsÃŧnÃŧz?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Şifrələnməmiş fayl olaraq saxla", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Bitwarden-ə kÃļçÃŧr", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Daxilə kÃļçÃŧrÃŧlÃŧr...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data uğurla daxilə kÃļçÃŧrÃŧldÃŧ!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Daxilə kÃļçÃŧrmə xətasÄą. Detallar ÃŧçÃŧn konsolu yoxlayÄąn.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Daxilə kÃļçÃŧrmə zamanÄą şəbəkə xətasÄą baş verdi.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Domen ləqəbi" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "\"Ana parolu təkrar soruş\" Ãļzəlliyi olan elementlər səhifə yÃŧklənəndə avto-doldurulmur. \"Səhifə yÃŧklənəndə avto-doldurma\" Ãļzəlliyi sÃļndÃŧrÃŧlÃŧb.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "\"Səhifə yÃŧklənəndə avto-doldurma\" Ãļzəlliyi ilkin ayarÄą istifadə etmək Ãŧzrə ayarlandÄą.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Bu xanaya dÃŧzəliş etmək ÃŧçÃŧn \"Ana parolu təkrar soruş\"u sÃļndÃŧrÃŧn", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Yan naviqasiyanÄą aç/bağla" + }, + "skipToContent": { + "message": "Məzmunu ÃļtÃŧr" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden avto-doldurma menyu dÃŧyməsi", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Bitwarden avto-doldurma menyusunu aç/bağla", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden avto-doldurma menyusu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Uyuşan giriş məlumatlarÄąna baxmaq ÃŧçÃŧn hesabÄąnÄązÄąn kilidini aÃ§Äąn", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Avto-doldurma təkliflərinə baxmaq ÃŧçÃŧn hesabÄąnÄązÄąn kilidini aÃ§Äąn", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "HesabÄąn kilidini aç", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "HesabÄąnÄązÄąn kilidini aÃ§Äąn, yeni bir pəncərədə aÃ§ÄąlÄąr", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Kimlik məlumatlarÄąnÄą doldur", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Qismən istifadəçi adÄą", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "GÃļstəriləcək heç bir element yoxdur", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Yeni element", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Yeni seyf elementi əlavə et", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Yeni giriş", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Yeni seyf giriş elementini əlavə et, yeni bir pəncərədə aÃ§ÄąlÄąr", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Yeni kart", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Yeni seyf kart elementini əlavə et, yeni bir pəncərədə aÃ§ÄąlÄąr", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Yeni kimlik", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Yeni seyf kimlik elementini əlavə et, yeni bir pəncərədə aÃ§ÄąlÄąr", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden avto-doldurma menyusu mÃļvcuddur. Seçmək ÃŧçÃŧn aşağı ox dÃŧyməsinə basÄąn.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "İşə sal" + }, + "ignore": { + "message": "Yox say" + }, + "importData": { + "message": "DatanÄą daxilə kÃļçÃŧr", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Daxilə kÃļçÃŧrmə xətasÄą" + }, + "importErrorDesc": { + "message": "Daxilə kÃļçÃŧrməyə çalÄąÅŸdığınÄąz data ilə bağlÄą bir problem var. LÃŧtfən mənbə faylÄąnÄązda aşağıda sadalanan xətalarÄą həll edib yenidən sÄąnayÄąn." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "AşağıdakÄą xətalarÄą həll edin və yenidən sÄąnayÄąn." + }, + "description": { + "message": "AÃ§Äąqlama" + }, + "importSuccess": { + "message": "Data uğurla daxilə kÃļçÃŧrÃŧldÃŧ" + }, + "importSuccessNumberOfItems": { + "message": "Cəmi $AMOUNT$ element daxilə kÃļçÃŧrÃŧldÃŧ.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Yenidən sÄąna" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Bu əməliyyat ÃŧçÃŧn doğrulama tələb olunur. Davam etmək ÃŧçÃŧn bir PIN təyin edin." + }, + "setPin": { + "message": "PIN təyin et" + }, + "verifyWithBiometrics": { + "message": "Biometriklə doğrula" + }, + "awaitingConfirmation": { + "message": "Təsdiq gÃļzlənilir" + }, + "couldNotCompleteBiometrics": { + "message": "Biometrik tamamlana bilmədi." + }, + "needADifferentMethod": { + "message": "Fərqli bir Ãŧsul lazÄąmdÄąr?" + }, + "useMasterPassword": { + "message": "Ana parolu istifadə et" + }, + "usePin": { + "message": "PIN-i istifadə et" + }, + "useBiometrics": { + "message": "Biometrik istifadə et" + }, + "enterVerificationCodeSentToEmail": { + "message": "E-poçtunuza gÃļndərilmiş doğrulama kodunu daxil edin." + }, + "resendCode": { + "message": "Kodu təkrar gÃļndər" + }, + "total": { + "message": "Cəmi" + }, + "importWarning": { + "message": "DatanÄą $ORGANIZATION$ təşkilatÄąna kÃļçÃŧrÃŧrsÃŧnÃŧz. DatanÄązÄą bu təşkilatÄąn Ãŧzvləri ilə paylaşa bilərsiniz. Davam etmək istəyirsiniz?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Duo xidmətinə bağlanarkən xəta baş verdi. Fərqli iki addÄąmlÄą giriş Ãŧsulu istifadə edin və ya kÃļmək ÃŧçÃŧn Duo ilə əlaqə saxlayÄąn." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Duo-nu başladÄąn və giriş prosesini tamamlamaq ÃŧçÃŧn addÄąmlarÄą izləyin." + }, + "duoRequiredForAccount": { + "message": "HesabÄąnÄąz ÃŧçÃŧn Duo iki addÄąmlÄą giriş tələb olunur." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Girişi tamamlamaq ÃŧçÃŧn uzantÄąnÄą aç." + }, + "popoutExtension": { + "message": "Popout uzantÄąsÄą" + }, + "launchDuo": { + "message": "Duo-nu başlat" + }, + "importFormatError": { + "message": "Data doğru format edilməyib. LÃŧtfən daxilə kÃļçÃŧrmə faylÄąnÄązÄą yoxlayÄąb yenidən sÄąnayÄąn." + }, + "importNothingError": { + "message": "Heç nə daxilə kÃļçÃŧrÃŧlmədi." + }, + "importEncKeyError": { + "message": "Xaricə kÃļçÃŧrÃŧlən faylÄąn şifrəsi aÃ§Äąlarkən xəta baş verdi. Şifrələmə açarÄąnÄąz, datanÄą xaricə kÃļçÃŧrmək ÃŧçÃŧn istifadə edilən şifrələmə açarÄą ilə uyuşmur." + }, + "invalidFilePassword": { + "message": "YararsÄąz fayl parolu, lÃŧtfən xaricə kÃļçÃŧrmə faylÄąnÄą yaradarkən daxil etdiyiniz parolu istifadə edin." + }, + "destination": { + "message": "Hədəf" + }, + "learnAboutImportOptions": { + "message": "Daxilə kÃļçÃŧrmə seçimlərinizi Ãļyrənin" + }, + "selectImportFolder": { + "message": "Bir qovluq seçin" + }, + "selectImportCollection": { + "message": "Bir kolleksiya seçin" + }, + "importTargetHint": { + "message": "Daxilə kÃļçÃŧrÃŧlən fayl məzmununun $DESTINATION$ yerinə daÅŸÄąnmasÄąnÄą istəyirsinizsə bu variantÄą seçin", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Faylda təyin edilməmiş elementlər var." + }, + "selectFormat": { + "message": "Daxilə kÃļçÃŧrmə faylÄąnÄąn formatÄąnÄą seçin" + }, + "selectImportFile": { + "message": "Daxilə kÃļçÃŧrmə faylÄąnÄą seçin" + }, + "chooseFile": { + "message": "Fayl seç" + }, + "noFileChosen": { + "message": "Heç bir fayl seçilməyib" + }, + "orCopyPasteFileContents": { + "message": "və ya daxilə kÃļçÃŧrmə faylÄąnÄąn məzmununu kopyalayÄąn/yapÄąÅŸdÄąrÄąn" + }, + "instructionsFor": { + "message": "$NAME$ TəlimatlarÄą", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Seyfi daxilə kÃļçÃŧrməyi təsdiqlə" + }, + "confirmVaultImportDesc": { + "message": "Bu fayl parolla qorunur. MəlumatlarÄą daxilə kÃļçÃŧrmək ÃŧçÃŧn fayl parolunu daxil edin." + }, + "confirmFilePassword": { + "message": "Fayl parolunu təsdiqlə" + }, + "exportSuccess": { + "message": "Seyf datasÄą xaricə kÃļçÃŧrÃŧldÃŧ" + }, + "typePasskey": { + "message": "Keçid açarÄą" + }, + "accessing": { + "message": "MÃŧraciət edilir" + }, + "passkeyNotCopied": { + "message": "Keçid açarÄą kopyalanmÄąr" + }, + "passkeyNotCopiedAlert": { + "message": "Keçid açarÄą, klonlanmÄąÅŸ elementə kopyalanmayacaq. Bu elementi klonlamağa davam etmək istəyirsiniz?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Başladan saytÄąn tələb etdiyi doğrulama. Bu Ãļzəllik, hələlik ana parolu olmayan hesablara tətbiq olunmur." + }, + "logInWithPasskeyQuestion": { + "message": "Keçid açarÄą ilə giriş edilsin?" + }, + "passkeyAlreadyExists": { + "message": "Bu tətbiq ÃŧçÃŧn bir keçid açarÄą artÄąq mÃļvcuddur." + }, + "noPasskeysFoundForThisApplication": { + "message": "Bu tətbiq ÃŧçÃŧn heç bir keçid açarÄą tapÄąlmadÄą." + }, + "noMatchingPasskeyLogin": { + "message": "Bu sayt ÃŧçÃŧn uyuşan bir giriş məlumatÄąnÄąz yoxdur." + }, + "noMatchingLoginsForSite": { + "message": "Bu sayt ÃŧçÃŧn uyuşan giriş məlumatÄą yoxdur" + }, + "searchSavePasskeyNewLogin": { + "message": "AxtarÄąn və ya keçid açarÄąnÄą yeni bir giriş olaraq saxlayÄąn" + }, + "confirm": { + "message": "Təsdiqlə" + }, + "savePasskey": { + "message": "Keçid açarÄąnÄą saxla" + }, + "savePasskeyNewLogin": { + "message": "Keçid açarÄąnÄą yeni bir giriş olaraq saxla" + }, + "chooseCipherForPasskeySave": { + "message": "Bu keçid açarÄąnÄą saxlayacaq bir giriş seçin" + }, + "chooseCipherForPasskeyAuth": { + "message": "Giriş ediləcək keçid açarÄąnÄą seçin" + }, + "passkeyItem": { + "message": "Keçid açarÄą elementi" + }, + "overwritePasskey": { + "message": "Keçid açarÄąnÄąn Ãŧzərinə yazÄąlsÄąn?" + }, + "overwritePasskeyAlert": { + "message": "Bu elementdə artÄąq bir keçid açarÄą var. HazÄąrkÄą keçid açarÄąnÄąn Ãŧzərinə yazmaq istədiyinizə əminsiniz?" + }, + "featureNotSupported": { + "message": "Özəllik hələ dəstəklənmir" + }, + "yourPasskeyIsLocked": { + "message": "Keçid açarÄąnÄą istifadə etmək ÃŧçÃŧn kimlik doğrulama tələb olunur. Davam etmək ÃŧçÃŧn kimliyinizi doğrulayÄąn." + }, + "multifactorAuthenticationCancelled": { + "message": "Çox faktorlu kimlik doğrulama ləğv edildi" + }, + "noLastPassDataFound": { + "message": "LastPass datasÄą tapÄąlmadÄą" + }, + "incorrectUsernameOrPassword": { + "message": "YanlÄąÅŸ istifadəçi adÄą və ya parol" + }, + "incorrectPassword": { + "message": "YanlÄąÅŸ parol" + }, + "incorrectCode": { + "message": "YanlÄąÅŸ kod" + }, + "incorrectPin": { + "message": "YanlÄąÅŸ PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Çox faktorlu kimlik doğrulama uğursuz oldu" + }, + "includeSharedFolders": { + "message": "PaylaÅŸÄąlan qovluqlarÄą daxil et" + }, + "lastPassEmail": { + "message": "LastPass E-poçtu" + }, + "importingYourAccount": { + "message": "HesabÄąnÄąz daxilə kÃļçÃŧrÃŧlÃŧr..." + }, + "lastPassMFARequired": { + "message": "LastPass çox faktorlu kimlik doğrulama tələb olunur" + }, + "lastPassMFADesc": { + "message": "Kimlik doğrulama tətbiqinizdəki təkistifadəlik kodu daxil edin" + }, + "lastPassOOBDesc": { + "message": "Kimlik doğrulama tətbiqinizdəki giriş tələbini təsdiqləyin və ya təkistifadəlik kodu daxil edin." + }, + "passcode": { + "message": "Kod" + }, + "lastPassMasterPassword": { + "message": "LastPass ana parolu" + }, + "lastPassAuthRequired": { + "message": "LastPass kimlik doğrulama tələb olunur" + }, + "awaitingSSO": { + "message": "SSO kimlik doğrulamasÄą gÃļzlənilir" + }, + "awaitingSSODesc": { + "message": "LÃŧtfən şirkət kimlik məlumatlarÄąnÄązÄą istifadə edərək giriş etməyə davam edin." + }, + "seeDetailedInstructions": { + "message": "KÃļmək saytÄąmÄązda detallÄą təlimatlara baxÄąn", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Birbaşa \"LastPass\"dan daxilə kÃļçÃŧr" + }, + "importFromCSV": { + "message": "CSV-dən daxilə kÃļçÃŧr" + }, + "lastPassTryAgainCheckEmail": { + "message": "Yenidən snayÄąn və ya siz olduğunuzu doğrulamaq ÃŧçÃŧn \"LastPass\"dan gələcək e-poçtu yoxlayÄąn." + }, + "collection": { + "message": "Kolleksiya" + }, + "lastPassYubikeyDesc": { + "message": "LastPass hesabÄąnÄązla əlaqələndirilmiş \"YubiKey\"i kompÃŧterinizin USB yuvasÄąna taxÄąn, daha sonra dÃŧyməsinə basÄąn." + }, + "switchAccount": { + "message": "HesabÄą dəyişdir" + }, + "switchAccounts": { + "message": "HesablarÄą dəyişdir" + }, + "switchToAccount": { + "message": "Hesaba keç" + }, + "activeAccount": { + "message": "Aktiv hesab" + }, + "availableAccounts": { + "message": "MÃļvcud hesablar" + }, + "accountLimitReached": { + "message": "Hesab limiti keçildi. Başqa bir hesab əlavə etmək ÃŧçÃŧn bir hesabdan Ã§ÄąxÄąÅŸ edin." + }, + "active": { + "message": "aktiv" + }, + "locked": { + "message": "kilidli" + }, + "unlocked": { + "message": "kilidi aÃ§ÄąlmÄąÅŸ" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "sahiblik edən" + }, + "useDeviceOrHardwareKey": { + "message": "CihazÄąnÄązÄą və ya avadanlÄąq açarÄąnÄązÄą istifadə edin" + }, + "justOnce": { + "message": "YalnÄąz bir dəfə" + }, + "alwaysForThisSite": { + "message": "Bu sayt ÃŧçÃŧn həmişə" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$, istisna domenlərə əlavə edildi.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Ortaq formatlar", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Brauzer ayarlarÄą ilə davam edilsin?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "KÃļmək Mərkəzi ilə davam edilsin?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Brauzerinizin avto-doldurma və parol idarəsi ayarlarÄąnÄą dəyişdirin.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "UzantÄą qÄąsayollarÄąnÄą brauzerinizin ayarlarÄąnda gÃļrə və ayarlaya bilərsiniz.", + "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": "Brauzerinizin avto-doldurma və parol idarəsi ayarlarÄąnÄą dəyişdirin.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "UzantÄą qÄąsayollarÄąnÄą brauzerinizin ayarlarÄąnda gÃļrə və ayarlaya bilərsiniz.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Bitwarden ilkin parol meneceriniz olaraq təyin edilsin?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Bu seçimin yox sayÄąlmasÄą, \"Bitwarden\"in və brauzerinizin avto-doldurma menyularÄą arasÄąnda ziddiyyətlərə səbəb ola bilər.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "\"Bitwarden\"i ilkin parol meneceriniz olaraq təyin edin", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Bitwarden ilkin parol meneceri olaraq ayarlana bilmir", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Bitwarden-i ilkin parol meneceri olaraq ayarlamaq ÃŧçÃŧn ona brauzer gizlilik icazələrini verməlisiniz.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "İlkin olaraq təyin et", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Kimlik məlumatlarÄą uğurla saxlanÄąldÄą!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Parol saxlanÄąldÄą!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Kimlik məlumatlarÄą uğurla gÃŧncəlləndi!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Parol gÃŧncəlləndi!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Kimlik məlumatlarÄąnÄą saxlama xətasÄą. Detallar ÃŧçÃŧn konsolu yoxlayÄąn.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Uğurlu" + }, + "removePasskey": { + "message": "Parolu sil" + }, + "passkeyRemoved": { + "message": "Parol silindi" + }, + "autofillSuggestions": { + "message": "Avto-doldurma təklifləri" + }, + "autofillSuggestionsTip": { + "message": "Bu saytÄąn avto-doldurmasÄą ÃŧçÃŧn giriş elementini saxlayÄąn" + }, + "yourVaultIsEmpty": { + "message": "Seyfiniz boşdur" + }, + "noItemsMatchSearch": { + "message": "AxtarÄąÅŸÄąnÄązla uyuşan heç bir element yoxdur" + }, + "clearFiltersOrTryAnother": { + "message": "Filtrləri təmizləyin və ya başqa bir axtarÄąÅŸ terminini sÄąnayÄąn" + }, + "copyInfoTitle": { + "message": "MəlumatlarÄą kopyala - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Notu kopyala - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Daha çox seçim, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Daha çox seçim - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "$ITEMNAME$ elementinə bax", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Avto-doldur - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Kopyalanacaq dəyər yoxdur" + }, + "assignToCollections": { + "message": "Kolleksiyalara təyin et" + }, + "copyEmail": { + "message": "E-poçtu kopyala" + }, + "copyPhone": { + "message": "Telefonu kopyala" + }, + "copyAddress": { + "message": "ÜnvanÄą kopyala" + }, + "adminConsole": { + "message": "Admin Konsolu" + }, + "accountSecurity": { + "message": "Hesab gÃŧvənliyi" + }, + "notifications": { + "message": "Bildirişlər" + }, + "appearance": { + "message": "GÃļrÃŧnÃŧş" + }, + "errorAssigningTargetCollection": { + "message": "Hədəf kolleksiyaya təyin etmə xətasÄą." + }, + "errorAssigningTargetFolder": { + "message": "Hədəf qovluğa təyin etmə xətasÄą." + }, + "viewItemsIn": { + "message": "$NAME$ daxilindəki elementlərə bax", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Geri qayÄąt: $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Yeni" + }, + "removeItem": { + "message": "Sil: $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Qovluğu olmayan elementlər" + }, + "itemDetails": { + "message": "Element detallarÄą" + }, + "itemName": { + "message": "Element adÄą" + }, + "cannotRemoveViewOnlyCollections": { + "message": "\"YalnÄąz baxma\" icazələrinə sahib kolleksiyalarÄą silə bilməzsiniz: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Təşkilat deaktiv edildi" + }, + "owner": { + "message": "Sahiblik" + }, + "selfOwnershipLabel": { + "message": "Siz", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Deaktiv edilmiş təşkilatlardakÄą elementlərə mÃŧraciət edilə bilməz. KÃļmək ÃŧçÃŧn təşkilatÄąnÄązÄąn sahibi ilə əlaqə saxlayÄąn." + }, + "additionalInformation": { + "message": "Əlavə məlumat" + }, + "itemHistory": { + "message": "Element tarixçəsi" + }, + "lastEdited": { + "message": "Son dÃŧzəliş" + }, + "ownerYou": { + "message": "Sahiblik: Siz" + }, + "linked": { + "message": "Əlaqələndirildi" + }, + "copySuccessful": { + "message": "Uğurla kopyalandÄą" + }, + "upload": { + "message": "YÃŧklə" + }, + "addAttachment": { + "message": "Qoşma əlavə et" + }, + "maxFileSizeSansPunctuation": { + "message": "Maksimal fayl həcmi 500 MB-dÄąr" + }, + "deleteAttachmentName": { + "message": "$NAME$ qoşmasÄąnÄą sil", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "$NAME$ endir", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Bu qoşmanÄą birdəfəlik silmək istədiyinizə əminsiniz?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Ödənişsiz təşkilatlar qoşmalarÄą istifadə edə bilməz" + }, + "filters": { + "message": "Filtrlər" + }, + "personalDetails": { + "message": "Şəxsi detallar" + }, + "identification": { + "message": "İdentifikasiya" + }, + "contactInfo": { + "message": "Əlaqə məlumatÄą" + }, + "downloadAttachment": { + "message": "$ITEMNAME$ - endir", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "kart nÃļmrəsinin sonu", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Giriş məlumatlarÄą" + }, + "authenticatorKey": { + "message": "Kimlik doğrulayÄącÄą açarÄą" + }, + "autofillOptions": { + "message": "Avto-doldurma seçimləri" + }, + "websiteUri": { + "message": "Veb sayt (URI)" + }, + "websiteUriCount": { + "message": "Veb sayt (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Veb sayt əlavə edildi" + }, + "addWebsite": { + "message": "Veb sayt əlavə et" + }, + "deleteWebsite": { + "message": "Veb saytÄą sil" + }, + "defaultLabel": { + "message": "İlkin ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "$WEBSITE$ ilə uyuşma aşkarlamasÄąnÄą gÃļstər", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "$WEBSITE$ ilə uyuşma aşkarlamasÄąnÄą gizlət", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Səhifə yÃŧklənəndə avto-doldurulsun?" + }, + "cardExpiredTitle": { + "message": "VaxtÄą bitmiş kart" + }, + "cardExpiredMessage": { + "message": "Yeniləmisinizsə, kart məlumatlarÄąnÄązÄą gÃŧncəlləyin" + }, + "cardDetails": { + "message": "Kart detallarÄą" + }, + "cardBrandDetails": { + "message": "$BRAND$ detallarÄą", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "AnimasiyalarÄą fəallaşdÄąr" + }, + "showAnimations": { + "message": "AnimasiyalarÄą gÃļstər" + }, + "addAccount": { + "message": "Hesab əlavə et" + }, + "loading": { + "message": "YÃŧklənir" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Keçid açarÄą", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Parollar", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Keçid açarÄą ilə giriş et", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Təyin et" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "YalnÄąz bu kolleksiyalara mÃŧraciəti olan təşkilat Ãŧzvləri bu elementi gÃļrə biləcək." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "YalnÄąz bu kolleksiyalara mÃŧraciəti olan təşkilat Ãŧzvləri bu elementləri gÃļrə biləcək." + }, + "bulkCollectionAssignmentWarning": { + "message": "$TOTAL_COUNT$ element seçmisiniz. DÃŧzəliş icazəniz olmadığı ÃŧçÃŧn $READONLY_COUNT$ elementi gÃŧncəlləyə bilməzsiniz.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Xana əlavə et" + }, + "add": { + "message": "Əlavə et" + }, + "fieldType": { + "message": "Xana nÃļvÃŧ" + }, + "fieldLabel": { + "message": "Xana etiketi" + }, + "textHelpText": { + "message": "TəhlÃŧkəsizlik suallarÄą kimi datalar ÃŧçÃŧn mətn xanalarÄąnÄą istifadə edin" + }, + "hiddenHelpText": { + "message": "Parol kimi həssas datalar ÃŧçÃŧn gizli xanalarÄą istifadə edin" + }, + "checkBoxHelpText": { + "message": "\"E-poçtu xatÄąrla\" kimi formun təsdiq qutusunu avto-doldurmaq istəyirsinizsə təsdiq qutularÄąnÄą istifadə edin" + }, + "linkedHelpText": { + "message": "MÃŧəyyən bir veb sayt ÃŧçÃŧn avto-doldurma problemləri ilə Ãŧzləşdikdə əlaqələndirilmiş xana istifadə edin." + }, + "linkedLabelHelpText": { + "message": "Xana ÃŧçÃŧn bunlarÄą daxil edin: kimlik, ad, aria-label və ya placeholder." + }, + "editField": { + "message": "Xanaya dÃŧzəliş et" + }, + "editFieldLabel": { + "message": "$LABEL$ - dÃŧzəliş et", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "$LABEL$ - sil", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ əlavə edildi", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "$LABEL$ - yenidən sÄąrala. Ox dÃŧyməsi ilə elementi yuxarÄą və ya aşağı daÅŸÄąyÄąn.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ yuxarÄą daÅŸÄąndÄą, mÃļvqeyi $INDEX$/$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Təyin ediləcək kolleksiyalarÄą seçin" + }, + "personalItemTransferWarningSingular": { + "message": "1 element seçilmiş təşkilata birdəfəlik transfer ediləcək. ArtÄąq bu elementlərə sahib olmaya bilməyəcəksiniz." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ element seçilmiş təşkilata birdəfəlik transfer ediləcək. ArtÄąq bu elementlərə sahib olmaya bilməyəcəksiniz.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 element $ORG$ təşkilatÄąna birdəfəlik transfer ediləcək. ArtÄąq bu elementə sahib olmaya bilməyəcəksiniz.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ element $ORG$ təşkilatÄąna birdəfəlik transfer ediləcək. ArtÄąq bu elementlərə sahib olmaya bilməyəcəksiniz.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Uğurla təyin edilən kolleksiyalar" + }, + "nothingSelected": { + "message": "Heç nə seçməmisiniz." + }, + "movedItemsToOrg": { + "message": "Seçilən elementlər $ORGNAME$ təşkilatÄąna daÅŸÄąnÄąldÄą", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Elementlər bura daÅŸÄąndÄą: $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Element bura daÅŸÄąndÄą: $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ aşağı daÅŸÄąndÄą, mÃļvqeyi $INDEX$/$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Element yeri" + }, + "fileSend": { + "message": "Fayl \"Send\"i" + }, + "fileSends": { + "message": "Fayl \"Send\"ləri" + }, + "textSend": { + "message": "Mətn \"Send\"i" + }, + "textSends": { + "message": "Mətn \"Send\"ləri" + }, + "bitwardenNewLook": { + "message": "Bitwarden-in yeni bir gÃļrÃŧnÃŧşÃŧ var!" + }, + "bitwardenNewLookDesc": { + "message": "Seyf vərəqindən avto-doldurma və axtarÄąÅŸ etmə artÄąq daha asan və intuitivdir. Nəzər salÄąn!" + }, + "accountActions": { + "message": "Hesab fəaliyyətləri" + }, + "showNumberOfAutofillSuggestions": { + "message": "UzantÄą ikonunda giriş ÃŧçÃŧn avto-doldurma təklif sayÄąnÄą gÃļstər" + }, + "systemDefault": { + "message": "İlkin sistem" + }, + "enterprisePolicyRequirementsApplied": { + "message": "MÃŧəssisə siyasət tələbləri bu ayara tətbiq edildi" + }, + "sshPrivateKey": { + "message": "Private açar" + }, + "sshPublicKey": { + "message": "Public açar" + }, + "sshFingerprint": { + "message": "Barmaq izi" + }, + "sshKeyAlgorithm": { + "message": "Açar nÃļvÃŧ" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Yenidən sÄąna" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum Ãļzəl bitmə vaxtÄą 1 dəqiqədir." + }, + "additionalContentAvailable": { + "message": "Əlavə məzmun əlçatandÄąr" + }, + "fileSavedToDevice": { + "message": "Fayl cihazda saxlanÄąldÄą. Endirilənləri cihazÄąnÄązdan idarə edin." + }, + "showCharacterCount": { + "message": "Xarakter sayÄąnÄą gÃļstər" + }, + "hideCharacterCount": { + "message": "Xarakter sayÄąnÄą gizlət" + }, + "itemsInTrash": { + "message": "TullantÄądakÄą elementlər" + }, + "noItemsInTrash": { + "message": "TullantÄąda element yoxdur" + }, + "noItemsInTrashDesc": { + "message": "Sildiyiniz elementlər burada gÃļrÃŧnəcək və 30 gÃŧn sonra birdəfəlik silinəcək" + }, + "trashWarning": { + "message": "TullantÄąda 30 gÃŧndən çox qalan elementlər avtomatik silinəcək" + }, + "restore": { + "message": "Bərpa et" + }, + "deleteForever": { + "message": "Həmişəlik sil" + }, + "noEditPermissions": { + "message": "Bu elementə dÃŧzəliş etmə icazəniz yoxdur" + }, + "authenticating": { + "message": "Kimlik doğrulama" + }, + "fillGeneratedPassword": { + "message": "YaradÄąlmÄąÅŸ parolu doldur", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Parol yenidən yaradÄąldÄą", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Giriş Bitwarden-də saxlanÄąlsÄąn?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Boşluq", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Tərs dÄąrnaq", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Nida işarəsi", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At işarəsi", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Diyez işarəsi", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar işarəsi", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Faiz işarəsi", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Və işarəsi", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Ulduz", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Sol mÃļtərizə", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Sağ mÃļtərizə", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Altdan xətt", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Tire", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Üstəgəl", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Bərabərdir", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Sol bəzəkli mÃļtərizə", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Sağ bəzəkli mÃļtərizə", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Sol kvadrat mÃļtərizə", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Sağ kvadrat mÃļtərizə", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Şaquli xətt", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Tərs sləş", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "CÃŧt nÃļqtə", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "NÃļqtəli vergÃŧl", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "CÃŧt dÄąrnaq", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Tək dÄąrnaq", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Kiçikdir", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "BÃļyÃŧkdÃŧr", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "VergÃŧl", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "NÃļqtə", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Sual işarəsi", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "DÃŧz sləş", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Kiçik hərf" + }, + "uppercaseAriaLabel": { + "message": "BÃļyÃŧk hərf" + }, + "generatedPassword": { + "message": "Parol yarat" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 2fc14ecb1fc..cb84cfa5014 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden – ĐąŅŅĐŋĐģĐ°Ņ‚ĐŊŅ‹ ĐŧĐĩĐŊĐĩĐ´ĐļĐ°Ņ€ ĐŋĐ°Ņ€ĐžĐģŅŅž", + "message": "МĐĩĐŊĐĩĐ´ĐļĐ°Ņ€ ĐŋĐ°Ņ€ĐžĐģŅŅž Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Đ‘ŅŅĐŋĐĩ҇ĐŊŅ‹ Ņ– ĐąŅŅĐŋĐģĐ°Ņ‚ĐŊŅ‹ ĐŧĐĩĐŊĐĩĐ´ĐļĐ°Ņ€ ĐŋĐ°Ņ€ĐžĐģŅŅž Đ´ĐģŅ ŅžŅŅ–Ņ… Đ˛Đ°ŅˆŅ‹Ņ… ĐŋҀҋĐģад.", - "description": "Extension description" + "message": "ДоĐŧа, ĐŊа ĐŋŅ€Đ°Ņ†Ņ‹ ҆Җ Ņž Đ´Đ°Ņ€ĐžĐˇĐĩ Bitwarden ĐģŅ‘ĐŗĐēа Đ°ĐąĐ°Ņ€Đ°ĐŊŅĐĩ ŅžŅĐĩ Đ˛Đ°ŅˆŅ‹ ĐŋĐ°Ņ€ĐžĐģŅ–, ĐēĐģŅŽŅ‡Ņ‹ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Ņ– ĐēаĐŊŅ„Ņ–Đ´ŅĐŊŅ†Ņ‹ŅĐģҌĐŊŅƒŅŽ Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹ŅŽ", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ĐŖĐ˛Đ°ĐšĐ´ĐˇŅ–Ņ†Đĩ айО ŅŅ‚Đ˛Đ°Ņ€Ņ‹Ņ†Đĩ ĐŊĐžĐ˛Ņ‹ ŅžĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ да ĐąŅŅĐŋĐĩ҇ĐŊĐ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°." }, + "inviteAccepted": { + "message": "ЗаĐŋŅ€Đ°ŅˆŅĐŊĐŊĐĩ ĐŋҀҋĐŊŅŅ‚Đ°" + }, "createAccount": { "message": "ĐĄŅ‚Đ˛Đ°Ņ€Ņ‹Ņ†ŅŒ ҃ĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ" }, - "login": { - "message": "ĐŖĐ˛Đ°ĐšŅŅ†Ņ–" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "ĐŸŅ€Ņ‹ĐˇĐŊĐ°Ņ‡Ņ‹Ņ†ŅŒ ĐŊадСĐĩĐšĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "ĐĐ´ĐˇŅ–ĐŊŅ‹ ŅžĐ˛Đ°Ņ…ĐžĐ´ ĐŋŅ€Đ°Đ´ĐŋҀҋĐĩĐŧŅŅ‚Đ˛Đ° (SSO)" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ПадĐēаСĐēа да Đ°ŅĐŊĐžŅžĐŊĐ°ĐŗĐ° ĐŋĐ°Ņ€ĐžĐģŅ ĐŧĐžĐļа даĐŋаĐŧĐ°ĐŗŅ‡Ņ‹ ваĐŧ ҃ҁĐŋĐžĐŧĐŊŅ–Ņ†ŅŒ ŅĐŗĐž, ĐēаĐģŅ– Đ˛Ņ‹ ŅĐŗĐž ĐˇĐ°ĐąŅ‹ĐģŅ–." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "ĐŖĐ˛ŅĐ´ĐˇŅ–Ņ†Đĩ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ ĐŋĐ°ŅžŅ‚ĐžŅ€ĐŊа" }, "masterPassHint": { "message": "ПадĐēаСĐēа да Đ°ŅĐŊĐžŅžĐŊĐ°ĐŗĐ° ĐŋĐ°Ņ€ĐžĐģŅ (ĐŊĐĩĐ°ĐąĐ°Đ˛ŅĐˇĐēОва)" }, + "joinOrganization": { + "message": "ДаĐģŅƒŅ‡Ņ‹Ņ†Ņ†Đ° да Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ–" + }, + "joinOrganizationName": { + "message": "ДаĐģŅƒŅ‡Ņ‹Ņ†Ņ†Đ° да $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "ĐŖĐēĐģадĐēа" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐŊĐ°Ņ‚Đ°Ņ‚Đē҃" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐēОд ĐąŅŅĐŋĐĩĐēŅ–" }, + "copyName": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ Ņ–ĐŧŅ" + }, + "copyCompany": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐēаĐŧĐŋаĐŊŅ–ŅŽ" + }, + "copySSN": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐŊ҃ĐŧĐ°Ņ€ ŅĐ°Ņ†Ņ‹ŅĐģҌĐŊĐ°ĐŗĐ° ŅŅ‚Ņ€Đ°Ņ…Đ°Đ˛Đ°ĐŊĐŊŅ" + }, + "copyPassportNumber": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐŊ҃ĐŧĐ°Ņ€ ĐŋĐ°ŅˆĐŋĐ°Ņ€Ņ‚Đ°" + }, + "copyLicenseNumber": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐŊ҃ĐŧĐ°Ņ€ ĐģŅ–Ņ†ŅĐŊĐˇŅ–Ņ–" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ŅĐ°ĐšŅ‚" + }, + "copyNotes": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐŊĐ°Ņ‚Đ°Ņ‚ĐēŅ–" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ" }, + "autoFillLogin": { + "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ ĐģĐ°ĐŗŅ–ĐŊа" + }, + "autoFillCard": { + "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ ĐēĐ°Ņ€Ņ‚ĐēŅ–" + }, + "autoFillIdentity": { + "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ Đ°ŅĐ°ĐąŅ–ŅŅ‚Ņ‹Ņ… даĐŊҋ҅" + }, "generatePasswordCopied": { "message": "ГĐĩĐŊĐĩŅ€Ņ‹Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ (С ĐēаĐŋŅ–ŅĐ˛Đ°ĐŊĐŊĐĩĐŧ)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "ĐŅĐŧа адĐŋавĐĩĐ´ĐŊҋ҅ ĐģĐ°ĐŗŅ–ĐŊĐ°Ņž." }, + "noCards": { + "message": "ĐŅĐŧа ĐēĐ°Ņ€Ņ‚Đ°Đē" + }, + "noIdentities": { + "message": "ĐŅĐŧа ĐŋŅ€Ņ‹Đ˛Đ°Ņ‚ĐŊҋ҅ даĐŊҋ҅" + }, + "addLoginMenu": { + "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐģĐ°ĐŗŅ–ĐŊ" + }, + "addCardMenu": { + "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐēĐ°Ņ€Ņ‚Đē҃" + }, + "addIdentityMenu": { + "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐŋĐ°ŅĐ˛ĐĩĐ´Ņ‡Đ°ĐŊĐŊĐĩ" + }, "unlockVaultMenu": { "message": "РаСйĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ŅĐģĐĩĐŧĐĩĐŊŅ‚" }, + "accountEmail": { + "message": "Email ҃ĐģŅ–ĐēĐžĐ˛Đ°ĐŗĐ° СаĐŋŅ–ŅŅƒ" + }, + "requestHint": { + "message": "ЗаĐŋŅ‹Ņ‚Đ°Ņ†ŅŒ ĐŋадĐēаСĐēŅ–" + }, + "requestPasswordHint": { + "message": "ЗаĐŋŅ‹Ņ‚Đ°Ņ†ŅŒ ĐŋадĐēаСĐē҃ да Đ°ŅĐŊĐžŅžĐŊĐ°ĐŗĐ° ĐŋĐ°Ņ€ĐžĐģŅ" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ПадĐēаСĐēа да ĐŋĐ°Ņ€ĐžĐģŅ" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "ĐŸĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐˇŅ–Ņ†Đĩ ŅĐ˛Đ°ŅŽ Đ°ŅĐžĐąŅƒ Đ´ĐģŅ ĐŋŅ€Đ°Ņ†ŅĐŗŅƒ." }, - "account": { - "message": "ĐŖĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ" - }, "changeMasterPassword": { "message": "ЗĐŧŅĐŊŅ–Ņ†ŅŒ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ" }, + "continueToWebApp": { + "message": "ĐŸŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ ҃ Đ˛ŅĐą-ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧĐĩ?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "ĐŸŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ ĐŋŅ€Đ°Ņ†Ņƒ Ņž ДавĐĩĐ´Đ°Ņ‡ĐŊŅ‹Đŧ Ņ†ŅĐŊ҂Ҁҋ?" + }, + "continueToHelpCenterDesc": { + "message": "ДавĐĩĐ´Đ°ĐšŅ†ĐĩŅŅ йОĐģҌ҈ ай ҂ҋĐŧ, ŅĐē Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ Bitwarden, ҃ ДавĐĩĐ´Đ°Ņ‡ĐŊŅ‹Đŧ Ņ†ŅĐŊ҂Ҁҋ." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Đ¤Ņ€Đ°ĐˇĐ° Đ°Đ´ĐąŅ–Ņ‚Đēа ĐŋаĐģŅŒŅ†Đ°", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Đ’Ņ‹ĐšŅŅ†Ņ–" }, + "aboutBitwarden": { + "message": "ĐŸŅ€Đ° Bitwarden" + }, "about": { "message": "ĐŸŅ€Đ° Bitwarden" }, + "moreFromBitwarden": { + "message": "БоĐģҌ҈ ад Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "ĐŸŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ ĐŊа bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden Đ´ĐģŅ ĐąŅ–ĐˇĐŊĐĩҁ҃" + }, + "bitwardenAuthenticator": { + "message": "ĐŅžŅ‚ŅĐŊ҂ҋ҄ҖĐēĐ°Ņ‚Đ°Ņ€ Bitwarden" + }, + "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" + }, + "bitwardenSecretsManager": { + "message": "МĐĩĐŊĐĩĐ´ĐļĐ°Ņ€ ŅĐ°ĐēŅ€ŅŅ‚Đ°Ņž Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Đ‘ŅŅĐŋĐģĐ°Ņ‚ĐŊŅ‹ Ņ‚Đ°Ņ€Ņ‹Ņ„ĐŊŅ‹ ĐŋĐģаĐŊ Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "ВĐĩŅ€ŅŅ–Ņ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Đ ŅĐ´Đ°ĐŗĐ°Đ˛Đ°Ņ†ŅŒ ĐŋаĐŋĐē҃" }, + "newFolder": { + "message": "ĐĐžĐ˛Đ°Ņ ĐŋаĐŋĐēа" + }, + "folderName": { + "message": "Назва ĐŋаĐŋĐēŅ–" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "ĐŅĐŧа дададСĐĩĐŊҋ҅ ĐŋаĐŋаĐē" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Đ’Ņ‹ ŅžĐŋŅŅžĐŊĐĩĐŊŅ‹Ņ, ŅˆŅ‚Đž ĐļадаĐĩ҆Đĩ ĐŊĐ°ĐˇĐ°ŅžŅŅ‘Đ´Ņ‹ Đ˛Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ ĐŗŅŅ‚Ņƒ ĐŋаĐŋĐē҃?" + }, "deleteFolder": { "message": "Đ’Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ ĐŋаĐŋĐē҃" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚Đ°Ņ€", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ĐŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊа ĐŗĐĩĐŊĐĩŅ€Ņ‹Ņ€ŅƒĐšŅ†Đĩ ĐŊадСĐĩĐšĐŊŅ‹Ņ Ņ– ŅžĐŊŅ–ĐēаĐģҌĐŊŅ‹Ņ ĐŋĐ°Ņ€ĐžĐģŅ– Đ´ĐģŅ Đ˛Đ°ŅˆŅ‹Ņ… ĐģĐ°ĐŗŅ–ĐŊĐ°Ņž." }, - "bitWebVault": { - "message": "Đ’ŅĐą-ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Bitwarden" + "bitWebVaultApp": { + "message": "Đ’ŅĐą-ĐŋŅ€Đ°ĐŗŅ€Đ°Đŧа Bitwarden" }, "importItems": { "message": "ІĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Ņž" @@ -235,6 +435,9 @@ "generatePassword": { "message": "ГĐĩĐŊĐĩŅ€Ņ‹Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "ĐŸĐ°ŅžŅ‚ĐžŅ€ĐŊа ĐŗĐĩĐŊĐĩŅ€Ņ‹Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ" }, @@ -244,17 +447,60 @@ "length": { "message": "Đ”Đ°ŅžĐļŅ‹ĐŊŅ" }, + "passwordMinLength": { + "message": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊĐ°Ņ Đ´Đ°ŅžĐļŅ‹ĐŊŅ ĐŋĐ°Ņ€ĐžĐģŅ" + }, "uppercase": { - "message": "Đ’ŅĐģŅ–ĐēŅ–Ņ ĐģŅ–Ņ‚Đ°Ņ€Ņ‹ (A-Z)" + "message": "Đ’ŅĐģŅ–ĐēŅ–Ņ ĐģŅ–Ņ‚Đ°Ņ€Ņ‹ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "МаĐģĐĩĐŊҌĐēŅ–Ņ ĐģŅ–Ņ‚Đ°Ņ€Ņ‹ (a-z)" + "message": "МаĐģĐĩĐŊҌĐēŅ–Ņ ĐģŅ–Ņ‚Đ°Ņ€Ņ‹ (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Đ›Ņ–Ņ‡ĐąŅ‹ (0-9)" + "message": "Đ›Ņ–Ņ‡ĐąŅ‹ (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ĐĄĐŋĐĩŅ†Ņ‹ŅĐģҌĐŊŅ‹Ņ ҁҖĐŧваĐģŅ‹ (!@#$%^&*)" + "message": "ĐĄĐŋĐĩŅ†Ņ‹ŅĐģҌĐŊŅ‹Ņ ҁҖĐŧваĐģŅ‹ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†Đĩ Đ˛ŅĐģŅ–ĐēŅ–Ņ ĐģŅ–Ņ‚Đ°Ņ€Ņ‹", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "ĐŖĐēĐģŅŽŅ‡Đ°ĐšŅ†Đĩ ĐŧаĐģŅ‹Ņ ĐģŅ–Ņ‚Đ°Ņ€Ņ‹", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "ĐŖĐēĐģŅŽŅ‡Đ°Ņ†ŅŒ ĐģŅ–Ņ‡ĐąŅ‹", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†Đĩ ҁĐŋĐĩŅ†Ņ‹ŅĐģҌĐŊŅ‹Ņ ҁҖĐŧваĐģŅ‹", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "КоĐģҌĐēĐ°ŅŅ†ŅŒ ҁĐģĐžŅž" @@ -276,7 +522,16 @@ "message": "ĐœŅ–ĐŊŅ–Đŧ҃Đŧ ҁĐŋĐĩŅ†Ņ‹ŅĐģҌĐŊҋ҅ ҁҖĐŧваĐģĐ°Ņž" }, "avoidAmbChar": { - "message": "ĐŸĐ°ĐˇĐąŅĐŗĐ°Ņ†ŅŒ ĐŊĐĩадĐŊаСĐŊĐ°Ņ‡ĐŊҋ҅ ҁҖĐŧваĐģĐ°Ņž" + "message": "ĐŸĐ°ĐˇĐąŅĐŗĐ°Ņ†ŅŒ ĐŊĐĩадĐŊаСĐŊĐ°Ņ‡ĐŊҋ҅ ҁҖĐŧваĐģĐ°Ņž", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "ĐŸĐ°ĐˇĐąŅĐŗĐ°Ņ†ŅŒ ĐŊĐĩадĐŊаСĐŊĐ°Ņ‡ĐŊҋ҅ ҁҖĐŧваĐģĐ°Ņž", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ĐŸĐžŅˆŅƒĐē ҃ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Ņ‹" @@ -299,15 +554,30 @@ "password": { "message": "ĐŸĐ°Ņ€ĐžĐģҌ" }, + "totp": { + "message": "ХаĐēŅ€ŅŅ‚ Đ°ŅžŅ‚ŅĐŊ҂ҋ҄ҖĐēĐ°Ņ†Ņ‹Ņ–" + }, "passphrase": { "message": "ĐŸĐ°Ņ€ĐžĐģҌĐŊĐ°Ņ Ņ„Ņ€Đ°ĐˇĐ°" }, "favorite": { "message": "ĐĐąŅ€Đ°ĐŊŅ‹" }, + "unfavorite": { + "message": "Đ’Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ С Đ°ĐąŅ€Đ°ĐŊĐ°ĐŗĐ°" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "ĐĐ°Ņ‚Đ°Ņ‚ĐēŅ–" }, + "privateNote": { + "message": "ĐŸŅ€Ņ‹Đ˛Đ°Ņ‚ĐŊĐ°Ņ ĐŊĐ°Ņ‚Đ°Ņ‚Đēа" + }, "note": { "message": "ĐĐ°Ņ‚Đ°Ņ‚Đēа" }, @@ -326,6 +596,18 @@ "launch": { "message": "ЗаĐŋŅƒŅŅ†Ņ–Ņ†ŅŒ" }, + "launchWebsite": { + "message": "АдĐēŅ€Ņ‹Ņ†ŅŒ ŅĐ°ĐšŅ‚" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Đ’ŅĐą-ŅĐ°ĐšŅ‚" }, @@ -338,8 +620,23 @@ "other": { "message": "IĐŊŅˆĐ°Đĩ" }, + "unlockMethods": { + "message": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ĐąĐģаĐēŅ–Ņ€ĐžŅžĐēŅ–" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "НаĐģĐ°Đ´ĐˇŅ–Ņ†ŅŒ ĐŧĐĩŅ‚Đ°Đ´ Ņ€Đ°ĐˇĐąĐģаĐēŅ–Ņ€ĐžŅžĐēŅ– Đ´ĐģŅ СĐŧŅĐŊĐĩĐŊĐŊŅ дСĐĩŅĐŊĐŊŅ Ņ‡Đ°ŅŅƒ Ņ‡Đ°ĐēаĐŊĐŊŅ Đ˛Đ°ŅˆĐ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Đ§Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ ҁĐĩаĐŊŅĐ°" + }, + "vaultTimeoutHeader": { + "message": "Đ§Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°" + }, + "otherOptions": { + "message": "ІĐŊŅˆŅ‹Ņ ĐŊаĐģĐ°Đ´Ņ‹" }, "rateExtension": { "message": "ĐŅ†Đ°ĐŊŅ–Ņ†ŅŒ ĐŋĐ°ŅˆŅ‹Ņ€ŅĐŊĐŊĐĩ" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Đ’Đ°ŅˆĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° СайĐģаĐēŅ–Ņ€Đ°Đ˛Đ°ĐŊа. Каб ĐŋŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ, ĐŋĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐˇŅ–Ņ†Đĩ ŅĐ˛Đ°ŅŽ Đ°ŅĐžĐąŅƒ." }, + "yourVaultIsLockedV2": { + "message": "Đ’Đ°ŅˆĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° СайĐģаĐēŅ–Ņ€Đ°Đ˛Đ°ĐŊа" + }, + "yourAccountIsLocked": { + "message": "Đ’Đ°Ņˆ ҃ĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ СайĐģаĐēŅ–Ņ€Đ°Đ˛Đ°ĐŊŅ‹" + }, + "or": { + "message": "айО" + }, "unlock": { "message": "РаСйĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Đ§Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°" }, + "vaultTimeout1": { + "message": "Đ§Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ" + }, "lockNow": { "message": "ЗабĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ĐˇĐ°Ņ€Đ°Đˇ" }, + "lockAll": { + "message": "ЗабĐģаĐēĐ°Đ˛Đ°Ņ†ŅŒ ҃ҁĐĩ" + }, "immediately": { "message": "ĐĐ´Ņ€Đ°ĐˇŅƒ" }, @@ -426,6 +738,18 @@ "security": { "message": "Đ‘ŅŅĐŋĐĩĐēа" }, + "confirmMasterPassword": { + "message": "ĐŸĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐˇŅ–Ņ†ŅŒ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "masterPassword": { + "message": "ĐŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "masterPassImportant": { + "message": "Đ’Đ°Ņˆ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩĐŧĐ°ĐŗŅ‡Ņ‹Đŧа ĐąŅƒĐ´ĐˇĐĩ адĐŊĐ°Đ˛Ņ–Ņ†ŅŒ, ĐēаĐģŅ– Đ˛Ņ‹ ŅĐŗĐž ĐˇĐ°ĐąŅƒĐ´ĐˇĐĩ҆Đĩ!" + }, + "masterPassHintLabel": { + "message": "ПадĐēаСĐēа да Đ°ŅĐŊĐžŅžĐŊĐ°ĐŗĐ° ĐŋĐ°Ņ€ĐžĐģŅ" + }, "errorOccurred": { "message": "ĐĐ´ĐąŅ‹ĐģĐ°ŅŅ ĐŋаĐŧŅ‹ĐģĐēа" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Đ’Đ°Ņˆ ҃ĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ ŅŅ‚Đ˛ĐžŅ€Đ°ĐŊŅ‹! ĐĻŅĐŋĐĩŅ€ Đ˛Ņ‹ ĐŧĐžĐļĐ°Ņ†Đĩ ŅžĐ˛Đ°ĐšŅŅ†Ņ– Ņž ŅĐŗĐž." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "Đ’Ņ‹ ŅžĐ˛Đ°ĐšŅˆĐģŅ– ва ŅžĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ!" + }, + "youSuccessfullyLoggedIn": { + "message": "Đ’Ņ‹ ĐŋĐ°ŅĐŋŅŅ…ĐžĐ˛Đ° Đ°ŅžŅ‚Đ°Ņ€Ņ‹ĐˇĐ°Đ˛Đ°ĐŊŅ‹" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "ĐœŅ‹ адĐŋŅ€Đ°Đ˛Ņ–ĐģŅ– ваĐŧ ĐŊа ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊŅƒŅŽ ĐŋĐžŅˆŅ‚Ņƒ ĐŋадĐēаСĐē҃ да Đ°ŅĐŊĐžŅžĐŊĐ°ĐŗĐ° ĐŋĐ°Ņ€ĐžĐģŅ." }, "verificationCodeRequired": { "message": "ĐŸĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩŅ†Ņ†Đ° ĐŋŅ€Đ°Đ˛ĐĩŅ€Đ°Ņ‡ĐŊŅ‹ ĐēОд." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "ПаĐŧŅ‹ĐģĐēĐžĐ˛Ņ‹ ĐŋŅ€Đ°Đ˛ĐĩŅ€Đ°Ņ‡ĐŊŅ‹ ĐēОд" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "НĐĩĐŧĐ°ĐŗŅ‡Ņ‹Đŧа Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐžŅžĐŊŅ–Ņ†ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊŅ‹ ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа ĐŗŅŅ‚Đ°Đš ŅŅ‚Đ°Ņ€ĐžĐŊ҆ҋ. ĐĄĐēаĐŋŅ–ŅŽĐšŅ†Đĩ Ņ– ŅžŅŅ‚Đ°ŅžŅ†Đĩ Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹ŅŽ ŅžŅ€ŅƒŅ‡ĐŊŅƒŅŽ." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "КĐģŅŽŅ‡ Đ°ŅžŅ‚ŅĐŊ҂ҋ҄ҖĐēĐ°Ņ†Ņ‹Ņ– дададСĐĩĐŊŅ‹" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐēĐģŅŽŅ‡ Đ°ŅžŅ‚ŅĐŊ҂ҋ҄ҖĐēĐ°Ņ†Ņ‹Ņ– (TOTP)" + }, "loggedOut": { "message": "Đ’Ņ‹ Đ˛Ņ‹ĐšŅˆĐģŅ–" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "ĐĸŅŅ€ĐŧŅ–ĐŊ дСĐĩŅĐŊĐŊŅ Đ˛Đ°ŅˆĐ°ĐŗĐ° ҁĐĩаĐŊҁ҃ ĐˇĐ°Đ˛ŅŅ€ŅˆŅ‹ŅžŅŅ." }, + "logIn": { + "message": "ĐŖĐ˛Đ°ĐšŅŅ†Ņ–" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "ĐŸŅ€Đ°Ņ‚ŅŅ€ĐŧŅ–ĐŊаваĐŊĐ°Ņ ҁĐŋĐ°ŅŅ‹ĐģĐēа" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Đ’Ņ‹ ŅžĐŋŅŅžĐŊĐĩĐŊŅ‹, ŅˆŅ‚Đž Ņ…ĐžŅ‡Đ°Ņ†Đĩ Đ˛Ņ‹ĐšŅŅ†Ņ–?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "ПаĐŋĐēа дададСĐĩĐŊа" }, - "changeMasterPass": { - "message": "ЗĐŧŅĐŊŅ–Ņ†ŅŒ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ" - }, - "changeMasterPasswordConfirmation": { - "message": "Đ’Ņ‹ ĐŧĐžĐļĐ°Ņ†Đĩ СĐŧŅĐŊŅ–Ņ†ŅŒ ŅĐ˛ĐžĐš Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ ҃ Đ˛ŅĐą-ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Ņ‹ ĐŊа bitwarden.com. ПĐĩŅ€Đ°ĐšŅŅ†Ņ– ĐŊа Đ˛ŅĐą-ŅĐ°ĐšŅ‚ ĐˇĐ°Ņ€Đ°Đˇ?" - }, "twoStepLoginConfirmation": { "message": "Đ”Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊŅ‹ ŅžĐ˛Đ°Ņ…ĐžĐ´ Ņ€ĐžĐąŅ–Ņ†ŅŒ Đ˛Đ°Ņˆ ҃ĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ йОĐģҌ҈ ĐąŅŅĐŋĐĩ҇ĐŊŅ‹Đŧ, ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒŅŽŅ‡Ņ‹ ĐŋĐ°Ņ†Đ˛ŅŅ€Đ´ĐļŅĐŊĐŊĐĩ ŅžĐ˛Đ°Ņ…ĐžĐ´Ņƒ ĐŊа Ņ–ĐŊŅˆĐ°Đš ĐŋҀҋĐģадСĐĩ С Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐŊĐŊĐĩĐŧ ĐēĐģŅŽŅ‡Đ° ĐąŅŅĐŋĐĩĐēŅ–, ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧŅ‹ Đ°ŅžŅ‚ŅĐŊ҂ҋ҄ҖĐēĐ°Ņ†Ņ‹Ņ–, SMS, Ņ‚ŅĐģĐĩŅ„ĐžĐŊĐŊĐ°ĐŗĐ° СваĐŊĐēа айО ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹. Đ”Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊŅ‹ ŅžĐ˛Đ°Ņ…ĐžĐ´ ҃ĐēĐģŅŽŅ‡Đ°ĐĩŅ†Ņ†Đ° ĐŊа bitwarden.com. ПĐĩŅ€Đ°ĐšŅŅ†Ņ– ĐŊа Đ˛ŅĐą-ŅĐ°ĐšŅ‚, Đēай ĐˇŅ€Đ°ĐąŅ–Ņ†ŅŒ ĐŗŅŅ‚Đ°?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "ĐŸŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ ҃ Đ˛ŅĐą-ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧĐĩ?" + }, "editedFolder": { "message": "ПаĐŋĐēа Đ°Đ´Ņ€ŅĐ´Đ°ĐŗĐ°Đ˛Đ°ĐŊа" }, @@ -552,6 +936,10 @@ "newUri": { "message": "ĐĐžĐ˛Ņ‹ URI" }, + "addDomain": { + "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ даĐŧĐĩĐŊ", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ дададСĐĩĐŊŅ‹" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "ĐŸŅ‹Ņ‚Đ°Ņ†Ņ†Đ° ĐŋҀҋ дадаваĐŊĐŊŅ– ĐģĐ°ĐŗŅ–ĐŊа" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "ĐŸŅ‹Ņ‚Đ°Ņ†Ņ†Đ° ĐŋŅ€Đ° дадаваĐŊĐŊĐĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°, ĐēаĐģŅ– Ņ‘ĐŊ Đ°Đ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°Đĩ Ņž Đ˛Đ°ŅˆŅ‹Đŧ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Ņ‹." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "ПаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ ĐēĐ°Ņ€Ņ‚ĐēŅ– ĐŊа ŅŅ‚Đ°Ņ€ĐžĐŊ҆ҋ С ҃ĐēĐģадĐēаĐŧŅ–" }, "showCardsCurrentTabDesc": { "message": "ĐĄĐŋҖҁ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Ņž ĐēĐ°Ņ€Ņ‚Đ°Đē ĐŊа ŅŅ‚Đ°Ņ€ĐžĐŊ҆ҋ С ҃ĐēĐģадĐēаĐŧŅ– Đ´ĐģŅ ĐģŅ‘ĐŗĐēĐ°ĐŗĐ° Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊŅ." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "ПаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ ĐŋĐ°ŅĐ˛ĐĩĐ´Ņ‡Đ°ĐŊĐŊŅ– ĐŊа ŅŅ‚Đ°Ņ€ĐžĐŊ҆ҋ С ҃ĐēĐģадĐēаĐŧŅ–" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "ĐŸŅ‹Ņ‚Đ°Ņ†Ņ†Đ° ĐŋŅ€Đ° айĐŊĐ°ŅžĐģĐĩĐŊĐŊĐĩ ĐŋĐ°Ņ€ĐžĐģŅ ад ĐģĐ°ĐŗŅ–ĐŊа ĐŋҀҋ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ– СĐŧŅĐŊĐĩĐŊĐŊŅŅž ĐŊа Đ˛ŅĐą-ŅĐ°ĐšŅ†Đĩ." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "ĐĨĐžŅ‡Đ°Ņ†Đĩ айĐŊĐ°Đ˛Ņ–Ņ†ŅŒ ĐŗŅŅ‚Ņ‹ ĐŋĐ°Ņ€ĐžĐģҌ ҃ Bitwarden?" }, @@ -634,10 +1043,13 @@ "message": "АйĐŊĐ°Đ˛Ņ–Ņ†ŅŒ" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { - "message": "Unlock" + "message": "РаСйĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ" + }, + "additionalOptions": { + "message": "Đ”Đ°Đ´Đ°Ņ‚ĐēĐžĐ˛Ņ‹ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ" }, "enableContextMenuItem": { "message": "ПаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ĐēаĐŊŅ‚ŅĐēҁ҂ĐŊĐ°ĐŗĐ° ĐŧĐĩĐŊŅŽ" @@ -645,9 +1057,12 @@ "contextMenuItemDesc": { "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ĐŋадвОĐĩĐŊŅ‹ ĐŊĐ°Ņ†Ņ–ŅĐē Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ да ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚Đ°Ņ€Đ° ĐŋĐ°Ņ€ĐžĐģŅŅž Ņ– ҁ҃ĐŋĐ°ŅŅ‚Đ°ŅžĐģĐĩĐŊĐŊŅ ĐģĐ°ĐŗŅ–ĐŊĐ°Ņž Đ´ĐģŅ Đ˛ŅĐą-ŅĐ°ĐšŅ‚Đ°Ņž. " }, + "contextMenuItemDescAlt": { + "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ĐŋадвОĐĩĐŊŅ‹ ĐŊĐ°Ņ†Ņ–ŅĐē Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ да ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚Đ°Ņ€Đ° ĐŋĐ°Ņ€ĐžĐģŅŅž Ņ– ҁ҃ĐŋĐ°ŅŅ‚Đ°ŅžĐģĐĩĐŊĐŊŅ ĐģĐ°ĐŗŅ–ĐŊĐ°Ņž Đ´ĐģŅ Đ˛ŅĐą-ŅĐ°ĐšŅ‚Đ°Ņž. ĐŸŅ€Ņ‹ĐŧŅĐŊŅĐĩŅ†Ņ†Đ° да ŅžŅŅ–Ņ… ҃ĐģŅ–ĐēĐžĐ˛Ņ‹Ņ… СаĐŋŅ–ŅĐ°Ņž, ŅĐēŅ–Ņ ŅžĐ˛Đ°ĐšŅˆĐģŅ– Ņž ŅŅ–ŅŅ‚ŅĐŧ҃." + }, "defaultUriMatchDetection": { "message": "ĐŸŅ€Đ°Đ´Đ˛Ņ‹ĐˇĐŊĐ°Ņ‡Đ°ĐŊаĐĩ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊĐĩ ҁ҃ĐŋадСĐĩĐŊĐŊŅ URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ ĐŋŅ€Đ°Đ´Đ˛Ņ‹ĐˇĐŊĐ°Ņ‡Đ°ĐŊŅ‹ ҁĐŋĐžŅĐ°Đą Đ˛Ņ‹ĐˇĐŊĐ°Ņ‡ŅĐŊĐŊŅ адĐŋавĐĩĐ´ĐŊĐ°ŅŅ†Ņ– URI Đ´ĐģŅ ĐģĐ°ĐŗŅ–ĐŊĐ°Ņž ĐŋҀҋ Đ˛Ņ‹ĐēаĐŊаĐŊĐŊŅ– Ņ‚Đ°ĐēŅ–Ņ… дСĐĩŅĐŊĐŊŅŅž, ŅĐē Đ°ŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊаĐĩ СаĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ЗĐŧĐĩĐŊа ĐēаĐģŅŅ€ĐžĐ˛Đ°Đš Ņ‚ŅĐŧŅ‹ ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧŅ‹." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "ĐĻŅ‘ĐŧĐŊĐ°Ņ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Đ­ĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ С" + }, "exportVault": { "message": "Đ­ĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°Ņ†ŅŒ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°" }, "fileFormat": { "message": "Đ¤Đ°Ņ€ĐŧĐ°Ņ‚ Ņ„Đ°ĐšĐģа" }, + "fileEncryptedExportWarningDesc": { + "message": "Đ“ŅŅ‚Ņ‹ ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊŅ‹ Ņ„Đ°ĐšĐģ ĐąŅƒĐ´ĐˇĐĩ Đ°ĐąĐ°Ņ€ĐžĐŊĐĩĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ, ŅĐēŅ– ĐŊĐĩĐ°ĐąŅ…ĐžĐ´ĐŊа ĐąŅƒĐ´ĐˇĐĩ ŅžĐ˛Đĩҁ҆Җ Đ´ĐģŅ ŅĐŗĐž Ņ€Đ°ŅŅˆŅ‹Ņ„Ņ€ĐžŅžĐēŅ–." + }, + "filePassword": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģа" + }, + "exportPasswordDescription": { + "message": "Đ“ŅŅ‚Ņ‹ ĐŋĐ°Ņ€ĐžĐģҌ ĐąŅƒĐ´ĐˇĐĩ Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†Ņ†Đ° Đ´ĐģŅ ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ Ņ– Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ ĐŗŅŅ‚Đ°ĐŗĐ° Ņ„Đ°ĐšĐģа" + }, + "accountRestrictedOptionDescription": { + "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐšŅ†Đĩ ŅĐ˛ĐžĐš ĐēĐģŅŽŅ‡ ŅˆŅ‹Ņ„Ņ€Đ°Đ˛Đ°ĐŊĐŊŅ, ŅĐēŅ– Đ°Ņ‚Ņ€Ņ‹ĐŧаĐŊŅ‹ С Ņ–ĐŧŅ ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа Ņ– Đ°ŅĐŊĐžŅžĐŊĐ°ĐŗĐ° ĐŋĐ°Ņ€ĐžĐģŅ, Đēай ĐˇĐ°ŅˆŅ‹Ņ„Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ Ņ– айĐŧĐĩĐļĐ°Đ˛Đ°Ņ†ŅŒ Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ Ņ‚ĐžĐģҌĐēŅ– ĐąŅĐŗŅƒŅ‡Đ°ĐŗĐ° ŅžĐģŅ–ĐēĐžĐ˛Đ°ĐŗĐ° СаĐŋŅ–ŅŅƒ Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "ĐĸŅ‹Đŋ ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ" + }, + "accountRestricted": { + "message": "АйĐŧĐĩĐļаваĐŊа ŅžĐģŅ–ĐēĐžĐ˛Ņ‹Đŧ СаĐŋŅ–ŅĐ°Đŧ" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "â€œĐŸĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģа” Ņ– â€œĐŸĐ°Ņ†Đ˛ŅŅ€Đ´ĐļŅĐŊĐŊĐĩ ĐŋĐ°Ņ€ĐžĐģŅ Ņ„Đ°ĐšĐģа“ ĐŊĐĩ ҁ҃ĐŋĐ°Đ´Đ°ŅŽŅ†ŅŒ." + }, "warning": { "message": "ĐŸĐĐŸĐ¯Đ Đ­Đ”Đ–ĐĐĐĐ•", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ĐĐąĐ°ĐŗŅƒĐģĐĩĐŊŅ‹Ņ" }, - "learnOrg": { - "message": "ДавĐĩĐ´Đ°Ņ†Ņ†Đ° ĐŋŅ€Đ° Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ–" - }, - "learnOrgConfirmation": { - "message": "Bitwarden даСваĐģŅĐĩ Đ°ĐąĐ°ĐŗŅƒĐģŅ–Ņ†ŅŒ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ Đ˛Đ°ŅˆĐ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° С Ņ–ĐŊŅˆŅ‹ĐŧŅ– ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–ĐēаĐŧŅ–, Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅŽŅ‡Ņ‹ Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹ŅŽ. ĐĨĐžŅ‡Đ°Ņ†Đĩ ĐŊавĐĩĐ´Đ°Ņ†ŅŒ ŅĐ°ĐšŅ‚ bitwarden.com, Đēай давĐĩĐ´Đ°Ņ†Ņ†Đ° йОĐģҌ҈?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "ПĐĩŅ€Đ°ĐŧŅŅŅ†Ņ–Ņ†ŅŒ ҃ Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹ŅŽ" @@ -762,6 +1204,9 @@ "file": { "message": "ФаКĐģ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ Ņ„Đ°ĐšĐģ." }, @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "1 ГБ ĐˇĐ°ŅˆŅ‹Ņ„Ņ€Đ°Đ˛Đ°ĐŊĐ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Đ´ĐģŅ даĐģŅƒŅ‡Đ°ĐŊҋ҅ Ņ„Đ°ĐšĐģĐ°Ņž." }, + "premiumSignUpEmergency": { + "message": "Đ­ĐēŅŅ‚Ņ€Đ°ĐŊĐŊŅ‹ Đ´ĐžŅŅ‚ŅƒĐŋ." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "ĐŸŅ€Đ°ĐŋҀҋĐĩŅ‚Đ°Ņ€ĐŊŅ‹Ņ Đ˛Đ°Ņ€Ņ‹ŅĐŊ҂ҋ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊĐ°ĐŗĐ° ŅžĐ˛Đ°Ņ…ĐžĐ´Ņƒ, Ņ‚Đ°ĐēŅ–Ņ ŅĐē YubiKey Ņ– Duo." }, "ppremiumSignUpReports": { "message": "Đ“Ņ–ĐŗŅ–ĐĩĐŊа ĐŋĐ°Ņ€ĐžĐģŅŅž, ĐˇĐ´Đ°Ņ€ĐžŅžĐĩ ŅžĐģŅ–ĐēĐžĐ˛Đ°ĐŗĐ° СаĐŋŅ–ŅŅƒ Ņ– ҁĐŋŅ€Đ°Đ˛Đ°ĐˇĐ´Đ°Ņ‡Ņ‹ ай ŅƒŅ†Đĩ҇ĐēĐ°Ņ… даĐŊҋ҅ Đ´ĐģŅ СайĐĩҁĐŋŅŅ‡ŅĐŊĐŊŅ ĐąŅŅĐŋĐĩĐēŅ– Đ˛Đ°ŅˆĐ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Đ’Ņ‹ ĐŧĐžĐļĐ°Ņ†Đĩ Đē҃ĐŋŅ–Ņ†ŅŒ ĐŋŅ€ŅĐŧŅ–ŅĐģҌĐŊŅ‹ ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŊа bitwarden.com. ПĐĩŅ€Đ°ĐšŅŅ†Ņ– ĐŊа Đ˛ŅĐą-ŅĐ°ĐšŅ‚ ĐˇĐ°Ņ€Đ°Đˇ?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "ĐŖ Đ˛Đ°Ņ ĐŋŅ€ŅĐŧŅ–ŅĐģҌĐŊŅ‹ ŅŅ‚Đ°Ņ‚ŅƒŅ!" }, "premiumCurrentMemberThanks": { "message": "Đ”ĐˇŅĐēŅƒĐš Са ĐŋĐ°Đ´Ņ‚Ņ€Ņ‹ĐŧĐē҃ Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "ĐŖŅŅĐŗĐž Са $PRICE$ ҃ ĐŗĐžĐ´!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "ĐŖŅŅĐŗĐž Са $PRICE$ ҃ ĐŗĐžĐ´!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "АйĐŊĐ°ŅžĐģĐĩĐŊĐŊĐĩ СавĐĩŅ€ŅˆĐ°ĐŊа" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "ĐŸŅ€Đ°ĐŗŅ€Đ°Đŧа Đ°ŅžŅ‚ŅĐŊ҂ҋ҄ҖĐēĐ°Ņ†Ņ‹Ņ–" }, - "authenticatorAppDesc": { - "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐšŅ†Đĩ ĐŋŅ€Đ°ĐŗŅ€Đ°Đŧ҃ ĐŋŅ€Đ°ĐŗŅ€Đ°Đŧ҃ Đ°ŅžŅ‚ŅĐŊ҂ҋ҄ҖĐēĐ°Ņ†Ņ‹Ņ– (ĐŊаĐŋҀҋĐēĐģад, Authy айО Google Authenticator) Đ´ĐģŅ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Ņ‹Ņ– ĐŋŅ€Đ°Đ˛ĐĩŅ€Đ°Ņ‡ĐŊҋ҅ ĐēĐžĐ´Đ°Ņž ĐŊа ĐŋĐ°Đ´ŅŅ‚Đ°Đ˛Đĩ Ņ‡Đ°ŅŅƒ.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "КĐģŅŽŅ‡ ĐąŅŅĐŋĐĩĐēŅ– YubiKey OTP" + "yubiKeyTitleV2": { + "message": "КĐģŅŽŅ‡ ĐąŅŅĐŋĐĩĐēŅ– Yubico OTP" }, "yubiKeyDesc": { "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐšŅ†Đĩ YubiKey Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ да Đ˛Đ°ŅˆĐ°ĐŗĐ° ŅžĐģŅ–ĐēĐžĐ˛Đ°ĐŗĐ° СаĐŋŅ–ŅŅƒ. ĐŸŅ€Đ°Ņ†ŅƒĐĩ С ĐēĐģŅŽŅ‡Đ°ĐŧŅ– ĐąŅŅĐŋĐĩĐēŅ– YubiKey 4, 4 Nano, 4C Ņ– NEO." }, - "duoDesc": { - "message": "ĐŸŅ€Đ°Đ˛ĐĩŅ€Đēа С даĐŋаĐŧĐžĐŗĐ°Đš Duo Security, Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅŽŅ‡Ņ‹ ĐŋŅ€Đ°ĐŗŅ€Đ°Đŧ҃ Duo Mobile, SMS, Ņ‚ŅĐģĐĩŅ„ĐžĐŊĐŊŅ‹ Đ˛Ņ‹ĐēĐģŅ–Đē айО ĐēĐģŅŽŅ‡ ĐąŅŅĐŋĐĩĐēŅ– U2F.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Đ­ĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐ°Ņ ĐŋĐžŅˆŅ‚Đ°" }, - "emailDesc": { - "message": "ĐŸŅ€Đ°Đ˛ĐĩŅ€Đ°Ņ‡ĐŊŅ‹Ņ ĐēĐžĐ´Ņ‹ ĐąŅƒĐ´ŅƒŅ†ŅŒ адĐŋŅ€Đ°ŅžĐģŅŅ†Ņ†Đ° ваĐŧ Đŋа ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊŅƒŅŽ ĐŋĐžŅˆŅ‚Ņƒ." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "ĐŅŅŅ€ĐžĐ´Đ´ĐˇĐĩ ŅžĐģĐ°ŅĐŊĐ°ĐŗĐ° Ņ…ĐžŅŅ‚Ņ‹ĐŊĐŗŅƒ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "ĐŖĐ˛ŅĐ´ĐˇŅ–Ņ†Đĩ Đ°ŅĐŊĐžŅžĐŊŅ‹ URL-Đ°Đ´Ņ€Đ°Ņ Đ˛Đ°ŅˆĐ°ĐŗĐ° ĐģаĐēаĐģҌĐŊĐ°ĐŗĐ° Ņ€Đ°ĐˇĐŧŅŅˆŅ‡ŅĐŊĐŊŅ ŅžŅŅ‚Đ°ĐģŅĐ˛Đ°ĐŊĐ°ĐŗĐ° Bitwarden." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "ĐšĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊҖ҆ĐēаĐĩ Đ°ŅŅŅ€ĐžĐ´Đ´ĐˇĐĩ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL-Đ°Đ´Ņ€Đ°Ņ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "ĐĄĐĩŅ€Đ˛ĐĩŅ€ URL-Đ°Đ´Ņ€Đ°ŅĐ° API" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "URL-Đ°Đ´Ņ€Đ°Ņ ҁĐĩŅ€Đ˛ĐĩŅ€Đ° Đ°ŅŅŅ€ĐžĐ´Đ´ĐˇŅ ĐˇĐ°Ņ…Đ°Đ˛Đ°ĐŊŅ‹." }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Đ’Ņ‹ĐēĐģŅŽŅ‡Đ°ĐŊа", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ ĐŋҀҋ ĐˇĐ°ĐŗŅ€ŅƒĐˇŅ†Ņ‹ ŅŅ‚Đ°Ņ€ĐžĐŊĐēŅ–" + }, "enableAutoFillOnPageLoad": { "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ ĐŋҀҋ ĐˇĐ°ĐŗŅ€ŅƒĐˇŅ†Ņ‹ ŅŅ‚Đ°Ņ€ĐžĐŊĐēŅ–" }, "enableAutoFillOnPageLoadDesc": { "message": "КаĐģŅ– Đ˛Ņ‹ŅŅžĐģĐĩĐŊа Ņ„ĐžŅ€Đŧа ŅžĐ˛Đ°Ņ…ĐžĐ´Ņƒ, Ņ‚Đž ĐąŅƒĐ´ĐˇĐĩ Đ˛Ņ‹ĐēаĐŊаĐŊа ŅĐĩ Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ ĐŋĐ°Đ´Ņ‡Đ°Ņ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēŅ– Đ˛ŅĐą-ŅŅ‚Đ°Ņ€ĐžĐŊĐēŅ–." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "ĐĄĐēаĐŧĐŋŅ€Đ°ĐŧĐĩŅ‚Đ°Đ˛Đ°ĐŊŅ‹Ņ айО ĐŊĐĩĐŊадСĐĩĐšĐŊŅ‹Ņ Đ˛ŅĐą-ŅĐ°ĐšŅ‚Ņ‹ ĐŧĐžĐŗŅƒŅ†ŅŒ СадСĐĩĐšĐŊŅ–Ņ‡Đ°Ņ†ŅŒ Ņ„ŅƒĐŊĐēŅ†Ņ‹ŅŽ Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊŅ ĐŋĐ°Đ´Ņ‡Đ°Ņ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēŅ– ŅŅ‚Đ°Ņ€ĐžĐŊĐēŅ–." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "ДавĐĩĐ´Đ°Ņ†Ņ†Đ° йОĐģҌ҈ ĐŋŅ€Đ° Ņ€Ņ‹ĐˇŅ‹ĐēŅ–" + }, "learnMoreAboutAutofill": { "message": "ДавĐĩĐ´Đ°Ņ†Ņ†Đ° йОĐģҌ҈ ĐŋŅ€Đ° Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ" }, @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "АдĐēŅ€Ņ‹Ņ†ŅŒ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Ņž йаĐēавОК ĐŋаĐŊŅĐģŅ–" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ аĐŋĐžŅˆĐŊŅĐŗĐ° ҁĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐŊĐ°ĐŗĐ° ĐģĐ°ĐŗŅ–ĐŊа Đ´ĐģŅ ĐąŅĐŗŅƒŅ‡Đ°ĐŗĐ° Đ˛ŅĐą-ŅĐ°ĐšŅ‚Đ°" }, + "commandAutofillCardDesc": { + "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ аĐŋĐžŅˆĐŊŅĐš ҁĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐŊаК ĐēĐ°Ņ€Ņ‚ĐēŅ– Đ´ĐģŅ ĐąŅĐŗŅƒŅ‡Đ°ĐŗĐ° Đ˛ŅĐą-ŅĐ°ĐšŅ‚Đ°" + }, + "commandAutofillIdentityDesc": { + "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊĐĩ аĐŋĐžŅˆĐŊŅĐŗĐ° ҁĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐŊĐ°ĐŗĐ° ĐŋĐ°ŅĐ˛ĐĩĐ´Ņ‡Đ°ĐŊĐŊŅ Đ´ĐģŅ ĐąŅĐŗŅƒŅ‡Đ°ĐŗĐ° Đ˛ŅĐą-ŅĐ°ĐšŅ‚Đ°" + }, "commandGeneratePasswordDesc": { "message": "ГĐĩĐŊĐĩŅ€Ņ‹Ņ€Đ°Đ˛Đ°Ņ†ŅŒ Ņ– ҁĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ĐŊĐžĐ˛Ņ‹ Đ˛Ņ‹ĐŋадĐēĐžĐ˛Ņ‹ ĐŋĐ°Ņ€ĐžĐģҌ ҃ ĐąŅƒŅ„ĐĩŅ€ айĐŧĐĩĐŊ҃" }, "commandLockVaultDesc": { "message": "ЗабĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°" }, - "privateModeWarning": { - "message": "ĐŸŅ€Ņ‹Đ˛Đ°Ņ‚ĐŊŅ‹ Ņ€ŅĐļŅ‹Đŧ - ĐŗŅŅ‚Đ° ŅĐēҁĐŋĐĩҀҋĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊĐ°Ņ Ņ„ŅƒĐŊĐēŅ†Ņ‹Ņ Ņ– ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹Ņ ĐŧĐ°ĐŗŅ‡Ņ‹ĐŧĐ°ŅŅ†Ņ– Ņž Ņ–Đŧ айĐŧĐĩĐļаваĐŊŅ‹." - }, "customFields": { "message": "ĐšĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊҖ҆ĐēŅ–Ņ ĐŋаĐģŅ–" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Đ‘ŅƒĐģĐĩва" }, + "cfTypeCheckbox": { + "message": "ĐŸŅ‚ŅƒŅˆĐēа" + }, "cfTypeLinked": { "message": "Đ—Đ˛ŅĐˇĐ°ĐŊа", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ПаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ Ņ€Đ°ŅĐŋаСĐŊаваĐģҌĐŊŅ‹ Đ˛Ņ–Đ´Đ°Ņ€Ņ‹Ņ ĐŋĐžĐąĐ°Ņ‡ С ĐēĐžĐļĐŊŅ‹Đŧ ĐģĐ°ĐŗŅ–ĐŊаĐŧ." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "ПаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ ĐģҖ҇ҋĐģҌĐŊŅ–Đē ĐŊа СĐŊĐ°Ņ‡Đē҃" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "ĐŸĐ°ŅĐ˛ĐĩĐ´Ņ‡Đ°ĐŊĐŊĐĩ" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "ĐĐžĐ˛Ņ‹ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Đ ŅĐ´Đ°ĐŗĐ°Đ˛Đ°Ņ†ŅŒ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "ĐŸŅ€Đ°ĐŗĐģŅĐ´ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Đ“Ņ–ŅŅ‚ĐžŅ€Ņ‹Ņ ĐŋĐ°Ņ€ĐžĐģŅŅž" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Назад" }, "collections": { "message": "КаĐģĐĩĐē҆ҋҖ" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "ĐĐąŅ€Đ°ĐŊŅ‹Ņ" }, @@ -1282,6 +1874,10 @@ "message": "ĐŅĐŊĐžŅžĐŊŅ‹ даĐŧĐĩĐŊ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ІĐŧŅ даĐŧĐĩĐŊа", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Đ’Ņ‹ŅŅžĐģĐĩĐŊĐŊĐĩ ҁ҃ĐŋадСĐĩĐŊĐŊŅŅž", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ĐŸŅ€Đ°Đ´Đ˛Ņ‹ĐˇĐŊĐ°Ņ‡Đ°ĐŊŅ‹ ĐŧĐĩŅ‚Đ°Đ´ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ПĐĩŅ€Đ°ĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "ĐŖ ҁĐŋҖҁĐĩ Đ°Đ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°ŅŽŅ†ŅŒ ĐŋĐ°Ņ€ĐžĐģŅ–." }, + "clearHistory": { + "message": "ĐŅ‡Ņ‹ŅŅ†Ņ–Ņ†ŅŒ ĐŗŅ–ŅŅ‚ĐžŅ€Ņ‹ŅŽ" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Đ’Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "РаСйĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ PIN-ĐēОдаĐŧ" }, + "setYourPinTitle": { + "message": "Đ—Đ°Đ´Đ°Ņ†ŅŒ PIN" + }, + "setYourPinButton": { + "message": "Đ—Đ°Đ´Đ°Ņ†ŅŒ PIN" + }, "setYourPinCode": { "message": "ĐŸŅ€Ņ‹ĐˇĐŊĐ°Ņ‡Ņ†Đĩ PIN-ĐēОд Đ´ĐģŅ Ņ€Đ°ĐˇĐąĐģаĐēŅ–Ņ€ĐžŅžĐēŅ– Bitwarden. НаĐģĐ°Đ´Ņ‹ PIN-ĐēОда ĐąŅƒĐ´ŅƒŅ†ŅŒ ҁĐēŅ–ĐŊŅƒŅ‚Ņ‹, ĐēаĐģŅ– Đ˛Ņ‹ ĐēаĐģŅ–-ĐŊĐĩĐąŅƒĐ´ĐˇŅŒ Ņ†Đ°ĐģĐēаĐŧ Đ˛Ņ‹ĐšĐ´ĐˇĐĩ҆Đĩ С ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧŅ‹." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "ĐŸĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩŅ†Ņ†Đ° PIN-ĐēОд." }, "invalidPin": { "message": "ПаĐŧŅ‹ĐģĐēĐžĐ˛Ņ‹ PIN-ĐēОд." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "РаСйĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ С даĐŋаĐŧĐžĐŗĐ°Đš ĐąŅ–ŅĐŧĐĩ҂ҀҋҖ" }, + "unlockWithMasterPassword": { + "message": "РаСйĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ С даĐŋаĐŧĐžĐŗĐ°Đš Đ°ŅĐŊĐžŅžĐŊĐ°ĐŗĐ° ĐŋĐ°Ņ€ĐžĐģŅ" + }, "awaitDesktop": { "message": "ЧаĐēаĐŊĐŊĐĩ ĐŋĐ°Ņ†Đ˛ŅŅ€Đ´ĐļŅĐŊĐŊŅ С ĐēаĐŧĐŋ'ŅŽŅ‚Đ°Ņ€Đ°" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "ЗабĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ Đ°ŅĐŊĐžŅžĐŊŅ‹Đŧ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ ĐŋҀҋ ĐŋĐĩŅ€Đ°ĐˇĐ°Đŋ҃ҁĐē҃ ĐąŅ€Đ°ŅžĐˇĐĩŅ€Đ°" }, + "lockWithMasterPassOnRestart1": { + "message": "ĐŸĐ°Ņ‚Ņ€Đ°ĐąĐ°Đ˛Đ°Ņ†ŅŒ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ ĐŋҀҋ ĐŋĐĩŅ€Đ°ĐˇĐ°Đŋ҃ҁĐē҃ ĐąŅ€Đ°ŅžĐˇĐĩŅ€Đ°" + }, "selectOneCollection": { "message": "Đ’Ņ‹ ĐŋĐ°Đ˛Ņ–ĐŊĐŊŅ‹ Đ˛Ņ‹ĐąŅ€Đ°Ņ†ŅŒ ĐŋҀҋĐŊаĐŧҁҖ адĐŊ҃ ĐēаĐģĐĩĐēŅ†Ņ‹ŅŽ." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "АдĐŊа айО йОĐģҌ҈ ĐŋаĐģҖ҂ҋĐē Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ– ŅžĐŋĐģŅ‹Đ˛Đ°Đĩ ĐŊа ĐŊаĐģĐ°Đ´Ņ‹ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚Đ°Ņ€Đ°." }, + "passwordGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚Đ°Ņ€ ĐŋĐ°Ņ€ĐžĐģŅŅž" + }, + "usernameGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚Đ°Ņ€ Ņ–ĐŧĐĩĐŊŅ– ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа" + }, + "useThisPassword": { + "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ĐŗŅŅ‚Ņ‹ ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "useThisUsername": { + "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ĐŗŅŅ‚Đ° Ņ–ĐŧŅ ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚Đ°Ņ€", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "Đēай ŅŅ‚Đ˛Đ°Ņ€Ņ‹Ņ†ŅŒ ĐŊадСĐĩĐšĐŊŅ‹ ŅžĐŊŅ–ĐēаĐģҌĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ДзĐĩŅĐŊĐŊĐĩ ĐŋĐ°ŅĐģŅ СаĐēаĐŊŅ‡ŅĐŊĐŊŅ Ņ‡Đ°ŅŅƒ Ņ‡Đ°ĐēаĐŊĐŊŅ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "ЗабĐģаĐēŅ–Ņ€Đ°Đ˛Đ°Ņ†ŅŒ", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ĐĄĐŧĐĩŅ‚ĐŊŅ–Ņ†Đ°", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ адĐŊĐžŅžĐģĐĩĐŊŅ‹" }, + "alreadyHaveAccount": { + "message": "ĐŖĐļĐž ĐŧаĐĩ҆Đĩ ŅžĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Đ’Ņ‹Ņ…Đ°Đ´ С ŅŅ–ŅŅ‚ŅĐŧŅ‹ ҁĐēĐ°ŅŅƒĐĩ ŅžŅĐĩ ĐŧĐ°ĐŗŅ‡Ņ‹ĐŧĐ°ŅŅ†Ņ– Đ´ĐžŅŅ‚ŅƒĐŋ҃ да ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Ņ– СаĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩ Đ°ŅžŅ‚ŅĐŊ҂ҋ҄ҖĐēĐ°Ņ†Ņ‹ŅŽ ĐŋŅ€Đ°Đˇ Ņ–ĐŊŅ‚ŅŅ€ĐŊŅŅ‚ ĐŋĐ°ŅĐģŅ ĐˇĐ°Đ˛ŅŅ€ŅˆŅĐŊĐŊŅ Ņ‡Đ°ŅŅƒ Ņ‡Đ°ĐēаĐŊĐŊŅ. Đ’Ņ‹ ŅĐ°ĐŋŅ€Đ°ŅžĐ´Ņ‹ Ņ…ĐžŅ‡Đ°Ņ†Đĩ Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ĐŗŅŅ‚Ņ‹ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐžŅžĐŊŅ–Ņ†ŅŒ Ņ– ĐˇĐ°Ņ…Đ°Đ˛Đ°Ņ†ŅŒ" }, + "fillAndSave": { + "message": "ЗаĐŋĐžŅžĐŊŅ–Ņ†ŅŒ Ņ– ĐˇĐ°Ņ…Đ°Đ˛Đ°Ņ†ŅŒ" + }, "autoFillSuccessAndSavedUri": { "message": "ĐŅžŅ‚Đ°ĐˇĐ°ĐŋĐžŅžĐŊĐĩĐŊŅ‹ ŅĐģĐĩĐŧĐĩĐŊŅ‚ Ņ– ĐˇĐ°Ņ…Đ°Đ˛Đ°ĐŊŅ‹ URI" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Đ’Đ°Ņˆ ĐŊĐžĐ˛Ņ‹ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩ адĐŋĐ°Đ˛ŅĐ´Đ°Đĩ ĐŋĐ°Ņ‚Ņ€Đ°ĐąĐ°Đ˛Đ°ĐŊĐŊŅĐŧ ĐŋаĐģҖ҂ҋĐēŅ–." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "АдĐŋŅ–ŅĐ°Ņ†Ņ†Đ°" + }, + "atAnyTime": { + "message": "Ņž ĐģŅŽĐąŅ‹ Ņ‡Đ°Ņ." + }, + "byContinuingYouAgreeToThe": { + "message": "ĐŸŅ€Đ°Ņ†ŅĐŗĐ˛Đ°ŅŽŅ‡Ņ‹, Đ˛Ņ‹ ĐˇĐŗĐ°Đ´ĐļаĐĩ҆ĐĩŅŅ С" + }, + "and": { + "message": "Ņ–" + }, "acceptPolicies": { "message": "ĐĄŅ‚Đ°Đ˛ŅŅ‡Ņ‹ ĐŗŅŅ‚Ņ‹ ŅŅ†ŅĐļĐžĐē, Đ˛Ņ‹ ĐŋĐ°ĐŗĐ°Đ´ĐļаĐĩ҆ĐĩŅŅ С ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ‹Đŧ:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Đ”ĐžĐąŅ€Đ°" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "ĐŸŅ€Đ°Đ˛ĐĩŅ€Đēа ҁҖĐŊŅ…Ņ€Đ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ– ĐŊа ĐēаĐŧĐŋ'ŅŽŅ‚Đ°Ņ€Ņ‹" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "НĐĩадĐŋавĐĩĐ´ĐŊĐ°ŅŅ†ŅŒ ҃ĐģŅ–ĐēĐžĐ˛Ņ‹Ņ… СаĐŋŅ–ŅĐ°Ņž" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Đ‘Ņ–ŅĐŧĐĩŅ‚Ņ€Ņ‹Ņ ĐŊĐĩ ŅžĐēĐģŅŽŅ‡Đ°ĐŊа" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Đ‘Ņ–ŅĐŧĐĩŅ‚Ņ€Ņ‹Ņ Ņž ĐąŅ€Đ°ŅžĐˇĐĩҀҋ ĐŊĐĩ ĐŋĐ°Đ´Ņ‚Ņ€Ņ‹ĐŧĐģŅ–Đ˛Đ°ĐĩŅ†Ņ†Đ° ĐŊа ĐŗŅŅ‚Đ°Đš ĐŋҀҋĐģадСĐĩ." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ПаĐģҖ҂ҋĐēа Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ– ŅžĐŋĐģŅ‹Đ˛Đ°Đĩ ĐŊа Đ˛Đ°ŅˆŅ‹ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ŅžĐģĐ°ŅĐŊĐ°ŅŅ†Ņ–." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "ДаĐŧĐĩĐŊŅ‹", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Đ’Ņ‹ĐēĐģŅŽŅ‡Đ°ĐŊŅ‹Ņ даĐŧĐĩĐŊŅ‹" }, "excludedDomainsDesc": { "message": "ĐŸŅ€Đ°ĐŗŅ€Đ°Đŧа ĐŊĐĩ ĐąŅƒĐ´ĐˇĐĩ ĐŋŅ€Đ°ĐŋаĐŊĐžŅžĐ˛Đ°Ņ†ŅŒ ĐˇĐ°Ņ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐ°Đ´Ņ€Đ°ĐąŅĐˇĐŊĐ°ŅŅ†Ņ– ŅžĐ˛Đ°Ņ…ĐžĐ´Ņƒ Đ´ĐģŅ ĐŗŅŅ‚Ņ‹Ņ… даĐŧĐĩĐŊĐ°Ņž. Đ’Ņ‹ ĐŋĐ°Đ˛Ņ–ĐŊĐŊŅ‹ айĐŊĐ°Đ˛Ņ–Ņ†ŅŒ ŅŅ‚Đ°Ņ€ĐžĐŊĐē҃, Đēай СĐŧŅĐŊĐĩĐŊĐŊŅ– ĐŋĐ°Ņ‡Đ°ĐģŅ– дСĐĩĐšĐŊŅ–Ņ‡Đ°Ņ†ŅŒ." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Đ’ŅĐą-ŅĐ°ĐšŅ‚ $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ĐŊĐĩ С'ŅŅžĐģŅĐĩŅ†Ņ†Đ° ĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊŅ‹Đŧ даĐŧĐĩĐŊаĐŧ", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Đ—Đ°ŅŅ‚Đ°ĐģĐžŅŅ ĐŋŅ€Đ°ĐŗĐģŅĐ´Đ°Ņž: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "ĐŸĐ°Đ´Ņ€Đ°ĐąŅĐˇĐŊĐ°ŅŅ†Ņ– Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ĐŸĐžŅˆŅƒĐē ҃ Send'Đ°Ņ…", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ĐĸŅĐēҁ҂" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ФаКĐģ" }, @@ -1666,6 +2406,9 @@ "message": "ĐŖŅĐĩ Sendâ€™Ņ‹", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Đ”Đ°ŅŅĐŗĐŊŅƒŅ‚Đ° ĐŧаĐēҁҖĐŧаĐģҌĐŊĐ°Ņ ĐēĐžĐģҌĐēĐ°ŅŅ†ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋĐ°Ņž", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "ĐĐąĐ°Ņ€ĐžĐŊĐĩĐŊа ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ" }, + "copyLink": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ҁĐŋĐ°ŅŅ‹ĐģĐē҃" + }, "copySendLink": { "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ҁĐŋĐ°ŅŅ‹ĐģĐē҃ ĐŊа Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Đ’Ņ‹ ŅĐ°ĐŋŅ€Đ°ŅžĐ´Ņ‹ Ņ…ĐžŅ‡Đ°Ņ†Đĩ Đ˛Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ ĐŗŅŅ‚Ņ‹ Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Đ’Ņ‹ ŅžĐŋŅŅžĐŊĐĩĐŊŅ‹Ņ, ŅˆŅ‚Đž Ņ…ĐžŅ‡Đ°Ņ†Đĩ ĐŊĐ°ĐˇĐ°ŅžŅŅ‘Đ´Ņ‹ Đ˛Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ ĐŗŅŅ‚Ņ‹ Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Đ ŅĐ´Đ°ĐŗĐ°Đ˛Đ°Ņ†ŅŒ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send ĐąŅƒĐ´ĐˇĐĩ ĐŊĐĩĐˇĐ˛Đ°Ņ€ĐžŅ‚ĐŊа Đ˛Ņ‹Đ´Đ°ĐģĐĩĐŊŅ‹ Ņž аСĐŊĐ°Ņ‡Đ°ĐŊŅ‹Ņ Đ´Đ°Ņ‚Ņƒ Ņ– Ņ‡Đ°Ņ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Đ”Đ°Ņ‚Đ° ĐˇĐ°Đ˛ŅŅ€ŅˆŅĐŊĐŊŅ" }, @@ -1769,6 +2523,10 @@ "message": "Па ĐŧĐ°ĐŗŅ‡Ņ‹ĐŧĐ°ŅŅ†Ņ– СаĐŋŅ‹Ņ‚Đ˛Đ°Ņ†ŅŒ ҃ ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–ĐēĐ°Ņž ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ да ĐŗŅŅ‚Đ°ĐŗĐ° Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "ĐŸŅ€Ņ‹Đ˛Đ°Ņ‚ĐŊŅ‹Ņ ĐŊĐ°Ņ‚Đ°Ņ‚ĐēŅ– ĐŋŅ€Đ° ĐŗŅŅ‚Ņ‹ Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "ĐĄŅ‚Đ˛ĐžŅ€Đ°ĐŊŅ‹ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send ĐŋĐ°ŅĐŋŅŅ…ĐžĐ˛Đ° ŅŅ‚Đ˛ĐžŅ€Đ°ĐŊŅ‹!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send Đ°Đ´Ņ€ŅĐ´Đ°ĐŗĐ°Đ˛Đ°ĐŊŅ‹", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "ДĐģŅ Đ˛Ņ‹ĐąĐ°Ņ€Ņƒ Ņ„Đ°ĐšĐģа ĐŊĐĩĐ°ĐąŅ…ĐžĐ´ĐŊа адĐēŅ€Ņ‹Ņ†ŅŒ ĐŋĐ°ŅˆŅ‹Ņ€ŅĐŊĐŊĐĩ ĐŊа йаĐēавОК ĐŋаĐŊŅĐģŅ– (ĐēаĐģŅ– Ņ‘ŅŅ†ŅŒ Ņ‚Đ°ĐēĐ°Ņ ĐŧĐ°ĐŗŅ‡Ņ‹ĐŧĐ°ŅŅ†ŅŒ) айО ĐŋĐĩŅ€Đ°ĐšŅŅ†Ņ– Ņž ĐŊОваĐĩ аĐēĐŊĐž, ĐŊĐ°Ņ†Ņ–ŅĐŊŅƒŅžŅˆŅ‹ ĐŊа ĐŗŅŅ‚Ņ‹ йаĐŊŅŅ€." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "ДĐģŅ Đ˛Ņ‹ĐąĐ°Ņ€Ņƒ Ņ„Đ°ĐšĐģа С Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐŊĐŊĐĩĐŧ Safari ĐŊĐĩĐ°ĐąŅ…ĐžĐ´ĐŊа ĐŋĐĩŅ€Đ°ĐšŅŅ†Ņ– Ņž ĐŊОваĐĩ аĐēĐŊĐž, ĐŊĐ°Ņ†Ņ–ŅĐŊŅƒŅžŅˆŅ‹ ĐŊа ĐŗŅŅ‚Ņ‹ йаĐŊŅŅ€." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "ПĐĩŅ€Đ°Đ´ ҂ҋĐŧ, ŅĐē ĐŋĐ°Ņ‡Đ°Ņ†ŅŒ" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŧОК Đ°Đ´Ņ€Đ°Ņ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹ ад Đ°Ņ‚Ņ€Ņ‹ĐŧаĐģҌĐŊŅ–ĐēĐ°Ņž." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "АдĐŊа айО йОĐģҌ҈ ĐŋаĐģҖ҂ҋĐē Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ– ŅžĐŋĐģŅ‹Đ˛Đ°ŅŽŅ†ŅŒ ĐŊа ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ĐŸĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩŅ†Ņ†Đ° ĐŋŅ€Đ°Đ˛ĐĩŅ€Đēа ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹" }, + "emailVerifiedV2": { + "message": "Email ĐŋĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐļаĐŊŅ‹" + }, "emailVerificationRequiredDesc": { "message": "Đ’Ņ‹ ĐŋĐ°Đ˛Ņ–ĐŊĐŊŅ‹ ĐŋŅ€Đ°Đ˛ĐĩŅ€Ņ‹Ņ†ŅŒ ŅĐ˛ĐžĐš Đ°Đ´Ņ€Đ°Ņ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹, Đēай Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ĐŗŅŅ‚Ņƒ Ņ„ŅƒĐŊĐēŅ†Ņ‹ŅŽ. Đ—Ņ€Đ°ĐąŅ–Ņ†ŅŒ ĐŗŅŅ‚Đ° ĐŧĐžĐļĐŊа Ņž Đ˛ŅĐą-ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Ņ‹." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Đ’Đ°Ņˆ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩ адĐŋĐ°Đ˛ŅĐ´Đ°Đĩ адĐŊОК айО ĐŊĐĩĐēаĐģҌĐēŅ–Đŧ ĐŋаĐģҖ҂ҋĐēаĐŧ Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ–. ДĐģŅ Đ°Ņ‚Ņ€Ņ‹ĐŧаĐŊĐŊŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ да ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°, Đ˛Ņ‹ ĐŋĐ°Đ˛Ņ–ĐŊĐŊŅ‹ айĐŊĐ°Đ˛Ņ–Ņ†ŅŒ ŅĐŗĐž. ĐŸŅ€Đ°Ņ†ŅĐŗĐ˛Đ°ŅŽŅ‡Ņ‹, Đ˛Ņ‹ Đ˛Ņ‹ĐšĐ´ĐˇŅ–Ņ†Đĩ С ĐąŅĐŗŅƒŅ‡Đ°ĐŗĐ° ҁĐĩаĐŊŅĐ° Ņ– ваĐŧ ĐŊĐĩĐ°ĐąŅ…ĐžĐ´ĐŊа ĐąŅƒĐ´ĐˇĐĩ ŅžĐ˛Đ°ĐšŅŅ†Ņ– ĐŋĐ°ŅžŅ‚ĐžŅ€ĐŊа. АĐēŅ‚Ņ‹ŅžĐŊŅ‹Ņ ҁĐĩаĐŊҁҋ ĐŊа Ņ–ĐŊŅˆŅ‹Ņ… ĐŋҀҋĐģĐ°Đ´Đ°Ņ… ĐŧĐžĐŗŅƒŅ†ŅŒ ĐˇĐ°ŅŅ‚Đ°Đ˛Đ°Ņ†Ņ†Đ° аĐēŅ‚Ņ‹ŅžĐŊŅ‹ĐŧŅ– ĐŊа ĐŋŅ€Đ°Ņ†ŅĐŗŅƒ адĐŊОК ĐŗĐ°Đ´ĐˇŅ–ĐŊŅ‹." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "ĐŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊĐ°Ņ Ņ€ŅĐŗŅ–ŅŅ‚Ņ€Đ°Ņ†Ņ‹Ņ" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Đ’Ņ‹ĐąŅ€Đ°Ņ†ŅŒ ĐŋаĐŋĐē҃..." }, - "ssoCompleteRegistration": { - "message": "ДĐģŅ ĐˇĐ°Đ˛ŅŅ€ŅˆŅĐŊĐŊŅ ĐŋŅ€Đ°Ņ†ŅŅŅƒ ŅžĐ˛Đ°Ņ…ĐžĐ´Ņƒ С даĐŋаĐŧĐžĐŗĐ°Đš SSO, ĐŋŅ€Ņ‹ĐˇĐŊĐ°Ņ‡Ņ†Đĩ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ да Đ˛Đ°ŅˆĐ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Ņ– ŅĐŗĐž Đ°ĐąĐ°Ņ€ĐžĐŊŅ‹." + "noFoldersFound": { + "message": "ПаĐŋĐēŅ– ĐŊĐĩ СĐŊОКдСĐĩĐŊŅ‹", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "С $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "ĐŸĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩŅ†Ņ†Đ° ĐŋŅ€Đ°Đ˛ĐĩŅ€Đēа", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Đ“Đ°Đ´ĐˇŅ–ĐŊŅ‹" @@ -1904,6 +2740,9 @@ "minutes": { "message": "ĐĨĐ˛Ņ–ĐģŅ–ĐŊŅ‹" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "ПаĐģҖ҂ҋĐēа Đ˛Đ°ŅˆĐ°Đš Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ– ŅžĐŋĐģŅ‹Đ˛Đ°Đĩ ĐŊа Ņ‡Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°. МаĐēҁҖĐŧаĐģҌĐŊŅ‹ даСвОĐģĐĩĐŊŅ‹ Ņ‡Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° ҁĐēĐģадаĐĩ $HOURS$ ĐŗĐ°Đ´Đˇ. Ņ– $MINUTES$ Ņ…Đ˛.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "ПаĐģҖ҂ҋĐēа Đ˛Đ°ŅˆĐ°Đš Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ– ŅžĐŋĐģŅ‹Đ˛Đ°Đĩ ĐŊа Ņ‡Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°. МаĐēҁҖĐŧаĐģҌĐŊŅ‹ даСвОĐģĐĩĐŊŅ‹ Ņ‡Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° ҁĐēĐģадаĐĩ ĐŗĐ°Đ´ĐˇŅ–ĐŊ: $HOURS$; Ņ…Đ˛Ņ–ĐģŅ–ĐŊ: $MINUTES$. ДĐģŅ Ņ‡Đ°ŅŅƒ Ņ‡Đ°ĐēаĐŊĐŊŅ Đ˛Đ°ŅˆĐ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° ĐŋŅ€Ņ‹ĐˇĐŊĐ°Ņ‡Đ°ĐŊа дСĐĩŅĐŊĐŊĐĩ $ACTION$.", "placeholders": { @@ -1992,7 +2857,7 @@ "message": "Đ­ĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ Đ°ŅĐ°ĐąŅ–ŅŅ‚Đ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Đ‘ŅƒĐ´ŅƒŅ†ŅŒ ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊŅ‹ Ņ‚ĐžĐģҌĐēŅ– Ņ–ĐŊĐ´Ņ‹Đ˛Ņ–Đ´ŅƒĐ°ĐģҌĐŊŅ‹Ņ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°, ŅĐēŅ–Ņ ĐˇĐ˛ŅĐˇĐ°ĐŊŅ‹ С $EMAIL$. Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ– ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ†ŅŒ ҃ĐēĐģŅŽŅ‡Đ°ĐŊŅ‹. ĐĸĐžĐģҌĐēŅ– СвĐĩҁ҂ĐēŅ– ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° ĐąŅƒĐ´ŅƒŅ†ŅŒ ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊŅ‹ Ņ– ŅĐŊŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ†ŅŒ ҃ĐēĐģŅŽŅ‡Đ°Ņ†ŅŒ ĐˇĐ˛ŅĐˇĐ°ĐŊŅ‹Ņ даĐģŅƒŅ‡ŅĐŊĐŊŅ–.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Đ­ĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ–" + }, + "exportingOrganizationVaultDesc": { + "message": "ĐĸĐžĐģҌĐēŅ– ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ–, ŅĐēŅ–Ņ ĐˇĐ˛ŅĐˇĐ°ĐŊŅ‹ С $ORGANIZATION$ ĐąŅƒĐ´ŅƒŅ†ŅŒ ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊŅ‹. Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ Đ°ŅĐ°ĐąŅ–ŅŅ‚Đ°ĐŗĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° Ņ– ŅĐģĐĩĐŧĐĩĐŊ҂ҋ С Ņ–ĐŊŅˆŅ‹Ņ… Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Đš ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ†ŅŒ ҃ĐēĐģŅŽŅ‡Đ°ĐŊŅ‹.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "ПаĐŧŅ‹ĐģĐēа" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ГĐĩĐŊĐĩŅ€Ņ‹Ņ€Đ°Đ˛Đ°Ņ†ŅŒ Ņ–ĐŧŅ ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "ĐĸŅ‹Đŋ Ņ–ĐŧŅ ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "ГĐĩĐŊĐĩŅ€Ņ‹Ņ€Đ°Đ˛Đ°Ņ†ŅŒ ĐŋҁĐĩŅžĐ´Đ°ĐŊŅ–Đŧ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹ ŅĐ° СĐŊĐĩ҈ĐŊŅ–Đŧ ŅŅŅ€Đ˛Ņ–ŅĐ°Đŧ ĐŋĐĩŅ€Đ°ŅŅ‹ĐģĐēŅ–." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "ПаĐŧŅ‹ĐģĐēа $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "ĐĄĐŗĐĩĐŊĐĩŅ€Đ°Đ˛Đ°ĐŊа Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Назва Đ˛ŅƒĐˇĐģа", "description": "Part of a URL." @@ -2093,7 +3097,7 @@ "message": "ВĐĩŅ€ŅŅ–Ņ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°" }, "selfHostedServer": { - "message": "self-hosted" + "message": "҃ĐģĐ°ŅĐŊаĐĩ Ņ€Đ°ĐˇĐŧŅŅˆŅ‡ŅĐŊĐŊĐĩ" }, "thirdParty": { "message": "ІĐŊŅˆŅ‹ ĐŋĐ°ŅŅ‚Đ°ŅžŅˆŅ‡Ņ‹Đē" @@ -2153,7 +3157,7 @@ "message": "АĐŋĐ°Đ˛ŅŅˆŅ‡ŅĐŊĐŊĐĩ ĐąŅ‹ĐģĐž адĐŋŅ€Đ°ŅžĐģĐĩĐŊа ĐŊа Đ˛Đ°ŅˆŅƒ ĐŋҀҋĐģĐ°Đ´Ņƒ." }, "loginInitiated": { - "message": "Login initiated" + "message": "ІĐŊŅ–Ņ†Ņ‹ŅĐ˛Đ°ĐŊŅ‹ ŅžĐ˛Đ°Ņ…ĐžĐ´" }, "exposedMasterPassword": { "message": "ĐĄĐēаĐŧĐŋŅ€Đ°ĐŧĐĩŅ‚Đ°Đ˛Đ°ĐŊŅ‹ Đ°ŅĐŊĐžŅžĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ" @@ -2192,7 +3196,7 @@ "message": "Đ¯Đē Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐžŅžĐŊŅ–Ņ†ŅŒ" }, "autofillSelectInfoWithCommand": { - "message": "Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа ĐŗŅŅ‚Đ°Đš ŅŅ‚Đ°Ņ€ĐžĐŊ҆ҋ айО ҁĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐšŅ†ĐĩŅŅ ҁĐŋаĐģŅƒŅ‡ŅĐŊĐŊĐĩĐŧ ĐēĐģĐ°Đ˛Ņ–Ņˆ: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа ĐŗŅŅ‚Đ°Đš ŅŅ‚Đ°Ņ€ĐžĐŊ҆ҋ айО ĐˇĐ°Đ´Đ°ĐšŅ†Đĩ ҁĐŋаĐģŅƒŅ‡ŅĐŊĐŊĐĩ ĐēĐģĐ°Đ˛Ņ–Ņˆ ҃ ĐŊаĐģĐ°Đ´Đ°Ņ…." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Đ—Ņ€Đ°ĐˇŅƒĐŧĐĩĐģа" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "НаĐģĐ°Đ´Ņ‹ Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊŅ" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "ĐĄĐŋаĐģŅƒŅ‡ŅĐŊĐŊŅ– ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊŅ" }, - "autofillShortcutNotSet": { - "message": "ĐĄĐŋаĐģŅƒŅ‡ŅĐŊĐŊŅ– ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊŅ ĐŊĐĩ СададСĐĩĐŊŅ‹. ЗĐŧŅĐŊҖ҆Đĩ ĐŗŅŅ‚Đ° Ņž ĐŊаĐģĐ°Đ´Đ°Ņ… ĐąŅ€Đ°ŅžĐˇĐĩŅ€Đ°." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "ĐĄĐŋаĐģŅƒŅ‡ŅĐŊĐŊŅ– ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊŅ: $COMMAND$. ЗĐŧŅĐŊҖ҆Đĩ ĐŗŅŅ‚Đ° Ņž ĐŊаĐģĐ°Đ´Đ°Ņ… ĐąŅ€Đ°ŅžĐˇĐĩŅ€Đ°.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,26 +3246,23 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "АдĐēŅ€Ņ‹Đ˛Đ°Ņ†ŅŒ ҃ ĐŊĐžĐ˛Ņ‹Đŧ аĐēĐŊĐĩ" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "ĐŸĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩŅ†Ņ†Đ° ŅžŅ…Đ˛Đ°ĐģĐĩĐŊĐŊĐĩ ĐŋҀҋĐģĐ°Đ´Ņ‹. Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ŅžŅ…Đ˛Đ°ĐģĐĩĐŊĐŊŅ ĐŊŅ–ĐļŅĐš:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "ЗаĐŋĐžĐŧĐŊŅ–Ņ†ŅŒ ĐŗŅŅ‚Ņƒ ĐŋҀҋĐģĐ°Đ´Ņƒ" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "Đ—Đ´Ņ‹ĐŧҖ҆Đĩ ĐŋаСĐŊаĐē҃, ĐēаĐģŅ– Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Đĩ҆Đĩ Đ°ĐŗŅƒĐģҌĐŊĐ°Đ´Đ°ŅŅ‚ŅƒĐŋĐŊŅƒŅŽ ĐŋҀҋĐģĐ°Đ´Ņƒ" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "ĐŖŅ…Đ˛Đ°ĐģŅ–Ņ†ŅŒ С Ņ–ĐŊŅˆĐ°Đš Đ˛Đ°ŅˆĐ°Đš ĐŋҀҋĐģĐ°Đ´Ņ‹" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "ЗаĐŋŅ‹Ņ‚Đ°Ņ†ŅŒ ŅƒŅ…Đ˛Đ°ĐģĐĩĐŊĐŊĐĩ адĐŧŅ–ĐŊŅ–ŅŅ‚Ņ€Đ°Ņ‚Đ°Ņ€Đ°" }, "approveWithMasterPassword": { "message": "Approve with master password" @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { - "message": "EU", + "message": "ЕС", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Đ”ĐžŅŅ‚ŅƒĐŋ ĐˇĐ°ĐąĐ°Ņ€ĐžĐŊĐĩĐŊŅ‹. ĐŖ Đ˛Đ°Ņ ĐŊĐĩ Đ´Đ°ŅŅ‚Đ°Ņ‚ĐēОва ĐŋŅ€Đ°Đ˛ĐžŅž Đ´ĐģŅ ĐŋŅ€Đ°ĐŗĐģŅĐ´Ņƒ ĐŗŅŅ‚Đ°Đš ŅŅ‚Đ°Ņ€ĐžĐŊĐēŅ–." }, @@ -2280,40 +3305,48 @@ "message": "АдĐģŅŽŅŅ‚Ņ€Đ°Đ˛Đ°ĐŊĐŊĐĩ" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "ĐŖĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ ĐŋĐ°ŅĐŋŅŅ…ĐžĐ˛Đ° ŅŅ‚Đ˛ĐžŅ€Đ°ĐŊŅ‹!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "ĐŸĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩŅ†Ņ†Đ° ŅžŅ…Đ˛Đ°ĐģĐĩĐŊĐŊĐĩ адĐŧŅ–ĐŊŅ–ŅŅ‚Ņ€Đ°Ņ‚Đ°Ņ€Đ°" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Đ’Đ°Ņˆ СаĐŋҋ҂ адĐŋŅ€Đ°ŅžĐģĐĩĐŊŅ‹ адĐŧŅ–ĐŊŅ–ŅŅ‚Ņ€Đ°Ņ‚Đ°Ņ€Ņƒ." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "Đ’Ņ‹ Đ°Ņ‚Ņ€Ņ‹ĐŧаĐĩ҆Đĩ аĐŋĐ°Đ˛ŅŅˆŅ‡ŅĐŊĐŊŅ ĐŋĐ°ŅĐģŅ ŅĐŗĐž ŅžŅ…Đ˛Đ°ĐģĐĩĐŊĐŊŅ." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "ĐŸŅ€Đ°ĐąĐģĐĩĐŧŅ‹ С ŅƒĐ˛Đ°Ņ…ĐžĐ´Đ°Đŧ?" }, "loginApproved": { - "message": "Login approved" + "message": "ĐŖĐ˛Đ°Ņ…ĐžĐ´ ŅƒŅ…Đ˛Đ°ĐģĐĩĐŊŅ‹" }, "userEmailMissing": { - "message": "User email missing" + "message": "ĐĐ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°Đĩ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐ°Ņ ĐŋĐžŅˆŅ‚Đ° ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа" }, "deviceTrusted": { - "message": "Device trusted" + "message": "ДавĐĩŅ€Đ°ĐŊĐ°Ņ ĐŋҀҋĐģада" + }, + "sendsNoItemsTitle": { + "message": "ĐŅĐŧа аĐēŅ‚Ņ‹ŅžĐŊҋ҅ Send'Đ°Ņž", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐšŅ†Đĩ Send'Ņ‹, Đēай ĐąŅŅĐŋĐĩ҇ĐŊа Đ°ĐąĐ°ĐŗŅƒĐģŅŅ†ŅŒ ĐˇĐ°ŅˆŅ‹Ņ„Ņ€Đ°Đ˛Đ°ĐŊŅƒŅŽ Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹ŅŽ С Ņ–ĐŊŅˆŅ‹ĐŧŅ–.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "НĐĩĐ°ĐąŅ…ĐžĐ´ĐŊŅ‹ ŅžĐ˛ĐžĐ´ даĐŊҋ҅." }, "required": { - "message": "required" + "message": "ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩŅ†Ņ†Đ°" }, "search": { - "message": "Search" + "message": "ĐŸĐžŅˆŅƒĐē" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "Đ”Đ°ŅžĐļŅ‹ĐŊŅ ŅžĐ˛ĐĩдСĐĩĐŊҋ҅ даĐŊҋ҅ ĐŋĐ°Đ˛Ņ–ĐŊĐŊа ҁĐēĐģĐ°Đ´Đ°Ņ†ŅŒ ĐŋҀҋĐŊаĐŧҁҖ $COUNT$ ҁҖĐŧв.", "placeholders": { "count": { "content": "$1", @@ -2322,7 +3355,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "Đ”Đ°ŅžĐļŅ‹ĐŊŅ ŅžĐ˛ĐĩдСĐĩĐŊҋ҅ даĐŊҋ҅ ĐŊĐĩ ĐŧĐžĐļа ĐŋĐĩŅ€Đ°Đ˛Ņ‹ŅˆĐ°Ņ†ŅŒ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅƒŅŽ ĐēĐžĐģҌĐēĐ°ŅŅ†ŅŒ ҁҖĐŧваĐģĐ°Ņž: $COUNT$.", "placeholders": { "count": { "content": "$1", @@ -2331,7 +3364,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "ĐĐ°ŅŅ‚ŅƒĐŋĐŊŅ‹Ņ ҁҖĐŧваĐģŅ‹ ĐˇĐ°ĐąĐ°Ņ€ĐžĐŊĐĩĐŊŅ‹: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊĐ°Ņ Đ´Đ°ŅžĐļŅ‹ĐŊŅ ҁҖĐŧваĐģĐ°Ņž СĐŊĐ°Ņ‡ŅĐŊĐŊŅ, ŅĐēĐžĐĩ ĐąŅƒĐ´ĐˇĐĩ ŅžĐ˛ĐžĐ´ĐˇŅ–Ņ†Ņ†Đ°: $MIN$.", "placeholders": { "min": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "МаĐēҁҖĐŧаĐģҌĐŊĐ°Ņ Đ´Đ°ŅžĐļŅ‹ĐŊŅ ҁҖĐŧваĐģĐ°Ņž СĐŊĐ°Ņ‡ŅĐŊĐŊŅ, ŅĐēĐžĐĩ ĐąŅƒĐ´ĐˇĐĩ ŅžĐ˛ĐžĐ´ĐˇŅ–Ņ†Ņ†Đ°: $MAX$.", "placeholders": { "max": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "1 айО ĐŊĐĩĐēаĐģҌĐēŅ– Đ°Đ´Ņ€Đ°ŅĐžŅž ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹ С'ŅŅžĐģŅŅŽŅ†Ņ†Đ° ĐŋаĐŧŅ‹ĐģĐēĐžĐ˛Ņ‹ĐŧŅ–" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "ĐŖĐ˛ĐĩдСĐĩĐŊаĐĩ СĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ ĐŊĐĩ ĐŋĐ°Đ˛Ņ–ĐŊĐŊа СĐŧŅŅˆŅ‡Đ°Ņ†ŅŒ Ņ‚ĐžĐģҌĐēŅ– ĐŋŅ€Đ°ĐąĐĩĐģŅ‹.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "ĐŖĐ˛ĐĩдСĐĩĐŊŅ‹Ņ даĐŊŅ‹Ņ ĐŊĐĩ С'ŅŅžĐģŅŅŽŅ†Ņ†Đ° Đ°Đ´Ņ€Đ°ŅĐ°Đŧ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊаК ĐŋĐžŅˆŅ‚Ņ‹." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "КоĐģҌĐēĐ°ŅŅ†ŅŒ ĐŋаĐģŅ‘Ņž, ŅĐēŅ–Ņ ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒŅŽŅ†ŅŒ Đ˛Đ°ŅˆĐ°Đš ŅƒĐ˛Đ°ĐŗŅ–: $COUNT$.", "placeholders": { "count": { "content": "$1", @@ -2376,23 +3409,35 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 ĐŋĐžĐģĐĩ ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒĐĩ Đ˛Đ°ŅˆĐ°Đš ŅƒĐ˛Đ°ĐŗŅ–." + }, + "multipleFieldsNeedAttention": { + "message": "КоĐģҌĐēĐ°ŅŅ†ŅŒ ĐŋаĐģŅ‘Ņž, ŅĐēŅ–Ņ ĐŋĐ°Ņ‚Ņ€Đ°ĐąŅƒŅŽŅ†ŅŒ Đ˛Đ°ŅˆĐ°Đš ŅƒĐ˛Đ°ĐŗŅ–: $COUNT$.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Đ’Ņ‹ĐąŅ€Đ°Ņ†ŅŒ --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "- ĐŖĐ˛ŅĐ´ĐˇŅ–Ņ†Đĩ Đ´ĐģŅ ҄ҖĐģŅŒŅ‚Ņ€Đ°Ņ†Ņ‹Ņ– -" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "ĐŅ‚Ņ€Ņ‹ĐŧаĐŊĐŊĐĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°Ņž..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚Đ°Ņž ĐŊĐĩ СĐŊОКдСĐĩĐŊа" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "ĐŅ‡Ņ‹ŅŅ†Ņ–Ņ†ŅŒ ŅƒŅŅ‘" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ ŅŅˆŅ‡Ņ $QUANTITY$", "placeholders": { "quantity": { "content": "$1", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "ПадĐŧĐĩĐŊŅŽ" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Đ—ĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ/Đ Đ°ĐˇĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ІĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "ДаĐŊŅ‹Ņ ĐŋĐ°ŅĐŋŅŅ…ĐžĐ˛Đ° Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊŅ‹!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "ĐœŅĐŊ҃҈Đēа даĐŧĐĩĐŊа" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "ПĐĩŅ€Đ°ĐšŅŅ†Ņ– да СĐŧĐĩŅŅ†Ņ–Đ˛Đ°" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "МĐĩĐŊŅŽ Đ°ŅžŅ‚Đ°ĐˇĐ°ĐŋĐ°ŅžĐŊĐĩĐŊĐŊŅ Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "ĐŅĐŧа ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Ņž Đ´ĐģŅ ĐŋаĐēĐ°ĐˇŅƒ", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "ĐĐžĐ˛Ņ‹ ŅĐģĐĩĐŧĐĩĐŊŅ‚", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "ĐĐžĐ˛Ņ‹ ĐģĐ°ĐŗŅ–ĐŊ", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ" + }, + "ignore": { + "message": "IĐŗĐŊĐ°Ņ€Đ°Đ˛Đ°Ņ†ŅŒ" + }, + "importData": { + "message": "ІĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ даĐŊҋ҅", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "ПаĐŧŅ‹ĐģĐēа Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "АĐŋŅ–ŅĐ°ĐŊĐŊĐĩ" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "ĐŸĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ СĐŊĐžŅž" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Đ—Đ°Đ´Đ°Ņ†ŅŒ PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "ĐŖĐ˛Đĩҁ҆Җ PIN-ĐēОд" + }, + "useBiometrics": { + "message": "Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ ĐąŅ–ŅĐŧĐĩŅ‚Ņ€Ņ‹ŅŽ" + }, + "enterVerificationCodeSentToEmail": { + "message": "ĐŖĐ˛ŅĐ´ĐˇŅ–Ņ†Đĩ ĐŋŅ€Đ°Đ˛ĐĩŅ€Đ°Ņ‡ĐŊŅ‹ ĐēОд, ŅĐēŅ– ĐąŅ‹Ņž адĐŋŅ€Đ°ŅžĐģĐĩĐŊŅ‹ ĐŊа Đ˛Đ°ŅˆŅƒ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊŅƒŅŽ ĐŋĐžŅˆŅ‚Ņƒ." + }, + "resendCode": { + "message": "АдĐŋŅ€Đ°Đ˛Ņ–Ņ†ŅŒ ĐēОд ŅŅˆŅ‡Ņ Ņ€Đ°Đˇ" + }, + "total": { + "message": "ĐŖŅŅĐŗĐž" + }, + "importWarning": { + "message": "Đ’Ņ‹ Ņ–ĐŧĐŋĐ°Ņ€Ņ‚ŅƒĐĩ҆Đĩ даĐŊŅ‹Ņ Ņž $ORGANIZATION$. Đ’Đ°ŅˆŅ‹ даĐŊŅ‹Ņ ĐŧĐžĐŗŅƒŅ†ŅŒ ĐąŅ‹Ņ†ŅŒ Đ°ĐąĐ°ĐŗŅƒĐģĐĩĐŊŅ‹ С ŅƒĐ´ĐˇĐĩĐģҌĐŊŅ–ĐēаĐŧŅ– Đ°Ņ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ‹Ņ–. Đ’Ņ‹ ŅĐ°ĐŋŅ€Đ°ŅžĐ´Ņ‹ Ņ…ĐžŅ‡Đ°Ņ†Đĩ ĐŋŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "ДаĐŊŅ‹Ņ ĐŊŅĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊа Đ°Đ´Ņ„Đ°Ņ€ĐŧĐ°Ņ‚Đ°Đ˛Đ°ĐŊŅ‹Ņ. КаĐģŅ– ĐģĐ°ŅĐēа, ĐŋŅ€Đ°Đ˛ĐĩҀ҆Đĩ Ņ„Đ°ĐšĐģ Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Ņƒ Ņ– ĐŋĐ°ŅĐŋŅ€Đ°ĐąŅƒĐšŅ†Đĩ ŅŅˆŅ‡Ņ Ņ€Đ°Đˇ." + }, + "importNothingError": { + "message": "ĐŅ–Ņ‡ĐžĐŗĐ° ĐŊĐĩ ĐąŅ‹ĐģĐž Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊа." + }, + "importEncKeyError": { + "message": "ПаĐŧŅ‹ĐģĐēа Đ´ŅŅˆŅ‹Ņ„Ņ€ĐžŅžĐēŅ– ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐ°ĐŗĐ° Ņ„Đ°ĐšĐģа. Đ’Đ°Ņˆ ĐēĐģŅŽŅ‡ ŅˆŅ‹Ņ„Ņ€Đ°Đ˛Đ°ĐŊĐŊŅ ĐŊĐĩ ҁ҃ĐŋадаĐĩ С ĐēĐģŅŽŅ‡ĐžĐŧ ŅˆŅ‹Ņ„Ņ€Đ°Đ˛Đ°ĐŊĐŊŅ, ŅĐēŅ– Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐĩŅ†Ņ†Đ° Đ´ĐģŅ ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ даĐŊҋ҅." + }, + "invalidFilePassword": { + "message": "ПаĐŧŅ‹ĐģĐēĐžĐ˛Ņ‹ ĐŋĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģа. ĐĄĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐšŅ†ĐĩŅŅ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ, ŅĐēŅ– Đ˛Ņ‹ ŅžĐ˛ĐžĐ´ĐˇŅ–ĐģŅ– ĐŋҀҋ ŅŅ‚Đ˛Đ°Ņ€ŅĐŊĐŊŅ– Ņ„Đ°ĐšĐģа ŅĐēҁĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ." + }, + "destination": { + "message": "ĐŸŅ€Ņ‹ĐˇĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ" + }, + "learnAboutImportOptions": { + "message": "ДавĐĩĐ´Đ°Ņ†Ņ†Đ° ĐŋŅ€Đ° ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ" + }, + "selectImportFolder": { + "message": "Đ’Ņ‹ĐąŅ€Đ°Ņ†ŅŒ ĐŋаĐŋĐē҃" + }, + "selectImportCollection": { + "message": "Đ’Ņ‹ĐąŅ€Đ°Ņ†ŅŒ ĐēаĐģĐĩĐēŅ†Ņ‹ŅŽ" + }, + "importTargetHint": { + "message": "Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ ĐŗŅŅ‚Ņ‹ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ, ĐēаĐģŅ– Đ˛Ņ‹ Ņ…ĐžŅ‡Đ°Ņ†Đĩ, Đēай СĐŧĐĩŅŅ†Ņ–Đ˛Đ° Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐ°ĐŗĐ° Ņ„Đ°ĐšĐģа ĐąŅ‹ĐģĐž ĐŋĐĩŅ€Đ°ĐŧĐĩŅˆŅ‡Đ°ĐŊĐ°ĐŗĐ° Ņž $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "ФаКĐģ СĐŧŅŅˆŅ‡Đ°Đĩ ĐŊĐĩĐŋадĐŋŅ–ŅĐ°ĐŊŅ‹Ņ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ." + }, + "selectFormat": { + "message": "Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ Ņ„Đ°Ņ€ĐŧĐ°Ņ‚ Ņ„Đ°ĐšĐģа Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ" + }, + "selectImportFile": { + "message": "Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ Ņ„Đ°ĐšĐģ Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ" + }, + "chooseFile": { + "message": "Đ’Ņ‹ĐąŅ€Đ°Ņ†ŅŒ Ņ„Đ°ĐšĐģ" + }, + "noFileChosen": { + "message": "ФаКĐģ ĐŊĐĩ Đ˛Ņ‹ĐąŅ€Đ°ĐŊŅ‹" + }, + "orCopyPasteFileContents": { + "message": "айО ҁĐēаĐŋŅ–ŅŽĐšŅ†Đĩ/ŅƒŅŅ‚Đ°ŅžŅ†Đĩ СĐŧĐĩŅŅ†Ņ–Đ˛Đ° Ņ„Đ°ĐšĐģа, ŅĐēŅ– Ņ–ĐŧĐŋĐ°Ņ€Ņ‚ŅƒĐĩŅ†Ņ†Đ°" + }, + "instructionsFor": { + "message": "ІĐŊŅŅ‚Ņ€ŅƒĐē҆ҋҖ Đ´ĐģŅ $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "ĐŸĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐˇŅ–Ņ†ŅŒ Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊĐĩ ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ°" + }, + "confirmVaultImportDesc": { + "message": "Đ“ŅŅ‚Ņ‹ Ņ„Đ°ĐšĐģ Đ°ĐąĐ°Ņ€ĐžĐŊĐĩĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ. КаĐģŅ– ĐģĐ°ŅĐēа, ŅƒĐ˛ŅĐ´ĐˇŅ–Ņ†Đĩ ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°ĐŊĐŊŅ даĐŊҋ҅." + }, + "confirmFilePassword": { + "message": "ĐŸĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐˇŅ–Ņ†ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģа" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "КĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "ĐŸĐ°Ņ†Đ˛ĐĩŅ€Đ´ĐˇŅ–Ņ†ŅŒ" + }, + "savePasskey": { + "message": "Đ—Đ°Ņ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "ПĐĩŅ€Đ°ĐˇĐ°ĐŋŅ–ŅĐ°Ņ†ŅŒ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "ĐŅĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊŅ‹ ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "incorrectCode": { + "message": "ĐŅĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊŅ‹ ĐēОд" + }, + "incorrectPin": { + "message": "ĐŅĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊŅ‹ PIN-ĐēОд" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Код Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "ІĐŧĐŋĐ°Ņ€Ņ‚Đ°Đ˛Đ°Ņ†ŅŒ С CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "КаĐģĐĩĐēŅ†Ņ‹Ņ" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "ЗĐŧŅĐŊŅ–Ņ†ŅŒ ҃ĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Đ”Đ°ŅŅĐŗĐŊŅƒŅ‚Đ° айĐŧĐĩĐļаваĐŊĐŊĐĩ ŅžĐģŅ–ĐēĐžĐ˛Đ°ĐŗĐ° СаĐŋŅ–ŅŅƒ. Đ’Ņ‹ĐšĐ´ĐˇŅ–Ņ†Đĩ, Đēай Đ´Đ°Đ´Đ°Ņ†ŅŒ Ņ–ĐŊŅˆŅ‹ ŅžĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ." + }, + "active": { + "message": "аĐēŅ‚Ņ‹ŅžĐŊŅ‹" + }, + "locked": { + "message": "СайĐģаĐēŅ–Ņ€Đ°Đ˛Đ°ĐŊа" + }, + "unlocked": { + "message": "Ņ€Đ°ĐˇĐąĐģаĐēаваĐŊа" + }, + "server": { + "message": "ҁĐĩŅ€Đ˛ĐĩŅ€" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Đ—Ņ€Đ°ĐąŅ–Ņ†ŅŒ ĐŋŅ€Đ°Đ´Đ˛Ņ‹ĐˇĐŊĐ°Ņ‡Đ°ĐŊŅ‹Đŧ", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ ĐˇĐ°Ņ…Đ°Đ˛Đ°ĐŊŅ‹!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ айĐŊĐžŅžĐģĐĩĐŊŅ‹!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "ĐŸĐžŅĐŋĐĩŅ…" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Đ’Đ°ŅˆĐ° ŅŅ…ĐžĐ˛Ņ–ŅˆŅ‡Đ° ĐŊŅ–Ņ‡ĐžĐŗĐ° ĐŊĐĩ СĐŧŅŅˆŅ‡Đ°Đĩ" + }, + "noItemsMatchSearch": { + "message": "ĐŸĐžŅˆŅƒĐē ĐŊĐĩ Đ´Đ°Ņž Đ˛Ņ‹ĐŊŅ–ĐēĐ°Ņž" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊŅƒŅŽ ĐŋĐžŅˆŅ‚Ņƒ" + }, + "copyPhone": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ Ņ‚ŅĐģĐĩŅ„ĐžĐŊ" + }, + "copyAddress": { + "message": "ĐĄĐēаĐŋŅ–ŅĐ˛Đ°Ņ†ŅŒ Đ°Đ´Ņ€Đ°Ņ" + }, + "adminConsole": { + "message": "КаĐŊŅĐžĐģҌ адĐŧŅ–ĐŊŅ–ŅŅ‚Ņ€Đ°Ņ‚Đ°Ņ€Đ°" + }, + "accountSecurity": { + "message": "Đ‘ŅŅĐŋĐĩĐēĐĩ аĐēĐ°ŅžĐŊŅ‚Đ°" + }, + "notifications": { + "message": "АĐŋĐ°Đ˛ŅŅˆŅ‡ŅĐŊĐŊŅ–" + }, + "appearance": { + "message": "ЗĐŊĐĩ҈ĐŊŅ– Đ˛Ņ‹ĐŗĐģŅĐ´" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "ĐĐžĐ˛Ņ‹" + }, + "removeItem": { + "message": "Đ’Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ ĐąĐĩС ĐŋаĐŋĐēŅ–" + }, + "itemDetails": { + "message": "ĐŸĐ°Đ´Ņ€Đ°ĐąŅĐˇĐŊĐ°ŅŅ†Ņ– ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "itemName": { + "message": "Назва ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "ĐŖĐģадаĐģҌĐŊŅ–Đē" + }, + "selfOwnershipLabel": { + "message": "Đ’Ņ‹", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Đ”Đ°Đ´Đ°Ņ‚ĐēĐžĐ˛Đ°Ņ Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹Ņ" + }, + "itemHistory": { + "message": "Đ“Ņ–ŅŅ‚ĐžŅ€Ņ‹Ņ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "ĐŖĐģадаĐģҌĐŊŅ–Đē: Đ’Ņ‹" + }, + "linked": { + "message": "Đ—Đ˛ŅĐˇĐ°ĐŊа" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "ЗаĐŋаĐŧĐŋĐ°Đ˛Đ°Ņ†ŅŒ" + }, + "addAttachment": { + "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ҃ĐēĐģадаĐŊĐŊĐĩ" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "ĐŸĐ°Đ´Ņ€Đ°ĐąŅĐˇĐŊĐ°ŅŅ†Ņ– ĐēĐ°Ņ€Ņ‚ĐēŅ–" + }, + "cardBrandDetails": { + "message": "ĐŸĐ°Đ´Ņ€Đ°ĐąŅĐˇĐŊĐ°ŅŅ†Ņ– $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ аĐŊŅ–ĐŧĐ°Ņ†Ņ‹Ņ–" + }, + "showAnimations": { + "message": "ПаĐēĐ°ĐˇĐ°Ņ†ŅŒ аĐŊŅ–ĐŧĐ°Ņ†Ņ‹Ņ–" + }, + "addAccount": { + "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ҃ĐģŅ–ĐēĐžĐ˛Ņ‹ СаĐŋҖҁ" + }, + "loading": { + "message": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēа" + }, + "data": { + "message": "ДаĐŊŅ‹Ņ" + }, + "passkeys": { + "message": "КĐģŅŽŅ‡Ņ‹ Đ´ĐžŅŅ‚ŅƒĐŋ҃", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "ĐŸĐ°Ņ€ĐžĐģŅ–", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "ĐŸŅ€Ņ‹ĐˇĐŊĐ°Ņ‡Ņ‹Ņ†ŅŒ" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐŋĐžĐģĐĩ" + }, + "add": { + "message": "Đ”Đ°Đ´Đ°Ņ†ŅŒ" + }, + "fieldType": { + "message": "ĐĸŅ‹Đŋ ĐŋĐžĐģŅ" + }, + "fieldLabel": { + "message": "Назва ĐŋĐžĐģŅ" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Đ ŅĐ´Đ°ĐŗĐ°Đ˛Đ°Ņ†ŅŒ ĐŋĐžĐģĐĩ" + }, + "editFieldLabel": { + "message": "Đ ŅĐ´Đ°ĐŗĐ°Đ˛Đ°Ņ†ŅŒ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Đ’Ņ‹Đ´Đ°ĐģŅ–ŅŅŒ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "Đ’Ņ‹ ĐŋаĐē҃ĐģҌ ĐŊŅ–Ņ‡ĐžĐŗĐ° ĐŊĐĩ Đ˛Ņ‹ĐąŅ€Đ°ĐģŅ–." + }, + "movedItemsToOrg": { + "message": "Đ’Ņ‹ĐąŅ€Đ°ĐŊŅ‹Ņ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ ĐŋĐĩŅ€Đ°ĐŧĐĩŅˆŅ‡Đ°ĐŊŅ‹ Ņž $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 0bd4ba3b7f9..5a0854b8a7c 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -3,21 +3,39 @@ "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ (Bitwarden)" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden — ҃ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģ ĐŊа ĐŋĐ°Ņ€ĐžĐģи", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "БĐĩСОĐŋĐ°ŅĐŊĐž и ĐąĐĩСĐŋĐģĐ°Ņ‚ĐŊĐž ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ Са Đ˛ŅĐ¸Ņ‡ĐēĐ¸Ņ‚Đĩ ви ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°.", - "description": "Extension description" + "message": "ĐŖ Đ´ĐžĐŧа, ĐŊа Ņ€Đ°ĐąĐžŅ‚Đ° иĐģи ĐŊа ĐŋŅŠŅ‚ – Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ°Đ˛Đ° Đ˛ŅĐ¸Ņ‡Đēи Đ’Đ°ŅˆĐ¸ ĐŋĐ°Ņ€ĐžĐģи, ҁĐĩĐēŅ€ĐĩŅ‚ĐŊи ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ и ĐģĐ¸Ņ‡ĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ВĐŋĐ¸ŅˆĐĩŅ‚Đĩ ҁĐĩ иĐģи ŅŅŠĐˇĐ´Đ°ĐšŅ‚Đĩ ĐŊОв айОĐŊаĐŧĐĩĐŊŅ‚, Са да Đ´ĐžŅŅ‚ŅŠĐŋĐ¸Ņ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊ ҂ҀĐĩĐˇĐžŅ€." }, - "createAccount": { - "message": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа айОĐŊаĐŧĐĩĐŊŅ‚" + "inviteAccepted": { + "message": "ПоĐēаĐŊĐ°Ņ‚Đ° Đĩ ĐŋŅ€Đ¸ĐĩŅ‚Đ°" }, - "login": { - "message": "ВĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ" + "createAccount": { + "message": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа аĐēĐ°ŅƒĐŊŅ‚" + }, + "newToBitwarden": { + "message": "За ĐŋŅ€ŅŠĐ˛ ĐŋŅŠŅ‚ Đģи ĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ?" + }, + "logInWithPasskey": { + "message": "ВĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ҁҊҁ ҁĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡" + }, + "useSingleSignOn": { + "message": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊа идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ" + }, + "welcomeBack": { + "message": "Đ”ĐžĐąŅ€Đĩ Đ´ĐžŅˆĐģи ĐžŅ‚ĐŊОвО" + }, + "setAStrongPassword": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ҁĐģĐžĐļĐŊа ĐŋĐ°Ņ€ĐžĐģа" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Đ—Đ°Đ˛ŅŠŅ€ŅˆĐĩŅ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸ ĐēĐ°Ņ‚Đž СададĐĩŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģа" }, "enterpriseSingleSignOn": { "message": "ЕдĐŊĐžĐēŅ€Đ°Ņ‚ĐŊа идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ (SSO)" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "АĐēĐž ҁ҂Đĩ ĐˇĐ°ĐąŅ€Đ°Đ˛Đ¸Đģи ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа, Ņ‚Đž ĐŋĐžĐ´ŅĐēаСваĐŊĐĩŅ‚Đž ĐŧĐžĐļĐĩ да ви ĐŋĐžĐŧĐžĐŗĐŊĐĩ да ŅĐ¸ Ņ ĐŋŅ€Đ¸ĐŋĐžĐŧĐŊĐ¸Ņ‚Đĩ." }, + "masterPassHintText": { + "message": "АĐēĐž ĐˇĐ°ĐąŅ€Đ°Đ˛Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ŅĐ¸, ĐŋĐžĐ´ŅĐēаСĐēĐ°Ņ‚Đ° ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ иСĐŋŅ€Đ°Ņ‚ĐĩĐŊа ĐŊа Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ° Ви. $CURRENT$/$MAXIMUM$ ĐŧаĐēŅĐ¸ĐŧаĐģĐĩĐŊ ĐąŅ€ĐžĐš СĐŊĐ°Ņ†Đ¸.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐŋаĐē ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа" }, "masterPassHint": { "message": "ĐŸĐžĐ´ŅĐēаСваĐŊĐĩ Са ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа (ĐŋĐž Đ¸ĐˇĐąĐžŅ€)" }, + "joinOrganization": { + "message": "ĐŸŅ€Đ¸ŅŅŠĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ ĐēҊĐŧ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "joinOrganizationName": { + "message": "ĐŸŅ€Đ¸ŅŅŠĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ ĐēҊĐŧ $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Đ—Đ°Đ˛ŅŠŅ€ŅˆĐĩŅ‚Đĩ ĐŋŅ€Đ¸ŅŅŠĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩŅ‚Đž ŅĐ¸ ĐēҊĐŧ Ņ‚Đ°ĐˇĐ¸ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ ĐēĐ°Ņ‚Đž СададĐĩŅ‚Đĩ ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа." + }, "tab": { "message": "РаСдĐĩĐģ" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°" }, + "copyPassphrase": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°-Ņ„Ņ€Đ°ĐˇĐ°" + }, "copyNote": { "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐĩĐģĐĩĐļĐēĐ°Ņ‚Đ°" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐēОда Са ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚" }, + "copyName": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа иĐŧĐĩŅ‚Đž" + }, + "copyCompany": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐēĐžĐŧĐŋаĐŊĐ¸ŅŅ‚Đ°" + }, + "copySSN": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ĐžŅĐ¸ĐŗŅƒŅ€ĐžĐ˛ĐēĐ°Ņ‚Đ°" + }, + "copyPassportNumber": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ĐŋĐ°ŅĐŋĐžŅ€Ņ‚Đ°" + }, + "copyLicenseNumber": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅĐ˛Đ¸Đ´ĐĩŅ‚ĐĩĐģŅŅ‚Đ˛ĐžŅ‚Đž" + }, + "copyPrivateKey": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ‡Đ°ŅŅ‚ĐŊĐ¸Ņ ĐēĐģŅŽŅ‡" + }, + "copyPublicKey": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊĐ¸Ņ ĐēĐģŅŽŅ‡" + }, + "copyFingerprint": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚ŅŠĐēа" + }, + "copyCustomField": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ°" + }, + "copyNotes": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐĩĐģĐĩĐļĐēĐ¸Ņ‚Đĩ" + }, + "fill": { + "message": "ПоĐŋҊĐģваĐŊĐĩ", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ´ĐžĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ" }, + "autoFillLogin": { + "message": "ĐĐ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа даĐŊĐŊи Са Đ˛Ņ…ĐžĐ´" + }, + "autoFillCard": { + "message": "ХаĐŧĐžĐŋĐžĐŋҊĐģĐ˛Đ°Ņ‰Đ° ҁĐĩ ĐēĐ°Ņ€Ņ‚Đ°" + }, + "autoFillIdentity": { + "message": "ХаĐŧĐžĐŋĐžĐŋҊĐģĐ˛Đ°Ņ‰Đ° ҁĐĩ ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚" + }, "generatePasswordCopied": { "message": "ГĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа (ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊа)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "ĐŅĐŧа ŅŅŠĐ˛ĐŋĐ°Đ´Đ°Ņ‰Đ¸ СаĐŋĐ¸ŅĐ¸." }, + "noCards": { + "message": "ĐŅĐŧа ĐēĐ°Ņ€Ņ‚Đ¸" + }, + "noIdentities": { + "message": "ĐŅĐŧа ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Đ¸" + }, + "addLoginMenu": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа СаĐŋĐ¸Ņ Са Đ˛Ņ…ĐžĐ´" + }, + "addCardMenu": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐēĐ°Ņ€Ņ‚Đ°" + }, + "addIdentityMenu": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚" + }, "unlockVaultMenu": { "message": "ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ ҂ҀĐĩĐˇĐžŅ€Đ° ŅĐ¸" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚" }, + "accountEmail": { + "message": "Е-ĐŋĐžŅ‰Đ° ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "requestHint": { + "message": "Đ—Đ°ŅĐ˛Đēа Са ĐŋĐžĐ´ŅĐēаСĐēа" + }, + "requestPasswordHint": { + "message": "Đ—Đ°ŅĐ˛Đēа Са ĐŋĐžĐ´ŅĐēаСĐēа Са ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ° ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸ и ĐŋĐžĐ´ŅĐēаСĐēĐ°Ņ‚Đ° Са ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ҉Đĩ Ви ĐąŅŠĐ´Đĩ иСĐŋŅ€Đ°Ņ‚ĐĩĐŊа" + }, "passwordHint": { "message": "ĐŸĐžĐ´ŅĐēаСĐēа Са ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€Đ´ĐĩŅ‚Đĩ ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Ņ‚Đ° ŅĐ¸, Са да ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚Đĩ." }, - "account": { - "message": "Đ ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ" - }, "changeMasterPassword": { "message": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа" }, + "continueToWebApp": { + "message": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļаваĐŊĐĩ ĐēҊĐŧ ҃ĐĩĐą ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž?" + }, + "continueToWebAppDesc": { + "message": "Đ Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ ĐžŅ‰Đĩ ĐžŅ‚ Đ˛ŅŠĐˇĐŧĐžĐļĐŊĐžŅŅ‚Đ¸Ņ‚Đĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸ в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ в ҃ĐĩĐą ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž." + }, + "continueToHelpCenter": { + "message": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļаваĐŊĐĩ ĐēҊĐŧ ĐŋĐžĐŧĐžŅ‰ĐŊĐ¸Ņ ҆ĐĩĐŊŅ‚ŅŠŅ€?" + }, + "continueToHelpCenterDesc": { + "message": "ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ ĐžŅ‚ĐŊĐžŅĐŊĐž Ņ‚ĐžĐ˛Đ° ĐēаĐē да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ в ĐŋĐžĐŧĐžŅ‰ĐŊĐ¸Ņ ҆ĐĩĐŊŅ‚ŅŠŅ€." + }, + "continueToBrowserExtensionStore": { + "message": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļаваĐŊĐĩ ĐēҊĐŧ ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "ПоĐŧĐžĐŗĐŊĐĩŅ‚Đĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ‚Đĩ да Ņ€Đ°ĐˇĐąĐĩŅ€Đ°Ņ‚ даĐģи Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ Đĩ ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰ Са Ņ‚ŅŅ…. ĐŸĐžŅĐĩŅ‚ĐĩŅ‚Đĩ ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ° ŅĐ¸ и Đ´Đ°ĐšŅ‚Đĩ ĐžŅ†ĐĩĐŊĐēа ĐžŅ‰Đĩ ҁĐĩĐŗĐ°." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "МоĐļĐĩ да ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŗĐģавĐŊĐ°Ņ‚Đ° ŅĐ¸ ĐŋĐ°Ņ€ĐžĐģа в ҃ĐĩĐą ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ." + }, "fingerprintPhrase": { "message": "ĐŖĐŊиĐēаĐģĐŊа Ņ„Ņ€Đ°ĐˇĐ°", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ĐžŅ‚ĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ" }, + "aboutBitwarden": { + "message": "ĐžŅ‚ĐŊĐžŅĐŊĐž Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ" + }, "about": { "message": "ĐžŅ‚ĐŊĐžŅĐŊĐž" }, + "moreFromBitwarden": { + "message": "ĐžŅ‰Đĩ ĐžŅ‚ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ" + }, + "continueToBitwardenDotCom": { + "message": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļаваĐŊĐĩ ĐēҊĐŧ bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ Са йиСĐŊĐĩŅĐ°" + }, + "bitwardenAuthenticator": { + "message": "ĐŖĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ĐĩĐģ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ" + }, + "continueToAuthenticatorPageDesc": { + "message": "ĐŖĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ĐĩĐģŅ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ĐŋОСвОĐģŅĐ˛Đ° да СаĐŋĐ°ĐˇĐ˛Đ°Ņ‚Đĩ ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ, ĐēаĐēŅ‚Đž и да ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļĐ´Đ°Ņ‚Đĩ ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊи ĐēОдОвĐĩ Са Đ´ĐžŅŅ‚ŅŠĐŋ Са ĐŧĐĩŅŅ‚Đ°Ņ‚Đ°, ĐēŅŠĐ´ĐĩŅ‚Đž ҁĐĩ Đ¸ĐˇĐ¸ŅĐēва ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ в 2 ŅŅ‚ŅŠĐŋĐēи. ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ в ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа Ņ‚Đ°ĐšĐŊи" + }, + "continueToSecretsManagerPageDesc": { + "message": "ĐĄŅŠŅ…Ņ€Đ°ĐŊŅĐ˛Đ°ĐšŅ‚Đĩ, ҃ĐŋŅ€Đ°Đ˛ĐģŅĐ˛Đ°ĐšŅ‚Đĩ и ҁĐŋОдĐĩĐģŅĐšŅ‚Đĩ Ņ‚Đ°ĐšĐŊĐ¸Ņ‚Đĩ ĐŋĐž Đ˛Ņ€ĐĩĐŧĐĩ ĐŊа Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Đēа ҁ ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩŅ‚Đž ĐŊа Ņ‚Đ°ĐšĐŊи ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ. ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ в ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐģĐĩҁĐŊи Са ĐŋĐžĐģСваĐŊĐĩ, ĐŊĐž ĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊи ĐŋŅ€ĐžŅ†ĐĩŅĐ¸ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ĐąĐĩС ĐŊ҃Đļда ĐžŅ‚ Ņ‚Ņ€Đ°Đ´Đ¸Ņ†Đ¸ĐžĐŊĐŊи ĐŋĐ°Ņ€ĐžĐģи ҁ ĐŋĐžĐŧĐžŅ‰Ņ‚Đ° ĐŊа Passwordless.dev. ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ в ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "БĐĩСĐŋĐģĐ°Ņ‚ĐĩĐŊ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ Са ҁĐĩĐŧĐĩĐšŅŅ‚Đ˛Đ°" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "МоĐļĐĩ да ҁĐĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Ņ‚Đĩ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ Са ҁĐĩĐŧĐĩĐšŅŅ‚Đ˛Đ° ĐąĐĩСĐŋĐģĐ°Ņ‚ĐŊĐž. Đ’ŅŠĐˇĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ҁĐĩ ĐžŅ‚ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž в ҃ĐĩĐą ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž." + }, "version": { "message": "ВĐĩŅ€ŅĐ¸Ņ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋаĐŋĐēа" }, + "newFolder": { + "message": "Нова ĐŋаĐŋĐēа" + }, + "folderName": { + "message": "ИĐŧĐĩ ĐŊа ĐŋаĐŋĐēĐ°Ņ‚Đ°" + }, + "folderHintText": { + "message": "МоĐļĐĩŅ‚Đĩ да вĐģĐžĐļĐ¸Ņ‚Đĩ ĐĩĐ´ĐŊа ĐŋаĐŋĐēа в Đ´Ņ€ŅƒĐŗĐ° ĐēĐ°Ņ‚Đž Đ˛ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ иĐŧĐĩŅ‚Đž ĐŊа ĐŗĐžŅ€ĐŊĐ°Ņ‚Đ° ĐŋаĐŋĐēа, а ҁĐģĐĩĐ´ Ņ‚ĐžĐ˛Đ° „/“. ĐŸŅ€Đ¸ĐŧĐĩŅ€: ĐĄĐžŅ†Đ¸Đ°ĐģĐŊи/Đ¤ĐžŅ€ŅƒĐŧи" + }, + "noFoldersAdded": { + "message": "ĐŅĐŧа дОйавĐĩĐŊи ĐŋаĐŋĐēи" + }, + "createFoldersToOrganize": { + "message": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐŋаĐŋĐēи, Са да ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°Ņ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸Ņ‚Đĩ в ҂ҀĐĩĐˇĐžŅ€Đ° ŅĐ¸" + }, + "deleteFolderPermanently": { + "message": "ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да Đ¸ĐˇŅ‚Ņ€Đ¸ĐĩŅ‚Đĩ Ņ‚Đ°ĐˇĐ¸ ĐŋаĐŋĐēа ĐžĐēĐžĐŊŅ‡Đ°Ņ‚ĐĩĐģĐŊĐž?" + }, "deleteFolder": { "message": "Đ˜ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋаĐŋĐēа" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ŅĐ¸ĐģĐŊи и ĐŊĐĩĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Đŧи ĐŋĐ°Ņ€ĐžĐģи." }, - "bitWebVault": { - "message": "ĐŖĐĩĐąŅ‚Ņ€ĐĩĐˇĐžŅ€ŅŠŅ‚ ĐŊа Bitwarden" + "bitWebVaultApp": { + "message": "ĐŖĐĩĐą ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ" }, "importItems": { "message": "ВĐŊĐ°ŅŅĐŊĐĩ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸" @@ -233,7 +433,10 @@ "message": "Đ˜ĐˇĐąĐžŅ€" }, "generatePassword": { - "message": "ГĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа" + "message": "Нова ĐŋĐ°Ņ€ĐžĐģа" + }, + "generatePassphrase": { + "message": "ГĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа-Ņ„Ņ€Đ°ĐˇĐ°" }, "regeneratePassword": { "message": "Đ ĐĩĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°" @@ -244,17 +447,60 @@ "length": { "message": "Đ”ŅŠĐģĐļиĐŊа" }, + "passwordMinLength": { + "message": "МиĐŊиĐŧаĐģĐŊа Đ´ŅŠĐģĐļиĐŊа ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°" + }, "uppercase": { - "message": "ГĐģавĐŊи ĐąŅƒĐēви (A-Z)" + "message": "ГĐģавĐŊи ĐąŅƒĐēви (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "МаĐģĐēи ĐąŅƒĐēви (a-z)" + "message": "МаĐģĐēи ĐąŅƒĐēви (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Đ§Đ¸ŅĐģа (0-9)" + "message": "Đ§Đ¸ŅĐģа (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ĐĄĐŋĐĩŅ†Đ¸Đ°ĐģĐŊи СĐŊĐ°Ņ†Đ¸ (!@#$%^&*)" + "message": "ĐĄĐŋĐĩŅ†Đ¸Đ°ĐģĐŊи СĐŊĐ°Ņ†Đ¸ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ĐŗĐģавĐŊи ĐąŅƒĐēви", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ĐŧаĐģĐēи ĐąŅƒĐēви", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Ņ†Đ¸Ņ„Ņ€Đ¸", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐŋĐĩŅ†Đ¸Đ°ĐģĐŊи СĐŊĐ°Ņ†Đ¸", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Đ‘Ņ€ĐžĐš Đ´ŅƒĐŧи" @@ -276,7 +522,16 @@ "message": "МиĐŊиĐŧаĐģĐĩĐŊ ĐąŅ€ĐžĐš ҁĐŋĐĩŅ†Đ¸Đ°ĐģĐŊи СĐŊĐ°Ņ†Đ¸" }, "avoidAmbChar": { - "message": "БĐĩС ĐŊĐĩĐĩĐ´ĐŊОСĐŊĐ°Ņ‡ĐŊи СĐŊĐ°Ņ†Đ¸" + "message": "БĐĩС ĐŊĐĩĐĩĐ´ĐŊОСĐŊĐ°Ņ‡ĐŊи СĐŊĐ°Ņ†Đ¸", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "БĐĩС ĐŊĐĩĐĩĐ´ĐŊОСĐŊĐ°Ņ‡ĐŊи СĐŊĐ°Ņ†Đ¸", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Đ˜ĐˇĐ¸ŅĐēваĐŊĐ¸ŅŅ‚Đ° ĐŊа ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēĐ°Ņ‚Đ° Са ĐŗĐžĐģĐĩĐŧи ĐēĐžĐŧĐŋаĐŊии ĐąŅŅ…Đ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊи ĐēҊĐŧ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ĐĸŅŠŅ€ŅĐĩĐŊĐĩ в ҂ҀĐĩĐˇĐžŅ€Đ°" @@ -299,15 +554,30 @@ "password": { "message": "ĐŸĐ°Ņ€ĐžĐģа" }, + "totp": { + "message": "ĐĸаКĐŊа Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ" + }, "passphrase": { "message": "ĐŸĐ°Ņ€ĐžĐģа-Ņ„Ņ€Đ°ĐˇĐ°" }, "favorite": { "message": "Đ›ŅŽĐąĐ¸Đŧи" }, + "unfavorite": { + "message": "ИСваĐļдаĐŊĐĩ ĐžŅ‚ ĐģŅŽĐąĐ¸Đŧи" + }, + "itemAddedToFavorites": { + "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚ŅŠŅ‚ Đĩ дОйавĐĩĐŊ ĐēҊĐŧ ĐģŅŽĐąĐ¸ĐŧĐ¸Ņ‚Đĩ" + }, + "itemRemovedFromFavorites": { + "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚ŅŠŅ‚ Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚ ĐžŅ‚ ĐģŅŽĐąĐ¸ĐŧĐ¸Ņ‚Đĩ" + }, "notes": { "message": "БĐĩĐģĐĩĐļĐēи" }, + "privateNote": { + "message": "Đ›Đ¸Ņ‡ĐŊа ĐąĐĩĐģĐĩĐļĐēа" + }, "note": { "message": "БĐĩĐģĐĩĐļĐēа" }, @@ -326,6 +596,18 @@ "launch": { "message": "ĐŸŅƒŅĐēаĐŊĐĩ" }, + "launchWebsite": { + "message": "ĐŸĐžŅĐĩŅ‰Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ°" + }, + "launchWebsiteName": { + "message": "ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩ ĐŊа ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ĐĄĐ°ĐšŅ‚" }, @@ -338,9 +620,24 @@ "other": { "message": "Đ”Ņ€ŅƒĐŗĐ¸" }, + "unlockMethods": { + "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Са ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ĐŧĐĩŅ‚ĐžĐ´ Са ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ, Са да ĐŧĐžĐļĐĩ да ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸ĐĩŅ‚Đž ĐŋŅ€Đ¸ Đ¸ĐˇŅ‚Đ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž Са Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ҂ҀĐĩĐˇĐžŅ€Đ°." }, + "unlockMethodNeeded": { + "message": "Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ĐŧĐĩŅ‚ĐžĐ´ Са ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ в ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ" + }, + "sessionTimeoutHeader": { + "message": "Đ˜ĐˇŅ‚Đ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž Са ҁĐĩŅĐ¸ŅŅ‚Đ°" + }, + "vaultTimeoutHeader": { + "message": "Đ’Ņ€ĐĩĐŧĐĩ Са Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ҂ҀĐĩĐˇĐžŅ€Đ°" + }, + "otherOptions": { + "message": "Đ”Ņ€ŅƒĐŗĐ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи" + }, "rateExtension": { "message": "ĐžŅ†ĐĩĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩŅ‚Đž" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "ĐĸŅ€ĐĩĐˇĐžŅ€ŅŠŅ‚ Đĩ СаĐēĐģŅŽŅ‡ĐĩĐŊ — Đ˛ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐŗĐģавĐŊĐ°Ņ‚Đ° ŅĐ¸ ĐŋĐ°Ņ€ĐžĐģа, Са да ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚Đĩ." }, + "yourVaultIsLockedV2": { + "message": "ĐĸŅ€ĐĩĐˇĐžŅ€ŅŠŅ‚ Ви Đĩ СаĐēĐģŅŽŅ‡ĐĩĐŊ" + }, + "yourAccountIsLocked": { + "message": "Đ ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° Ви Đĩ СаĐēĐģŅŽŅ‡ĐĩĐŊа" + }, + "or": { + "message": "иĐģи" + }, "unlock": { "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Đ’Ņ€ĐĩĐŧĐĩ Са Đ´ĐžŅŅ‚ŅŠĐŋ" }, + "vaultTimeout1": { + "message": "Đ’Ņ€ĐĩĐŧĐĩ Са Đ´ĐžŅŅ‚ŅŠĐŋ" + }, "lockNow": { "message": "ЗаĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ҁĐĩĐŗĐ°" }, + "lockAll": { + "message": "ЗаĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи" + }, "immediately": { "message": "НĐĩСайавĐŊĐž" }, @@ -418,7 +730,7 @@ "message": "ĐŸŅ€Đ¸ СаĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ°" }, "onRestart": { - "message": "ĐŸŅ€Đ¸ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đŋ҃ҁĐēаĐŊĐĩ ĐŊа ҇ĐĩŅ‚ĐĩŅ†Đ°" + "message": "ĐŸŅ€Đ¸ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đŋ҃ҁĐēаĐŊĐĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°" }, "never": { "message": "НиĐēĐžĐŗĐ°" @@ -426,6 +738,18 @@ "security": { "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚" }, + "confirmMasterPassword": { + "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа" + }, + "masterPassword": { + "message": "ГĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа" + }, + "masterPassImportant": { + "message": "ГĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩĐŊа, аĐēĐž Ņ ĐˇĐ°ĐąŅ€Đ°Đ˛Đ¸Ņ‚Đĩ!" + }, + "masterPassHintLabel": { + "message": "ĐŸĐžĐ´ŅĐēаСĐēа Са ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа" + }, "errorOccurred": { "message": "Đ’ŅŠĐˇĐŊиĐēĐŊа ĐŗŅ€Đĩ҈Đēа" }, @@ -457,17 +781,32 @@ "newAccountCreated": { "message": "АйОĐŊаĐŧĐĩĐŊŅ‚ŅŠŅ‚ ви ĐąĐĩ ŅŅŠĐˇĐ´Đ°Đ´ĐĩĐŊ. ВĐĩ҇Đĩ ĐŧĐžĐļĐĩŅ‚Đĩ да ҁĐĩ вĐŋĐ¸ŅˆĐĩŅ‚Đĩ." }, + "newAccountCreated2": { + "message": "ĐĐžĐ˛Đ°Ņ‚Đ° Ви Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ ĐąĐĩ҈Đĩ ŅŅŠĐˇĐ´Đ°Đ´ĐĩĐŊа!" + }, + "youHaveBeenLoggedIn": { + "message": "ВĐĩ҇Đĩ ҁ҂Đĩ вĐŋĐ¸ŅĐ°ĐŊ(а)!" + }, + "youSuccessfullyLoggedIn": { + "message": "ВĐŋĐ¸ŅĐ°Ņ…Ņ‚Đĩ ҁĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž" + }, + "youMayCloseThisWindow": { + "message": "МоĐļĐĩ да ĐˇĐ°Ņ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ Ņ‚ĐžĐˇĐ¸ ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆" + }, "masterPassSent": { "message": "ИСĐŋŅ€Đ°Ņ‚Đ¸Ņ…ĐŧĐĩ ви ĐŋĐ¸ŅĐŧĐž ҁ ĐŋĐžĐ´ŅĐēаСĐēа Са ĐŗĐģавĐŊĐ°Ņ‚Đ° ви ĐŋĐ°Ņ€ĐžĐģа." }, "verificationCodeRequired": { "message": "ĐšĐžĐ´ŅŠŅ‚ Са ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļĐ´ĐĩĐŊиĐĩ Đĩ ĐˇĐ°Đ´ŅŠĐģĐļĐ¸Ņ‚ĐĩĐģĐĩĐŊ." }, + "webauthnCancelOrTimeout": { + "message": "ĐŖĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐąĐĩ҈Đĩ ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊĐž иĐģи ĐžŅ‚ĐŊĐĩ Ņ‚Đ˛ŅŠŅ€Đ´Đĩ ĐŧĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩ. МоĐģŅ, ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО." + }, "invalidVerificationCode": { "message": "Đ“Ņ€Đĩ҈ĐĩĐŊ ĐēОд Са ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ" }, "valueCopied": { - "message": "$VALUE$ — ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊĐž", + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐž Đĩ $VALUE$", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -479,12 +818,57 @@ "autofillError": { "message": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ. ВĐŧĐĩŅŅ‚Đž Ņ‚ĐžĐ˛Đ° ĐēĐžĐŋĐ¸Ņ€Đ°ĐšŅ‚Đĩ и ĐŋĐžŅŅ‚Đ°Đ˛ĐĩŅ‚Đĩ даĐŊĐŊĐ¸Ņ‚Đĩ." }, + "totpCaptureError": { + "message": "QR-ĐēĐžĐ´ŅŠŅ‚ ĐžŅ‚ Ņ‚ĐĩĐēŅƒŅ‰Đ°Ņ‚Đ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊ" + }, + "totpCaptureSuccess": { + "message": "ĐŖĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ĐĩĐģĐŊĐ¸ŅŅ‚ ĐēĐģŅŽŅ‡ Đĩ дОйавĐĩĐŊ" + }, + "totpCapture": { + "message": "ĐĄĐēаĐŊĐ¸Ņ€Đ°ĐšŅ‚Đĩ QR-ĐēОда Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ĐžŅ‚ Ņ‚ĐĩĐēŅƒŅ‰Đ°Ņ‚Đ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°" + }, + "totpHelperTitle": { + "message": "НаĐŋŅ€Đ°Đ˛ĐĩŅ‚Đĩ 2-ŅŅ‚ŅŠĐŋĐēĐžĐ˛ĐžŅ‚Đž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ĐąĐĩСĐŋŅ€ĐžĐąĐģĐĩĐŧĐŊĐž и ĐŊĐĩСайĐĩĐģĐĩĐļиĐŧĐž" + }, + "totpHelper": { + "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ĐŧĐžĐļĐĩ да ŅŅŠŅ…Ņ€Đ°ĐŊŅĐ˛Đ° и ĐŋĐžĐŋҊĐģва ĐēОдОвĐĩŅ‚Đĩ Са 2-ŅŅ‚ŅŠĐŋĐēОвО ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ. КоĐŋĐ¸Ņ€Đ°ĐšŅ‚Đĩ ĐēĐģŅŽŅ‡Đ° в Ņ‚ĐžĐ˛Đ° ĐŋĐžĐģĐĩ." + }, + "totpHelperWithCapture": { + "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ĐŧĐžĐļĐĩ да ŅŅŠŅ…Ņ€Đ°ĐŊŅĐ˛Đ° и ĐŋĐžĐŋҊĐģва ĐēОдОвĐĩŅ‚Đĩ Са 2-ŅŅ‚ŅŠĐŋĐēОвО ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ. ИСйĐĩŅ€ĐĩŅ‚Đĩ иĐēĐžĐŊĐēĐ°Ņ‚Đ° ҁ ĐēаĐŧĐĩŅ€Đ°, Са да ĐŊаĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đĩ ĐĩĐēŅ€Đ°ĐŊĐŊа ҁĐŊиĐŧĐēа ĐŊа QR-ĐēОда ĐžŅ‚ Ņ‚ĐžĐˇĐ¸ ҃ĐĩĐą ŅĐ°ĐšŅ‚ иĐģи ĐēĐžĐŋĐ¸Ņ€Đ°ĐšŅ‚Đĩ ĐēĐģŅŽŅ‡Đ° в Ņ‚ĐžĐ˛Đ° ĐŋĐžĐģĐĩ." + }, + "learnMoreAboutAuthenticators": { + "message": "ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ Са ҁҀĐĩĐ´ŅŅ‚Đ˛Đ°Ņ‚Đ° Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ" + }, + "copyTOTP": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ĐĩĐģĐŊĐ¸Ņ ĐēĐģŅŽŅ‡ (TOTP)" + }, "loggedOut": { "message": "Đ‘ŅŅ…Ņ‚Đĩ ĐžŅ‚ĐŋĐ¸ŅĐ°ĐŊи" }, + "loggedOutDesc": { + "message": "Đ‘ŅŅ…Ņ‚Đĩ ĐžŅ‚ĐŋĐ¸ŅĐ°ĐŊ(а) ĐžŅ‚ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸." + }, "loginExpired": { "message": "ĐĄĐĩŅĐ¸ŅŅ‚Đ° ви Đ¸ĐˇŅ‚Đĩ҇Đĩ." }, + "logIn": { + "message": "ВĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ" + }, + "logInToBitwarden": { + "message": "ВĐŋĐ¸ŅˆĐĩŅ‚Đĩ ҁĐĩ в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ" + }, + "restartRegistration": { + "message": "Đ ĐĩŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "expiredLink": { + "message": "Đ’Ņ€ŅŠĐˇĐēа ҁ Đ¸ĐˇŅ‚ĐĩĐēĐģа давĐŊĐžŅŅ‚" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Đ ĐĩŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐšŅ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° иĐģи ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да ҁĐĩ вĐŋĐ¸ŅˆĐĩŅ‚Đĩ." + }, + "youMayAlreadyHaveAnAccount": { + "message": "МоĐļĐĩ вĐĩ҇Đĩ да иĐŧĐ°Ņ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ" + }, "logOutConfirmation": { "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да ҁĐĩ ĐžŅ‚ĐŋĐ¸ŅˆĐĩŅ‚Đĩ?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "ДобавĐĩĐŊа ĐŋаĐŋĐēа" }, - "changeMasterPass": { - "message": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа" - }, - "changeMasterPasswordConfirmation": { - "message": "ГĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа ĐŊа ҂ҀĐĩĐˇĐžŅ€ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋŅ€ĐžĐŧĐĩĐŊи ҇ҀĐĩС ŅĐ°ĐšŅ‚Đ° bitwarden.com. Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŗĐž ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ?" - }, "twoStepLoginConfirmation": { "message": "Đ”Đ˛ŅƒŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐžŅ‚Đž вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ°Đ˛Đ° Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ви, ĐēĐ°Ņ‚Đž ви ĐēĐ°Ņ€Đ° да ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´Đ¸Ņ‚Đĩ вĐģиСаĐŊĐĩŅ‚Đž ŅĐ¸ ҇ҀĐĩС ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž-ĐēĐģŅŽŅ‡, ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ĐĩĐŊиĐĩ, ĐŧОйиĐģĐŊĐž ŅŅŠĐžĐąŅ‰ĐĩĐŊиĐĩ, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊĐž ОйаĐļдаĐŊĐĩ иĐģи ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊа ĐŋĐžŅ‰Đ°. Đ”Đ˛ŅƒŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐžŅ‚Đž вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ вĐēĐģŅŽŅ‡Đ¸ ҇ҀĐĩС ŅĐ°ĐšŅ‚Đ° bitwarden.com. Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŗĐž ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ?" }, + "twoStepLoginConfirmationContent": { + "message": "ĐŸĐžĐ´ĐžĐąŅ€ĐĩŅ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ°Ņ‚Đ° ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸, ĐēĐ°Ņ‚Đž ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚Đĩ Đ´Đ˛ŅƒŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐžŅ‚Đž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ в ҃ĐĩĐą ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ." + }, + "twoStepLoginConfirmationTitle": { + "message": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļаваĐŊĐĩ ĐēҊĐŧ ҃ĐĩĐą ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž?" + }, "editedFolder": { "message": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊа ĐŋаĐŋĐēа" }, @@ -537,7 +921,7 @@ "message": "КоĐŋĐ¸Ņ€Đ°ĐŊа ĐŋĐ°Ņ€ĐžĐģа" }, "uri": { - "message": "ĐĐ´Ņ€Đĩҁ" + "message": "ĐŖĐŊĐ¸Ņ„Đ¸Ņ†Đ¸Ņ€Đ°ĐŊ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ĐŊа Ņ€ĐĩŅŅƒŅ€Ņ" }, "uriPosition": { "message": "ĐĐ´Ņ€Đĩҁ $POSITION$", @@ -550,7 +934,11 @@ } }, "newUri": { - "message": "Нов Đ°Đ´Ņ€Đĩҁ" + "message": "Нов ҃ĐŊĐ¸Ņ„Đ¸Ņ†Đ¸Ņ€Đ°ĐŊ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ĐŊа Ņ€ĐĩŅŅƒŅ€Ņ" + }, + "addDomain": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа Đ´ĐžĐŧĐĩĐšĐŊ", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." }, "addedItem": { "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚ŅŠŅ‚ Đĩ дОйавĐĩĐŊ" @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "ĐŸĐ¸Ņ‚Đ°ĐŊĐĩ Са Đ´ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа СаĐŋĐ¸Ņ" }, + "vaultSaveOptionsTitle": { + "message": "ЗаĐŋаСваĐŊĐĩ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ°" + }, "addLoginNotificationDesc": { "message": "ИСвĐĩŅŅ‚Đ¸ŅŅ‚Đ° Са СаĐŋаСваĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ви ĐŋОдĐēаĐŊŅŅ‚ да СаĐŋĐ°ĐˇĐ¸Ņ‚Đĩ ĐŊĐžĐ˛Đ¸Ņ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸ в ҂ҀĐĩĐˇĐžŅ€Đ° ĐŋŅ€Đ¸ ĐŋŅŠŅ€Đ˛ĐžŅ‚Đž ви вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ в Ņ‚ŅŅ…." }, + "addLoginNotificationDescAlt": { + "message": "ĐŸĐ¸Ņ‚Đ°ĐŊĐĩ Са Đ´ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚, аĐēĐž Ņ‚Đ°ĐēŅŠĐ˛ ĐŊĐĩ ĐąŅŠĐ´Đĩ ĐŊаĐŧĐĩŅ€ĐĩĐŊ в ҂ҀĐĩĐˇĐžŅ€Đ°. ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ° ҁĐĩ Са Đ˛ŅĐ¸Ņ‡Đēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, в ĐēĐžĐ¸Ņ‚Đž ҁ҂Đĩ вĐŋĐ¸ŅĐ°ĐŊ(а)." + }, + "showCardsInVaultView": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐēĐ°Ņ€Ņ‚Đ¸Ņ‚Đĩ ĐēĐ°Ņ‚Đž ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ в Đ¸ĐˇĐŗĐģĐĩда ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ°" + }, "showCardsCurrentTab": { "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐēĐ°Ņ€Ņ‚Đ¸ в ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° ҁ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚Đĩ" }, "showCardsCurrentTabDesc": { "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐēĐ°Ņ€Ņ‚Đ¸Ņ‚Đĩ в ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° ҁ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚Đĩ, Са ĐģĐĩҁĐŊĐž Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ." }, + "showIdentitiesInVaultView": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Đ¸ ĐēĐ°Ņ‚Đž ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ в Đ¸ĐˇĐŗĐģĐĩда ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ°" + }, "showIdentitiesCurrentTab": { "message": "ПоĐēаСваĐŊĐĩ ĐŊа ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Đ¸ в ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° ҁ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚Đĩ" }, @@ -627,11 +1027,20 @@ "changedPasswordNotificationDesc": { "message": "ĐŸĐ¸Ņ‚Đ°ĐŊĐĩ Са ОйĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ĐēҊĐŧ дадĐĩĐŊ СаĐŋĐ¸Ņ, ĐēĐžĐŗĐ°Ņ‚Đž ĐąŅŠĐ´Đĩ ĐˇĐ°ŅĐĩ҇ĐĩĐŊа ĐŋŅ€ĐžĐŧŅĐŊа в ŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ĐŊĐ¸Ņ ҃ĐĩĐą ŅĐ°ĐšŅ‚." }, + "changedPasswordNotificationDescAlt": { + "message": "ĐŸĐ¸Ņ‚Đ°ĐŊĐĩ Са ОйĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° Са дадĐĩĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ, аĐēĐž ĐąŅŠĐ´Đĩ ĐˇĐ°ŅĐĩ҇ĐĩĐŊа ĐŋŅ€ĐžĐŧŅĐŊа в ŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ĐŊĐ¸Ņ ҃ĐĩĐą ŅĐ°ĐšŅ‚. ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ° ҁĐĩ Са Đ˛ŅĐ¸Ņ‡Đēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, в ĐēĐžĐ¸Ņ‚Đž ҁ҂Đĩ вĐŋĐ¸ŅĐ°ĐŊ(а)." + }, + "enableUsePasskeys": { + "message": "ĐŸĐ¸Ņ‚Đ°ĐŊĐĩ Са СаĐŋаСваĐŊĐĩ и ĐŋĐžĐģСваĐŊĐĩ ĐŊа ҁĐĩĐēŅ€ĐĩŅ‚ĐŊи ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ" + }, + "usePasskeysDesc": { + "message": "ĐŸĐ¸Ņ‚Đ°ĐŊĐĩ Са СаĐŋаСваĐŊĐĩ ĐŊа ĐŊОви ҁĐĩĐēŅ€ĐĩŅ‚ĐŊи ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ иĐģи Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ҇ҀĐĩС ҁĐĩĐēŅ€ĐĩŅ‚ĐŊи ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ, ĐŋаСĐĩĐŊи в ҂ҀĐĩĐˇĐžŅ€Đ°. ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ° ҁĐĩ Са Đ˛ŅĐ¸Ņ‡Đēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, в ĐēĐžĐ¸Ņ‚Đž ҁ҂Đĩ вĐŋĐ¸ŅĐ°ĐŊ(а)." + }, "notificationChangeDesc": { "message": "Да ҁĐĩ ОйĐŊОви Đģи ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° в Bitwarden?" }, "notificationChangeSave": { - "message": "Да, ĐŊĐĩĐēа ҁĐĩ ОйĐŊОви ҁĐĩĐŗĐ°" + "message": "ĐžŅŅŠĐ˛Ņ€ĐĩĐŧĐĩĐŊŅĐ˛Đ°ĐŊĐĩ" }, "notificationUnlockDesc": { "message": "ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ ҂ҀĐĩĐˇĐžŅ€Đ° ŅĐ¸ в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ, Са да ĐˇĐ°Đ˛ŅŠŅ€ŅˆĐ¸Ņ‚Đĩ ĐˇĐ°ŅĐ˛ĐēĐ°Ņ‚Đ° Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ." @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ" }, + "additionalOptions": { + "message": "ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи" + }, "enableContextMenuItem": { "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐžĐŋŅ†Đ¸Đ¸ в ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐžŅ‚Đž ĐŧĐĩĐŊŅŽ" }, "contextMenuItemDesc": { "message": "ĐŠŅ€Đ°ĐēваĐŊĐĩ ҁ Đ´ĐĩҁĐŊĐ¸Ņ ĐąŅƒŅ‚ĐžĐŊ ĐŊа ĐŧĐ¸ŅˆĐēĐ°Ņ‚Đ° дава Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° ĐŊа ĐŋĐ°Ņ€ĐžĐģи и ŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ°Ņ‰Đ¸Ņ‚Đĩ Са ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° СаĐŋĐ¸ŅĐ¸. " }, + "contextMenuItemDescAlt": { + "message": "ĐŠŅ€Đ°ĐēваĐŊĐĩ ҁ Đ´ĐĩҁĐŊĐ¸Ņ ĐąŅƒŅ‚ĐžĐŊ ĐŊа ĐŧĐ¸ŅˆĐēĐ°Ņ‚Đ° дава Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° ĐŊа ĐŋĐ°Ņ€ĐžĐģи и ŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ°Ņ‰Đ¸Ņ‚Đĩ Са ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° СаĐŋĐ¸ŅĐ¸. ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ° ҁĐĩ Са Đ˛ŅĐ¸Ņ‡Đēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, в ĐēĐžĐ¸Ņ‚Đž ҁ҂Đĩ вĐŋĐ¸ŅĐ°ĐŊ(а)." + }, "defaultUriMatchDetection": { "message": "ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐž ĐˇĐ°ŅĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Đ°Đ´Ņ€ĐĩŅĐ¸", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "КаĐēŅŠĐ˛ да Đĩ ĐŊĐ°Ņ‡Đ¸ĐŊŅŠŅ‚, ĐŋĐž ĐēĐžĐšŅ‚Đž да ҁĐĩ ĐˇĐ°ŅĐ¸Ņ‡Đ° ŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ¸Đĩ ĐŊа Đ°Đ´Ņ€ĐĩŅĐ° Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đ¸Ņ ОйĐģиĐē ĐŊа ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐ°Ņ‚Đ°." }, + "themeDescAlt": { + "message": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đ°Ņ‚Đ° Ņ‚ĐĩĐŧа ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž. ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ° ҁĐĩ Са Đ˛ŅĐ¸Ņ‡Đēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, в ĐēĐžĐ¸Ņ‚Đž ҁ҂Đĩ вĐŋĐ¸ŅĐ°ĐŊ(а)." + }, "dark": { "message": "ĐĸҊĐŧĐĩĐŊ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "ĐŸŅ€ĐĩĐĩĐēҁĐŋĐžĐŊĐ¸Ņ€Đ°ĐŊĐž Ņ‚ŅŠĐŧĐĩĐŊ", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "ИСĐŊĐ°ŅŅĐŊĐĩ ĐžŅ‚" + }, "exportVault": { "message": "ИСĐŊĐ°ŅŅĐŊĐĩ ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ°" }, "fileFormat": { "message": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ ĐŊа Ņ„Đ°ĐšĐģа" }, + "fileEncryptedExportWarningDesc": { + "message": "ИСĐŊĐĩҁĐĩĐŊĐ¸ŅŅ‚ Ņ„Đ°ĐšĐģ ҉Đĩ ĐąŅŠĐ´Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊ ҁ ĐŋĐ°Ņ€ĐžĐģа, ĐēĐžŅŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧа Са Đ´ĐĩŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ„Đ°ĐšĐģа." + }, + "filePassword": { + "message": "ĐŸĐ°Ņ€ĐžĐģа ĐŊа Ņ„Đ°ĐšĐģа" + }, + "exportPasswordDescription": { + "message": "ĐŸĐ°Ņ€ĐžĐģа ҉Đĩ ҁĐĩ иСĐŋĐžĐģСва ĐŋŅ€Đ¸ иСĐŊĐ°ŅŅĐŊĐĩŅ‚Đž и ĐŋŅ€Đ¸ вĐŊĐ°ŅŅĐŊĐĩŅ‚Đž ĐŊа Ņ‚ĐžĐˇĐ¸ Ņ„Đ°ĐšĐģ" + }, + "accountRestrictedOptionDescription": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ĐēĐģŅŽŅ‡Đ° ŅĐ¸ Са ŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°ĐŊĐĩ, ĐēĐžĐšŅ‚Đž ҁĐĩ ĐŋĐžĐģŅƒŅ‡Đ°Đ˛Đ° ҇ҀĐĩС ĐēĐžĐŧйиĐŊĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐžŅ‚Đž иĐŧĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° Ви и ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа. ĐĄ ĐŊĐĩĐŗĐž иСĐŊĐ°ŅŅĐŊĐĩŅ‚Đž ҉Đĩ ҁĐĩ ŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ° и вĐŊĐ°ŅŅĐŊĐĩŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đ° Đ˛ŅŠĐˇĐŧĐžĐļĐŊĐž ŅĐ°ĐŧĐž в Ņ‚ĐĩĐēŅƒŅ‰Đ°Ņ‚Đ° Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ." + }, + "passwordProtectedOptionDescription": { + "message": "Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģа Са Ņ„Đ°ĐšĐģа, Са да ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°Ņ‚Đĩ иСĐŊĐĩҁĐĩĐŊĐ¸Ņ‚Đĩ даĐŊĐŊи. ĐŠĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ да вĐŊĐĩҁĐĩŅ‚Đĩ даĐŊĐŊĐ¸Ņ‚Đĩ Đ˛ŅŠĐ˛ Đ˛ŅŅĐēа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ иСĐŋĐžĐģСваКĐēи ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° Са Đ´ĐĩŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°ĐŊĐĩ." + }, + "exportTypeHeading": { + "message": "Вид иСĐŊĐ°ŅŅĐŊĐĩ" + }, + "accountRestricted": { + "message": "Đ ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊа" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "Đ”ŅŠĐŊĐŊĐ¸Ņ‚Đĩ в ĐŋĐžĐģĐĩŅ‚Đ°Ņ‚Đ° â€žĐŸĐ°Ņ€ĐžĐģа ĐŊа Ņ„Đ°ĐšĐģа“ и â€žĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ĐŊа Ņ„Đ°ĐšĐģа“ ĐŊĐĩ ŅŅŠĐ˛ĐŋĐ°Đ´Đ°Ņ‚." + }, "warning": { "message": "ВНИМАНИЕ", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -684,7 +1129,7 @@ "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа иСĐŊĐ°ŅŅĐŊĐĩŅ‚Đž ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ°" }, "exportWarningDesc": { - "message": "ДаĐŊĐŊĐ¸Ņ‚Đĩ ĐžŅ‚ ҂ҀĐĩĐˇĐžŅ€Đ° ви ҉Đĩ ҁĐĩ иСĐŊĐĩŅĐ°Ņ‚ в ĐŊĐĩĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊ Ņ„ĐžŅ€ĐŧĐ°Ņ‚. НĐĩ ĐŗĐž ĐŋŅ€Đ°Ņ‰Đ°ĐšŅ‚Đĩ ĐŋĐž ĐŊĐĩĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊи ĐēаĐŊаĐģи ĐēĐ°Ņ‚Đž Đĩ-ĐŋĐžŅ‰Đ°. Đ˜ĐˇŅ‚Ņ€Đ¸ĐšŅ‚Đĩ Ņ„Đ°ĐšĐģа ĐŊĐĩСайавĐŊĐž ҁĐģĐĩĐ´ ĐēĐ°Ņ‚Đž ŅĐ˛ŅŠŅ€ŅˆĐ¸Ņ‚Đĩ Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚Đ° ŅĐ¸ ҁ ĐŊĐĩĐŗĐž." + "message": "ĐĸОСи иСĐŊĐžŅ ŅŅŠĐ´ŅŠŅ€Đļа даĐŊĐŊи ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ° ви в ĐŊĐĩĐēŅ€Đ¸ĐŋŅ‚Đ¸Ņ€Đ°ĐŊ Ņ„ĐžŅ€ĐŧĐ°Ņ‚. НĐĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да ŅŅŠŅ…Ņ€Đ°ĐŊŅĐ˛Đ°Ņ‚Đĩ иĐģи иСĐŋŅ€Đ°Ņ‰Đ°Ņ‚Đĩ иСĐŊĐžŅĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ ĐŋŅ€ĐĩС ĐŊĐĩĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊи ĐēаĐŊаĐģи (ĐēĐ°Ņ‚Đž иĐŧĐĩĐšĐģ). Đ˜ĐˇŅ‚Ņ€Đ¸ĐšŅ‚Đĩ Ņ„Đ°ĐšĐģа ĐŧĐžĐŧĐĩĐŊŅ‚Đ°ĐģĐŊĐž ҁĐģĐĩĐ´ ĐēĐ°Ņ‚Đž ŅĐ˛ŅŠŅ€ŅˆĐ¸Ņ‚Đĩ Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚Đ° ŅĐ¸ ҁ ĐŊĐĩĐŗĐž." }, "encExportKeyWarningDesc": { "message": "ĐŸŅ€Đ¸ иСĐŊĐ°ŅŅĐŊĐĩ даĐŊĐŊĐ¸Ņ‚Đĩ ҁĐĩ ŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°Ņ‚ ҁ ĐēĐģŅŽŅ‡Đ° ви. АĐēĐž ĐŗĐž ҁĐŧĐĩĐŊĐ¸Ņ‚Đĩ, ҉Đĩ Ņ‚Ņ€ŅĐąĐ˛Đ° ĐŊаĐŊОвО да ĐŗĐ¸ иСĐŊĐĩҁĐĩŅ‚Đĩ, ĐˇĐ°Ņ‰ĐžŅ‚Đž ĐŊŅĐŧа да ĐŧĐžĐļĐĩ да Đ´ĐĩŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°Ņ‚Đĩ ĐŊĐ°ŅŅ‚ĐžŅŅ‰Đ¸Ņ Ņ„Đ°ĐšĐģ." @@ -698,11 +1143,8 @@ "shared": { "message": "ĐĄĐŋОдĐĩĐģĐĩĐŊĐž" }, - "learnOrg": { - "message": "РаСйĐĩŅ€ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ Са ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸Ņ‚Đĩ" - }, - "learnOrgConfirmation": { - "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ĐŋОСвОĐģŅĐ˛Đ° да ҁĐŋОдĐĩĐģŅŅ‚Đĩ Ņ‡Đ°ŅŅ‚Đ¸ ĐžŅ‚ ҂ҀĐĩĐˇĐžŅ€Đ° ŅĐ¸ ҇ҀĐĩС иСĐŋĐžĐģСваĐŊĐĩŅ‚Đž ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ. Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŊĐ°ŅƒŅ‡Đ¸Ņ‚Đĩ ĐŋОвĐĩ҇Đĩ ĐžŅ‚ ŅĐ°ĐšŅ‚Đ° bitwarden.com?" + "bitwardenForBusinessPageDesc": { + "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ Са йиСĐŊĐĩŅĐ° ĐŋОСвОĐģŅĐ˛Đ° да ҁĐŋОдĐĩĐģŅŅ‚Đĩ Ņ‡Đ°ŅŅ‚Đ¸ ĐžŅ‚ ҂ҀĐĩĐˇĐžŅ€Đ° ŅĐ¸ ҇ҀĐĩС иСĐŋĐžĐģСваĐŊĐĩŅ‚Đž ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ. ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ в ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ° bitwarden.com." }, "moveToOrganization": { "message": "ĐŸŅ€ĐĩĐŧĐĩŅŅ‚Đ˛Đ°ĐŊĐĩ в ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ" @@ -762,6 +1204,9 @@ "file": { "message": "ФаКĐģ" }, + "fileToShare": { + "message": "ФаКĐģ Са ҁĐŋОдĐĩĐģŅĐŊĐĩ" + }, "selectFile": { "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ„Đ°ĐšĐģ." }, @@ -781,7 +1226,7 @@ "message": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа айОĐŊаĐŧĐĩĐŊŅ‚Đ°" }, "premiumManageAlert": { - "message": "МоĐļĐĩŅ‚Đĩ да ҃ĐŋŅ€Đ°Đ˛ĐģŅĐ˛Đ°Ņ‚Đĩ айОĐŊаĐŧĐĩĐŊŅ‚Đ° ŅĐ¸ ĐŋŅ€ĐĩС ŅĐ°ĐšŅ‚Đ° bitwarden.com. Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŗĐž ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ҁĐĩĐŗĐ°?" + "message": "МоĐļĐĩ да ҃ĐŋŅ€Đ°Đ˛ĐģŅĐ˛Đ°Ņ‚Đĩ ҇ĐģĐĩĐŊŅŅ‚Đ˛ĐžŅ‚Đž ŅĐ¸ в ĐŧŅ€ĐĩĐļĐ°Ņ‚Đ° ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ° в bitwarden.com. Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ҃ĐĩĐąŅĐ°ĐšŅ‚Đ° ҁĐĩĐŗĐ°?" }, "premiumRefresh": { "message": "ОĐŋŅ€ĐĩҁĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа айОĐŊаĐŧĐĩĐŊŅ‚Đ°" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž Са Ņ„Đ°ĐšĐģОвĐĩ, ĐēĐžĐ¸Ņ‚Đž ҁĐĩ ŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°Ņ‚." }, + "premiumSignUpEmergency": { + "message": "ĐĐ˛Đ°Ņ€Đ¸ĐĩĐŊ Đ´ĐžŅŅ‚ŅŠĐŋ" + }, "premiumSignUpTwoStepOptions": { "message": "Đ§Đ°ŅŅ‚ĐŊĐž Đ´Đ˛ŅƒŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ҇ҀĐĩС YubiKey и Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "МоĐļĐĩ да ĐŋĐģĐ°Ņ‚Đ¸Ņ‚Đĩ айОĐŊаĐŧĐĩĐŊŅ‚Đ° ŅĐ¸ ĐŋŅ€ĐĩС ŅĐ°ĐšŅ‚Đ° bitwarden.com. Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŗĐž ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ҁĐĩĐŗĐ°?" }, + "premiumPurchaseAlertV2": { + "message": "МоĐļĐĩŅ‚Đĩ да СаĐē҃ĐŋĐ¸Ņ‚Đĩ ĐŋĐģĐ°Ņ‚ĐĩĐŊĐ°Ņ‚Đ° вĐĩŅ€ŅĐ¸Ņ ĐžŅ‚ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸, в ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž ĐŋĐž ҃ĐĩĐą ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ." + }, "premiumCurrentMember": { "message": "ЧĐĩŅŅ‚Đ¸Ņ‚Đž, ĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ ĐŋĐģĐ°Ņ‚ĐĩĐŊ айОĐŊаĐŧĐĩĐŊŅ‚!" }, "premiumCurrentMemberThanks": { "message": "БĐģĐ°ĐŗĐžĐ´Đ°Ņ€Đ¸Đŧ ви Са ĐŋОдĐēŅ€ĐĩĐŋĐ°Ņ‚Đ° ĐŊа Bitwarden." }, + "premiumFeatures": { + "message": "ĐŸŅ€ĐĩĐŧиĐŊĐĩŅ‚Đĩ ĐēҊĐŧ ĐŋĐģĐ°Ņ‚ĐĩĐŊĐ°Ņ‚Đ° вĐĩŅ€ŅĐ¸Ņ и ҉Đĩ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚Đĩ:" + }, "premiumPrice": { "message": "И Ņ‚ĐžĐ˛Đ° ŅĐ°ĐŧĐž Са $PRICE$ ĐŊа ĐŗĐžĐ´Đ¸ĐŊа!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "И Ņ‚ĐžĐ˛Đ° ŅĐ°ĐŧĐž Са $PRICE$ ĐŊа ĐŗĐžĐ´Đ¸ĐŊа!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "АйОĐŊаĐŧĐĩĐŊŅ‚ŅŠŅ‚ Đĩ ĐžĐŋŅ€ĐĩҁĐŊĐĩĐŊ" }, @@ -901,7 +1364,7 @@ "message": "Đ ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊа ҁ Đ´Đ˛ŅƒŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ, ĐŊĐž ĐŊиĐēОК ĐžŅ‚ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐŊĐ¸Ņ‚Đĩ Đ´ĐžŅŅ‚Đ°Đ˛Ņ‡Đ¸Ņ†Đ¸ ĐŊа ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ĐŊĐĩ ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа ĐžŅ‚ Ņ‚ĐžĐˇĐ¸ ĐąŅ€Đ°ŅƒĐˇŅŠŅ€." }, "noTwoStepProviders2": { - "message": "ĐŸŅ€ĐžĐąĐ˛Đ°ĐšŅ‚Đĩ ҁ ĐŋĐžĐ´Đ´ŅŠŅ€ĐļаĐŊ ҃ĐĩĐą ĐąŅ€Đ°ŅƒĐˇŅŠŅ€ (ĐēĐ°Ņ‚Đž Chrome иĐģи Firefox) и Đ´Ņ€ŅƒĐŗĐ¸ Đ´ĐžŅŅ‚Đ°Đ˛Ņ‡Đ¸Ņ†Đ¸ ĐŊа ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ, ĐēĐžĐ¸Ņ‚Đž ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€ĐļĐ°Ņ‚ ĐžŅ‚ ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ¸Ņ‚Đĩ (ĐēĐ°Ņ‚Đž ҁĐŋĐĩŅ†Đ¸Đ°ĐģĐŊи ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ)." + "message": "ĐŖĐŋĐžŅ‚Ņ€ĐĩĐąŅĐ˛Đ°ĐšŅ‚Đĩ ĐŋĐžĐ´Đ´ŅŠŅ€ĐļаĐŊ ĐąŅ€Đ°ŅƒĐˇŅŠŅ€ (ĐēĐ°Ņ‚Đž Chrome, Firefox) и/иĐģи дОйавĐĩŅ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸ Đ´ĐžŅŅ‚Đ°Đ˛Ņ‡Đ¸Ņ†Đ¸ ĐŊа ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ, ĐēĐžĐ¸Ņ‚Đž ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€ĐļĐ°Ņ‚ ĐŋĐž-Đ´ĐžĐąŅ€Đĩ ĐžŅ‚ ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ¸Ņ‚Đĩ (ĐēĐ°Ņ‚Đž ҁĐŋĐĩŅ†Đ¸Đ°ĐģĐŊи ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ)." }, "twoStepOptions": { "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа Đ´Đ˛ŅƒŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐžŅ‚Đž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "ĐŸŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ" }, - "authenticatorAppDesc": { - "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ (ĐēĐ°Ņ‚Đž Authy иĐģи Google Authenticator) Са ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊи ĐēОдОвĐĩ Са ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļĐ´ĐĩĐŊиĐĩ.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐēОд ŅŅŠĐˇĐ´Đ°Đ´ĐĩĐŊ ҇ҀĐĩС ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ, ĐēĐ°Ņ‚Đž ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ Ņ‚ĐžĐ˛Đ° ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "ĐŖŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž YubiKey OTP" + "yubiKeyTitleV2": { + "message": "КĐģŅŽŅ‡ Са ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚ YubiKey OTP" }, "yubiKeyDesc": { - "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž ĐŊа YubiKey, Са да вĐģĐĩСĐĩŅ‚Đĩ в айОĐŊаĐŧĐĩĐŊŅ‚Đ° ŅĐ¸. ĐŸĐžĐ´Đ´ŅŠŅ€ĐļĐ°Ņ‚ ҁĐĩ ĐŧОдĐĩĐģĐ¸Ņ‚Đĩ YubiKey 4, 4 Nano, 4C и NEO." + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ĐēĐģŅŽŅ‡Đ° Са ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚ YubiKey, Са да вĐģĐĩСĐĩŅ‚Đĩ в аĐēĐ°ŅƒĐŊŅ‚Đ° ŅĐ¸. Đ Đ°ĐąĐžŅ‚Đ¸ ҁ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ‚Đ° YubiKey 4, 4 Nano, 4C и NEO." }, - "duoDesc": { - "message": "ĐŖĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ҇ҀĐĩС Duo Security, ҁ ĐŋĐžĐģСваĐŊĐĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž Duo Mobile, SMS, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐĩĐŊ Ņ€Đ°ĐˇĐŗĐžĐ˛ĐžŅ€ иĐģи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž U2F.", + "duoDescV2": { + "message": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐēОд ŅŅŠĐˇĐ´Đ°Đ´ĐĩĐŊ ҇ҀĐĩС Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "ЕĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊа ĐŋĐžŅ‰Đ°" }, - "emailDesc": { - "message": "КодовĐĩŅ‚Đĩ Са ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļĐ´ĐĩĐŊиĐĩ ҉Đĩ ви ĐąŅŠĐ´Đ°Ņ‚ ĐŋŅ€Đ°Ņ‚ĐĩĐŊи ĐŋĐž Đĩ-ĐŋĐžŅ‰Đ°." + "emailDescV2": { + "message": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐēОда иСĐŋŅ€Đ°Ņ‚ĐĩĐŊ ĐŊа Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ° Ви." }, "selfHostedEnvironment": { "message": "ĐĄĐžĐąŅŅ‚Đ˛ĐĩĐŊа ҁҀĐĩда" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "ĐŖĐēаĐļĐĩŅ‚Đĩ ĐąĐ°ĐˇĐžĐ˛Đ¸Ņ Đ°Đ´Ņ€Đĩҁ Са ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐ°Ņ‚Đ° ви иĐŊŅŅ‚Đ°ĐģĐ¸Ņ€Đ°ĐŊа ҁҀĐĩда ĐŊа Bitwarden." }, + "selfHostedBaseUrlHint": { + "message": "ĐŸĐžŅĐžŅ‡ĐĩŅ‚Đĩ ĐąĐ°ĐˇĐžĐ˛Đ¸Ņ Đ°Đ´Ņ€Đĩҁ ĐŊа Đ’Đ°ŅˆĐ°Ņ‚Đ° ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊа иĐŊŅŅ‚Đ°ĐģĐ°Ņ†Đ¸Ņ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ. ĐŸŅ€Đ¸ĐŧĐĩŅ€: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "За ĐŋĐž-Đ´ĐĩŅ‚Đ°ĐšĐģĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа, ĐŧĐžĐļĐĩ да ҃ĐēаĐļĐĩŅ‚Đĩ ĐžŅĐŊОвĐŊĐ¸Ņ Đ°Đ´Ņ€Đĩҁ ĐŊа Đ˛ŅŅĐēа ҃ҁĐģŅƒĐŗĐ° ĐŋĐžĐžŅ‚Đ´ĐĩĐģĐŊĐž." + }, + "selfHostedEnvFormInvalid": { + "message": "ĐĸŅ€ŅĐąĐ˛Đ° да Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚Đĩ иĐģи ĐžŅĐŊОвĐŊĐ¸Ņ Đ°Đ´Ņ€Đĩҁ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°, иĐģи ĐŋĐžĐŊĐĩ ĐĩĐ´ĐŊа ҁĐŋĐĩŅ†Đ¸Đ°ĐģĐŊа ҁҀĐĩда." + }, "customEnvironment": { "message": "ĐĄĐŋĐĩŅ†Đ¸Đ°ĐģĐŊа ҁҀĐĩда" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "ĐĐ´Ņ€Đĩҁ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°" }, + "selfHostBaseUrl": { + "message": "ĐĐ´Ņ€Đĩҁ ĐŊа ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐ¸Ņ ŅŅŠŅ€Đ˛ŅŠŅ€", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "ĐĐ´Ņ€Đĩҁ ĐŊа ППИ-ŅŅŠŅ€Đ˛ŅŠŅ€Đ°" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "ĐĄŅ€ĐĩĐ´Đ°Ņ‚Đ° ҁ Đ°Đ´Ņ€ĐĩŅĐ¸Ņ‚Đĩ Đĩ СаĐŋаСĐĩĐŊа." }, + "showAutoFillMenuOnFormFields": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐŧĐĩĐŊŅŽ Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŋŅ€Đ¸ ĐŋĐžĐģĐĩŅ‚Đ°Ņ‚Đ° ĐŊа Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€Đ¸Ņ‚Đĩ", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "ĐŸŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ" + }, + "showInlineMenuLabel": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа ĐŋĐžĐģĐĩŅ‚Đ°Ņ‚Đ° Đ˛ŅŠĐ˛ Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€Đ¸" + }, + "showInlineMenuIdentitiesLabel": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа идĐĩĐŊŅ‚Đ¸Ņ‡ĐŊĐžŅŅ‚Đ¸ ĐēĐ°Ņ‚Đž ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ" + }, + "showInlineMenuCardsLabel": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐēĐ°Ņ€Ņ‚Đ¸ ĐēĐ°Ņ‚Đž ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ ĐēĐžĐŗĐ°Ņ‚Đž иĐēĐžĐŊĐēĐ°Ņ‚Đ° Đĩ Đ¸ĐˇĐąŅ€Đ°ĐŊа" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ° ҁĐĩ Са Đ˛ŅĐ¸Ņ‡Đēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, в ĐēĐžĐ¸Ņ‚Đž ҁ҂Đĩ вĐŋĐ¸ŅĐ°ĐŊ(а)." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "ИСĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ Đ˛ĐŗŅ€Đ°Đ´ĐĩĐŊĐžŅ‚Đž ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģи ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ° ŅĐ¸, Са да иСйĐĩĐŗĐŊĐĩŅ‚Đĩ ĐēĐžĐŊŅ„ĐģиĐēŅ‚Đ¸Ņ‚Đĩ." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°." + }, + "autofillOverlayVisibilityOff": { + "message": "ИСĐēĐģŅŽŅ‡ĐĩĐŊĐž", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "ĐšĐžĐŗĐ°Ņ‚Đž ĐŋĐžĐģĐĩŅ‚Đž ĐąŅŠĐ´Đĩ Đ¸ĐˇĐąŅ€Đ°ĐŊĐž (ĐŊа Ņ„ĐžĐē҃ҁ)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "ĐšĐžĐŗĐ°Ņ‚Đž ĐąŅŠĐ´Đĩ Đ¸ĐˇĐąŅ€Đ°ĐŊа иĐēĐžĐŊĐēĐ°Ņ‚Đ° Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°" + }, "enableAutoFillOnPageLoad": { "message": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ" }, "enableAutoFillOnPageLoadDesc": { "message": "ĐŸŅ€Đ¸ ĐˇĐ°ŅĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩŅ‚Đž ĐŊа ҃ĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž да ҁĐĩ ĐŋĐžĐŋҊĐģĐ˛Đ°Ņ‚ даĐŊĐŊĐ¸Ņ‚Đĩ ĐŊа ŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ°Ņ‰Đ°Ņ‚Đ° Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$ВĐŊиĐŧаĐŊиĐĩ:$CLOSETAG$ ОĐŋĐ°ŅĐŊĐ¸Ņ‚Đĩ иĐģи ĐēĐžĐŧĐŋŅ€ĐžĐŧĐĩĐŊŅ‚Đ¸Ņ€Đ°ĐŊи ҃ĐĩĐą ŅĐ°ĐšŅ‚ĐžĐ˛Đĩ ĐŧĐžĐŗĐ°Ņ‚ да ҁĐĩ Đ˛ŅŠĐˇĐŋĐžĐģĐˇĐ˛Đ°Ņ‚ ĐžŅ‚ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģĐŊĐžŅŅ‚Ņ‚Đ° Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "КоĐŧĐŋŅ€ĐžĐŧĐĩĐŊŅ‚Đ¸Ņ€Đ°ĐŊи и иСĐŧаĐŧĐŊи ҃ĐĩĐą ŅĐ°ĐšŅ‚ĐžĐ˛Đĩ ĐŧĐžĐŗĐ°Ņ‚ да ҁĐĩ Đ˛ŅŠĐˇĐŋĐžĐģĐˇĐ˛Đ°Ņ‚ ĐžŅ‚ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ ĐžŅ‚ĐŊĐžŅĐŊĐž Ņ€Đ¸ŅĐēОвĐĩŅ‚Đĩ" + }, "learnMoreAboutAutofill": { "message": "ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ ĐžŅ‚ĐŊĐžŅĐŊĐž Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩ ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ° в ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ°" }, - "commandAutofillDesc": { - "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа ĐŋĐžŅĐģĐĩĐ´ĐŊĐž иСĐŋĐžĐģСваĐŊĐ¸Ņ СаĐŋĐ¸Ņ в Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ ŅĐ°ĐšŅ‚." + "commandAutofillLoginDesc": { + "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа ĐŋĐžŅĐģĐĩĐ´ĐŊĐž иСĐŋĐžĐģСваĐŊĐ¸Ņ СаĐŋĐ¸Ņ в Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ ҃ĐĩĐą ŅĐ°ĐšŅ‚" + }, + "commandAutofillCardDesc": { + "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа ĐŋĐžŅĐģĐĩĐ´ĐŊĐž иСĐŋĐžĐģСваĐŊĐ°Ņ‚Đ° ĐēĐ°Ņ€Ņ‚Đ° в Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ ҃ĐĩĐą ŅĐ°ĐšŅ‚" + }, + "commandAutofillIdentityDesc": { + "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа ĐŋĐžŅĐģĐĩĐ´ĐŊĐž иСĐŋĐžĐģСваĐŊĐ°Ņ‚Đ° ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚ в Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ ҃ĐĩĐą ŅĐ°ĐšŅ‚" }, "commandGeneratePasswordDesc": { "message": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ и ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŊОва ҁĐģŅƒŅ‡Đ°ĐšĐŊа ĐŋĐ°Ņ€ĐžĐģа в ĐąŅƒŅ„ĐĩŅ€Đ°." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "ЗаĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ°" }, - "privateModeWarning": { - "message": "ĐŸĐžĐ´Đ´Ņ€ŅŠĐļĐēĐ°Ņ‚Đ° ĐŊа Ņ‡Đ°ŅŅ‚ĐŊĐ¸Ņ Ņ€ĐĩĐļиĐŧ Đĩ ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģĐŊа и ĐŊŅĐēОи Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģĐŊĐžŅŅ‚Đ¸ ŅĐ° ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊи." - }, "customFields": { "message": "ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊи ĐŋĐžĐģĐĩŅ‚Đ°" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Đ‘ŅƒĐģĐĩвО" }, + "cfTypeCheckbox": { + "message": "ПоĐģĐĩ Са ĐžŅ‚ĐŧĐĩŅ‚Đēа" + }, "cfTypeLinked": { "message": "ĐĄĐ˛ŅŠŅ€ĐˇĐ°ĐŊĐž", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ПоĐēаСваĐŊĐĩ ĐŊа Ņ€Đ°ĐˇĐŋОСĐŊаваĐĩĐŧĐž Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ Đ´Đž Đ˛ŅĐĩĐēи СаĐŋĐ¸Ņ." }, + "faviconDescAlt": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа Ņ€Đ°ĐˇĐŋОСĐŊаваĐĩĐŧĐž Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ Đ´Đž Đ˛ŅĐĩĐēи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚. ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ° ҁĐĩ ĐēҊĐŧ Đ˛ŅĐ¸Ņ‡Đēи аĐēĐ°ŅƒĐŊŅ‚Đ¸, в ĐēĐžĐ¸Ņ‚Đž ҁ҂Đĩ ВĐŋĐ¸ŅĐ°ĐŊ(а)." + }, "enableBadgeCounter": { "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐąŅ€ĐžŅŅ‡ в СĐŊĐ°Ņ‡Đēа" }, @@ -1152,7 +1696,7 @@ "message": "Д-Ņ€" }, "mx": { - "message": "Mx" + "message": "Đ“ĐžŅĐŋĐžŅƒĐ¸" }, "firstName": { "message": "ĐĄĐžĐąŅŅ‚Đ˛ĐĩĐŊĐž иĐŧĐĩ" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "ХаĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚" }, + "typeSshKey": { + "message": "SSH ĐēĐģŅŽŅ‡" + }, + "newItemHeader": { + "message": "Ново $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "ĐĨŅ€ĐžĐŊĐžĐģĐžĐŗĐ¸Ņ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°" }, + "generatorHistory": { + "message": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ ĐŊа ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž" + }, + "clearGeneratorHistoryTitle": { + "message": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ŅŅ‚ĐžŅ€Đ¸ŅŅ‚Đ° ĐŊа ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩ" + }, + "cleargGeneratorHistoryDescription": { + "message": "АĐēĐž ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚Đĩ, Đ˛ŅĐ¸Ņ‡Đēи СаĐŋĐ¸ŅĐ¸ в Đ¸ŅŅ‚ĐžŅ€Đ¸ŅŅ‚Đ° ĐŊа ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩ ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸ СавиĐŊĐ°ĐŗĐ¸. ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ Ņ‚ĐžĐ˛Đ°?" + }, "back": { "message": "Назад" }, "collections": { "message": "КоĐģĐĩĐēŅ†Đ¸Đ¸" }, + "nCollections": { + "message": "$COUNT$ ĐēĐžĐģĐĩĐēŅ†Đ¸Đ¸", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Đ›ŅŽĐąĐ¸Đŧи" }, @@ -1282,6 +1874,10 @@ "message": "ĐžŅĐŊОвĐĩĐŊ Đ´ĐžĐŧĐĩĐšĐŊ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "ĐžŅĐŊОвĐĩĐŊ Đ´ĐžĐŧĐĩĐšĐŊ (ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ¸Ņ‚ĐĩĐģĐŊĐž)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ИĐŧĐĩ ĐŊа Đ´ĐžĐŧĐĩĐšĐŊ", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ŅŅŠĐ˛ĐŋадĐĩĐŊĐ¸Ņ", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐž ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ŅŅŠĐ˛ĐŋадĐĩĐŊĐ¸Ņ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа ĐŋŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "ĐŅĐŧа ĐŋĐ°Ņ€ĐžĐģи Са ĐŋĐžĐēаСваĐŊĐĩ." }, + "clearHistory": { + "message": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ŅŅ‚ĐžŅ€Đ¸ŅŅ‚Đ°" + }, + "nothingToShow": { + "message": "ĐŅĐŧа ĐŊĐ¸Ņ‰Đž Са ĐŋĐžĐēаСваĐŊĐĩ" + }, + "nothingGeneratedRecently": { + "message": "ĐĄĐēĐžŅ€Đž ĐŊĐĩ ҁ҂Đĩ ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°Đģи ĐŊĐ¸Ņ‰Đž" + }, "remove": { "message": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ҁ ПИН" }, + "setYourPinTitle": { + "message": "ЗадаваĐŊĐĩ ĐŊа ПИН" + }, + "setYourPinButton": { + "message": "ЗадаваĐŊĐĩ ĐŊа ПИН" + }, "setYourPinCode": { "message": "Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ПИН Са ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Bitwarden. ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са ПИН ҁĐĩ Đ¸ĐˇŅ‡Đ¸ŅŅ‚Đ˛Đ°Ņ‚ ĐŋŅ€Đ¸ Đ˛ŅŅĐēĐž ĐŋҊĐģĐŊĐž иСĐģиСаĐŊĐĩ ĐžŅ‚ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐ°Ņ‚Đ°." }, + "setYourPinCode1": { + "message": "Đ’Đ°ŅˆĐ¸ŅŅ‚ ПИН ҉Đĩ ĐąŅŠĐ´Đĩ ĐŋĐžĐģСваĐŊ Са ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ, вĐŧĐĩŅŅ‚Đž ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа. ĐĸОК ҉Đĩ ĐąŅŠĐ´Đĩ ĐŊ҃ĐģĐ¸Ņ€Đ°ĐŊ, аĐēĐž ĐŊŅĐēĐžĐŗĐ° ҁĐĩ ĐžŅ‚ĐŋĐ¸ŅˆĐĩŅ‚Đĩ ĐŊаĐŋҊĐģĐŊĐž ĐžŅ‚ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ." + }, "pinRequired": { "message": "НĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧ Đĩ ПИН." }, "invalidPin": { "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ ПИН." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "НаĐŋŅ€Đ°Đ˛Đ¸Đģи ҁ҂Đĩ Ņ‚Đ˛ŅŠŅ€Đ´Đĩ ĐŧĐŊĐžĐŗĐž ĐžĐŋĐ¸Ņ‚Đ¸ ҁ ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ ПИН ĐēОд. ĐžŅ‚ĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩâ€Ļ" + }, "unlockWithBiometrics": { "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ҁ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи" }, + "unlockWithMasterPassword": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ҁ ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа" + }, "awaitDesktop": { "message": "ЧаĐēа ҁĐĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐžŅ‚ ŅĐ°ĐŧĐžŅŅ‚ĐžŅŅ‚ĐĩĐģĐŊĐžŅ‚Đž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "ЗаĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ҁ ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа ĐŋŅ€Đ¸ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đŋ҃ҁĐēаĐŊĐĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°" }, + "lockWithMasterPassOnRestart1": { + "message": "Đ˜ĐˇĐ¸ŅĐēваĐŊĐĩ ĐŊа ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа ĐŋŅ€Đ¸ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đŋ҃ҁĐēаĐŊĐĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°" + }, "selectOneCollection": { "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐŋĐžĐŊĐĩ ĐĩĐ´ĐŊа ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "ПоĐŊĐĩ ĐĩĐ´ĐŊа ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēа ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ вĐģĐ¸ŅĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ¸Ņ‚Đĩ." }, + "passwordGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ ĐŊа ĐŋĐ°Ņ€ĐžĐģи" + }, + "usernameGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēи иĐŧĐĩĐŊа" + }, + "useThisPassword": { + "message": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа Ņ‚Đ°ĐˇĐ¸ ĐŋĐ°Ņ€ĐžĐģа" + }, + "useThisUsername": { + "message": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа Ņ‚ĐžĐ˛Đ° ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐž иĐŧĐĩ" + }, + "securePasswordGenerated": { + "message": "ĐĄŅŠĐˇĐ´Đ°Đ´ĐĩĐŊа Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊа ĐŋĐ°Ņ€ĐžĐģа! НĐĩ ĐˇĐ°ĐąŅ€Đ°Đ˛ŅĐšŅ‚Đĩ и да ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ŅĐ¸ в ҃ĐĩĐą ŅĐ°ĐšŅ‚Đ°." + }, + "useGeneratorHelpTextPartOne": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "Са да ŅŅŠĐˇĐ´Đ°Đ´ĐĩŅ‚Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊа и ҃ĐŊиĐēаĐģĐŊа ĐŋĐ°Ņ€ĐžĐģа", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ДĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŋŅ€Đ¸ Đ¸ĐˇŅ‚Đ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž" }, + "vaultTimeoutAction1": { + "message": "ДĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŋŅ€Đ¸ Đ¸ĐˇŅ‚Đ¸Ņ‡Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž Са Đ´ĐžŅŅ‚ŅŠĐŋ" + }, "lock": { "message": "ЗаĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ĐšĐžŅˆŅ‡Đĩ", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ЗаĐŋĐ¸ŅŅŠŅ‚ Đĩ Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩĐŊ" }, + "alreadyHaveAccount": { + "message": "ВĐĩ҇Đĩ иĐŧĐ°Ņ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ?" + }, "vaultTimeoutLogOutConfirmation": { "message": "ИСĐģиСаĐŊĐĩŅ‚Đž ĐžŅ‚ ҂ҀĐĩĐˇĐžŅ€Đ° Đ¸ĐˇŅ†ŅĐģĐž ҁĐŋĐ¸Ņ€Đ° Đ´ĐžŅŅ‚ŅŠĐŋа Đ´Đž ĐŊĐĩĐŗĐž ҁĐģĐĩĐ´ Đ¸ĐˇŅ‚Đ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž. ĐŠĐĩ ви ҁĐĩ ĐŊаĐģĐžĐļи ĐžŅ‚ĐŊОвО да ҁĐĩ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€Đ°Ņ‚Đĩ, Са да ĐŗĐž Đ´ĐžŅŅ‚ŅŠĐŋĐ¸Ņ‚Đĩ. ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ Ņ‚ĐžĐ˛Đ° Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ДоĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ и ОйĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ" }, + "fillAndSave": { + "message": "ПоĐŋҊĐģваĐŊĐĩ и СаĐŋаСваĐŊĐĩ" + }, "autoFillSuccessAndSavedUri": { "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ´ĐžĐŋĐ¸ŅĐ°ĐŊ СаĐŋĐ¸Ņ и Đ°Đ´Ņ€Đĩҁ" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "ĐŸĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ви ĐŊĐĩ ĐžŅ‚ĐŗĐžĐ˛Đ°Ņ€Ņ ĐŊа ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēĐ¸Ņ‚Đĩ." }, + "receiveMarketingEmailsV2": { + "message": "ПоĐģŅƒŅ‡Đ°Đ˛Đ°ĐšŅ‚Đĩ ŅŅŠĐ˛ĐĩŅ‚Đ¸, ĐžĐąŅĐ˛ĐģĐĩĐŊĐ¸Ņ и ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ Са ŅƒŅ‡Đ°ŅŅ‚Đ¸Đĩ в ĐŋŅ€ĐžŅƒŅ‡Đ˛Đ°ĐŊĐ¸Ņ ĐžŅ‚ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ в ĐŋĐžŅ‰ĐĩĐŊҁĐēĐ°Ņ‚Đ° ŅĐ¸ ĐēŅƒŅ‚Đ¸Ņ." + }, + "unsubscribe": { + "message": "ĐžŅ‚ĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ" + }, + "atAnyTime": { + "message": "ĐŋĐž Đ˛ŅŅĐēĐž Đ˛Ņ€ĐĩĐŧĐĩ." + }, + "byContinuingYouAgreeToThe": { + "message": "АĐēĐž ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚Đĩ, ВиĐĩ ҁĐĩ ŅŅŠĐŗĐģĐ°ŅŅĐ˛Đ°Ņ‚Đĩ ҁ" + }, + "and": { + "message": "и" + }, "acceptPolicies": { "message": "Đ§Ņ€ĐĩС Ņ‚Đ°ĐˇĐ¸ ĐžŅ‚ĐŧĐĩŅ‚Đēа виĐĩ ҁĐĩ ŅŅŠĐŗĐģĐ°ŅŅĐ˛Đ°Ņ‚Đĩ ҁҊҁ ҁĐģĐĩĐ´ĐŊĐžŅ‚Đž:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Đ”ĐžĐąŅ€Đĩ" }, + "errorRefreshingAccessToken": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ĐžĐŋŅ€ĐĩҁĐŊŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ° Са Đ´ĐžŅŅ‚ŅŠĐŋ" + }, + "errorRefreshingAccessTokenDesc": { + "message": "ĐŅĐŧа ĐŊаĐŧĐĩŅ€ĐĩĐŊ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ Са ĐžĐŋŅ€ĐĩҁĐŊŅĐ˛Đ°ĐŊĐĩ иĐģи ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ Са ППИ. ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да ҁĐĩ ĐžŅ‚ĐŋĐ¸ŅˆĐĩŅ‚Đĩ и да ҁĐĩ вĐŋĐ¸ŅˆĐĩŅ‚Đĩ ĐžŅ‚ĐŊОвО." + }, "desktopSyncVerificationTitle": { "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° ĐŊа ŅĐ°ĐŧĐžŅŅ‚ĐžŅŅ‚ĐĩĐģĐŊĐžŅ‚Đž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Đ ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸Ņ‚Đĩ ŅĐ° Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊи" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "НĐĩŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ°Ņ‰ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐĩĐŊ ĐēĐģŅŽŅ‡" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩŅ‚Đž ҇ҀĐĩС йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи ĐŊĐĩ ĐąĐĩ҈Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž. БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊĐ¸ŅŅ‚ Ņ‚Đ°ĐĩĐŊ ĐēĐģŅŽŅ‡ ĐŊĐĩ ҃ҁĐŋŅ да ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸ ҂ҀĐĩĐˇĐžŅ€Đ°. ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да ĐŊаĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ‚Đ° ĐŊа йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊĐ¸Ņ‚Đĩ даĐŊĐŊи ĐžŅ‚ĐŊОвО." + }, "biometricsNotEnabledTitle": { "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩŅ‚Đž ҁ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи ĐŊĐĩ Đĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐž" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "ĐŖŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž ĐŊĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ҁ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи." }, + "biometricsNotUnlockedTitle": { + "message": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģŅŅ‚ Đĩ СаĐēĐģŅŽŅ‡ĐĩĐŊ иĐģи ĐžŅ‚ĐŋĐ¸ŅĐ°ĐŊ" + }, + "biometricsNotUnlockedDesc": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģŅ в ĐŊĐ°ŅŅ‚ĐžĐģĐŊĐžŅ‚Đž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ и ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО." + }, + "biometricsNotAvailableTitle": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩŅ‚Đž ҇ҀĐĩС йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐŊĐž" + }, + "biometricsNotAvailableDesc": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩŅ‚Đž ҇ҀĐĩС йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐŊĐž в ĐŧĐžĐŧĐĩĐŊŅ‚Đ°. ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО ĐŋĐž-ĐēҊҁĐŊĐž." + }, "biometricsFailedTitle": { "message": "НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ҇ҀĐĩС йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ПоĐģĐ¸Ņ‚Đ¸Đēа ĐžŅ‚ ĐŊŅĐēĐžŅ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ вĐģĐ¸ŅĐĩ ĐŊа Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚Đ¸Ņ‚Đĩ Са ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐžŅŅ‚." }, + "personalOwnershipPolicyInEffectImports": { + "message": "ПоĐģĐ¸Ņ‚Đ¸Đēа ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° ĐˇĐ°ĐąŅ€Đ°ĐŊŅĐ˛Đ° да вĐŊĐ°ŅŅŅ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ в ĐģĐ¸Ņ‡ĐŊĐ¸Ņ ŅĐ¸ ҂ҀĐĩĐˇĐžŅ€." + }, + "domainsTitle": { + "message": "ДоĐŧĐĩĐšĐŊи", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "ИСĐēĐģŅŽŅ‡ĐĩĐŊи Đ´ĐžĐŧĐĩĐšĐŊи" }, "excludedDomainsDesc": { "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ĐŊŅĐŧа да ĐŋĐ¸Ņ‚Đ° даĐģи да СаĐŋаСва даĐŊĐŊĐ¸Ņ‚Đĩ Са Đ˛Ņ…ĐžĐ´ в Ņ‚ĐĩСи ŅĐ°ĐšŅ‚ĐžĐ˛Đĩ. За да вĐģĐĩСĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐžŅ‚Đž в ŅĐ¸Đģа, ĐŋŅ€ĐĩĐˇĐ°Ņ€ĐĩĐ´ĐĩŅ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°." }, + "excludedDomainsDescAlt": { + "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ĐŊŅĐŧа да ĐŋĐ¸Ņ‚Đ° даĐģи да СаĐŋаСва даĐŊĐŊĐ¸Ņ‚Đĩ Са Đ˛Ņ…ĐžĐ´ в Ņ‚ĐĩСи ŅĐ°ĐšŅ‚ĐžĐ˛Đĩ Са Đ˛ŅĐ¸Ņ‡Đēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸, в ĐēĐžĐ¸Ņ‚Đž ҁ҂Đĩ вĐŋĐ¸ŅĐ°ĐŊ(а). За да вĐģĐĩСĐĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐžŅ‚Đž в ŅĐ¸Đģа, ĐŋŅ€ĐĩĐˇĐ°Ņ€ĐĩĐ´ĐĩŅ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°." + }, + "websiteItemLabel": { + "message": "ĐŖĐĩĐą ŅĐ°ĐšŅ‚ $number$ (Đ°Đ´Ņ€Đĩҁ)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ĐŊĐĩ Đĩ ваĐģидĐĩĐŊ Đ´ĐžĐŧĐĩĐšĐŊ", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŊа иСĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ‚Đĩ Đ´ĐžĐŧĐĩĐšĐŊи ŅĐ° СаĐŋаСĐĩĐŊи" + }, + "limitSendViews": { + "message": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐĩĐŗĐģĐĩĐļдаĐŊĐ¸ŅŅ‚Đ°" + }, + "limitSendViewsHint": { + "message": "НиĐēОК ĐŊŅĐŧа да ĐŧĐžĐļĐĩ да ĐŋŅ€ĐĩĐŗĐģĐĩĐļда Ņ‚ĐžĐ˛Đ° ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ ҁĐģĐĩĐ´ Đ´ĐžŅŅ‚Đ¸ĐŗĐ°ĐŊĐĩ ĐŊа ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩŅ‚Đž.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "ĐžŅŅ‚Đ°Đ˛Đ°Ņ‚ $ACCESSCOUNT$ ĐŋŅ€ĐĩĐŗĐģĐĩĐļдаĐŊĐ¸Ņ", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ Са ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ĐĸŅŠŅ€ŅĐĩĐŊĐĩ в иСĐŋŅ€Đ°Ņ‚ĐĩĐŊĐ¸Ņ‚Đĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ĐĸĐĩĐēҁ҂" }, + "sendTypeTextToShare": { + "message": "ĐĸĐĩĐēҁ҂ Са ҁĐŋОдĐĩĐģŅĐŊĐĩ" + }, "sendTypeFile": { "message": "ФаКĐģ" }, @@ -1666,6 +2406,9 @@ "message": "Đ’ŅĐ¸Ņ‡Đēи иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐ¸Ņ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ° ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ" + }, "maxAccessCountReached": { "message": "Đ”ĐžŅŅ‚Đ¸ĐŗĐŊĐ°Ņ‚ Đĩ ĐŧаĐēŅĐ¸ĐŧаĐģĐŊĐ¸ŅŅ‚ ĐąŅ€ĐžĐš Đ´ĐžŅŅ‚ŅŠĐŋваĐŊĐ¸Ņ", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Đ—Đ°Ņ‰Đ¸Ņ‚Đ° ҁ ĐŋĐ°Ņ€ĐžĐģа" }, + "copyLink": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ°" + }, "copySendLink": { "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ° ĐēҊĐŧ иСĐŋŅ€Đ°Ņ‚ĐĩĐŊĐžŅ‚Đž", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да Đ¸ĐˇŅ‚Ņ€Đ¸ĐĩŅ‚Đĩ Ņ‚ĐžĐ˛Đ° иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да Đ¸ĐˇŅ‚Ņ€Đ¸ĐĩŅ‚Đĩ СавиĐŊĐ°ĐŗĐ¸ Ņ‚ĐžĐ˛Đ° ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đĩ ĐžĐēĐžĐŊŅ‡Đ°Ņ‚ĐĩĐģĐŊĐž Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đž ĐŊа СададĐĩĐŊĐ°Ņ‚Đ° Đ´Đ°Ņ‚Đ° и Đ˛Ņ€ĐĩĐŧĐĩ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đĩ ĐžĐēĐžĐŊŅ‡Đ°Ņ‚ĐĩĐģĐŊĐž Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đž ĐŊа Ņ‚Đ°ĐˇĐ¸ Đ´Đ°Ņ‚Đ°.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "ĐĄŅ€ĐžĐē ĐŊа ваĐģидĐŊĐžŅŅ‚" }, @@ -1769,6 +2523,10 @@ "message": "Đ˜ĐˇĐ¸ŅĐēваĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа Са Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž Ņ‚ĐžĐ˛Đ° иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "ДобавĐĩŅ‚Đĩ ĐŊĐĩĐˇĐ°Đ´ŅŠĐģĐļĐ¸Ņ‚ĐĩĐģĐŊа ĐŋĐ°Ņ€ĐžĐģа, ҁ ĐēĐžŅŅ‚Đž ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ĐĩĐģĐ¸Ņ‚Đĩ да иĐŧĐ°Ņ‚ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž Ņ‚ĐžĐ˛Đ° ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "ĐĄĐēŅ€Đ¸Ņ‚Đ¸ ĐąĐĩĐģĐĩĐļĐēи Са Ņ‚ĐžĐ˛Đ° иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "ĐĄŅŠĐˇĐ´Đ°Đ´ĐĩĐŊĐž иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž Đĩ ŅŅŠĐˇĐ´Đ°Đ´ĐĩĐŊĐž ҃ҁĐŋĐĩ҈ĐŊĐž!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đĩ Đ´ĐžŅŅ‚ŅŠĐŋĐŊĐž Са Đ˛ŅĐĩĐēи ҁ Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ° ĐŋŅ€ĐĩС ҁĐģĐĩĐ´Đ˛Đ°Ņ‰Đ¸Ņ 1 Ņ‡Đ°Ņ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đĩ Đ´ĐžŅŅ‚ŅŠĐŋĐŊĐž Са Đ˛ŅĐĩĐēи ҁ Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ° ĐŋŅ€ĐĩС ҁĐģĐĩĐ´Đ˛Đ°Ņ‰Đ¸Ņ‚Đĩ $HOURS$ Ņ‡Đ°ŅĐ°.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đĩ Đ´ĐžŅŅ‚ŅŠĐŋĐŊĐž Са Đ˛ŅĐĩĐēи ҁ Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ° ĐŋŅ€ĐĩС ҁĐģĐĩĐ´Đ˛Đ°Ņ‰Đ¸Ņ 1 Đ´ĐĩĐŊ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đĩ Đ´ĐžŅŅ‚ŅŠĐŋĐŊĐž Са Đ˛ŅĐĩĐēи ҁ Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ° ĐŋŅ€ĐĩС ҁĐģĐĩĐ´Đ˛Đ°Ņ‰Đ¸Ņ‚Đĩ $DAYS$ Đ´ĐŊи.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Đ’Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ° ĐēҊĐŧ ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩŅ‚Đž Đĩ ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊа", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐž иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩ ĐŊа Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩŅ‚Đž в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "За да ŅŅŠĐˇĐ´Đ°Đ´ĐĩŅ‚Đĩ Ņ„Đ°ĐšĐģОвО ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ, Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐžŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩŅ‚Đž в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "За да иСйĐĩŅ€ĐĩŅ‚Đĩ Ņ„Đ°ĐšĐģ, ĐžŅ‚Đ˛ĐžŅ€ĐĩŅ‚Đĩ Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩŅ‚Đž в ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° (аĐēĐž Đĩ Đ˛ŅŠĐˇĐŧĐžĐļĐŊĐž) иĐģи в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆, ĐēĐ°Ņ‚Đž ĐŊĐ°Ņ‚Đ¸ŅĐŊĐĩŅ‚Đĩ Ņ‚ĐžĐ˛Đ° ŅŅŠĐžĐąŅ‰ĐĩĐŊиĐĩ." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "За да иСйĐĩŅ€ĐĩŅ‚Đĩ Ņ„Đ°ĐšĐģ в Safari, ĐžŅ‚Đ˛ĐžŅ€ĐĩŅ‚Đĩ Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩŅ‚Đž в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆, ĐēĐ°Ņ‚Đž ĐŊĐ°Ņ‚Đ¸ŅĐŊĐĩŅ‚Đĩ Ņ‚ĐžĐ˛Đ° ŅŅŠĐžĐąŅ‰ĐĩĐŊиĐĩ." }, + "popOut": { + "message": "ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩ в ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆" + }, "sendFileCalloutHeader": { "message": "ĐŸŅ€Đĩди да ĐŋĐžŅ‡ĐŊĐĩŅ‚Đĩ" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ° Đŧи ĐžŅ‚ ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ĐĩĐģĐ¸Ņ‚Đĩ." }, + "hideYourEmail": { + "message": "ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Đ’Đ°ŅˆĐ°Ņ‚Đ° Đĩ-ĐŋĐžŅ‰Đ° ĐžŅ‚ ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ĐĩĐģĐ¸Ņ‚Đĩ." + }, "sendOptionsPolicyInEffect": { "message": "ПоĐŊĐĩ ĐĩĐ´ĐŊа ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēа ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ вĐģĐ¸ŅĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Đ˜ĐˇĐ¸ŅĐēва ҁĐĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŊа Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ°" }, + "emailVerifiedV2": { + "message": "Е-ĐŋĐžŅ‰Đ°Ņ‚Đ° Đĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´ĐĩĐŊа" + }, "emailVerificationRequiredDesc": { "message": "ĐĸŅ€ŅĐąĐ˛Đ° да ĐŋĐžŅ‚Đ˛ŅŠŅ€Đ´Đ¸Ņ‚Đĩ Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ° ŅĐ¸, Са да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ Ņ‚Đ°ĐˇĐ¸ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģĐŊĐžŅŅ‚. МоĐļĐĩŅ‚Đĩ да ĐŗĐž ĐŊаĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đĩ в ҃ĐĩĐą-҂ҀĐĩĐˇĐžŅ€Đ°." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Đ’Đ°ŅˆĐ°Ņ‚Đ° ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа ĐŊĐĩ ĐžŅ‚ĐŗĐžĐ˛Đ°Ņ€Ņ ĐŊа ĐĩĐ´ĐŊа иĐģи ĐŋОвĐĩ҇Đĩ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° Ви. За да ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚Đĩ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ҂ҀĐĩĐˇĐžŅ€Đ°, Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŗĐģавĐŊĐ°Ņ‚Đ° ŅĐ¸ ĐŋĐ°Ņ€ĐžĐģа ҁĐĩĐŗĐ°. ĐĸОва ОСĐŊĐ°Ņ‡Đ°Đ˛Đ°, ҇Đĩ ҉Đĩ ĐąŅŠĐ´ĐĩŅ‚Đĩ ĐžŅ‚ĐŋĐ¸ŅĐ°ĐŊ(а) ĐžŅ‚ Ņ‚ĐĩĐēŅƒŅ‰Đ°Ņ‚Đ° ŅĐ¸ ҁĐĩŅĐ¸Ņ и ҉Đĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да ҁĐĩ вĐŋĐ¸ŅˆĐĩŅ‚Đĩ ĐžŅ‚ĐŊОвО. АĐēŅ‚Đ¸Đ˛ĐŊĐ¸Ņ‚Đĩ ҁĐĩŅĐ¸Đ¸ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° ĐŧĐžĐļĐĩ да ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ°Ņ‚ да ĐąŅŠĐ´Đ°Ņ‚ аĐēŅ‚Đ¸Đ˛ĐŊи ĐžŅ‰Đĩ ĐĩдиĐŊ Ņ‡Đ°Ņ." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Đ’Đ°ŅˆĐ°Ņ‚Đ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đģа ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐĩŅ‚Đž ҇ҀĐĩС дОвĐĩŅ€ĐĩĐŊи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°. Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа, Са да ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚Đĩ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ҂ҀĐĩĐˇĐžŅ€Đ° ŅĐ¸." + }, "resetPasswordPolicyAutoEnroll": { "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž вĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Đ˜ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋаĐŋĐēа..." }, - "ssoCompleteRegistration": { - "message": "За да ĐˇĐ°Đ˛ŅŠŅ€ŅˆĐ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊа идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ, Ņ‚Ņ€ŅĐąĐ˛Đ° да СададĐĩŅ‚Đĩ ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа Са ҂ҀĐĩĐˇĐžŅ€Đ°." + "noFoldersFound": { + "message": "ĐŅĐŧа ĐŊаĐŧĐĩŅ€ĐĩĐŊи ĐŋаĐŋĐēи", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "ĐŸŅ€Đ°Đ˛Đ°Ņ‚Đ° Ви в ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° ĐąŅŅ…Đ° ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊи, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž Đĩ да СададĐĩŅ‚Đĩ ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° Ви Đ¸ĐˇĐ¸ŅĐēва да СададĐĩŅ‚Đĩ ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "ĐžŅ‚ $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Đ˜ĐˇĐ¸ŅĐēва ҁĐĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļĐ´ĐĩĐŊиĐĩ", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Đ§Đ°ŅĐ°" @@ -1904,6 +2740,9 @@ "minutes": { "message": "МиĐŊŅƒŅ‚Đ¸" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Đ˜ĐˇĐ¸ŅĐēваĐŊĐ¸ŅŅ‚Đ° ĐŊа ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēĐ°Ņ‚Đ° Са ĐŗĐžĐģĐĩĐŧи ĐēĐžĐŧĐŋаĐŊии ĐąŅŅ…Đ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊи ĐēҊĐŧ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž Са Đ´ĐžŅŅ‚ŅŠĐŋ" + }, "vaultTimeoutPolicyInEffect": { "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° Ви вĐģĐ¸ŅŅŅ‚ Đ˛ŅŠŅ€Ņ…Ņƒ Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž Са Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ҂ҀĐĩĐˇĐžŅ€Đ° Ви. МаĐēŅĐ¸ĐŧаĐģĐŊĐžŅ‚Đž Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩ Са Đ´ĐžŅŅ‚ŅŠĐŋ Đĩ $HOURS$ Ņ‡Đ°Ņ(а) и $MINUTES$ ĐŧиĐŊŅƒŅ‚Đ¸", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "МаĐēŅĐ¸Đŧ҃Đŧ $HOURS$ Ņ‡Đ°Ņ(а) и $MINUTES$ ĐŧиĐŊŅƒŅ‚Đ°/и.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Đ’Ņ€ĐĩĐŧĐĩŅ‚Đž Са Đ´ĐžŅŅ‚ŅŠĐŋ ĐŋŅ€ĐĩĐ˛Đ¸ŅˆĐ°Đ˛Đ° ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩŅ‚Đž, СададĐĩĐŊĐž ĐžŅ‚ Đ’Đ°ŅˆĐ°Ņ‚Đ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ: ĐŧаĐēŅĐ¸Đŧ҃Đŧ $HOURS$ Ņ‡Đ°Ņ(а) и $MINUTES$ ĐŧиĐŊŅƒŅ‚Đ°/и", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° Ви вĐģĐ¸ŅŅŅ‚ Đ˛ŅŠŅ€Ņ…Ņƒ Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž Са Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž ҂ҀĐĩĐˇĐžŅ€Đ° Ви. МаĐēŅĐ¸ĐŧаĐģĐŊĐžŅ‚Đž Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩ Са Đ´ĐžŅŅ‚ŅŠĐŋ Đĩ $HOURS$ Ņ‡Đ°Ņ(а) и $MINUTES$ ĐŧиĐŊŅƒŅ‚Đ°/и. ЗададĐĩĐŊĐžŅ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŋŅ€Đ¸ Đ¸ĐˇŅ‚Đ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Ņ‚ĐžĐ˛Đ° Đ˛Ņ€ĐĩĐŧĐĩ Đĩ $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "ИСĐŊĐ°ŅŅĐŊĐĩ ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ° ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "exportingOrganizationVaultDesc": { + "message": "ĐŠĐĩ ĐąŅŠĐ´Đ°Ņ‚ иСĐŊĐĩҁĐĩĐŊи ŅĐ°ĐŧĐž СаĐŋĐ¸ŅĐ¸Ņ‚Đĩ ĐžŅ‚ ҂ҀĐĩĐˇĐžŅ€Đ° ŅĐ˛ŅŠŅ€ĐˇĐ°ĐŊ ҁ $ORGANIZATION$. ЗаĐŋĐ¸ŅĐ¸Ņ‚Đĩ в ĐžŅ‚Đ´ĐĩĐģĐŊĐ¸Ņ‚Đĩ ĐģĐ¸Ņ‡ĐŊи ҂ҀĐĩĐˇĐžŅ€Đ¸ и Ņ‚ĐĩСи в Đ´Ņ€ŅƒĐŗĐ¸ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŊŅĐŧа да ĐąŅŠĐ´Đ°Ņ‚ вĐēĐģŅŽŅ‡ĐĩĐŊи.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Đ“Ņ€Đĩ҈Đēа" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ГĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐžŅ‚Ņ€. иĐŧĐĩ" }, + "generateEmail": { + "message": "ГĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊа ĐŋĐžŅ‰Đ°" + }, + "generatorBoundariesHint": { + "message": "ĐĄŅ‚ĐžĐšĐŊĐžŅŅ‚Ņ‚Đ° Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ ĐŧĐĩĐļĐ´Ņƒ $MIN$ и $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "ĐĸиĐŋ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐž иĐŧĐĩ" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "ĐĄŅŠĐˇĐ´Đ°ĐšŅ‚Đĩ ĐŋҁĐĩвдОĐŊиĐŧ ĐŊа Đĩ-ĐŋĐžŅ‰Đ° ҁ Đ˛ŅŠĐŊ҈ĐŊа ҃ҁĐģŅƒĐŗĐ° Са ĐŋŅ€ĐĩĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ." }, + "forwarderDomainName": { + "message": "ДоĐŧĐĩĐšĐŊ ĐŊа ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐ°Ņ‚Đ° ĐŋĐžŅ‰Đ°", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Đ´ĐžĐŧĐĩĐšĐŊ, ĐēĐžĐšŅ‚Đž ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа ĐžŅ‚ Đ¸ĐˇĐąŅ€Đ°ĐŊĐ°Ņ‚Đ° ҃ҁĐģŅƒĐŗĐ°", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐžŅ‚ $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "ĐĄŅŠĐˇĐ´Đ°Đ´ĐĩĐŊĐž ĐžŅ‚ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "ĐŖĐĩĐąŅĐ°ĐšŅ‚: $WEBSITE$. ĐĄŅŠĐˇĐ´Đ°Đ´ĐĩĐŊĐž ĐžŅ‚ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ Са ППИ ĐŊа $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ Са ППИ ĐŊа $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "НĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ĐŊа ĐŧĐ°ŅĐēĐ¸Ņ€Đ°ĐŊ ҇ҀĐĩС Đĩ-ĐŋĐžŅ‰Đ° аĐēĐ°ŅƒĐŊŅ‚ ĐžŅ‚ $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ Đ´ĐžĐŧĐĩĐšĐŊ Са $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ Đ°Đ´Ņ€Đĩҁ ĐŊа $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Đ’ŅŠĐˇĐŊиĐēĐŊа ĐŊĐĩĐžŅ‡Đ°ĐēваĐŊа ĐŗŅ€Đĩ҈Đēа ŅĐ˛ŅŠŅ€ĐˇĐ°ĐŊа ҁ $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "НĐĩиСвĐĩҁ҂ĐŊа ĐŋŅ€ĐĩĐŊĐ°ŅĐžŅ‡Đ˛Đ°Ņ‰Đ° ҃ҁĐģŅƒĐŗĐ°: „$SERVICENAME$“.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ИĐŧĐĩ ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°", "description": "Part of a URL." @@ -2096,10 +3100,10 @@ "message": "ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊ Ņ…ĐžŅŅ‚Đ¸ĐŊĐŗ" }, "thirdParty": { - "message": "Third-party" + "message": "ĐĸŅ€ĐĩŅ‚Đ° ŅŅ‚Ņ€Đ°ĐŊа" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "ĐĄĐ˛ŅŠŅ€ĐˇĐ°ĐŊ(а) ҁ҂Đĩ ҁҊҁ ŅŅŠŅ€Đ˛ŅŠŅ€ĐŊа иĐŧĐŋĐģĐĩĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Ņ ĐžŅ‚ ҂ҀĐĩŅ‚Đ° ŅŅ‚Ņ€Đ°ĐŊа — $SERVERNAME$. АĐēĐž ҁĐĩ ŅĐąĐģҊҁĐēĐ°Ņ‚Đĩ ҁ ĐŋŅ€ĐžĐąĐģĐĩĐŧ, ĐŧĐžĐļĐĩ да ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚Đĩ ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģĐŊĐ¸Ņ ŅŅŠŅ€Đ˛ŅŠŅ€, иĐģи да ĐŗĐž Đ´ĐžĐēĐģĐ°Đ´Đ˛Đ°Ņ‚Đĩ в ŅŅŠŅ€Đ˛ŅŠŅ€Đ° ĐŊа ҂ҀĐĩŅ‚Đ°Ņ‚Đ° ŅŅ‚Ņ€Đ°ĐŊа.", "placeholders": { "servername": { "content": "$1", @@ -2156,16 +3160,16 @@ "message": "ВĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩŅ‚Đž Đĩ ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐž" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "РаСОйĐģĐ¸Ņ‡ĐĩĐŊа ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "ĐŸĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° Đĩ ĐŊаĐŧĐĩŅ€ĐĩĐŊа в ĐŋŅ€ĐžĐąĐ¸Đ˛ ĐŊа даĐŊĐŊи. ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ҃ĐŊиĐēаĐģĐŊа ĐŋĐ°Ņ€ĐžĐģа, Са да ĐˇĐ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚Đĩ Đ˛Đ°ŅˆĐ¸Ņ аĐēĐ°ŅƒĐŊŅ‚. ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ ҁĐģайа ĐŋĐ°Ņ€ĐžĐģа?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "ĐĄĐģайа и Ņ€Đ°ĐˇĐžĐąĐģĐ¸Ņ‡ĐĩĐŊа ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "РаСĐŋОСĐŊĐ°Ņ‚Đ° Đĩ ҁĐģайа ĐŋĐ°Ņ€ĐžĐģа, ĐēĐžŅŅ‚Đž ĐŋŅ€Đ¸ŅŅŠŅŅ‚Đ˛Đ° в иСвĐĩҁ҂ĐĩĐŊ ҁĐģŅƒŅ‡Đ°Đš ĐŊа Đ¸ĐˇŅ‚ĐĩĐēĐģи даĐŊĐŊи. ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ҁĐģĐžĐļĐŊа и ҃ĐŊиĐēаĐģĐŊа ĐŋĐ°Ņ€ĐžĐģа, Са да ĐˇĐ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚Đĩ даĐŊĐŊĐ¸Ņ‚Đĩ ŅĐ¸. ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ Ņ‚Đ°ĐˇĐ¸ ĐŋĐ°Ņ€ĐžĐģа?" }, "checkForBreaches": { "message": "ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ в иСвĐĩҁ҂ĐŊĐ¸Ņ‚Đĩ ҁĐģŅƒŅ‡Đ°Đ¸ ĐŊа Đ¸ĐˇŅ‚ĐĩĐēĐģи даĐŊĐŊи Са Ņ‚Đ°ĐˇĐ¸ ĐŋĐ°Ņ€ĐžĐģа" @@ -2192,7 +3196,7 @@ "message": "КаĐē ҁĐĩ ĐŋĐžĐģСва Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ" }, "autofillSelectInfoWithCommand": { - "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ ĐžŅ‚ Ņ‚Đ°ĐˇĐ¸ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° иĐģи иСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ҁĐģĐĩĐ´ĐŊĐ°Ņ‚Đ° ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ: $COMMAND$", + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа Ņ‚ĐžĐˇĐ¸ ĐĩĐēŅ€Đ°ĐŊ, иСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸ŅŅ‚Đ° $COMMAND$ иĐģи Ņ€Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸ ĐžĐŋŅ†Đ¸Đ¸ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ ĐžŅ‚ Ņ‚Đ°ĐˇĐ¸ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° иĐģи ĐˇĐ°Đ´Đ°ĐšŅ‚Đĩ ĐēĐģĐ°Đ˛Đ¸ŅˆĐŊа ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ." + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа Ņ‚ĐžĐˇĐ¸ ĐĩĐēŅ€Đ°ĐŊ иĐģи Ņ€Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸ ĐžĐŋŅ†Đ¸Đ¸ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ." }, "gotIt": { "message": "Đ Đ°ĐˇĐąŅ€Đ°ĐŊĐž" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "КĐģĐ°Đ˛Đ¸ŅˆĐŊа ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐēĐģĐ°Đ˛Đ¸ŅˆĐŊĐ°Ņ‚Đ° ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐēĐģĐ°Đ˛Đ¸ŅˆĐŊĐ¸Ņ‚Đĩ ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Đ¸" + }, "autofillShortcut": { "message": "КĐģĐ°Đ˛Đ¸ŅˆĐŊа ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ" }, - "autofillShortcutNotSet": { - "message": "ĐŅĐŧа СададĐĩĐŊа ĐēĐģĐ°Đ˛Đ¸ŅˆĐŊа ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ. ĐŸŅ€ĐžĐŧĐĩĐŊĐĩŅ‚Đĩ Ņ‚ĐžĐ˛Đ° в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°." + "autofillLoginShortcutNotSet": { + "message": "ĐŅĐŧа СададĐĩĐŊа ĐēĐģĐ°Đ˛Đ¸ŅˆĐŊа ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа даĐŊĐŊи Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ. ĐŸŅ€ĐžĐŧĐĩĐŊĐĩŅ‚Đĩ Ņ‚ĐžĐ˛Đ° в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°." }, - "autofillShortcutText": { - "message": "КĐģĐ°Đ˛Đ¸ŅˆĐŊĐ°Ņ‚Đ° ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ Đĩ: $COMMAND$. МоĐļĐĩ да Ņ ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°.", + "autofillLoginShortcutText": { + "message": "КĐģĐ°Đ˛Đ¸ŅˆĐŊĐ°Ņ‚Đ° ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа даĐŊĐŊи Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ Đĩ $COMMAND$. МоĐļĐĩ да ĐŋŅ€ĐžĐŧĐĩĐŊŅŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи ĐēĐģĐ°Đ˛Đ¸ŅˆĐŊи ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Đ¸ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "ВĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ в" - }, "opensInANewWindow": { "message": "ĐžŅ‚Đ˛Đ°Ņ€Ņ ҁĐĩ в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ŅŠŅ‚ Са ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊа идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ Đĩ ĐˇĐ°Đ´ŅŠĐģĐļĐ¸Ņ‚ĐĩĐģĐĩĐŊ." }, + "creatingAccountOn": { + "message": "ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ в" + }, + "checkYourEmail": { + "message": "ĐŸŅ€ĐžĐ˛ĐĩŅ€ĐĩŅ‚Đĩ Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ° ŅĐ¸" + }, + "followTheLinkInTheEmailSentTo": { + "message": "ĐŸĐžŅĐģĐĩĐ´Đ˛Đ°ĐšŅ‚Đĩ Đ˛Ņ€ŅŠĐˇĐēĐ°Ņ‚Đ° в Đĩ-ĐŋĐ¸ŅĐŧĐžŅ‚Đž иСĐŋŅ€Đ°Ņ‚ĐĩĐŊĐž Đ´Đž" + }, + "andContinueCreatingYourAccount": { + "message": "и ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐĩŅ‚Đĩ ҁҊҁ ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸." + }, + "noEmail": { + "message": "НĐĩ ҁ҂Đĩ ĐŋĐžĐģŅƒŅ‡Đ¸Đģи Đĩ-ĐŋĐ¸ŅĐŧĐž?" + }, + "goBack": { + "message": "Đ’ŅŠŅ€ĐŊĐĩŅ‚Đĩ ҁĐĩ ĐŊаСад" + }, + "toEditYourEmailAddress": { + "message": ", Са да Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°Ņ‚Đĩ Đ°Đ´Ņ€ĐĩŅĐ° ĐŊа Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ° ŅĐ¸." + }, "eu": { "message": "ЕС", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "ĐžŅ‚ĐēаСаĐŊ Đ´ĐžŅŅ‚ŅŠĐŋ. ĐŅĐŧĐ°Ņ‚Đĩ ĐŋŅ€Đ°Đ˛Đž Са ĐŋŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°." }, @@ -2303,8 +3328,16 @@ "deviceTrusted": { "message": "ĐŖŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž Đĩ дОвĐĩŅ€ĐĩĐŊĐž" }, + "sendsNoItemsTitle": { + "message": "ĐŅĐŧа аĐēŅ‚Đ¸Đ˛ĐŊи ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐ¸Ņ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ, Са да ҁĐŋОдĐĩĐģĐ¸Ņ‚Đĩ ĐąĐĩСОĐŋĐ°ŅĐŊĐž ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ҁ ĐŊŅĐēĐžĐŗĐž.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { - "message": "ПоĐģĐĩŅ‚Đž Đĩ ĐˇĐ°Đ´ŅŠĐģĐļŅ‚ĐĩĐģĐŊĐž да ĐąŅŠĐ´Đĩ ĐŋĐžĐŋҊĐģĐŊĐĩĐŊĐž." + "message": "ПоĐģĐĩŅ‚Đž Đĩ ĐˇĐ°Đ´ŅŠĐģĐļĐ¸Ņ‚ĐĩĐģĐŊĐž да ĐąŅŠĐ´Đĩ ĐŋĐžĐŋҊĐģĐŊĐĩĐŊĐž." }, "required": { "message": "ĐˇĐ°Đ´ŅŠĐģĐļĐ¸Ņ‚ĐĩĐģĐŊĐž" @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 ĐŋĐžĐģĐĩ ҁĐĩ ĐŊ҃ĐļдаĐĩ ĐžŅ‚ вĐŊиĐŧаĐŊиĐĩŅ‚Đž Ви." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ ĐŋĐžĐģĐĩŅ‚Đ° ҁĐĩ ĐŊ҃ĐļĐ´Đ°ŅŅ‚ ĐžŅ‚ вĐŊиĐŧаĐŊиĐĩŅ‚Đž Ви.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- ИСйĐĩŅ€ĐĩŅ‚Đĩ --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "ĐŸŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩŅ‚Đž", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "ВĐŊĐ°ŅŅĐŊĐĩ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ Ви в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Đ—Đ°Ņ‰Đ¸Ņ‚Đ°Đ˛Đ°ĐŊĐĩ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ Ви ĐžŅ‚ LastPass и вĐŊĐ°ŅŅĐŊĐĩ в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "ЗаĐŋаСваĐŊĐĩ ĐēĐ°Ņ‚Đž ĐŊĐĩŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊ Ņ„Đ°ĐšĐģ", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "ВĐŊĐ°ŅŅĐŊĐĩ в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ВĐŊĐ°ŅŅĐŊĐĩâ€Ļ", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "ДаĐŊĐŊĐ¸Ņ‚Đĩ ĐąŅŅ…Đ° вĐŊĐĩҁĐĩĐŊи ҃ҁĐŋĐĩ҈ĐŊĐž!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ вĐŊĐ°ŅŅĐŊĐĩŅ‚Đž. ВиĐļŅ‚Đĩ ĐēĐžĐŊСОĐģĐ°Ņ‚Đ° Са ĐŋĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "По Đ˛Ņ€ĐĩĐŧĐĩ ĐŊа вĐŊĐ°ŅŅĐŊĐĩŅ‚Đž Đ˛ŅŠĐˇĐŊиĐēĐŊа ĐŧŅ€ĐĩĐļОва ĐŗŅ€Đĩ҈Đēа.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "ĐŸŅĐĩвдОĐŊиĐŧĐĩĐŊ Đ´ĐžĐŧĐĩĐšĐŊ" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "ЗаĐŋĐ¸ŅĐ¸Ņ‚Đĩ ҁ вĐēĐģŅŽŅ‡ĐĩĐŊĐž Đ¸ĐˇĐ¸ŅĐēваĐŊĐĩ Са ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ˛ŅŠĐ˛ĐĩĐļдаĐŊĐĩ ĐŊа ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ‚ да ĐąŅŠĐ´Đ°Ņ‚ ĐŋĐžĐŋҊĐģваĐŊи Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°. ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° Đĩ иСĐēĐģŅŽŅ‡ĐĩĐŊĐž.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ° иСĐŋĐžĐģСва ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ‚Đ° ŅĐ¸ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "ИСĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐžŅ‚Đž Đ˛ŅŠĐ˛ĐĩĐļдаĐŊĐĩ ĐŊа ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа, Са да Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°Ņ‚Đĩ Ņ‚ĐžĐ˛Đ° ĐŋĐžĐģĐĩ", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "ĐŸŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐŊĐ°Ņ‚Đ° ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ" + }, + "skipToContent": { + "message": "ĐŸŅ€ĐĩҁĐēĐ°Ņ‡Đ°ĐŊĐĩ ĐēҊĐŧ ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩŅ‚Đž" + }, + "bitwardenOverlayButton": { + "message": "Đ‘ŅƒŅ‚ĐžĐŊ ĐŊа ĐŧĐĩĐŊŅŽŅ‚Đž Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "ĐŸŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа ĐŧĐĩĐŊŅŽŅ‚Đž Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "МĐĩĐŊŅŽ Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸, Са да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ ŅŅŠĐ˛ĐŋĐ°Đ´Đ°Ņ‰Đ¸Ņ‚Đĩ СаĐŋĐ¸ŅĐ¸ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸, Са да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "ĐžŅ‚ĐēĐģŅŽĐ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°, ĐžŅ‚Đ˛Đ°Ņ€Ņ ҁĐĩ в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "ПоĐŋҊĐģваĐŊĐĩ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ Са", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Đ§Đ°ŅŅ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐž иĐŧĐĩ", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "ĐŅĐŧа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ Са ĐŋĐžĐēаСваĐŊĐĩ", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Нов ĐĩĐģĐĩĐŧĐĩĐŊŅ‚", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊОв ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ в ҂ҀĐĩĐˇĐžŅ€Đ°", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Нов ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊОв ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ в ҂ҀĐĩĐˇĐžŅ€Đ°, ĐžŅ‚Đ˛Đ°Ņ€Ņ ҁĐĩ в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Нова ĐēĐ°Ņ€Ņ‚Đ°", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊОв ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са ĐēĐ°Ņ€Ņ‚Đ° в ҂ҀĐĩĐˇĐžŅ€Đ°, ĐžŅ‚Đ˛Đ°Ņ€Ņ ҁĐĩ в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Нова ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊОв ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са идĐĩĐŊŅ‚Đ¸Ņ‡ĐŊĐžŅŅ‚ в ҂ҀĐĩĐˇĐžŅ€Đ°, ĐžŅ‚Đ˛Đ°Ņ€Ņ ҁĐĩ в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "ИĐŧа ĐŊаĐģĐ¸Ņ‡ĐŊĐž ĐŧĐĩĐŊŅŽ Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ. ĐĐ°Ņ‚Đ¸ŅĐŊĐĩŅ‚Đĩ ҁ҂ҀĐĩĐģĐēĐ°Ņ‚Đ° ĐŊадОĐģ҃, Са да ĐŗĐž иСйĐĩŅ€ĐĩŅ‚Đĩ.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ" + }, + "ignore": { + "message": "ĐŸŅ€ĐĩĐŊĐĩĐąŅ€ĐĩĐŗĐ˛Đ°ĐŊĐĩ" + }, + "importData": { + "message": "ВĐŊĐ°ŅŅĐŊĐĩ ĐŊа даĐŊĐŊи", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ вĐŊĐ°ŅŅĐŊĐĩŅ‚Đž" + }, + "importErrorDesc": { + "message": "ИĐŧа ĐŋŅ€ĐžĐąĐģĐĩĐŧ ҁ даĐŊĐŊĐ¸Ņ‚Đĩ, ĐēĐžĐ¸Ņ‚Đž вĐŊĐ°ŅŅŅ‚Đĩ. ПоĐŋŅ€Đ°Đ˛ĐĩŅ‚Đĩ ĐŗŅ€Đĩ҈ĐēĐ¸Ņ‚Đĩ ĐŋĐžŅĐžŅ‡ĐĩĐŊи ĐŋĐž-Đ´ĐžĐģ҃ и ĐŋŅ€ĐžĐąĐ˛Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "ОĐŋŅ€Đ°Đ˛ĐĩŅ‚Đĩ ĐŗŅ€Đĩ҈ĐēĐ¸Ņ‚Đĩ ĐŋĐž-Đ´ĐžĐģ҃ и ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО." + }, + "description": { + "message": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ" + }, + "importSuccess": { + "message": "ДаĐŊĐŊĐ¸Ņ‚Đĩ ŅĐ° вĐŊĐĩҁĐĩĐŊи ҃ҁĐŋĐĩ҈ĐŊĐž" + }, + "importSuccessNumberOfItems": { + "message": "ĐžĐąŅ‰Đž вĐŊĐĩҁĐĩĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸: $AMOUNT$.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Нов ĐžĐŋĐ¸Ņ‚" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "ĐĸОва Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ Đ¸ĐˇĐ¸ŅĐēва ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ. Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ПИН, Са да ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚Đĩ." + }, + "setPin": { + "message": "ЗадаваĐŊĐĩ ĐŊа ПИН" + }, + "verifyWithBiometrics": { + "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ҁ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи" + }, + "awaitingConfirmation": { + "message": "Đ˜ĐˇŅ‡Đ°Đēва ҁĐĩ ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļĐ´ĐĩĐŊиĐĩ" + }, + "couldNotCompleteBiometrics": { + "message": "ДĐĩĐšŅŅ‚Đ˛Đ¸ĐĩŅ‚Đž ҁ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ĐˇĐ°Đ˛ŅŠŅ€ŅˆĐĩĐŊĐž." + }, + "needADifferentMethod": { + "message": "Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐžĐŋĐ¸Ņ‚Đ°Ņ‚Đĩ Đ´Ņ€ŅƒĐŗ ĐŧĐĩŅ‚ĐžĐ´?" + }, + "useMasterPassword": { + "message": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа ĐŗĐģавĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа" + }, + "usePin": { + "message": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа ПИН" + }, + "useBiometrics": { + "message": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊи даĐŊĐŊи" + }, + "enterVerificationCodeSentToEmail": { + "message": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐēОда Са ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ, ĐēĐžĐšŅ‚Đž ĐąĐĩ҈Đĩ иСĐŋŅ€Đ°Ņ‚ĐĩĐŊ ĐŊа Đ’Đ°ŅˆĐ°Ņ‚Đ° Đĩ-ĐŋĐžŅ‰Đ°." + }, + "resendCode": { + "message": "ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ ĐŊа ĐēОда" + }, + "total": { + "message": "ĐžĐąŅ‰Đž" + }, + "importWarning": { + "message": "ВĐŊĐ°ŅŅŅ‚Đĩ даĐŊĐŊи ĐēҊĐŧ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° „$ORGANIZATION$“. ДаĐŊĐŊĐ¸Ņ‚Đĩ ĐŧĐžĐŗĐ°Ņ‚ да ĐąŅŠĐ´Đ°Ņ‚ ҁĐŋОдĐĩĐģĐĩĐŊи ҁ ҇ĐģĐĩĐŊОвĐĩŅ‚Đĩ Ņ. ĐĄĐ¸ĐŗŅƒŅ€ĐŊи Đģи ҁ҂Đĩ, ҇Đĩ Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚Đĩ?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ŅĐ˛ŅŠŅ€ĐˇĐ˛Đ°ĐŊĐĩŅ‚Đž ҁ ҃ҁĐģŅƒĐŗĐ°Ņ‚Đ° ĐŊа Duo. ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ Đ´Ņ€ŅƒĐŗ ĐŧĐĩŅ‚ĐžĐ´ Са Đ´Đ˛ŅƒŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ иĐģи ҁĐĩ ŅĐ˛ŅŠŅ€ĐļĐĩŅ‚Đĩ ҁ Duo Са ŅŅŠĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "ĐĄŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐšŅ‚Đĩ DUO и ҁĐģĐĩĐ´Đ˛Đ°ĐšŅ‚Đĩ иĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đ¸Ņ‚Đĩ, Са да ĐˇĐ°Đ˛ŅŠŅ€ŅˆĐ¸Ņ‚Đĩ вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩŅ‚Đž." + }, + "duoRequiredForAccount": { + "message": "Đ’Đ°ŅˆĐ°Ņ‚Đ° Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ Đ¸ĐˇĐ¸ŅĐēва Đ´Đ˛ŅƒŅŅ‚ĐĩĐŋĐĩĐŊĐŊĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ҇ҀĐĩС Duo." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "ĐžŅ‚Đ˛ĐžŅ€ĐĩŅ‚Đĩ Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩŅ‚Đž в Đ¸ĐˇŅĐēĐ°Ņ‡Đ°Ņ‰ ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆, Са да ĐˇĐ°Đ˛ŅŠŅ€ŅˆĐ¸Ņ‚Đĩ вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩŅ‚Đž." + }, + "popoutExtension": { + "message": "ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩ ĐŊа Ņ€Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊиĐĩŅ‚Đž в ĐŊОв ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆" + }, + "launchDuo": { + "message": "ĐĄŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа DUO" + }, + "importFormatError": { + "message": "ДаĐŊĐŊĐ¸Ņ‚Đĩ ŅĐ° в ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ Ņ„ĐžŅ€ĐŧĐ°Ņ‚. ĐŸŅ€ĐžĐ˛ĐĩŅ€ĐĩŅ‚Đĩ Ņ„Đ°ĐšĐģа Са вĐŊĐ°ŅŅĐŊĐĩ и ĐŋŅ€ĐžĐąĐ˛Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО." + }, + "importNothingError": { + "message": "ĐĐ¸Ņ‰Đž ĐŊĐĩ ĐąĐĩ вĐŊĐĩҁĐĩĐŊĐž." + }, + "importEncKeyError": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ Đ´ĐĩŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа иСĐŊĐĩҁĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ. КĐģŅŽŅ‡ŅŠŅ‚ Са ŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊĐĩ ĐžŅ‚ĐŗĐžĐ˛Đ°Ņ€Ņ ĐŊа Ņ‚ĐžĐˇĐ¸, ĐēĐžĐšŅ‚Đž Đĩ иСĐŋĐžĐģСваĐŊ Са иСĐŊĐ°ŅŅĐŊĐĩŅ‚Đž ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ." + }, + "invalidFilePassword": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐŊа ĐŋĐ°Ņ€ĐžĐģа Са Ņ„Đ°ĐšĐģа. ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°, ĐēĐžŅŅ‚Đž ҁ҂Đĩ Đ˛ŅŠĐ˛ĐĩĐģи ĐŋŅ€Đ¸ ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа иСĐŊĐĩҁĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ." + }, + "destination": { + "message": "МĐĩŅŅ‚ĐžĐŊаСĐŊĐ°Ņ‡ĐĩĐŊиĐĩ" + }, + "learnAboutImportOptions": { + "message": "ĐĐ°ŅƒŅ‡ĐĩŅ‚Đĩ ĐŋОвĐĩ҇Đĩ ĐžŅ‚ĐŊĐžŅĐŊĐž Đ˛ŅŠĐˇĐŧĐžĐļĐŊĐžŅŅ‚Đ¸Ņ‚Đĩ Са вĐŊĐ°ŅŅĐŊĐĩ" + }, + "selectImportFolder": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐŋаĐŋĐēа" + }, + "selectImportCollection": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ" + }, + "importTargetHint": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ‚Đ°ĐˇĐ¸ ĐžĐŋŅ†Đ¸Ņ, аĐēĐž Đ¸ŅĐēĐ°Ņ‚Đĩ ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩŅ‚Đž ĐŊа вĐŊĐĩҁĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ да ĐąŅŠĐ´Đĩ ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊĐž в $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "ФаКĐģŅŠŅ‚ ŅŅŠĐ´ŅŠŅ€Đļа ĐŊĐĩĐ˛ŅŠĐˇĐģĐžĐļĐĩĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸." + }, + "selectFormat": { + "message": "Đ˜ĐˇĐąĐžŅ€ ĐŊа Ņ„ĐžŅ€ĐŧĐ°Ė€Ņ‚Đ° ĐŊа Ņ„Đ°ĐšĐģа Са вĐŊĐ°ŅŅĐŊĐĩ" + }, + "selectImportFile": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ„Đ°ĐšĐģа Са вĐŊĐ°ŅŅĐŊĐĩ" + }, + "chooseFile": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ„Đ°ĐšĐģ" + }, + "noFileChosen": { + "message": "НĐĩ Đĩ Đ¸ĐˇĐąŅ€Đ°ĐŊ Ņ„Đ°ĐšĐģ" + }, + "orCopyPasteFileContents": { + "message": "иĐģи ĐŋĐžŅŅ‚Đ°Đ˛ĐĩŅ‚Đĩ ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩŅ‚Đž Đŧ҃" + }, + "instructionsFor": { + "message": "ИĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đ¸ Са $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа вĐŊĐ°ŅŅĐŊĐĩŅ‚Đž ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ°" + }, + "confirmVaultImportDesc": { + "message": "ĐĸОСи Ņ„Đ°ĐšĐģ Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊ ҁ ĐŋĐ°Ņ€ĐžĐģа. ĐĸŅ€ŅĐąĐ˛Đ° да Đ˛ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°, Са да ĐŧĐžĐŗĐ°Ņ‚ даĐŊĐŊĐ¸Ņ‚Đĩ да ĐąŅŠĐ´Đ°Ņ‚ вĐŊĐĩҁĐĩĐŊи." + }, + "confirmFilePassword": { + "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ĐŊа Ņ„Đ°ĐšĐģа" + }, + "exportSuccess": { + "message": "ДаĐŊĐŊĐ¸Ņ‚Đĩ ĐžŅ‚ ҂ҀĐĩĐˇĐžŅ€Đ° ŅĐ° иСĐŊĐĩҁĐĩĐŊи" + }, + "typePasskey": { + "message": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡" + }, + "accessing": { + "message": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа" + }, + "passkeyNotCopied": { + "message": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸ŅŅ‚ ĐēĐģŅŽŅ‡ ĐŊŅĐŧа да ĐąŅŠĐ´Đĩ ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊ" + }, + "passkeyNotCopiedAlert": { + "message": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸ŅŅ‚ ĐēĐģŅŽŅ‡ ĐŊŅĐŧа да ĐąŅŠĐ´Đĩ ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊ в ĐēĐģĐžĐŊĐ¸Ņ€Đ°ĐŊĐ¸Ņ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚. Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚Đĩ ҁ ĐēĐģĐžĐŊĐ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Đ˜ĐˇĐ¸ŅĐēва ҁĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēа ĐžŅ‚ иĐŊĐ¸Ņ†Đ¸Đ¸Ņ€Đ°Ņ‰Đ¸Ņ ŅĐ°ĐšŅ‚. ĐĸаСи Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ Đ˛ŅĐĩ ĐžŅ‰Đĩ ĐŊĐĩ Đĩ вĐŊĐĩĐ´Ņ€ĐĩĐŊа Са аĐēĐ°ŅƒĐŊŅ‚Đ¸ ĐąĐĩС ĐŗĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа." + }, + "logInWithPasskeyQuestion": { + "message": "ВĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ҁҊҁ ҁĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡?" + }, + "passkeyAlreadyExists": { + "message": "За Ņ‚ĐžĐ˛Đ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ вĐĩ҇Đĩ ŅŅŠŅ‰ĐĩŅŅ‚Đ˛ŅƒĐ˛Đ° ҁĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡." + }, + "noPasskeysFoundForThisApplication": { + "message": "ĐŅĐŧа ĐŊаĐŧĐĩŅ€ĐĩĐŊи ҁĐĩĐēŅ€ĐĩŅ‚ĐŊи ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ Са Ņ‚ĐžĐ˛Đ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ." + }, + "noMatchingPasskeyLogin": { + "message": "ĐŅĐŧĐ°Ņ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ, ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰ Са Ņ‚ĐžĐˇĐ¸ ҃ĐĩĐą ŅĐ°ĐšŅ‚." + }, + "noMatchingLoginsForSite": { + "message": "ĐŅĐŧа СаĐŋĐ¸ŅĐ¸ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ĐžŅ‚ĐŗĐžĐ˛Đ°Ņ€ŅŅ‰Đ¸ ĐŊа Ņ‚ĐžĐˇĐ¸ ҃ĐĩĐą ŅĐ°ĐšŅ‚" + }, + "searchSavePasskeyNewLogin": { + "message": "ĐĸŅŠŅ€ŅĐĩĐŊĐĩ иĐģи СаĐŋаСваĐŊĐĩ ĐŊа ҁĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸Ņ ĐēĐģŅŽŅ‡ ĐēĐ°Ņ‚Đž ĐŊОв ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ" + }, + "confirm": { + "message": "ĐŸĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ" + }, + "savePasskey": { + "message": "ЗаĐŋаСваĐŊĐĩ ĐŊа ҁĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸Ņ ĐēĐģŅŽŅ‡" + }, + "savePasskeyNewLogin": { + "message": "ЗаĐŋаСваĐŊĐĩ ĐŊа ҁĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸Ņ ĐēĐģŅŽŅ‡ ĐēĐ°Ņ‚Đž ĐŊОв ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ" + }, + "chooseCipherForPasskeySave": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚, в ĐēĐžĐšŅ‚Đž да СаĐŋĐ°ĐˇĐ¸Ņ‚Đĩ Ņ‚ĐžĐˇĐ¸ ҁĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡" + }, + "chooseCipherForPasskeyAuth": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ҁĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡, ҁ ĐēĐžĐšŅ‚Đž да ҁĐĩ вĐŋĐ¸ŅˆĐĩŅ‚Đĩ" + }, + "passkeyItem": { + "message": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡" + }, + "overwritePasskey": { + "message": "Да ҁĐĩ СаĐŧĐĩĐŊи Đģи ҁĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸ŅŅ‚ ĐēĐģŅŽŅ‡?" + }, + "overwritePasskeyAlert": { + "message": "ĐĸОСи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ вĐĩ҇Đĩ ŅŅŠĐ´ŅŠŅ€Đļа ҁĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡. ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да СаĐŧĐĩĐŊĐ¸Ņ‚Đĩ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ ҁĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡?" + }, + "featureNotSupported": { + "message": "ĐĸаСи Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģĐŊĐžŅŅ‚ Đ˛ŅĐĩ ĐžŅ‰Đĩ ĐŊĐĩ ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа" + }, + "yourPasskeyIsLocked": { + "message": "За да ҁĐĩ ĐŋĐžĐģСва ҁĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸ŅŅ‚ ĐēĐģŅŽŅ‡, Đĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ. ĐŸĐžŅ‚Đ˛ŅŠŅ€Đ´ĐĩŅ‚Đĩ ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Ņ‚Đ° ŅĐ¸, Са да ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚Đĩ." + }, + "multifactorAuthenticationCancelled": { + "message": "МĐŊĐžĐŗĐžŅŅ‚ŅŠĐŋĐēĐžĐ˛ĐžŅ‚Đž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ Đĩ ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊĐž" + }, + "noLastPassDataFound": { + "message": "ĐŅĐŧа ĐŊаĐŧĐĩŅ€ĐĩĐŊи даĐŊĐŊи ĐžŅ‚ LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐŊĐž ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐž иĐŧĐĩ иĐģи ĐŋĐ°Ņ€ĐžĐģа" + }, + "incorrectPassword": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐŊа ĐŋĐ°Ņ€ĐžĐģа" + }, + "incorrectCode": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ ĐēОд" + }, + "incorrectPin": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐĩĐŊ ПИН" + }, + "multifactorAuthenticationFailed": { + "message": "МĐŊĐžĐŗĐžŅŅ‚ŅŠĐŋĐēĐžĐ˛ĐžŅ‚Đž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ĐąĐĩ҈Đĩ ĐŊĐĩ҃ҁĐŋĐĩ҈ĐŊĐž" + }, + "includeSharedFolders": { + "message": "Да ҁĐĩ вĐēĐģŅŽŅ‡Đ°Ņ‚ и ҁĐŋОдĐĩĐģĐĩĐŊĐ¸Ņ‚Đĩ ĐŋаĐŋĐēи" + }, + "lastPassEmail": { + "message": "Е-ĐŋĐžŅ‰Đ° ĐžŅ‚ LastPass" + }, + "importingYourAccount": { + "message": "ВĐŊĐ°ŅŅĐŊĐĩ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ Виâ€Ļ" + }, + "lastPassMFARequired": { + "message": "Đ˜ĐˇĐ¸ŅĐēва ҁĐĩ ĐŧĐŊĐžĐŗĐžŅŅ‚ŅŠĐŋĐēОвО ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ Са LastPass" + }, + "lastPassMFADesc": { + "message": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊĐ¸Ņ ĐēОд Са Đ´ĐžŅŅ‚ŅŠĐŋ ĐžŅ‚ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž ŅĐ¸ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ" + }, + "lastPassOOBDesc": { + "message": "ĐžĐ´ĐžĐąŅ€ĐĩŅ‚Đĩ ĐˇĐ°ŅĐ˛ĐēĐ°Ņ‚Đ° Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ в ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž ŅĐ¸ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ, иĐģи Đ˛ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐĩĐŊ ĐēОд Са Đ´ĐžŅŅ‚ŅŠĐŋ." + }, + "passcode": { + "message": "Код Са Đ´ĐžŅŅ‚ŅŠĐŋ" + }, + "lastPassMasterPassword": { + "message": "ГĐģавĐŊа ĐŋĐ°Ņ€ĐžĐģа ĐŊа LastPass" + }, + "lastPassAuthRequired": { + "message": "Đ˜ĐˇĐ¸ŅĐēва ҁĐĩ ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ в LastPass" + }, + "awaitingSSO": { + "message": "Đ˜ĐˇŅ‡Đ°ĐēваĐŊĐĩ ĐŊа ĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊĐžŅ‚Đž ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ" + }, + "awaitingSSODesc": { + "message": "МоĐģŅ, ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐĩŅ‚Đĩ вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩŅ‚Đž ҁ даĐŊĐŊĐ¸Ņ‚Đĩ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ĐŊа Đ’Đ°ŅˆĐ°Ņ‚Đ° ĐēĐžĐŧĐŋаĐŊĐ¸Ņ." + }, + "seeDetailedInstructions": { + "message": "МоĐļĐĩ да ĐŊаĐŧĐĩŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐ´Ņ€ĐžĐąĐŊи иĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đ¸ в ĐŋĐžĐŧĐžŅ‰ĐŊĐ¸Ņ ĐŊи ҃ĐĩĐą ŅĐ°ĐšŅ‚ ĐŊа Đ°Đ´Ņ€Đĩҁ", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "ВĐŊĐ°ŅŅĐŊĐĩ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐŊĐž ĐžŅ‚ LastPass" + }, + "importFromCSV": { + "message": "ВĐŊĐ°ŅŅĐŊĐĩ ĐžŅ‚ CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО иĐģи виĐļŅ‚Đĩ даĐģи иĐŧĐ°Ņ‚Đĩ Đĩ-ĐŋĐ¸ŅĐŧĐž ĐžŅ‚ LastPass Са ĐŋĐžŅ‚Đ˛ŅŠŅ€ĐļдаваĐŊĐĩ ĐŊа ŅĐ°ĐŧĐžĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Ņ‚Đ° ŅĐ¸." + }, + "collection": { + "message": "КоĐģĐĩĐēŅ†Đ¸Ņ" + }, + "lastPassYubikeyDesc": { + "message": "ĐŸĐžŅŅ‚Đ°Đ˛ĐĩŅ‚Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž ĐŊа YubiKey, ĐēĐžĐĩŅ‚Đž Đĩ ŅĐ˛ŅŠŅ€ĐˇĐ°ĐŊĐž ҁ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ° Ви в LastPass, в USB ĐŋĐžŅ€Ņ‚ и ĐŊĐ°Ņ‚Đ¸ŅĐŊĐĩŅ‚Đĩ ĐąŅƒŅ‚ĐžĐŊа ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž." + }, + "switchAccount": { + "message": "ĐŸŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "switchAccounts": { + "message": "ĐŸŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸Ņ‚Đĩ" + }, + "switchToAccount": { + "message": "ĐŸŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐēҊĐŧ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "activeAccount": { + "message": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "availableAccounts": { + "message": "НаĐģĐ¸Ņ‡ĐŊи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸" + }, + "accountLimitReached": { + "message": "Đ”ĐžŅŅ‚Đ¸ĐŗĐŊĐ°Ņ‚Đž Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩŅ‚Đž ĐŊа ĐąŅ€ĐžŅ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸. ИСĐģĐĩĐˇŅ‚Đĩ ĐžŅ‚ ĐŊŅĐēĐžŅ, Са да Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ°." + }, + "active": { + "message": "аĐēŅ‚Đ¸Đ˛ĐŊĐž" + }, + "locked": { + "message": "СаĐēĐģŅŽŅ‡ĐĩĐŊĐž" + }, + "unlocked": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊĐž" + }, + "server": { + "message": "ŅŅŠŅ€Đ˛ŅŠŅ€" + }, + "hostedAt": { + "message": "Đ´ĐžĐŧаĐēиĐŊŅŅ‚Đ˛Đ°ĐŊĐž ĐŋŅ€Đ¸" + }, + "useDeviceOrHardwareKey": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ŅĐ˛ĐžĐĩŅ‚Đž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž иĐģи Ņ…Đ°Ņ€Đ´ŅƒĐĩŅ€ĐĩĐŊ ĐēĐģŅŽŅ‡" + }, + "justOnce": { + "message": "ХаĐŧĐž вĐĩĐ´ĐŊҊĐļ" + }, + "alwaysForThisSite": { + "message": "ВиĐŊĐ°ĐŗĐ¸ Са Ņ‚ĐžĐˇĐ¸ ҃ĐĩĐą ŅĐ°ĐšŅ‚" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ ĐąĐĩ҈Đĩ дОйавĐĩĐŊĐž ĐēҊĐŧ иСĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ‚Đĩ Đ´ĐžĐŧĐĩĐšĐŊи.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "ЧĐĩŅŅ‚Đž иСĐŋĐžĐģСваĐŊи Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļаваĐŊĐĩ ĐēҊĐŧ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "ĐŸŅ€ĐžĐ´ŅŠĐģĐļаваĐŊĐĩ ĐēҊĐŧ ĐŋĐžĐŧĐžŅ‰ĐŊĐ¸Ņ ҆ĐĩĐŊŅ‚ŅŠŅ€?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "ĐŸŅ€ĐžĐŧĐĩĐŊĐĩŅ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ° ŅĐ¸ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ и ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ¸Ņ‚Đĩ.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "МоĐļĐĩŅ‚Đĩ да ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‚Đĩ и ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚Đĩ ĐēĐģĐ°Đ˛Đ¸ŅˆĐŊĐ¸Ņ‚Đĩ ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Đ¸ Са дОйавĐēĐ°Ņ‚Đ° в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ° ŅĐ¸.", + "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": "ĐŸŅ€ĐžĐŧĐĩĐŊĐĩŅ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ° ŅĐ¸ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ и ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ¸Ņ‚Đĩ.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "МоĐļĐĩŅ‚Đĩ да ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‚Đĩ и ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚Đĩ ĐēĐģĐ°Đ˛Đ¸ŅˆĐŊĐ¸Ņ‚Đĩ ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Đ¸ Са дОйавĐēĐ°Ņ‚Đ° в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ° ŅĐ¸.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŊаĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đĩ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ŅĐ˛ĐžŅ ҃ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģ ĐŊа ĐŋĐ°Ņ€ĐžĐģи ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "АĐēĐž ĐŋŅ€ĐĩĐŊĐĩĐąŅ€ĐĩĐŗĐŊĐĩŅ‚Đĩ Ņ‚Đ°ĐˇĐ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа, ĐŧĐžĐļĐĩ да иĐŧа ĐēĐžĐŊŅ„ĐģиĐēŅ‚ ĐŧĐĩĐļĐ´Ņƒ ĐŧĐĩĐŊŅŽŅ‚Đž Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ и Ņ‚ĐžĐ˛Đ° ĐŊа ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "НаĐŋŅ€Đ°Đ˛ĐĩŅ‚Đĩ Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ŅĐ˛ĐžŅ ҃ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģ ĐŊа ĐŋĐ°Ņ€ĐžĐģи ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ СададĐĩĐŊ ĐēĐ°Ņ‚Đž ҃ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģ ĐŊа ĐŋĐ°Ņ€ĐžĐģи ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "ĐĸŅ€ŅĐąĐ˛Đ° да дадĐĩŅ‚Đĩ ĐŊа Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ Са ĐŋĐžĐģСваĐŊĐĩ в ĐŋОвĐĩŅ€Đ¸Ņ‚ĐĩĐģĐŊи ĐŋŅ€ĐžĐˇĐžŅ€Ņ†Đ¸, аĐēĐž Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŗĐž СададĐĩŅ‚Đĩ ĐēĐ°Ņ‚Đž ҃ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģ ĐŊа ĐŋĐ°Ņ€ĐžĐģи ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "ЗадаваĐŊĐĩ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊĐŊĐ¸Ņ‚Đĩ даĐŊĐŊи ŅĐ° СаĐŋаСĐĩĐŊи ҃ҁĐŋĐĩ҈ĐŊĐž!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "ĐŸĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° Đĩ СаĐŋаСĐĩĐŊа!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊĐŊĐ¸Ņ‚Đĩ даĐŊĐŊи ŅĐ° ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊи ҃ҁĐŋĐĩ҈ĐŊĐž!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "ĐŸĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° Đĩ ОйĐŊОвĐĩĐŊа!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ СаĐŋаСваĐŊĐĩŅ‚Đž ĐŊа идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊĐŊĐ¸Ņ‚Đĩ даĐŊĐŊи. ВиĐļŅ‚Đĩ ĐēĐžĐŊСОĐģĐ°Ņ‚Đ° Са ĐŋĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "ĐŖŅĐŋĐĩŅ…" + }, + "removePasskey": { + "message": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸Ņ ĐēĐģŅŽŅ‡" + }, + "passkeyRemoved": { + "message": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐŊĐ¸ŅŅ‚ ĐēĐģŅŽŅ‡ Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚" + }, + "autofillSuggestions": { + "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ" + }, + "autofillSuggestionsTip": { + "message": "ЗаĐŋаСваĐŊĐĩ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ Са Ņ‚ĐžĐˇĐ¸ ҃ĐĩĐą ŅĐ°ĐšŅ‚, Са Đ°Đ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ" + }, + "yourVaultIsEmpty": { + "message": "ĐĸŅ€ĐĩĐˇĐžŅ€ŅŠŅ‚ Đĩ ĐŋŅ€Đ°ĐˇĐĩĐŊ" + }, + "noItemsMatchSearch": { + "message": "ĐŅĐŧа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸, ĐžŅ‚ĐŗĐžĐ˛Đ°Ņ€ŅŅ‰Đ¸ ĐŊа Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž" + }, + "clearFiltersOrTryAnother": { + "message": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚ĐĩŅ‚Đĩ Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ‚Đĩ иĐģи ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да Ņ‚ŅŠŅ€ŅĐ¸Ņ‚Đĩ ĐŊĐĩŅ‰Đž Đ´Ņ€ŅƒĐŗĐž" + }, + "copyInfoTitle": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŅ‚Đ° – $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐĩĐģĐĩĐļĐēĐ°Ņ‚Đ° – $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "ĐžŅ‰Đĩ ĐžĐŋŅ†Đ¸Đ¸, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "ĐžŅ‰Đĩ ĐžĐŋŅ†Đ¸Đ¸ – $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° – $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "ĐĐ˛Ņ‚. ĐŋĐžĐŋҊĐģваĐŊĐĩ – $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "ĐŅĐŧа ŅŅ‚ĐžĐšĐŊĐžŅŅ‚Đ¸ Са ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊĐĩ" + }, + "assignToCollections": { + "message": "ĐĄĐ˛ŅŠŅ€ĐˇĐ˛Đ°ĐŊĐĩ ҁ ĐēĐžĐģĐĩĐēŅ†Đ¸Đ¸" + }, + "copyEmail": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ°" + }, + "copyPhone": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊа" + }, + "copyAddress": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ°Đ´Ņ€ĐĩŅĐ°" + }, + "adminConsole": { + "message": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚Đ¸Đ˛ĐŊа ĐēĐžĐŊСОĐģа" + }, + "accountSecurity": { + "message": "Đ—Đ°Ņ‰Đ¸Ņ‚Đ° ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "notifications": { + "message": "ИСвĐĩŅŅ‚Đ¸Ņ" + }, + "appearance": { + "message": "Đ’ŅŠĐŊ҈ĐĩĐŊ вид" + }, + "errorAssigningTargetCollection": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ СадаваĐŊĐĩŅ‚Đž ĐŊа ҆ĐĩĐģĐĩва ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ." + }, + "errorAssigningTargetFolder": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ СадаваĐŊĐĩŅ‚Đž ĐŊа ҆ĐĩĐģĐĩва ĐŋаĐŋĐēа." + }, + "viewItemsIn": { + "message": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸Ņ‚Đĩ в $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Назад ĐēҊĐŧ $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Ново" + }, + "removeItem": { + "message": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ ĐąĐĩС ĐŋаĐŋĐēа" + }, + "itemDetails": { + "message": "ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ Са ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "itemName": { + "message": "ИĐŧĐĩ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "cannotRemoveViewOnlyCollections": { + "message": "НĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ да ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°Ņ‚Đĩ ĐēĐžĐģĐĩĐēŅ†Đ¸Đ¸ ҁ ĐŋŅ€Đ°Đ˛Đ° „СаĐŧĐž Са ĐŋŅ€ĐĩĐŗĐģĐĩд“: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊа" + }, + "owner": { + "message": "ĐĄĐžĐąŅŅ‚Đ˛ĐĩĐŊиĐē" + }, + "selfOwnershipLabel": { + "message": "ВиĐĩ", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "ЗаĐŋĐ¸ŅĐ¸Ņ‚Đĩ в Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊи ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŊĐĩ ŅĐ° Đ´ĐžŅŅ‚ŅŠĐŋĐŊи. ĐĄĐ˛ŅŠŅ€ĐļĐĩŅ‚Đĩ ҁĐĩ ҁҊҁ ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊиĐēа ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° ŅĐ¸ Са ĐŋĐžĐŧĐžŅ‰." + }, + "additionalInformation": { + "message": "ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ" + }, + "itemHistory": { + "message": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "lastEdited": { + "message": "ĐŸĐžŅĐģĐĩĐ´ĐŊа ĐŋŅ€ĐžĐŧŅĐŊа" + }, + "ownerYou": { + "message": "ĐĄĐžĐąŅŅ‚Đ˛ĐĩĐŊиĐē: ВиĐĩ" + }, + "linked": { + "message": "ĐĄĐ˛ŅŠŅ€ĐˇĐ°ĐŊĐž" + }, + "copySuccessful": { + "message": "КоĐŋĐ¸Ņ€Đ°ĐŊĐĩŅ‚Đž Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž" + }, + "upload": { + "message": "ĐšĐ°Ņ‡Đ˛Đ°ĐŊĐĩ" + }, + "addAttachment": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋŅ€Đ¸ĐēĐ°Ņ‡ĐĩĐŊ Ņ„Đ°ĐšĐģ" + }, + "maxFileSizeSansPunctuation": { + "message": "МаĐēŅĐ¸ĐŧаĐģĐŊĐ¸ŅŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐŊа Ņ„Đ°ĐšĐģа Đĩ 500 MB" + }, + "deleteAttachmentName": { + "message": "Đ˜ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ¸ĐēĐ°Ņ‡ĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "ХваĐģŅĐŊĐĩ ĐŊа $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "ĐĐ°Đ¸ŅŅ‚Đ¸ĐŊа Đģи Đ¸ŅĐēĐ°Ņ‚Đĩ да Đ¸ĐˇŅ‚Ņ€Đ¸ĐĩŅ‚Đĩ СавиĐŊĐ°ĐŗĐ¸ Ņ‚ĐžĐˇĐ¸ ĐŋŅ€Đ¸ĐēĐ°Ņ‡ĐĩĐŊ Ņ„Đ°ĐšĐģ?" + }, + "premium": { + "message": "ĐŸŅ€ĐĩĐŧĐ¸ŅƒĐŧ" + }, + "freeOrgsCannotUseAttachments": { + "message": "БĐĩСĐŋĐģĐ°Ņ‚ĐŊĐ¸Ņ‚Đĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŊĐĩ ĐŧĐžĐŗĐ°Ņ‚ да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚ ĐŋŅ€Đ¸ĐēĐ°Ņ‡ĐĩĐŊи Ņ„Đ°ĐšĐģОвĐĩ" + }, + "filters": { + "message": "ФиĐģŅ‚Ņ€Đ¸" + }, + "personalDetails": { + "message": "Đ›Đ¸Ņ‡ĐŊи даĐŊĐŊи" + }, + "identification": { + "message": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ" + }, + "contactInfo": { + "message": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Са Đ˛Ņ€ŅŠĐˇĐēа" + }, + "downloadAttachment": { + "message": "ХваĐģŅĐŊĐĩ – $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "ĐŊĐžĐŧĐĩŅ€ŅŠŅ‚ ĐŊа ĐēĐ°Ņ€Ņ‚Đ°Ņ‚Đ° ĐˇĐ°Đ˛ŅŠŅ€ŅˆĐ˛Đ° ҁ", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "ДаĐŊĐŊи Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ" + }, + "authenticatorKey": { + "message": "КĐģŅŽŅ‡ Са ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ" + }, + "autofillOptions": { + "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ" + }, + "websiteUri": { + "message": "ĐŖĐĩĐą ŅĐ°ĐšŅ‚ (Đ°Đ´Ņ€Đĩҁ)" + }, + "websiteUriCount": { + "message": "ĐŖĐĩĐą ŅĐ°ĐšŅ‚ (Đ°Đ´Ņ€Đĩҁ) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "ĐŖĐĩĐą ŅĐ°ĐšŅ‚ŅŠŅ‚ Đĩ дОйавĐĩĐŊ" + }, + "addWebsite": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ҃ĐĩĐą ŅĐ°ĐšŅ‚" + }, + "deleteWebsite": { + "message": "Đ˜ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ҃ĐĩĐą ŅĐ°ĐšŅ‚" + }, + "defaultLabel": { + "message": "По ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐžŅ‚ĐēŅ€Đ¸Ņ‚ĐžŅ‚Đž ŅŅŠĐ˛ĐŋадĐĩĐŊиĐĩ $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐžŅ‚ĐēŅ€Đ¸Ņ‚ĐžŅ‚Đž ŅŅŠĐ˛ĐŋадĐĩĐŊиĐĩ $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°?" + }, + "cardExpiredTitle": { + "message": "Đ˜ĐˇŅ‚ĐĩĐēĐģа ĐēĐ°Ņ€Ņ‚Đ°" + }, + "cardExpiredMessage": { + "message": "АĐēĐž ҁ҂Đĩ Ņ ĐŋОдĐŊОвиĐģи, аĐēŅ‚ŅƒĐ°ĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐšŅ‚Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŅ‚Đ° Са ĐēĐ°Ņ€Ņ‚Đ°Ņ‚Đ°" + }, + "cardDetails": { + "message": "ДаĐŊĐŊи Са ĐēĐ°Ņ€Ņ‚Đ°Ņ‚Đ°" + }, + "cardBrandDetails": { + "message": "ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ Са $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа аĐŊиĐŧĐ°Ņ†Đ¸Đ¸Ņ‚Đĩ" + }, + "showAnimations": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа аĐŊиĐŧĐ°Ņ†Đ¸Đ¸" + }, + "addAccount": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ" + }, + "loading": { + "message": "Đ—Đ°Ņ€ĐĩĐļдаĐŊĐĩ" + }, + "data": { + "message": "ДаĐŊĐŊи" + }, + "passkeys": { + "message": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐŊи ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "ĐŸĐ°Ņ€ĐžĐģи", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "ВĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ҁҊҁ ҁĐĩĐēŅ€ĐĩŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "ĐĄĐ˛ŅŠŅ€ĐˇĐ˛Đ°ĐŊĐĩ" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "ХаĐŧĐž ҇ĐģĐĩĐŊОвĐĩŅ‚Đĩ ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ°, ĐēĐžĐ¸Ņ‚Đž иĐŧĐ°Ņ‚ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž Ņ‚ĐĩСи ĐēĐžĐģĐĩĐēŅ†Đ¸Đ¸, ҉Đĩ ĐŧĐžĐŗĐ°Ņ‚ да виĐļĐ´Đ°Ņ‚ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "ХаĐŧĐž ҇ĐģĐĩĐŊОвĐĩŅ‚Đĩ ĐŊа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ°, ĐēĐžĐ¸Ņ‚Đž иĐŧĐ°Ņ‚ Đ´ĐžŅŅ‚ŅŠĐŋ Đ´Đž Ņ‚ĐĩСи ĐēĐžĐģĐĩĐēŅ†Đ¸Đ¸, ҉Đĩ ĐŧĐžĐŗĐ°Ņ‚ да виĐļĐ´Đ°Ņ‚ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸Ņ‚Đĩ." + }, + "bulkCollectionAssignmentWarning": { + "message": "Đ˜ĐˇĐąŅ€Đ°Đģи ҁ҂Đĩ $TOTAL_COUNT$ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° НĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ да ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ $READONLY_COUNT$ ĐžŅ‚ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸Ņ‚Đĩ, Ņ‚ŅŠĐš ĐēĐ°Ņ‚Đž ĐŊŅĐŧĐ°Ņ‚Đĩ ĐŋŅ€Đ°Đ˛Đž Са Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐžĐģĐĩ" + }, + "add": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ" + }, + "fieldType": { + "message": "ĐĸиĐŋ ĐŊа ĐŋĐžĐģĐĩŅ‚Đž" + }, + "fieldLabel": { + "message": "Đ•Ņ‚Đ¸ĐēĐĩŅ‚ ĐŊа ĐŋĐžĐģĐĩŅ‚Đž" + }, + "textHelpText": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đ¸ ĐŋĐžĐģĐĩŅ‚Đ° Са ОйиĐēĐŊОвĐĩĐŊи даĐŊĐŊи, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ Đ˛ŅŠĐŋŅ€ĐžŅĐ¸ Са ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚" + }, + "hiddenHelpText": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ҁĐēŅ€Đ¸Ņ‚Đ¸ ĐŋĐžĐģĐĩŅ‚Đ° Са Ņ‡ŅƒĐ˛ŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģĐŊи даĐŊĐŊи, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ ĐŋĐ°Ņ€ĐžĐģи" + }, + "checkBoxHelpText": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ĐŋĐžĐģĐĩŅ‚Đ° Са ĐžŅ‚ĐŧĐĩŅ‚Đēи, аĐēĐž Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŋĐžĐŋҊĐģĐ˛Đ°Ņ‚Đĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ‚Đ°Đēива ĐŋĐžĐģĐĩŅ‚Đ° Đ˛ŅŠĐ˛ Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€Đ¸, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ Ņ‚Đ°ĐēОва Са СаĐŋĐžĐŧĐŊŅĐŊĐĩ ĐŊа Đĩ-ĐŋĐžŅ‰Đ°Ņ‚Đ°" + }, + "linkedHelpText": { + "message": "ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ŅĐ˛ŅŠŅ€ĐˇĐ°ĐŊĐž ĐŋĐžĐģĐĩ, ĐēĐžĐŗĐ°Ņ‚Đž иĐŧĐ°Ņ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧи ҁ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐĩĐŊ ҃ĐĩĐą ŅĐ°ĐšŅ‚." + }, + "linkedLabelHelpText": { + "message": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐŋĐžĐ´Ņ€ĐžĐąĐŊĐžŅŅ‚Đ¸ Са ĐŋĐžĐģĐĩŅ‚Đž ĐžŅ‚ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸Ņ‚Đĩ Đŧ҃ в HTML – id, name, aria-label иĐģи placeholder." + }, + "editField": { + "message": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋĐžĐģĐĩŅ‚Đž" + }, + "editFieldLabel": { + "message": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Đ˜ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "ДобавĐĩĐŊĐž: $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "ĐŸŅ€ĐĩĐŧĐĩŅŅ‚Đ˛Đ°ĐŊĐĩ ĐŊа $LABEL$. ИСĐŋĐžĐģĐˇĐ˛Đ°ĐšŅ‚Đĩ ҁ҂ҀĐĩĐģĐēĐ¸Ņ‚Đĩ, Са да ĐŋŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Ņ‚Đĩ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° ĐŊĐ°ĐŗĐžŅ€Đĩ иĐģи ĐŊадОĐģ҃.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "ĐŸŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊĐž ĐŊĐ°ĐŗĐžŅ€Đĩ: $LABEL$. ĐŸĐžĐˇĐ¸Ņ†Đ¸Ņ $INDEX$ ĐžŅ‚ $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐēĐžĐģĐĩĐēŅ†Đ¸Đ¸ Са ŅĐ˛ŅŠŅ€ĐˇĐ˛Đ°ĐŊĐĩ" + }, + "personalItemTransferWarningSingular": { + "message": "1 ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ ҉Đĩ ĐąŅŠĐ´Đĩ ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊ СавиĐŊĐ°ĐŗĐ¸ в Đ¸ĐˇĐąŅ€Đ°ĐŊĐ°Ņ‚Đ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ. ВĐĩ҇Đĩ ĐŊŅĐŧа да ĐŋŅ€Đ¸Ņ‚ĐĩĐļĐ°Đ˛Đ°Ņ‚Đĩ Ņ‚ĐžĐˇĐ¸ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊи СавиĐŊĐ°ĐŗĐ¸ в Đ¸ĐˇĐąŅ€Đ°ĐŊĐ°Ņ‚Đ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ. ВĐĩ҇Đĩ ĐŊŅĐŧа да ĐŋŅ€Đ¸Ņ‚ĐĩĐļĐ°Đ˛Đ°Ņ‚Đĩ Ņ‚ĐĩСи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ ҉Đĩ ĐąŅŠĐ´Đĩ ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊ СавиĐŊĐ°ĐŗĐ¸ в $ORG$. ВĐĩ҇Đĩ ĐŊŅĐŧа да ĐŋŅ€Đ¸Ņ‚ĐĩĐļĐ°Đ˛Đ°Ņ‚Đĩ Ņ‚ĐžĐˇĐ¸ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ° ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊи СавиĐŊĐ°ĐŗĐ¸ в $ORG$. ВĐĩ҇Đĩ ĐŊŅĐŧа да ĐŋŅ€Đ¸Ņ‚ĐĩĐļĐ°Đ˛Đ°Ņ‚Đĩ Ņ‚ĐĩСи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "ĐŖŅĐŋĐĩ҈ĐŊĐž ŅĐ˛ŅŠŅ€ĐˇĐ˛Đ°ĐŊĐĩ ĐŊа ĐēĐžĐģĐĩĐēŅ†Đ¸Đ¸Ņ‚Đĩ" + }, + "nothingSelected": { + "message": "НĐĩ ҁ҂Đĩ Đ¸ĐˇĐąŅ€Đ°Đģи ĐŊĐ¸Ņ‰Đž." + }, + "movedItemsToOrg": { + "message": "Đ˜ĐˇĐąŅ€Đ°ĐŊĐ¸Ņ‚Đĩ СаĐŋĐ¸ŅĐ¸ ĐąŅŅ…Đ° ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊи в $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚Đ¸Ņ‚Đĩ ŅĐ° ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊи в $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚ŅŠŅ‚ Đĩ ĐŋŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊ в $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "ĐŸŅ€ĐĩĐŧĐĩҁ҂ĐĩĐŊĐž ĐŊадОĐģ҃: $LABEL$. ĐŸĐžĐˇĐ¸Ņ†Đ¸Ņ $INDEX$ ĐžŅ‚ $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "МĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "fileSend": { + "message": "ФаКĐģОвО иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ" + }, + "fileSends": { + "message": "ФаКĐģОви иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐ¸Ņ" + }, + "textSend": { + "message": "ĐĸĐĩĐēŅŅ‚ĐžĐ˛Đž иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ" + }, + "textSends": { + "message": "ĐĸĐĩĐēŅŅ‚ĐžĐ˛Đ¸ иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐ¸Ņ" + }, + "bitwardenNewLook": { + "message": "Đ‘Đ¸ŅƒĐžŅ€Đ´ĐĩĐŊ иĐŧа ĐŊОв ОйĐģиĐē!" + }, + "bitwardenNewLookDesc": { + "message": "ĐĄĐĩĐŗĐ° Đĩ ĐŋĐž-ĐģĐĩҁĐŊĐž и иĐŊŅ‚ŅƒĐ¸Ņ‚Đ¸Đ˛ĐŊĐž ĐžŅ‚ Đ˛ŅŅĐēĐžĐŗĐ° да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžŅ‚Đž ĐŋĐžĐŋҊĐģваĐŊĐĩ и да Ņ‚ŅŠŅ€ŅĐ¸Ņ‚Đĩ в Ņ€Đ°ĐˇĐ´ĐĩĐģа ĐŊа ҂ҀĐĩĐˇĐžŅ€Đ°. Đ Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ!" + }, + "accountActions": { + "message": "ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŋĐž Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŅ‚Đ°" + }, + "showNumberOfAutofillSuggestions": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐąŅ€ĐžŅ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ Са Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа даĐŊĐŊи Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ Đ˛ŅŠŅ€Ņ…Ņƒ иĐēĐžĐŊĐēĐ°Ņ‚Đ° ĐŊа дОйавĐēĐ°Ņ‚Đ°" + }, + "systemDefault": { + "message": "По ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ Са ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ°" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Đ˜ĐˇĐ¸ŅĐēваĐŊĐ¸ŅŅ‚Đ° ĐŊа ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēĐ°Ņ‚Đ° Са ĐŗĐžĐģĐĩĐŧи ĐēĐžĐŧĐŋаĐŊии ĐąŅŅ…Đ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊи ĐēҊĐŧ Ņ‚Đ°ĐˇĐ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа" + }, + "sshPrivateKey": { + "message": "Đ§Đ°ŅŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡" + }, + "sshPublicKey": { + "message": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐĩĐŊ ĐēĐģŅŽŅ‡" + }, + "sshFingerprint": { + "message": "ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚ŅŠĐē" + }, + "sshKeyAlgorithm": { + "message": "ĐĸиĐŋ ĐŊа ĐēĐģŅŽŅ‡Đ°" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048 ĐąĐ¸Ņ‚Đ°" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072 ĐąĐ¸Ņ‚Đ°" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096 ĐąĐ¸Ņ‚Đ°" + }, + "retry": { + "message": "ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊ ĐžĐŋĐ¸Ņ‚" + }, + "vaultCustomTimeoutMinimum": { + "message": "МиĐŊиĐŧаĐģĐŊĐžŅ‚Đž ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩ Са Đ´ĐžŅŅ‚ŅŠĐŋ Đĩ 1 ĐŧиĐŊŅƒŅ‚Đ°." + }, + "additionalContentAvailable": { + "message": "ИĐŧа ĐŊаĐģĐ¸Ņ‡ĐŊĐž Đ´ĐžĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊĐž ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ" + }, + "fileSavedToDevice": { + "message": "ФаКĐģŅŠŅ‚ Đĩ СаĐŋаСĐĩĐŊ ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž. МоĐļĐĩŅ‚Đĩ да ĐŗĐž ĐŊаĐŧĐĩŅ€Đ¸Ņ‚Đĩ в ĐŧŅŅŅ‚ĐžŅ‚Đž Са ŅĐ˛Đ°ĐģŅĐŊĐ¸Ņ ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž." + }, + "showCharacterCount": { + "message": "ПоĐēаСваĐŊĐĩ ĐŊа ĐąŅ€ĐžŅ СĐŊĐ°Ņ†Đ¸" + }, + "hideCharacterCount": { + "message": "ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅ€ĐžŅ СĐŊĐ°Ņ†Đ¸" + }, + "itemsInTrash": { + "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ в ĐēĐžŅˆŅ‡ĐĩŅ‚Đž" + }, + "noItemsInTrash": { + "message": "ĐŅĐŧа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ в ĐēĐžŅˆŅ‡ĐĩŅ‚Đž" + }, + "noItemsInTrashDesc": { + "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚Đ¸Ņ‚Đĩ, ĐēĐžĐ¸Ņ‚Đž Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°Ņ‚Đĩ, ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ ĐŋŅ€ĐĩĐŧĐĩŅŅ‚Đ˛Đ°ĐŊи Ņ‚ŅƒĐē и Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊи ĐžĐēĐžĐŊŅ‡Đ°Ņ‚ĐĩĐģĐŊĐž ҁĐģĐĩĐ´ 30 Đ´ĐŊи" + }, + "trashWarning": { + "message": "ЕĐģĐĩĐŧĐĩĐŊŅ‚Đ¸Ņ‚Đĩ, ĐēĐžĐ¸Ņ‚Đž ŅĐ° йиĐģи в ĐēĐžŅˆŅ‡ĐĩŅ‚Đž Са ĐŋОвĐĩ҇Đĩ ĐžŅ‚ 30 Đ´ĐŊи, ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊи Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž" + }, + "restore": { + "message": "Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ" + }, + "deleteForever": { + "message": "Đ˜ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ СавиĐŊĐ°ĐŗĐ¸" + }, + "noEditPermissions": { + "message": "ĐŅĐŧĐ°Ņ‚Đĩ ĐŋŅ€Đ°Đ˛Đž Са Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ‚ĐžĐˇĐ¸ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚" + }, + "authenticating": { + "message": "ĐŖĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ" + }, + "fillGeneratedPassword": { + "message": "ПоĐŋҊĐģваĐŊĐĩ ĐŊа ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "ĐŸĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° Đĩ ĐŋŅ€ĐĩĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊа", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "ЗаĐŋаСваĐŊĐĩ ĐŊа даĐŊĐŊĐ¸Ņ‚Đĩ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ в Đ‘Đ¸Ņ‚ŅƒĐžŅ€Đ´ĐĩĐŊ?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "ИĐŊŅ‚ĐĩŅ€Đ˛Đ°Đģ", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Đ’ŅŠĐģĐŊĐ¸Ņ‡Đēа", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "ĐŖĐ´Đ¸Đ˛Đ¸Ņ‚ĐĩĐģĐĩĐŊ СĐŊаĐē", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "КĐģŅŒĐžĐŧйа", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "ДиĐĩС", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "ЗĐŊаĐē Са Đ´ĐžĐģĐ°Ņ€", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "ĐŸŅ€ĐžŅ†ĐĩĐŊŅ‚", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "КоĐģийĐēа", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "АĐŧĐŋĐĩŅ€ŅĐ°ĐŊĐ´", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "ЗвĐĩĐˇĐ´Đ¸Ņ‡Đēа", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Đ›ŅĐ˛Đ° ҁĐēОйа", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Đ”ŅŅĐŊа ҁĐēОйа", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "ДоĐģĐŊа ҇ĐĩŅ€Ņ‚Đ°", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "ĐĸĐ¸Ņ€Đĩ", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "ПĐģŅŽŅ", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "РавĐŊĐž", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Đ›ŅĐ˛Đ° Ņ„Đ¸ĐŗŅƒŅ€ĐŊа ҁĐēОйа", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Đ”ŅŅĐŊа Ņ„Đ¸ĐŗŅƒŅ€ĐŊа ҁĐēОйа", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Đ›ŅĐ˛Đ° ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊа ҁĐēОйа", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Đ”ŅŅĐŊа ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊа ҁĐēОйа", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "ВĐĩŅ€Ņ‚Đ¸ĐēаĐģĐŊа ҇ĐĩŅ€Ņ‚Đ°", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "ĐžĐąŅ€Đ°Ņ‚ĐŊа ĐŊаĐēĐģĐžĐŊĐĩĐŊа ҇ĐĩŅ€Ņ‚Đ°", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "ДвоĐĩŅ‚ĐžŅ‡Đ¸Đĩ", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "ĐĸĐžŅ‡Đēа и СаĐŋĐĩŅ‚Đ°Ņ", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "ДвойĐŊа ĐēĐ°Đ˛Đ¸Ņ‡Đēа", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "ЕдиĐŊĐ¸Ņ‡ĐŊа ĐēĐ°Đ˛Đ¸Ņ‡Đēа", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "По-ĐŧаĐģĐēĐž", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "По-ĐŗĐžĐģŅĐŧĐž", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "ЗаĐŋĐĩŅ‚Đ°Ņ", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "ĐĸĐžŅ‡Đēа", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Đ’ŅŠĐŋŅ€ĐžŅĐ¸Ņ‚ĐĩĐģĐĩĐŊ СĐŊаĐē", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "НаĐēĐģĐžĐŊĐĩĐŊа ҇ĐĩŅ€Ņ‚Đ°", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "МаĐģĐēи ĐąŅƒĐēви" + }, + "uppercaseAriaLabel": { + "message": "ГĐģавĐŊи ĐąŅƒĐēви" + }, + "generatedPassword": { + "message": "ГĐĩĐŊĐĩŅ€Đ¸Ņ€Đ°ĐŊа ĐŋĐ°Ņ€ĐžĐģа" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index f57c4687ea3..b1ba11bdb29 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "āφāĻĒāύāĻžāϰ āϏāĻŽāĻ¸ā§āϤ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āĻāĻŦāĻ‚ āĻŦāĻŋāύāĻžāĻŽā§‚āĻ˛ā§āϝ⧇āϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ•āĨ¤", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "āφāĻĒāύāĻžāϰ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āĻ­āĻ˛ā§āĻŸā§‡ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāϤ⧇ āϞāĻ— āχāύ āĻ•āϰ⧁āύ āĻ…āĻĨāĻŦāĻž āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤" }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" }, - "login": { - "message": "āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰ⧁āύ" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "āĻāĻ¨ā§āϟāĻžāϰāĻĒā§āϰāĻžāχāϜ āĻāĻ•āĻ• āϏāĻžāχāύ-āĻ…āύ" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϭ⧁āϞ⧇ āϝāĻžāύ āϤāĻžāĻšāϞ⧇ āĻāĻ•āϟāĻŋ āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄā§‡āϰ āχāĻ™ā§āĻ—āĻŋāϤāϟāĻŋ āφāĻĒāύāĻžāϕ⧇ āĻŽāύ⧇ āĻ•āϰāĻžāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤" }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϟāĻŋ āϞāĻŋāϖ⧁āύ" }, "masterPassHint": { "message": "āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āχāĻ™ā§āĻ—āĻŋāϤ (āϐāĻšā§āĻ›āĻŋāĻ•)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "āĻŸā§āϝāĻžāĻŦ" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻ…āύ⧁āϞāĻŋāĻĒāĻŋāϤ āĻ•āϰ⧁āύ" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "āύ⧋āϟ āĻ…āύ⧁āϞāĻŋāĻĒāĻŋāϤ āĻ•āϰ⧁āύ" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "āϏ⧁āϰāĻ•ā§āώāĻž āϕ⧋āĻĄ āĻ…āύ⧁āϞāĻŋāĻĒāĻŋāϤ āĻ•āϰ⧁āύ" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "āĻ¸ā§āĻŦāϤāσāĻĒā§‚āϰāĻŖ" }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" + }, "generatePasswordCopied": { "message": "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ (āĻ…āύ⧁āϞāĻŋāĻĒāĻŋāĻ•ā§ƒāϤ)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "āϕ⧋āύāĻ“ āĻŽāĻŋāϞāϤ āϞāĻ—āχāύ āύ⧇āχāĨ¤" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -115,6 +231,18 @@ "addItem": { "message": "āĻŦāĻ¸ā§āϤ⧁ āϜ⧁⧜⧁āύ" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āχāĻ™ā§āĻ—āĻŋāϤ" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ" - }, "changeMasterPassword": { "message": "āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "āĻĢāĻŋāĻ™ā§āĻ—āĻžāϰāĻĒā§āϰāĻŋāĻ¨ā§āϟ āĻĢā§āϰ⧇āϜ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "āϞāĻ— āφāωāϟ" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "āϏāĻŽā§āĻŦāĻ¨ā§āϧ⧇" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻŽā§āϛ⧁āύ" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "āĻ‰ā§ŽāĻĒāĻžāĻĻāĻ•", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "āφāĻĒāύāĻžāϰ āϞāĻ—āχāύāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀, āĻ…āĻĻā§āĻŦāĻŋāĻ¤ā§€ā§Ÿ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤" }, - "bitWebVault": { - "message": "Bitwarden āĻ“ā§Ÿā§‡āĻŦ āĻ­āĻ˛ā§āϟ" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "āĻŦāĻ¸ā§āϤ⧁ āφāĻŽāĻĻāĻžāύāĻŋ" @@ -235,6 +435,9 @@ "generatePassword": { "message": "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒ⧁āύāσāϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" }, @@ -244,17 +447,60 @@ "length": { "message": "āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "āĻļāĻŦā§āĻĻ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž" @@ -276,7 +522,16 @@ "message": "āĻ¨ā§āϝ⧂āύāϤāĻŽ āĻŦāĻŋāĻļ⧇āώ" }, "avoidAmbChar": { - "message": "āĻ…āĻ¸ā§āĻĒāĻˇā§āϟ āĻŦāĻ°ā§āĻŖāϗ⧁āϞāĻŋ āĻāĻĄāĻŧāĻŋāϝāĻŧ⧇ āϚāϞ⧁āύ" + "message": "āĻ…āĻ¸ā§āĻĒāĻˇā§āϟ āĻŦāĻ°ā§āĻŖāϗ⧁āϞāĻŋ āĻāĻĄāĻŧāĻŋāϝāĻŧ⧇ āϚāϞ⧁āύ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "āĻ­āĻ˛ā§āϟ āϖ⧁āρāϜ⧁āύ" @@ -299,15 +554,30 @@ "password": { "message": "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "āĻĒāĻžāϏāĻĢā§āϰ⧇āϜ" }, "favorite": { "message": "āĻĒā§āϰāĻŋ⧟" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "āύ⧋āϟ" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "āύ⧋āϟ" }, @@ -326,6 +596,18 @@ "launch": { "message": "āĻļ⧁āϰ⧁" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ" }, @@ -338,9 +620,24 @@ "other": { "message": "āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "āĻāĻ•ā§āϏāĻŸā§‡āύāĻļāύāϟāĻŋ āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ āĻ•āϰ⧁āύ" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "āφāĻĒāύāĻžāϰ āĻ­āĻ˛ā§āϟ āϞāĻ• āĻ•āϰāĻž āφāϛ⧇āĨ¤ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝ⧇āϤ⧇ āφāĻĒāύāĻžāϰ āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϟāĻŋ āϝāĻžāϚāĻžāχ āĻ•āϰāĻžāύāĨ¤" }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "āφāύāϞāĻ•" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "āĻ­āĻ˛ā§āĻŸā§‡āϰ āϏāĻŽāϝāĻŧāϏ⧀āĻŽāĻž" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "āĻāĻ–āύāχ āϞāĻ• āĻ•āϰ⧁āύ" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "āϏāĻ™ā§āϗ⧇ āϏāĻ™ā§āϗ⧇" }, @@ -426,6 +738,18 @@ "security": { "message": "āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āĻ‰ā§ŽāĻĒāĻ¨ā§āύ āĻšāϝāĻŧ⧇āϛ⧇" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "āφāĻĒāύāĻžāϰ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇! āφāĻĒāύāĻŋ āĻāĻ–āύ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤" }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "āφāĻŽāϰāĻž āφāĻĒāύāĻžāϕ⧇ āφāĻĒāύāĻžāϰ āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄā§‡āϰ āχāĻ™ā§āĻ—āĻŋāϤ āϏāĻš āĻāĻ•āϟāĻŋ āχāĻŽā§‡āϞ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇āĻ›āĻŋāĨ¤" }, "verificationCodeRequired": { "message": "āϝāĻžāϚāĻžāχāĻ•āϰāĻŖ āϕ⧋āĻĄ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤" }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "āĻāχ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āύāĻŋāĻ°ā§āĻŦāĻžāϚāĻŋāϤ āĻŦāĻ¸ā§āϤ⧁āϟāĻŋ āĻ¸ā§āĻŦāϤāσāĻĒā§‚āĻ°ā§āϪ⧇ āĻ…āĻ•ā§āώāĻŽāĨ¤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āϤāĻĨā§āϝāϟāĻŋ āĻ…āύ⧁āϞāĻŋāĻĒāĻŋāϤ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āφāϟāĻ•āĻžāύāĨ¤" }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "āĻĒā§āϰāĻ¸ā§āĻĨāĻžāύāĻ•ā§ƒāϤ" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "āφāĻĒāύāĻžāϰ āϞāĻ—āχāύ āĻŽāĻžāĻ¤ā§āϰāĻ•āĻžāϞāϟāĻŋāϰ āĻŽā§‡āϝāĻŧāĻžāĻĻ āĻļ⧇āώ āĻšāϝāĻŧ⧇ āϗ⧇āϛ⧇āĨ¤" }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "āφāĻĒāύāĻŋ āϞāĻ— āφāωāϟ āĻ•āϰāϤ⧇ āϚāĻžāύ?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻœā§‹ā§œāĻž āĻšā§Ÿā§‡āϛ⧇" }, - "changeMasterPass": { - "message": "āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ" - }, - "changeMasterPasswordConfirmation": { - "message": "āφāĻĒāύāĻŋ bitwarden.com āĻ“āϝāĻŧ⧇āĻŦ āĻ­āĻ˛ā§āϟ āĻĨ⧇āϕ⧇ āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϟāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āφāĻĒāύāĻŋ āĻ•āĻŋ āĻāĻ–āύāχ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āϚāĻžāύ?" - }, "twoStepLoginConfirmation": { "message": "āĻĻā§āĻŦāĻŋ-āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āϞāĻ—āχāύ āĻ…āĻ¨ā§āϝ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āφāĻĒāύāĻžāϰ āϞāĻ—āχāύāϟāĻŋ āϝāĻžāϚāĻžāχ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āϕ⧀, āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ, āĻāϏāĻāĻŽāĻāϏ, āĻĢā§‹āύ āĻ•āϞ āĻŦāĻž āχ-āĻŽā§‡āχāϞ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϕ⧇ āφāϰāĻ“ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āĻ•āϰ⧇āĨ¤ bitwarden.com āĻ“āϝāĻŧ⧇āĻŦ āĻ­āĻ˛ā§āĻŸā§‡ āĻĻā§āĻŦāĻŋ-āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ⧇āϰ āϞāĻ—āχāύ āϏāĻ•ā§āώāĻŽ āĻ•āϰāĻž āϝāĻžāĻŦ⧇āĨ¤ āφāĻĒāύāĻŋ āĻ•āĻŋ āĻāĻ–āύāχ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āϚāĻžāύ?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āϏāĻŽā§āĻĒāĻžāĻĻāĻŋāϤ" }, @@ -552,6 +936,10 @@ "newUri": { "message": "āύāϤ⧁āύ URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "āĻŦāĻ¸ā§āϤ⧁ āϝ⧋āĻ— āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "\"āϞāĻ—āχāύ āϝ⧋āĻ— āĻ•āϰ⧁āύ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ\" āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āφāĻĒāύāχ āϝāĻ–āύāχ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āϞāĻ— āχāύ āĻ•āϰ⧇āύ āϤāĻ–āύ āφāĻĒāύāĻžāϰ āĻ­āĻ˛ā§āĻŸā§‡ āύāϤ⧁āύ āϞāĻ—āχāύāϗ⧁āϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāϤ⧇ āĻ…āύ⧁āϰ⧋āϧ āϜāĻžāύāĻžāϝāĻŧāĨ¤" }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "āĻ•ā§āϞāĻŋāĻĒāĻŦā§‹āĻ°ā§āĻĄ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "āφāĻĒāύāĻŋ āĻ•āĻŋ āĻāχ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϟāĻŋ Bitwarden āĻ āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻ āĻ•āϰāϤ⧇ āϚāĻžāύ?" }, @@ -634,20 +1043,26 @@ "message": "āĻšā§āϝāĻžāρ, āĻāĻ–āύāχ āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻ āĻ•āϰ⧁āύ" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "āĻĒā§‚āĻ°ā§āĻŦ-āύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ URI āĻŽāĻŋāϞ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "āĻ¸ā§āĻŦāϤāσāĻĒā§‚āϰāϪ⧇āϰ āĻŽāϤ⧋ āĻ•ā§āϰāĻŋāϝāĻŧāĻž āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϞāĻ—āχāύāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ URI āĻŽāĻŋāϞ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āϝ⧇ āĻĒā§‚āĻ°ā§āĻŦ-āύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻž āĻšāĻŦ⧇ āϤāĻž āϚāϝāĻŧāύ āĻ•āϰ⧁āύāĨ¤" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋāϰ āϰāĻ‚ āĻĨāĻŋāĻŽ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāĨ¤" }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "āĻ…āĻ¨ā§āϧāĻ•āĻžāϰ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "āĻ­āĻ˛ā§āϟ āϰāĻĢāϤāĻžāύāĻŋ" }, "fileFormat": { "message": "āĻĢāĻžāχāϞ⧇āϰ āϧāϰāĻŖ" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "āϏāϤāĻ°ā§āĻ•āϤāĻž", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "āĻ­āĻžāĻ—āĻ•ā§ƒāϤ" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "āĻĢāĻžāχāϞ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "āĻāĻ•āϟāĻŋ āĻĢāĻžāχāϞ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύāĨ¤" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "āĻĢāĻžāχāϞ āϏāĻ‚āϝ⧁āĻ•ā§āϤāĻŋāϰ āϜāĻ¨ā§āϝ ā§§ āϜāĻŋāĻŦāĻŋ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡āĻĄ āĻ¸ā§āĻĨāĻžāύāĨ¤" }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "āφāĻĒāύāĻŋ bitwarden.com āĻ“āϝāĻŧ⧇āĻŦ āĻ­āĻ˛ā§āĻŸā§‡ āĻĒā§āϰāĻŋāĻŽāĻŋāϝāĻŧāĻžāĻŽ āϏāĻĻāĻ¸ā§āϝāϤāĻž āĻ•āĻŋāύāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āφāĻĒāύāĻŋ āĻ•āĻŋ āĻāĻ–āύāχ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āϚāĻžāύ?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "āφāĻĒāύāĻŋ āĻĒā§āϰāĻŋāĻŽāĻŋāϝāĻŧāĻžāĻŽ āϏāĻĻāĻ¸ā§āϝ!" }, "premiumCurrentMemberThanks": { "message": "Bitwarden āϕ⧇ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϕ⧇ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻāĨ¤" }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "āϏāĻŽāĻ¸ā§āϤ āĻŽāĻžāĻ¤ā§āϰ $PRICE$ / āĻŦāĻ›āϰ⧇āϰ āϜāĻ¨ā§āϝ!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "āĻĒ⧁āύāσāϏāϤ⧇āϜ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻĒ" }, - "authenticatorAppDesc": { - "message": "āϏāĻŽāϝāĻŧ āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āϝāĻžāϚāĻžāχāĻ•āϰāĻŖ āϕ⧋āĻĄ āĻ‰ā§ŽāĻĒāĻ¨ā§āύ āĻ•āϰāϤ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ (āϝ⧇āĻŽāύ Authy āĻŦāĻž Google Authenticator) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP āϏ⧁āϰāĻ•ā§āώāĻž āϕ⧀" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻāĻ•āϟāĻŋ YubiKey āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ YubiKey 4, 4 Nano, 4C, āĻāĻŦāĻ‚ NEO āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤" }, - "duoDesc": { - "message": "Duo Mobile app, āĻāϏāĻāĻŽāĻāϏ, āĻĢā§‹āύ āĻ•āϞ, āĻŦāĻž U2F āϏ⧁āϰāĻ•ā§āώāĻž āϕ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Duo Security āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϝāĻžāϚāĻžāχ āĻ•āϰ⧁āύāĨ¤", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "āχ-āĻŽā§‡āχāϞ" }, - "emailDesc": { - "message": "āϝāĻžāϚāĻžāχ āϕ⧋āĻĄāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϕ⧇ āχ-āĻŽā§‡āχāϞ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤" + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "āĻ¸ā§āĻŦ-āĻšā§‹āĻ¸ā§āϟāĻ•ā§ƒāϤ āĻĒāϰāĻŋāĻŦ⧇āĻļ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "āφāĻĒāύāĻžāϰ āĻ…āύ-āĻĒā§āϰāĻžāĻ™ā§āĻ—āύ⧇ āĻšā§‹āĻ¸ā§āϟāĻ•ā§ƒāϤ Bitwarden āχāύāĻ¸ā§āϟāϞ⧇āĻļāύāϟāĻŋāϰ āĻŦ⧇āϏ URL āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧁āύāĨ¤" }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "āĻĒāĻ›āĻ¨ā§āĻĻāϏāχ āĻĒāϰāĻŋāĻŦ⧇āĻļ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "āϏāĻžāĻ°ā§āĻ­āĻžāϰ URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "āĻāĻĒāĻŋāφāχ āϏāĻžāĻ°ā§āĻ­āĻžāϰ URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇āϰ URL āϗ⧁āϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "āĻĒ⧃āĻˇā§āĻ āĻž āϞ⧋āĻĄā§‡ āĻ¸ā§āĻŦāϤāσāĻĒā§‚āϰāĻŖ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ" }, "enableAutoFillOnPageLoadDesc": { "message": "āϝāĻĻāĻŋ āϕ⧋āύāĻ“ āϞāĻ—āχāύ āĻĢāĻ°ā§āĻŽ āϏāύāĻžāĻ•ā§āϤ āĻšāϝāĻŧ, āĻ“āϝāĻŧ⧇āĻŦ āĻĒ⧃āĻˇā§āĻ āĻžāϟāĻŋ āϞ⧋āĻĄ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻŦāϤāσāĻĒā§‚āϰāĻŖ āĻ•āϰ⧁āύāĨ¤" }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "āĻ­āĻ˛ā§āϟ āĻĒāĻĒāφāĻĒ āϖ⧁āϞ⧁āύ" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "āϏāĻžāχāĻĄāĻŦāĻžāϰ⧇ āĻ­āĻ˛ā§āϟ āϖ⧁āϞ⧁āύ" }, - "commandAutofillDesc": { - "message": "āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟāϟāĻŋāϰ āϜāĻ¨ā§āϝ āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āϞāĻ—āχāύāϟāĻŋ āĻ¸ā§āĻŦāϤāσāĻĒā§‚āϰāĻŖ āĻ•āϰ⧁āύ" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "āĻ•ā§āϞāĻŋāĻĒāĻŦā§‹āĻ°ā§āĻĄā§‡ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻāϞ⧋āĻŽā§‡āϞ⧋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āĻ…āύ⧁āϞāĻŋāĻĒāĻŋāϤ āĻ•āϰ⧁āύ" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "āĻ­āĻ˛ā§āϟ āϞāĻ• āĻ•āϰ⧁āύ" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "āĻĒāĻ›āĻ¨ā§āĻĻāϏāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "āĻŦ⧁āϞāĻŋāϝāĻŧāĻžāύ" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "āĻĒāϰāĻŋāϚāϝāĻŧ" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āχāϤāĻŋāĻšāĻžāϏ" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "āĻĒ⧇āĻ›āύ" }, "collections": { "message": "āϏāĻ‚āĻ—ā§āϰāĻš" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "āĻĒā§āϰāĻŋāϝāĻŧāϗ⧁āϞ⧋" }, @@ -1282,6 +1874,10 @@ "message": "āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻĄā§‹āĻŽā§‡āχāύ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "āĻŽāĻŋāϞ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "āĻĒā§‚āĻ°ā§āĻŦ-āύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āĻŽāĻŋāϞ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āϟāĻ—āϞ āĻ•āϰ⧁āύ" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "āϤāĻžāϞāĻŋāĻ•āĻžāϰ āϜāĻ¨ā§āϝ āϕ⧋āύāĻ“ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āύ⧇āχāĨ¤" }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "āϏāϰāĻžāύ" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "āĻĒāĻŋāύ āĻĻāĻŋāϝāĻŧ⧇ āφāύāϞāĻ•" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Bitwarden āφāύāϞāĻ• āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϰ āĻĒāĻŋāύ āϕ⧋āĻĄāϟāĻŋ āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āĻĨ⧇āϕ⧇ āĻĒ⧁āϰ⧋āĻĒ⧁āϰāĻŋ āϞāĻ— āφāωāϟ āĻ•āϰ⧇āύ āϤāĻŦ⧇ āφāĻĒāύāĻžāϰ āĻĒāĻŋāύ āϏ⧇āϟāĻŋāĻ‚āϏ āϰāĻŋāϏ⧇āϟ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤" }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "āĻĒāĻŋāύ āϕ⧋āĻĄ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤" }, "invalidPin": { "message": "āĻ…āĻŦ⧈āϧ āĻĒāĻŋāύ āϕ⧋āĻĄāĨ¤" }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "āĻŦāĻžāϝāĻŧā§‹āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĻāĻŋāϝāĻŧ⧇ āφāύāϞāĻ• āĻ•āϰ⧁āύ" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "āĻĄā§‡āĻ¸ā§āĻ•āϟāĻĒ āĻĨ⧇āϕ⧇ āύāĻŋāĻļā§āϚāĻŋāϤāĻ•āϰāϪ⧇āϰ āĻ…āĻĒ⧇āĻ•ā§āώāĻžāϝāĻŧ" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "āĻŦā§āϰāĻžāωāϜāĻžāϰ āĻĒ⧁āύāϰāĻžāϰāĻŽā§āĻ­āϤ⧇ āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻāĻŋāϝāĻŧ⧇ āϞāĻ• āĻ•āϰ⧁āύ" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "āĻ•āĻŽāĻĒāĻ•ā§āώ⧇ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ—ā§āϰāĻš āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύāĨ¤" }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "āĻāĻ• āĻŦāĻž āĻāĻ•āĻžāϧāĻŋāĻ• āϏāĻ‚āĻ¸ā§āĻĨāĻžāϰ āύ⧀āϤāĻŋāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϰ āĻ‰ā§ŽāĻĒāĻžāĻĻāϕ⧇āϰ āϏ⧇āϟāĻŋāĻ‚āϏāϕ⧇ āĻĒā§āϰāĻ­āĻžāĻŦāĻŋāϤ āĻ•āϰāϛ⧇āĨ¤" }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "āĻ­āĻ˛ā§āĻŸā§‡āϰ āϏāĻŽāϝāĻŧāϏ⧀āĻŽāĻž āĻ•āĻ°ā§āĻŽ" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "āϞāĻ•", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "āφāĻŦāĻ°ā§āϜāύāĻž", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "āĻŦāĻ¸ā§āϤ⧁ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰāĻ•ā§ƒāϤ" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "āϞāĻ— āφāωāϟ āĻ•āϰāĻž āφāĻĒāύāĻžāϰ āĻ­āĻ˛ā§āĻŸā§‡āϰ āϏāĻŽāĻ¸ā§āϤ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āϏāϰāĻŋāϝāĻŧ⧇ āĻĢ⧇āϞāĻŦ⧇ āĻāĻŦāĻ‚ āϏāĻŽāϝāĻŧāϏ⧀āĻŽāĻžāϰ āĻĒāϰ⧇ āĻ…āύāϞāĻžāχāύ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāϪ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āĻāχ āϏ⧇āϟāĻŋāĻ‚āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "āĻ¸ā§āĻŦāϤāσāĻĒā§‚āϰāĻŖ āĻ“ āϏāĻ‚āϰāĻ•ā§āώāĻŖ" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "āĻ¸ā§āĻŦāϤāσāĻĒā§‚āϰāĻŖāĻ•ā§ƒāϤ āĻŦāĻ¸ā§āϤ⧁ āĻ“ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ URI" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "āφāĻĒāύāĻžāϰ āύāϤ⧁āύ āĻŽā§‚āϞ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āύ⧀āϤāĻŋāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻĒā§‚āϰāĻŖ āĻ•āϰ⧇ āύāĻžāĨ¤" }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "āĻāχ āĻŦāĻžāĻ•ā§āϏāϟāĻŋ āϟāĻŋāĻ• āĻ•āϰ⧇ āφāĻĒāύāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤāϗ⧁āϞāĻŋāϤ⧇ āϏāĻŽā§āĻŽāϤ āĻšāύ:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "āĻ āĻŋāĻ• āφāϛ⧇" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "āĻĄā§‡āĻ¸ā§āĻ•āϟāĻĒ āϏāĻŋāĻ™ā§āĻ• āϝāĻžāϚāĻžāχāĻ•āϰāĻŖ" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§‡āϞ⧇āύāĻŋ" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "āĻŦāĻžāϝāĻŧā§‹āĻŽā§‡āĻŸā§āϰāĻŋāĻ•āϏ āϏāĻ•ā§āώāĻŽ āύ⧇āχ" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "āĻŦā§āϰāĻžāωāϜāĻžāϰ āĻŦāĻžāϝāĻŧā§‹āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻāχ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āύāϝāĻŧāĨ¤" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "āĻāĻ•āϟāĻŋ āĻĒā§āϰāϤāĻŋāĻˇā§āĻ āĻžāύ⧇āϰ āύ⧀āϤāĻŋ āφāĻĒāύāĻžāϰ āĻŽāĻžāϞāĻŋāĻ•āĻžāύāĻž āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϕ⧇ āĻĒā§āϰāĻ­āĻžāĻŦāĻŋāϤ āĻ•āϰāϛ⧇āĨ¤" }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "āĻĢāĻžāχāϞ" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Send āϞāĻŋāĻ™ā§āĻ• āĻ•āĻĒāĻŋ āĻ•āϰ⧁āύ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "āχāĻŽā§‡āχāϞ āϏāĻ¤ā§āϝāĻžā§Ÿāύ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 1c930eeafc7..3f01ef5dbc8 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Prijavite se ili napravite novi račun da biste pristupili svom sigurnom trezoru." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Napravi račun" }, - "login": { - "message": "Prijavite se" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-fill" + "message": "Autofill" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,7 +223,7 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Add a login" @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "NagovjeÅĄtaj lozinke" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Otključaj PIN-om" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Zaključaj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Smeće", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fajl" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 41f022a4362..e91afa303a8 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden - Gestor de contrasenyes", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Administrador de contrasenyes segur i gratuït per a tots els vostres dispositius.", - "description": "Extension description" + "message": "A casa, a la feina o en moviment, Bitwarden protegeix totes les contrasenyes, claus de pas i informaciÃŗ sensible", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Inicieu sessiÃŗ o creeu un compte nou per accedir a la caixa forta." }, + "inviteAccepted": { + "message": "InvitaciÃŗ acceptada" + }, "createAccount": { "message": "Crea un compte" }, - "login": { - "message": "Inicia sessiÃŗ" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Estableix una contrasenya segura" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Acabeu de crear el vostre compte establint una contrasenya" }, "enterpriseSingleSignOn": { "message": "Inici de sessiÃŗ Ãēnic d'empresa" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Una pista de contrasenya mestra us pot ajudar a recordar-la si l'oblideu." }, + "masterPassHintText": { + "message": "Si oblideu la contrasenya, la pista de contrasenya es pot enviar al vostre correu electrÃ˛nic. $CURRENT$/$MAXIMUM$ caràcters màxim.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Torneu a escriure la contrasenya mestra" }, "masterPassHint": { "message": "Pista de la contrasenya mestra (opcional)" }, + "joinOrganization": { + "message": "Uneix-te a l'organitzaciÃŗ" + }, + "joinOrganizationName": { + "message": "Uniu-vos a $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Acabeu d'unir-vos a aquesta organitzaciÃŗ establint una contrasenya mestra." + }, "tab": { "message": "Pestanya" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copia contrasenya" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copia nota" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copia el codi de seguretat" }, + "copyName": { + "message": "Copia el nom" + }, + "copyCompany": { + "message": "Copia la companyia" + }, + "copySSN": { + "message": "Copia nÃēmero de la Seguretat Social" + }, + "copyPassportNumber": { + "message": "Copia el nÃēmero de passaport" + }, + "copyLicenseNumber": { + "message": "Copia el nÃēmero de llicència" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copia $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copia lloc web" + }, + "copyNotes": { + "message": "Copia notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Emplenament automàtic" }, + "autoFillLogin": { + "message": "Emplena automàticament l'inici de sessiÃŗ" + }, + "autoFillCard": { + "message": "Emplena automàticament la targeta" + }, + "autoFillIdentity": { + "message": "Emplena automàticament l'identitat" + }, "generatePasswordCopied": { "message": "Genera contrasenya (copiada)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No hi ha inicis de sessiÃŗ coincidents." }, + "noCards": { + "message": "Sense targetes" + }, + "noIdentities": { + "message": "Sense identitats" + }, + "addLoginMenu": { + "message": "Afig inici de sessiÃŗ" + }, + "addCardMenu": { + "message": "Afig una targeta" + }, + "addIdentityMenu": { + "message": "Afig identitat" + }, "unlockVaultMenu": { "message": "1. Desbloquegeu la caixa forta." }, @@ -115,6 +231,18 @@ "addItem": { "message": "Afegeix element" }, + "accountEmail": { + "message": "Correu electrÃ˛nic del compte" + }, + "requestHint": { + "message": "Sol¡licita pista" + }, + "requestPasswordHint": { + "message": "Sol¡licita pista de la contrasenya" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Introduïu l'adreça de correu electrÃ˛nic del compte i se us enviarà la pista de contrasenya" + }, "passwordHint": { "message": "Pista de la contrasenya" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirmeu la vostra identitat per continuar." }, - "account": { - "message": "Compte" - }, "changeMasterPassword": { "message": "Canvia la contrasenya mestra" }, + "continueToWebApp": { + "message": "Continua cap a l'aplicaciÃŗ web?" + }, + "continueToWebAppDesc": { + "message": "Exploreu mÊs característiques del vostre compte Bitwarden a l'aplicaciÃŗ web." + }, + "continueToHelpCenter": { + "message": "Voleu continuar cap al Centre d'ajuda?" + }, + "continueToHelpCenterDesc": { + "message": "Obteniu mÊs informaciÃŗ sobre com utilitzar Bitwarden al Centre d'ajuda." + }, + "continueToBrowserExtensionStore": { + "message": "Voleu continuar cap a la botiga d'extensions del navegador?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Ajudeu els altres a descobrir si Bitwarden Ês adequat per a ells. Visiteu la botiga d'aplicacions i deixeu-nos una valoraciÃŗ ara." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Podeu canviar la vostra contrasenya mestra a l'aplicaciÃŗ web de Bitwarden." + }, "fingerprintPhrase": { "message": "Frase d'empremta digital", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Tanca la sessiÃŗ" }, + "aboutBitwarden": { + "message": "Quant a Bitwarden" + }, "about": { "message": "Quant a" }, + "moreFromBitwarden": { + "message": "MÊs de Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Voleu continuar cap a bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden per a negocis" + }, + "bitwardenAuthenticator": { + "message": "Autenticador Bitwarden" + }, + "continueToAuthenticatorPageDesc": { + "message": "L'autenticador Bitwarden us permet emmagatzemar claus d'autenticaciÃŗ i generar codis TOTP per a fluxos de verificaciÃŗ en dos passos. MÊs informaciÃŗ al lloc web bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Administrador de secrets de Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Emmagatzema, gestiona i comparteix de manera segura els secrets dels desenvolupadors amb l'Administrador de secrets de Bitwarden. MÊs informaciÃŗ al lloc web bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Creeu experiències d'inici de sessiÃŗ segures i sense contrasenyes tradicionals amb Passwordless.dev. MÊs informaciÃŗ al lloc web bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Famílies Bitwarden gratuït" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Sou elegible per a Famílies Bitwarden gratuït. Bescanvia aquesta oferta hui a l'aplicaciÃŗ web." + }, "version": { "message": "VersiÃŗ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edita la carpeta" }, + "newFolder": { + "message": "Carpeta nova" + }, + "folderName": { + "message": "Nom de la carpeta" + }, + "folderHintText": { + "message": "Imbriqueu una carpeta afegint el nom de la carpeta principal seguit d'una \"/\". Exemple: Social/FÃ˛rums" + }, + "noFoldersAdded": { + "message": "No s'ha afegit cap carpeta" + }, + "createFoldersToOrganize": { + "message": "Crea carpetes per organitzar els elements de la caixa forta" + }, + "deleteFolderPermanently": { + "message": "Esteu segur que voleu suprimir permanentment aquesta carpeta?" + }, "deleteFolder": { "message": "Suprimeix carpeta" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generador", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Genera automàticament contrasenyes fortes i Ãēniques per als vostres inicis de sessiÃŗ." }, - "bitWebVault": { - "message": "Caixa forta web de Bitwarden" + "bitWebVaultApp": { + "message": "AplicaciÃŗ web Bitwarden" }, "importItems": { "message": "Importa elements" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Genera contrasenya" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenera contrasenya" }, @@ -244,17 +447,60 @@ "length": { "message": "Longitud" }, + "passwordMinLength": { + "message": "Longitud mínima de la contrasenya" + }, "uppercase": { - "message": "MajÃēscula (A-Z)" + "message": "MajÃēscula (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "MinÃēscula (a-z)" + "message": "MinÃēscula (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "NÃēmeros (0-9)" + "message": "NÃēmeros (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caràcters especials (!@#$%^&*)" + "message": "Caràcters especials (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Inclou", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Inclou majÃēscules", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Inclou minÃēscules", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Inclou nÃēmeros", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Inclou caràcters especials", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Nombre de paraules" @@ -276,7 +522,16 @@ "message": "Mínim de caràcters especials" }, "avoidAmbChar": { - "message": "Eviteu caràcters ambigus" + "message": "Eviteu caràcters ambigus", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Eviteu caràcters ambigus", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Cerca en la caixa forta" @@ -299,15 +554,30 @@ "password": { "message": "Contrasenya" }, + "totp": { + "message": "Secret de l'autenticador" + }, "passphrase": { "message": "Frase de pas" }, "favorite": { "message": "Preferit" }, + "unfavorite": { + "message": "Trau dels preferits" + }, + "itemAddedToFavorites": { + "message": "Element afegit als preferits" + }, + "itemRemovedFromFavorites": { + "message": "Element suprimit dels preferits" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -326,6 +596,18 @@ "launch": { "message": "Inicia" }, + "launchWebsite": { + "message": "Obri la web" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Lloc web" }, @@ -338,9 +620,24 @@ "other": { "message": "Altres" }, + "unlockMethods": { + "message": "Opcions de desbloqueig" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Configura un mètode de desbloqueig per canviar l'acciÃŗ del temps d'espera de la caixa forta." }, + "unlockMethodNeeded": { + "message": "Configura un mètode de desbloqueig a ConfiguraciÃŗ" + }, + "sessionTimeoutHeader": { + "message": "Temps de sessiÃŗ" + }, + "vaultTimeoutHeader": { + "message": "Temps d'espera de la caixa forta" + }, + "otherOptions": { + "message": "Altres opcions" + }, "rateExtension": { "message": "Valora aquesta extensiÃŗ" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "La caixa forta està bloquejada. Comproveu la contrasenya mestra per continuar." }, + "yourVaultIsLockedV2": { + "message": "La caixa forta està bloquejada" + }, + "yourAccountIsLocked": { + "message": "El compte està bloquejat" + }, + "or": { + "message": "o" + }, "unlock": { "message": "Desbloqueja" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Temps d'espera de la caixa forta" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Bloqueja ara" }, + "lockAll": { + "message": "Bloqueja-ho tot" + }, "immediately": { "message": "Immediatament" }, @@ -426,6 +738,18 @@ "security": { "message": "Seguretat" }, + "confirmMasterPassword": { + "message": "Confirma la contrasenya mestra" + }, + "masterPassword": { + "message": "Contrasenya mestra" + }, + "masterPassImportant": { + "message": "La contrasenya mestra no es pot recuperar si la oblideu!" + }, + "masterPassHintLabel": { + "message": "Pista de la contrasenya mestra" + }, "errorOccurred": { "message": "S'ha produït un error" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "El vostre compte s'ha creat correctament. Ara ja podeu iniciar sessiÃŗ." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "Heu iniciat sessiÃŗ correctament" + }, + "youMayCloseThisWindow": { + "message": "Podeu tancar aquesta finestra" + }, "masterPassSent": { "message": "Hem enviat un correu electrÃ˛nic amb la vostra contrasenya mestra." }, "verificationCodeRequired": { "message": "El codi de verificaciÃŗ Ês obligatori." }, + "webauthnCancelOrTimeout": { + "message": "L'autenticaciÃŗ s'ha cancel¡lat o ha tardat massa. Torna-ho a provar." + }, "invalidVerificationCode": { "message": "Codi de verificaciÃŗ no vàlid" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "No es pot omplir automàticament l'element seleccionat en aquesta pàgina. Com a alternativa, copieu i enganxeu la informaciÃŗ." }, + "totpCaptureError": { + "message": "No es pot escanejar el codi QR des de la pàgina web actual" + }, + "totpCaptureSuccess": { + "message": "S'ha afegit la clau de l'autenticador" + }, + "totpCapture": { + "message": "Escaneja el codi QR de l'autenticador des de la pàgina web actual" + }, + "totpHelperTitle": { + "message": "Feu que la verificaciÃŗ en dos passos siga perfecta" + }, + "totpHelper": { + "message": "Bitwarden pot emmagatzemar i omplir codis de verificaciÃŗ en dos passos. Copieu i enganxeu la clau en aquest camp." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copia la clau de l'autenticador (TOTP)" + }, "loggedOut": { "message": "SessiÃŗ tancada" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "La vostra sessiÃŗ ha caducat." }, + "logIn": { + "message": "Inicia sessiÃŗ" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Segur que voleu tancar la sessiÃŗ?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Carpeta afegida" }, - "changeMasterPass": { - "message": "Canvia la contrasenya mestra" - }, - "changeMasterPasswordConfirmation": { - "message": "Podeu canviar la contrasenya mestra a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?" - }, "twoStepLoginConfirmation": { "message": "L'inici de sessiÃŗ en dues passes fa que el vostre compte siga mÊs segur, ja que obliga a verificar el vostre inici de sessiÃŗ amb un altre dispositiu, com ara una clau de seguretat, una aplicaciÃŗ autenticadora, un SMS, una trucada telefÃ˛nica o un correu electrÃ˛nic. Es pot habilitar l'inici de sessiÃŗ en dues passes a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Carpeta guardada" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Nova URI" }, + "addDomain": { + "message": "Afig domini", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Element afegit" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Demana d'afegir els inicis de sessiÃŗ" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "La \"NotificaciÃŗ per afegir inicis de sessiÃŗ\" demana automàticament que guardeu els nous inicis de sessiÃŗ a la vostra caixa forta quan inicieu la sessiÃŗ per primera vegada." }, + "addLoginNotificationDescAlt": { + "message": "Demana afegir un element si no se'n troba cap a la caixa forta. S'aplica a tots els comptes connectats." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Mostra les targetes a la pàgina de pestanya" }, "showCardsCurrentTabDesc": { "message": "Llista els elements de la targeta a la pàgina de pestanya per facilitar l'autoemplenat." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Mostra les identitats a la pàgina de pestanya" }, "showIdentitiesCurrentTabDesc": { - "message": "Llista els elements d'identitat de la pàgina de pestanya per facilitar l'autoemplenat." + "message": "Llista els elements d'identitat de la pestanya de la pàgina per facilitar l'autoemplenat." }, "clearClipboard": { "message": "Buida el porta-retalls", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Demana actualitzar la contrasenya d'inici de sessiÃŗ quan es detecte un canvi en un lloc web." }, + "changedPasswordNotificationDescAlt": { + "message": "Demana actualitzar la contrasenya d'inici de sessiÃŗ quan es detecte un canvi en un lloc web. S'aplica a tots els comptes connectats." + }, + "enableUsePasskeys": { + "message": "Demana guardar i utilitzar claus de pas" + }, + "usePasskeysDesc": { + "message": "Demana que guardeu les contrasenyes noves o inicieu sessiÃŗ amb les claus emmagatzemades a la vostra caixa forta. S'aplica a tots els comptes connectats." + }, "notificationChangeDesc": { "message": "Voleu actualitzar aquesta contrasenya a Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Desbloqueja" }, + "additionalOptions": { + "message": "Opcions addicionals" + }, "enableContextMenuItem": { "message": "Mostra les opcions del menÃē contextual" }, "contextMenuItemDesc": { "message": "Utilitza un clic secundari per accedir a la generaciÃŗ de contrasenyes i als inicis de sessiÃŗ coincidents per al lloc web. " }, + "contextMenuItemDescAlt": { + "message": "Fa servir un clic secundari per accedir a la generaciÃŗ de contrasenyes i als inicis de sessiÃŗ coincidents per al lloc web. S'aplica a tots els comptes connectats." + }, "defaultUriMatchDetection": { "message": "DetecciÃŗ de coincidències URI per defecte", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Trieu la manera predeterminada en que es gestiona la detecciÃŗ de coincidència d'URI per als inicis de sessiÃŗ en realitzar accions com l'emplenament automàtic." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Canvia el color del tema de l'aplicaciÃŗ." }, + "themeDescAlt": { + "message": "Canvia el tema de color de l'aplicaciÃŗ. S'aplica a tots els comptes connectats." + }, "dark": { "message": "Fosc", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solaritzat fosc", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Exporta des de" + }, "exportVault": { "message": "Exporta caixa forta" }, "fileFormat": { "message": "Format de fitxer" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "Contrasenya del fitxer" + }, + "exportPasswordDescription": { + "message": "Aquesta contrasenya s'utilitzarà per exportar i importar aquest fitxer" + }, + "accountRestrictedOptionDescription": { + "message": "Utilitzeu la clau de xifratge del vostre compte, derivada del nom d'usuari i la contrasenya mestra, per xifrar l'exportaciÃŗ i restringir la importaciÃŗ nomÊs al compte de Bitwarden actual." + }, + "passwordProtectedOptionDescription": { + "message": "Establiu una contrasenya per xifrar l'exportaciÃŗ i importeu-la a qualsevol compte de Bitwarden mitjançant aquesta contrasenya." + }, + "exportTypeHeading": { + "message": "Tipus d'exportaciÃŗ" + }, + "accountRestricted": { + "message": "Hi ha una restricciÃŗ de compte" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Contrasenya del fitxer\" i \"Confirma contrasenya del fitxer\" no coincideixen." + }, "warning": { "message": "ADVERTIMENT", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Compartit" }, - "learnOrg": { - "message": "MÊs informaciÃŗ sobre les organitzacions" - }, - "learnOrgConfirmation": { - "message": "Bitwarden us permet compartir els elements de la vostra caixa forta amb altres usuaris mitjançant una organitzaciÃŗ. Voleu visitar el lloc web de bitwarden.com per obtenir mÊs informaciÃŗ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Desplaça a l'organitzaciÃŗ" @@ -762,6 +1204,9 @@ "file": { "message": "Fitxer" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Seleccioneu un fitxer" }, @@ -772,7 +1217,7 @@ "message": "Característica no disponible" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Cal migrar la clau de xifratge. Inicieu la sessiÃŗ a la caixa forta web per actualitzar la clau de xifratge." }, "premiumMembership": { "message": "SubscripciÃŗ Premium" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB d'emmagatzematge xifrat per als fitxers adjunts." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Opcions propietàries de doble factor com ara YubiKey i Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Podeu comprar la vostra subscripciÃŗ a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Sou un membre premium!" }, "premiumCurrentMemberThanks": { "message": "Gràcies per donar suport a Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "Tot per nomÊs $PRICE$ / any!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ActualitzaciÃŗ completa" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "AplicaciÃŗ autenticadora" }, - "authenticatorAppDesc": { - "message": "Utilitzeu una aplicaciÃŗ autenticadora (com Authy o Google Authenticator) per generar codis de verificaciÃŗ basats en el temps.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "Clau de seguretat OTP de YubiKey" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Utilitzeu una YubiKey per accedir al vostre compte. Funciona amb els dispositius YubiKey 4, 4 Nano, 4C i NEO." }, - "duoDesc": { - "message": "Verifiqueu amb Duo Security mitjançant l'aplicaciÃŗ Duo Mobile, SMS, trucada telefÃ˛nica o clau de seguretat U2F.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Correu electrÃ˛nic" }, - "emailDesc": { - "message": "Els codis de verificaciÃŗ els rebreu per correu electrÃ˛nic." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Entorn d'allotjament propi" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Especifiqueu l'URL base de la vostra instal¡laciÃŗ de Bitwarden allotjada en un entorn propi." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Entorn personalitzat" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL del servidor" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL del servidor API" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "S'han guardat les URL de l'entorn" }, + "showAutoFillMenuOnFormFields": { + "message": "Mostra el menÃē d'emplenament automàtic als camps del formulari", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Desactiveu la configuraciÃŗ integrada del gestor de contrasenyes del vostre navegador per evitar conflictes." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edita la configuraciÃŗ del navegador." + }, + "autofillOverlayVisibilityOff": { + "message": "Desactivat", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Quan el camp està seleccionat (en el focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Quan la icona d'emplenament automàtic està seleccionada", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Habilita l'emplenament automàtic en carregar la pàgina" }, "enableAutoFillOnPageLoadDesc": { "message": "Si es detecta un formulari d'inici de sessiÃŗ, es realitza automàticament un emplenament automàtic quan es carrega la pàgina web." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Els llocs web compromesos o no fiables poden aprofitar-se de l'emplenament automàtic en carregar de la pàgina." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "Obteniu mÊs informaciÃŗ sobre l'emplenament automàtic" }, @@ -994,7 +1529,7 @@ "message": "ConfiguraciÃŗ per defecte d'emplenament automàtic per als elements d'inici de sessiÃŗ" }, "defaultAutoFillOnPageLoadDesc": { - "message": "DesprÊs d'habilitar l'emplenament automàtic a la càrrega de la pàgina, podeu habilitar o inhabilitar la característica per a elements d'inici de sessiÃŗ individuals. Aquesta Ês la configuraciÃŗ per defecte per als elements d'inici de sessiÃŗ que no estan configurats per separat." + "message": "Podeu desactivar l'emplenament automàtic a la càrrega de la pàgina per a elements d'inici de sessiÃŗ individuals des de la vista d'ediciÃŗ de l'element." }, "itemAutoFillOnPageLoad": { "message": "Emplenament automàtic a la càrrega de la pàgina (si està habilitat a Opcions)" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Obri la caixa forta a la barra lateral" }, - "commandAutofillDesc": { - "message": "Ompliu automàticament amb l'Ãēltim accÊs utilitzat per al lloc web actual." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Genera i copia una nova contrasenya aleatÃ˛ria al porta-retalls." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Tanca la caixa forta" }, - "privateModeWarning": { - "message": "El suport del mode privat Ês experimental i algunes funcions sÃŗn limitades." - }, "customFields": { "message": "Camps personalitzats" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Booleà" }, + "cfTypeCheckbox": { + "message": "Casella de selecciÃŗ" + }, "cfTypeLinked": { "message": "Enllaçat", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Mostra una imatge reconeixible al costat de cada inici de sessiÃŗ." }, + "faviconDescAlt": { + "message": "Mostra una imatge reconeixible al costat de cada sessiÃŗ. S'aplica a tots els comptes connectats." + }, "enableBadgeCounter": { "message": "Mostra el comptador insígnia" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitat" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Historial de les contrasenyes" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Arrere" }, "collections": { "message": "Col¡leccions" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Preferits" }, @@ -1282,6 +1874,10 @@ "message": "Domini base", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Nom del domini", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "DetecciÃŗ de coincidències", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "DetecciÃŗ de coincidències per defecte", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Commuta opcions" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "No hi ha cap contrasenya a llistar." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Suprimeix" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Desbloqueja amb codi PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Configureu el vostre codi PIN per desbloquejar Bitwarden. La configuraciÃŗ del PIN es restablirà si tanqueu la sessiÃŗ definitivament." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Es necessita el codi PIN." }, "invalidPin": { "message": "El codi PIN no Ês vàlid." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Hi ha massa intents d'introducciÃŗ de PIN no vàlids. S'està tancant sessiÃŗ." + }, "unlockWithBiometrics": { "message": "Desbloqueja amb biomètrica" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "S’espera confirmaciÃŗ des de l’escriptori" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Bloqueja amb la contrasenya mestra en reiniciar el navegador" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Heu d'escollir com a mínim una col¡lecciÃŗ." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Una o mÊs polítiques d’organitzaciÃŗ afecten la configuraciÃŗ del generador." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "AcciÃŗ quan acabe el temps d'espera de la caixa forta" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Bloqueja", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Paperera", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Element restaurat" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "En tancar la sessiÃŗ s'eliminarà tot l'accÊs a la vostra caixa forta i es requerirà una autenticaciÃŗ en línia desprÊs del període de temps d'espera. Esteu segur que voleu utilitzar aquesta configuraciÃŗ?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Ompli automàticament i guarda" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Element emplenat automàticament i URI guardat" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "La nova contrasenya principal no compleix els requisits de la política." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Anul¡la subscripciÃŗ" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "i" + }, "acceptPolicies": { "message": "Si activeu aquesta casella, indiqueu que esteu d’acord amb el segÃŧent:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "D’acord" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "VerificaciÃŗ de sincronitzaciÃŗ d'escriptori" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "El compte no coincideix" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "La biomètrica no està habilitada" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "La biometria del navegador no Ês compatible amb aquest dispositiu." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "La biometria ha fallat" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Una política d’organitzaciÃŗ afecta les vostres opcions de propietat." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Una política d'organitzaciÃŗ ha bloquejat la importaciÃŗ d'elements a la vostra caixa forta individual." + }, + "domainsTitle": { + "message": "Dominis", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Dominis exclosos" }, "excludedDomainsDesc": { "message": "Bitwarden no demanarà que es guarden les dades d’inici de sessiÃŗ d’aquests dominis. Heu d'actualitzar la pàgina perquè els canvis tinguen efecte." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden no demanarà que es guarden les dades d'inici de sessiÃŗ d'aquests dominis per a tots els comptes iniciats. Heu d'actualitzar la pàgina perquè els canvis tinguen efecte." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ no Ês un domini vàlid", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Detalls de l'enviament", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Cerca Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text a compartir" + }, "sendTypeFile": { "message": "Fitxer" }, @@ -1666,6 +2406,9 @@ "message": "Tots els Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Ocultar el text per defecte" + }, "maxAccessCountReached": { "message": "S'ha assolit el recompte màxim d'accesos", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Protegit amb contrasenya" }, + "copyLink": { + "message": "Copia l'enllaç" + }, "copySendLink": { "message": "Copia l'enllaç Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Esteu segur que voleu suprimir aquest Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edita Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "L'enviament se suprimirà permanentment a la data i hora especificades.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "L'enviament s'esborrarà permanentment en aquesta data.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data de caducitat" }, @@ -1769,6 +2523,10 @@ "message": "Opcionalment, necessiteu una contrasenya perquè els usuaris accedisquen a aquest Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notes privades sobre aquest Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send creat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send guardat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Per triar un fitxer, obriu l'extensiÃŗ a la barra lateral (si Ês possible) o eixiu a una finestra nova fent clic a aquest bàner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Per triar un fitxer mitjançant Safari, eixiu a una finestra nova fent clic en aquest bàner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Abans de començar" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Amagueu la meua adreça de correu electrÃ˛nic als destinataris." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Una o mÊs polítiques d'organitzaciÃŗ afecten les vostres opcions del Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Es requereix verificaciÃŗ del correu electrÃ˛nic" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "Heu de verificar el correu electrÃ˛nic per utilitzar aquesta característica. Podeu verificar el vostre correu electrÃ˛nic a la caixa forta web." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "La vostra contrasenya mestra no compleix una o mÊs de les polítiques de l'organitzaciÃŗ. Per accedir a la caixa forta, heu d'actualitzar-la ara. Si continueu, es tancarà la sessiÃŗ actual i us demanarà que torneu a iniciar-la. Les sessions en altres dispositius poden continuar romanent actives fins a una hora." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "InscripciÃŗ automàtica" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Seleccioneu la carpeta..." }, - "ssoCompleteRegistration": { - "message": "Per completar la sessiÃŗ amb SSO, configureu una contrasenya mestra per accedir i protegir la vostra caixa forta." + "noFoldersFound": { + "message": "No s'ha trobat cap carpeta", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Els permisos de la vostra organitzaciÃŗ s'han actualitzat, cal que establiu una contrasenya mestra.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "La vostra organitzaciÃŗ requereix que establiu una contrasenya mestra.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Es requereix verificaciÃŗ", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hores" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minuts" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Les polítiques de l'organitzaciÃŗ afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès d'aquesta Ês de $HOURS$ hores i $MINUTES$ minuts", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Les polítiques de l'organitzaciÃŗ afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès de la caixa forta Ês de $HOURS$ hores i $MINUTES$ minuts. L'acciÃŗ de temps d'espera de la caixa forta està definida en $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Genera un nom d'usuari" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Tipus de nom d'usuari" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Genera un àlies de correu electrÃ˛nic amb un servei de reenviament extern." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Error de $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generat per Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Lloc web: $WEBSITE$. Generat per Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nom de l'amfitriÃŗ", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Com emplenar automàticament" }, "autofillSelectInfoWithCommand": { - "message": "Seleccioneu un element d'aquesta pàgina o utilitzeu la drecera: $COMMAND$", + "message": "Seleccioneu un element d'aquesta pantalla, utilitzeu la drecera $COMMAND$ o exploreu altres opcions a la configuraciÃŗ.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Seleccioneu un element d'aquesta pàgina o definiu una drecera a la configuraciÃŗ." + "message": "Seleccioneu un element d'aquesta pantalla, o exploreu altres opcions a la configuraciÃŗ." }, "gotIt": { "message": "D'acord" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "ConfiguraciÃŗ d'emplenament automàtic" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "Drecera de teclat d'emplenament automàtic" }, - "autofillShortcutNotSet": { - "message": "La drecera d'emplenament automàtic no està configurada. Canvieu-ho a la configuraciÃŗ del navegador." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "La drecera d'emplenament automàtic Ês: $COMMAND$. Canvieu-ho a la configuraciÃŗ del navegador.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Inici de sessiÃŗ en" - }, "opensInANewWindow": { "message": "S'obri en una finestra nova" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Es requereix un identificador SSO de l'organitzaciÃŗ." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Torna arrere" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "UE", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "AccÊs denegat. No teniu permís per veure aquesta pàgina." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Dispositiu de confiança" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "L'entrada Ês obligatÃ˛ria." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Selecciona --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Redueix/Amplia", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Voleu importar les vostres dades a Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protegiu les vostres dades de LastPass i importeu-les a Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Guarda com a fitxer sense xifrar", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importa a Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "S'està important...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Les dades s'han importat correctament!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "S'ha produït un error en importar. Consulteu la consola per obtenir mÊs informaciÃŗ.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "S'ha trobat un error de xarxa durant la importaciÃŗ.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alies de domini" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Els elements amb una nova sol¡licitud de contrasenya mestra no es poden omplir automàticament en carregar la pàgina. L'emplenament automàtic en carregar la pàgina està desactivat.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "S'ha configurat l'emplenament automàtic en carregar la pàgina perquè utilitze la configuraciÃŗ predeterminada.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Desactiveu la sol¡licitud de nova contrasenya mestra per editar aquest camp", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "VÊs al contingut" + }, + "bitwardenOverlayButton": { + "message": "BotÃŗ de menÃē d'emplenament automàtic de Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Commuta el menÃē d'emplenament automàtic de Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "MenÃē d'emplenament automàtic de Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Desbloqueja el compte per veure els inicis de sessiÃŗ coincidents", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Desbloqueja el compte", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Ompliu les credencials per a", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Nom d'usuari parcial", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No hi ha cap element per mostrar", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Element nou", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Afegeix un nou element a la caixa forta", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Nova targeta", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "El menÃē d'emplenament automàtic de Bitwarden està disponible. Premeu la tecla de fletxa avall per seleccionar-lo.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Activa" + }, + "ignore": { + "message": "Ignora" + }, + "importData": { + "message": "Importa dades", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Error d'importaciÃŗ" + }, + "importErrorDesc": { + "message": "Hi ha hagut un problema amb les dades que heu intentat importar. Resoleu els errors que es mostren a continuaciÃŗ al fitxer font i torneu-ho a provar." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resoleu els errors segÃŧents i torneu-ho a provar." + }, + "description": { + "message": "DescripciÃŗ" + }, + "importSuccess": { + "message": "Les dades s'han importat correctament" + }, + "importSuccessNumberOfItems": { + "message": "S'han importat un total de $AMOUNT$ elements.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Torneu-ho a provar" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Es requereix verificaciÃŗ per a aquesta acciÃŗ. Estableix un PIN per continuar." + }, + "setPin": { + "message": "Estableix el PIN" + }, + "verifyWithBiometrics": { + "message": "Verifica amb biomètrica" + }, + "awaitingConfirmation": { + "message": "S'està esperant la confirmaciÃŗ" + }, + "couldNotCompleteBiometrics": { + "message": "No s'ha pogut completar la biomètrica." + }, + "needADifferentMethod": { + "message": "Necessita un mètode diferent?" + }, + "useMasterPassword": { + "message": "Utilitza contrasenya mestra" + }, + "usePin": { + "message": "Utilitza el PIN" + }, + "useBiometrics": { + "message": "Utilitza la biometria" + }, + "enterVerificationCodeSentToEmail": { + "message": "Introduïu el codi de verificaciÃŗ que s’ha enviat al vostre correu electrÃ˛nic." + }, + "resendCode": { + "message": "Reenvia el codi" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "Esteu important dades a $ORGANIZATION$. Les vostres dades es poden compartir amb membres d'aquesta organitzaciÃŗ. Voleu continuar?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Inicieu DUO i seguiu els passos per finalitzar la sessiÃŗ." + }, + "duoRequiredForAccount": { + "message": "Es requereix l'inici de sessiÃŗ en dos passos de DUO al vostre compte." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Desplega l'extensiÃŗ per completar l'inici de sessiÃŗ." + }, + "popoutExtension": { + "message": "ExtensiÃŗ emergent" + }, + "launchDuo": { + "message": "Inicia DUO" + }, + "importFormatError": { + "message": "Les dades no estan formatades correctament. Comproveu el fitxer d'importaciÃŗ i torneu-ho a provar." + }, + "importNothingError": { + "message": "No s'ha importat res." + }, + "importEncKeyError": { + "message": "Error en desxifrar el fitxer exportat. La vostra clau de xifratge no coincideix amb la clau de xifratge utilitzada per exportar les dades." + }, + "invalidFilePassword": { + "message": "La contrasenya del fitxer no Ês vàlida. Utilitzeu la contrasenya que vau introduir quan vau crear el fitxer d'exportaciÃŗ." + }, + "destination": { + "message": "DestinaciÃŗ" + }, + "learnAboutImportOptions": { + "message": "Obteniu informaciÃŗ sobre les opcions d'importaciÃŗ" + }, + "selectImportFolder": { + "message": "Selecciona una carpeta" + }, + "selectImportCollection": { + "message": "Selecciona una col¡lecciÃŗ" + }, + "importTargetHint": { + "message": "Seleccioneu aquesta opciÃŗ si voleu que el contingut del fitxer importat es desplace a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "El fitxer contÊ elements no assignats." + }, + "selectFormat": { + "message": "Seleccioneu el format del fitxer d'importaciÃŗ" + }, + "selectImportFile": { + "message": "Seleccioneu el fitxer d'importaciÃŗ" + }, + "chooseFile": { + "message": "Trieu fitxer" + }, + "noFileChosen": { + "message": "No s'ha triat cap fitxer" + }, + "orCopyPasteFileContents": { + "message": "o copieu/enganxeu el contingut dels fitxers d'importaciÃŗ" + }, + "instructionsFor": { + "message": "Instruccions de $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirma la importaciÃŗ de la Caixa forta" + }, + "confirmVaultImportDesc": { + "message": "Aquest fitxer està protegit amb contrasenya. Introduïu-la per importar dades." + }, + "confirmFilePassword": { + "message": "Confirma la contrasenya del fitxer" + }, + "exportSuccess": { + "message": "S'han exportat les dades de la caixa forta" + }, + "typePasskey": { + "message": "Clau de pas" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "La clau de pas no es copiarà" + }, + "passkeyNotCopiedAlert": { + "message": "La clau de pas no es copiarà a l'element clonat. Voleu continuar clonant aquest element?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "VerificaciÃŗ requerida pel lloc iniciador. Aquesta funciÃŗ encara no s'ha implementat per als comptes sense contrasenya mestra." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "Ja hi ha una clau de pas per a aquesta aplicaciÃŗ." + }, + "noPasskeysFoundForThisApplication": { + "message": "No s'han trobat claus de pas per a aquesta aplicaciÃŗ." + }, + "noMatchingPasskeyLogin": { + "message": "No teniu cap inici de sessiÃŗ que coincidisca amb el d'aquest lloc." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirma-ho" + }, + "savePasskey": { + "message": "Guarda la clau de pas" + }, + "savePasskeyNewLogin": { + "message": "Guarda la clau de pas com a nou inici de sessiÃŗ" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Element de clau de pas" + }, + "overwritePasskey": { + "message": "Sobreescriure la clau de pas?" + }, + "overwritePasskeyAlert": { + "message": "Aquest element ja contÊ una clau de pas. Esteu segur que voleu sobreescriure la actual?" + }, + "featureNotSupported": { + "message": "La característica encara no Ês compatible" + }, + "yourPasskeyIsLocked": { + "message": "Es requereix autenticaciÃŗ per utilitzar la clau de pas. Verifiqueu la vostra identitat per continuar." + }, + "multifactorAuthenticationCancelled": { + "message": "S'ha cancel¡lat l'autenticaciÃŗ multifactor" + }, + "noLastPassDataFound": { + "message": "No s'han trobat dades de LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "Nom d'usuari o contrasenya incorrectes" + }, + "incorrectPassword": { + "message": "Contrasenya incorrecta" + }, + "incorrectCode": { + "message": "Codi incorrecte" + }, + "incorrectPin": { + "message": "PIN incorrecte" + }, + "multifactorAuthenticationFailed": { + "message": "L'autenticaciÃŗ multifactor ha fallat" + }, + "includeSharedFolders": { + "message": "Inclou les carpetes compartides" + }, + "lastPassEmail": { + "message": "Adreça electrÃ˛nica de LastPass" + }, + "importingYourAccount": { + "message": "S'està important el compte..." + }, + "lastPassMFARequired": { + "message": "L'autenticaciÃŗ multifactor de LastPass Ês obligatÃ˛ria" + }, + "lastPassMFADesc": { + "message": "Introduïu la vostra contrasenya Ãēnica des de l'aplicaciÃŗ d'autenticaciÃŗ" + }, + "lastPassOOBDesc": { + "message": "Aproveu la sol¡licitud d'inici de sessiÃŗ a l'aplicaciÃŗ d'autenticaciÃŗ o introduïu una contrasenya Ãēnica." + }, + "passcode": { + "message": "Clau d'accÊs" + }, + "lastPassMasterPassword": { + "message": "Contrasenya mestra de LastPass" + }, + "lastPassAuthRequired": { + "message": "L'autenticaciÃŗ de LastPass Ês obligatÃ˛ria" + }, + "awaitingSSO": { + "message": "S'està esperant l'autenticaciÃŗ SSO" + }, + "awaitingSSODesc": { + "message": "Continueu iniciant la sessiÃŗ amb les credencials de la vostra empresa." + }, + "seeDetailedInstructions": { + "message": "Consulteu les instruccions detallades al nostre lloc d'ajuda a", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importa directament des de LastPass" + }, + "importFromCSV": { + "message": "Importa des de CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Torneu a provar-ho o cerqueu un correu electrÃ˛nic de LastPass per verificar la vostra identitat." + }, + "collection": { + "message": "Col¡lecciÃŗ" + }, + "lastPassYubikeyDesc": { + "message": "Inseriu la YubiKey associada al compte del LastPass al port USB de l'ordinador i, desprÊs, toqueu-ne el botÃŗ." + }, + "switchAccount": { + "message": "Canvia de compte" + }, + "switchAccounts": { + "message": "Canvia de comptes" + }, + "switchToAccount": { + "message": "Canvia al compte" + }, + "activeAccount": { + "message": "Activa el compte" + }, + "availableAccounts": { + "message": "Comptes disponibles" + }, + "accountLimitReached": { + "message": "S'ha arribat al límit del compte. Tanqueu la sessiÃŗ d'un compte per afegir-ne un altre." + }, + "active": { + "message": "activa" + }, + "locked": { + "message": "bloquejat" + }, + "unlocked": { + "message": "desbloquejat" + }, + "server": { + "message": "servidor" + }, + "hostedAt": { + "message": "allotjat a" + }, + "useDeviceOrHardwareKey": { + "message": "Utilitzeu el vostre dispositiu o la clau de maquinari" + }, + "justOnce": { + "message": "NomÊs una vegada" + }, + "alwaysForThisSite": { + "message": "Sempre per aquest lloc" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ afegit als dominis exclosos.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Formats comuns", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Fer que Bitwarden siga el gestor de contrasenyes predeterminat?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Si ignoreu aquesta opciÃŗ pot provocar conflictes entre el menÃē d'emplenament automàtic de Bitwarden i el del navegador.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Feu que Bitwarden siga el vostre gestor de contrasenyes predeterminat", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "No es pot establir Bitwarden com a gestor de contrasenyes predeterminat", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Heu de concedir permisos de privadesa del navegador a Bitwarden per establir-lo com a gestor de contrasenyes predeterminat.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Estableix per defecte", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Les credencials s'han guardat correctament!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Les credencials s'han actualitzat correctament!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "S'ha produït un error en guardar les credencials. Consulteu la consola per obtenir mÊs informaciÃŗ.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Èxit" + }, + "removePasskey": { + "message": "Suprimeix la clau de pas" + }, + "passkeyRemoved": { + "message": "Clau de pas suprimida" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Consola d'administraciÃŗ" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "S'ha produït un error en assignar la col¡lecciÃŗ de destinaciÃŗ." + }, + "errorAssigningTargetFolder": { + "message": "S'ha produït un error en assignar la carpeta de destinaciÃŗ." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nou" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Detalls de l'element" + }, + "itemName": { + "message": "Nom d'element" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Propietari" + }, + "selfOwnershipLabel": { + "message": "TÃē", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "No es pot accedir als elements de les organitzacions inhabilitades. Poseu-vos en contacte amb el propietari de la vostra organitzaciÃŗ per obtenir ajuda." + }, + "additionalInformation": { + "message": "InformaciÃŗ addicional" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Última ediciÃŗ" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Enllaçat" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filtres" + }, + "personalDetails": { + "message": "Detalls personals" + }, + "identification": { + "message": "IdentificaciÃŗ" + }, + "contactInfo": { + "message": "InformaciÃŗ de contacte" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Credencials d'inici de sessiÃŗ" + }, + "authenticatorKey": { + "message": "Clau autenticadora" + }, + "autofillOptions": { + "message": "Opcions d'emplenament automàtic" + }, + "websiteUri": { + "message": "Lloc web (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Lloc web afegit" + }, + "addWebsite": { + "message": "Afig un lloc web" + }, + "deleteWebsite": { + "message": "Suprimeix lloc web" + }, + "defaultLabel": { + "message": "Per defecte ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Afig compte" + }, + "loading": { + "message": "S'està carregant" + }, + "data": { + "message": "Dades" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assigna" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Afig un camp" + }, + "add": { + "message": "Afig" + }, + "fieldType": { + "message": "Tipus de camp" + }, + "fieldLabel": { + "message": "Etiqueta del camp" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edita el camp" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Seleccioneu les col¡leccions per assignar" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 27ddddb5124..0510d17dbf0 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden – BezplatnÃŊ sprÃĄvce hesel", + "message": "Bitwarden - SprÃĄvce hesel", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "BezpečnÃŊ a bezplatnÃŊ sprÃĄvce hesel pro vÅĄechna VaÅĄe zařízení.", - "description": "Extension description" + "message": "Bitwarden zabezpečí vÅĄechna VaÅĄe hesla, přístupovÊ klíče a citlivÊ informace doma, v prÃĄci nebo na cestÃĄch", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Pro přístup do VaÅĄeho bezpečnÊho trezoru se přihlaste nebo si vytvořte novÃŊ Ãēčet." }, + "inviteAccepted": { + "message": "PozvÃĄnka byla přijata" + }, "createAccount": { "message": "Vytvořit Ãēčet" }, - "login": { - "message": "PřihlÃĄsit se" + "newToBitwarden": { + "message": "Jste noví na Bitwardenu?" + }, + "logInWithPasskey": { + "message": "PřihlÃĄsit se pomocí přístupovÊho klíče" + }, + "useSingleSignOn": { + "message": "PouŞít jednotnÊ přihlÃĄÅĄení" + }, + "welcomeBack": { + "message": "Vítejte zpět" + }, + "setAStrongPassword": { + "message": "Nastavit hlavní heslo" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Dokončete vytvÃĄÅ™ení Ãēčtu nastavením hesla" }, "enterpriseSingleSignOn": { "message": "JednotnÊ podnikovÊ přihlÃĄÅĄení" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "NÃĄpověda k hlavnímu heslu VÃĄm pomůŞe vzpomenout si heslo, pokud ho zapomenete." }, + "masterPassHintText": { + "message": "Pokud zapomenete svÊ heslo, můŞe bÃŊt nÃĄpověda k heslu odeslÃĄna na VÃĄÅĄ e-mail. $CURRENT$/$MAXIMUM$ znaků maximÃĄlně.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Znovu zadejte hlavní heslo" }, "masterPassHint": { "message": "NÃĄpověda k hlavnímu heslu (volitelnÊ)" }, + "joinOrganization": { + "message": "Přidat se k organizaci" + }, + "joinOrganizationName": { + "message": "Připojit se k $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Dokončete připojení k tÊto organizaci nastavením hlavního hesla." + }, "tab": { "message": "Karta" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopírovat heslo" }, + "copyPassphrase": { + "message": "Kopírovat heslovou frÃĄzi" + }, "copyNote": { "message": "Kopírovat poznÃĄmku" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopírovat bezpečnostní kÃŗd" }, + "copyName": { + "message": "Kopírovat nÃĄzev" + }, + "copyCompany": { + "message": "Kopírovat společnost" + }, + "copySSN": { + "message": "Kopírovat rodnÊ číslo" + }, + "copyPassportNumber": { + "message": "Kopírovat číslo pasu" + }, + "copyLicenseNumber": { + "message": "Kopírovat číslo dokladu totoÅžnosti" + }, + "copyPrivateKey": { + "message": "Kopírovat soukromÃŊ klíč" + }, + "copyPublicKey": { + "message": "Kopírovat veřejnÃŊ klíč" + }, + "copyFingerprint": { + "message": "Kopírovat otisk prstu" + }, + "copyCustomField": { + "message": "Kopírovat $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopírovat webovou strÃĄnku" + }, + "copyNotes": { + "message": "Kopírovat poznÃĄmky" + }, + "fill": { + "message": "Vyplnit", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "AutomatickÊ vyplňovÃĄní" }, + "autoFillLogin": { + "message": "Automaticky vyplnit přihlÃĄÅĄení" + }, + "autoFillCard": { + "message": "Automaticky vyplnit kartu" + }, + "autoFillIdentity": { + "message": "Automaticky vyplnit identitu" + }, "generatePasswordCopied": { "message": "Vygenerovat heslo a zkopírovat do schrÃĄnky" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "ÅŊÃĄdnÊ odpovídající přihlaÅĄovací Ãēdaje" }, + "noCards": { + "message": "ÅŊÃĄdnÊ karty" + }, + "noIdentities": { + "message": "ÅŊÃĄdnÊ identity" + }, + "addLoginMenu": { + "message": "Přidat přihlaÅĄovací Ãēdaje" + }, + "addCardMenu": { + "message": "Přidat kartu" + }, + "addIdentityMenu": { + "message": "Přidat identitu" + }, "unlockVaultMenu": { "message": "Odemknout VÃĄÅĄ trezor" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Přidat poloÅžku" }, + "accountEmail": { + "message": "E-mail Ãēčtu" + }, + "requestHint": { + "message": "VyÅžÃĄdat nÃĄpovědu" + }, + "requestPasswordHint": { + "message": "VyÅžÃĄdat nÃĄpovědu k heslu" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Zadejte svou e-mailovou adresu, na kterou VÃĄm zaÅĄleme nÃĄpovědu k heslu" + }, "passwordHint": { "message": "NÃĄpověda pro heslo" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Pro pokračovÃĄní potvrďte svou identitu." }, - "account": { - "message": "Účet" - }, "changeMasterPassword": { "message": "Změnit hlavní heslo" }, + "continueToWebApp": { + "message": "Pokračovat do webovÊ aplikace?" + }, + "continueToWebAppDesc": { + "message": "Prozkoumejte dalÅĄÃ­ funkce VaÅĄeho Ãēčtu Bitwarden ve webovÊ aplikaci." + }, + "continueToHelpCenter": { + "message": "Pokračovat do Centra nÃĄpovědy?" + }, + "continueToHelpCenterDesc": { + "message": "Přečtěte si více o tom, jak pouŞívat Bitwarden v Centru nÃĄpovědy." + }, + "continueToBrowserExtensionStore": { + "message": "Pokračovat do obchdou s rozÅĄÃ­Å™eními pro prohlíŞeč?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Pomozte ostatním zjistit, zda je Bitwarden pro ně sprÃĄvnÃŊ. NavÅĄtivte obchod s rozÅĄÃ­Å™eními pro prohlíŞeč a zanechte hodnocení." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Hlavní heslo můŞete změnit ve webovÊ aplikaci Bitwardenu." + }, "fingerprintPhrase": { "message": "FrÃĄze otisku prstu", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "OdhlÃĄsit se" }, + "aboutBitwarden": { + "message": "O Bitwardenu" + }, "about": { "message": "O rozÅĄÃ­Å™ení" }, + "moreFromBitwarden": { + "message": "Více od Bitwardenu" + }, + "continueToBitwardenDotCom": { + "message": "Pokračovat na bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden pro byznys" + }, + "bitwardenAuthenticator": { + "message": "AutentifikÃĄtor Bitwarden" + }, + "continueToAuthenticatorPageDesc": { + "message": "AutentifikÃĄtor Bitwarden umoŞňuje uklÃĄdat ověřovací klíče a generovat TOTP kÃŗdy pro 2-fÃĄzovÊ ověřovÃĄní. DalÅĄÃ­ informace naleznete na strÃĄnkÃĄch bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "SprÃĄvce tajnÃŊch klíčů Bitwardenu" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bezpečně uklÃĄdÃĄ, spravuje a sdílí tajnÊ klíče vÃŊvojÃĄÅ™e se sprÃĄvcem tajnÃŊch klíčů Bitwardenu. Více informací naleznete na strÃĄnkÃĄch bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "S heslem Passwordless.dev vytvoří hladkÃŊ a bezpečnÃŊ přístup bez tradičních hesel. DalÅĄÃ­ informace naleznete na strÃĄnkÃĄch bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden pro rodinu zdarma" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "MÃĄte nÃĄrok na Bitwarden pro rodinu zdarma. Uplatněte tuto nabídku jeÅĄtě dnes ve webovÊ aplikaci." + }, "version": { "message": "Verze" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Upravit sloÅžku" }, + "newFolder": { + "message": "NovÃĄ sloÅžka" + }, + "folderName": { + "message": "NÃĄzev sloÅžky" + }, + "folderHintText": { + "message": "Vnořit sloÅžku přidÃĄním nÃĄzvu nadřazenÊ sloÅžky nÃĄsledovanÊho znakem \"/\". Příklad: SociÃĄlní/FÃŗra" + }, + "noFoldersAdded": { + "message": "Nebyly přidÃĄny ÅžÃĄdnÊ sloÅžky" + }, + "createFoldersToOrganize": { + "message": "Vytvořte sloÅžky pro organizaci VaÅĄich poloÅžek trezoru" + }, + "deleteFolderPermanently": { + "message": "Opravdu chcete trvale smazat tuto sloÅžku?" + }, "deleteFolder": { "message": "Smazat sloÅžku" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "GenerÃĄtor", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Vygenerujte si silnÊ a unikÃĄtní heslo pro přihlaÅĄovací Ãēdaje." }, - "bitWebVault": { - "message": "WebovÃŊ trezor Bitwardenu" + "bitWebVaultApp": { + "message": "WebovÃĄ aplikace Bitwardenu" }, "importItems": { "message": "Importovat poloÅžky" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Vygenerovat heslo" }, + "generatePassphrase": { + "message": "Vygenerovat heslovou frÃĄzi" + }, "regeneratePassword": { "message": "Vygenerovat jinÊ heslo" }, @@ -244,17 +447,60 @@ "length": { "message": "DÊlka" }, + "passwordMinLength": { + "message": "MinimÃĄlní dÊlka hesla" + }, "uppercase": { - "message": "VelkÃĄ písmena (A-Z)" + "message": "VelkÃĄ písmena (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "MalÃĄ písmena (a-z)" + "message": "MalÃĄ písmena (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Číslice (0-9)" + "message": "Číslice (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "SpeciÃĄlní znaky (!@#$%^&*)" + "message": "SpeciÃĄlní znaky (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Zahrnout", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Zahrnout velkÃĄ písmena", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Zahrnout malÃĄ písmena", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Zahrnout číslice", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Zahrnout speciÃĄlní znaky", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Počet slov" @@ -276,7 +522,16 @@ "message": "MinimÃĄlní počet speciÃĄlních znaků" }, "avoidAmbChar": { - "message": "NepouŞívat zaměnitelnÊ znaky" + "message": "NepouŞívat zaměnitelnÊ znaky", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "NepouŞívat zaměnitelnÊ znaky", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Na volby generÃĄtoru byly uplatněny poÅžadavky podnikovÃŊch zÃĄsad.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Vyhledat v trezoru" @@ -299,15 +554,30 @@ "password": { "message": "Heslo" }, + "totp": { + "message": "TajnÃŊ klíč autentizace" + }, "passphrase": { "message": "HeslovÃĄ frÃĄze" }, "favorite": { "message": "OblíbenÊ" }, + "unfavorite": { + "message": "Odebrat z oblíbenÃŊch" + }, + "itemAddedToFavorites": { + "message": "PoloÅžka byla přidÃĄna do oblíbenÃŊch" + }, + "itemRemovedFromFavorites": { + "message": "PoloÅžka byla odebrÃĄna z oblíbenÃŊch" + }, "notes": { "message": "PoznÃĄmky" }, + "privateNote": { + "message": "SoukromÃĄ poznÃĄmka" + }, "note": { "message": "PoznÃĄmka" }, @@ -326,6 +596,18 @@ "launch": { "message": "Spustit" }, + "launchWebsite": { + "message": "Otevřít webovou strÃĄnku" + }, + "launchWebsiteName": { + "message": "Spustit web $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "WebovÃĄ strÃĄnka" }, @@ -338,9 +620,24 @@ "other": { "message": "Ostatní" }, + "unlockMethods": { + "message": "Volby odemknutí" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Nastavte metodu odemknutí, abyste změnili časovÃŊ limit VaÅĄeho trezoru." }, + "unlockMethodNeeded": { + "message": "Nastavit metodu odemknutí v Nastavení" + }, + "sessionTimeoutHeader": { + "message": "ČasovÃŊ limit relace" + }, + "vaultTimeoutHeader": { + "message": "ČasovÃŊ limit trezoru" + }, + "otherOptions": { + "message": "DalÅĄÃ­ volby" + }, "rateExtension": { "message": "Ohodnotit rozÅĄÃ­Å™ení" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "VÃĄÅĄ trezor je uzamčen. Pro pokračovÃĄní musíte zadat hlavní heslo." }, + "yourVaultIsLockedV2": { + "message": "VÃĄÅĄ trezor je uzamčen" + }, + "yourAccountIsLocked": { + "message": "VÃĄÅĄ Ãēčet je uzamčen" + }, + "or": { + "message": "nebo" + }, "unlock": { "message": "Odemknout" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "ČasovÃŊ limit trezoru" }, + "vaultTimeout1": { + "message": "ČasovÃŊ limit" + }, "lockNow": { "message": "Zamknout nyní" }, + "lockAll": { + "message": "Zamknout vÅĄe" + }, "immediately": { "message": "OkamÅžitě" }, @@ -426,6 +738,18 @@ "security": { "message": "Zabezpečení" }, + "confirmMasterPassword": { + "message": "Potvrzení hlavního hesla" + }, + "masterPassword": { + "message": "Hlavní heslo" + }, + "masterPassImportant": { + "message": "Pokud zapomenete VaÅĄe hlavní heslo, nebude moÅžnÊ jej obnovit!" + }, + "masterPassHintLabel": { + "message": "NÃĄpověda k hlavnímu heslu" + }, "errorOccurred": { "message": "Vyskytla se chyba" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "VÃĄÅĄ Ãēčet byl vytvořen! MůŞete se přihlÃĄsit." }, + "newAccountCreated2": { + "message": "VÃĄÅĄ novÃŊ Ãēčet byl vytvořen!" + }, + "youHaveBeenLoggedIn": { + "message": "Byli jste přihlÃĄÅĄeni!" + }, + "youSuccessfullyLoggedIn": { + "message": "Byli jste ÃēspÄ›ÅĄně přihlÃĄÅĄeni" + }, + "youMayCloseThisWindow": { + "message": "Toto okno můŞete zavřít" + }, "masterPassSent": { "message": "Poslali jsme VÃĄm e-mail s nÃĄpovědou k hlavnímu heslu." }, "verificationCodeRequired": { "message": "Je vyÅžadovÃĄn ověřovací kÃŗd." }, + "webauthnCancelOrTimeout": { + "message": "Ověření bylo zruÅĄeno nebo trvalo příliÅĄ dlouho. Zkuste to znovu." + }, "invalidVerificationCode": { "message": "NeplatnÃŊ ověřovací kÃŗd" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "VybranÊ přihlaÅĄovací Ãēdaje nelze na tÊto strÃĄnce automaticky vyplnit. Zkopírujte a vloÅžte svÊ přihlaÅĄovací Ãēdaje ručně." }, + "totpCaptureError": { + "message": "Nelze naskenovat QR kÃŗd z aktuÃĄlní webovÊ strÃĄnky" + }, + "totpCaptureSuccess": { + "message": "Byl přidÃĄn autentizační klíč" + }, + "totpCapture": { + "message": "Naskenovat QR kÃŗd z aktuÃĄlní webovÊ strÃĄnky" + }, + "totpHelperTitle": { + "message": "BezproblÊmovÊ dvoufÃĄzovÊ ověřovÃĄní" + }, + "totpHelper": { + "message": "Bitwarden umí uklÃĄdat a vyplňovat dvoufÃĄzovÊ ověřovací kÃŗdy. Zkopírujte a vloÅžte klíč do tohoto pole." + }, + "totpHelperWithCapture": { + "message": "Bitwarden umí uklÃĄdat a vyplňovat dvoufÃĄzovÊ ověřovací kÃŗdy. Vyberte ikonu fotoaparÃĄtu a pořiďte snímek obrazovky ověřovacího QR kÃŗdu tÊto webovÊ strÃĄnky nebo klíč zkopírujte a vloÅžte do tohoto pole." + }, + "learnMoreAboutAuthenticators": { + "message": "Zjistěte více o autentizÃĄtorech" + }, + "copyTOTP": { + "message": "Kopírovat autentizační klíč (TOTP)" + }, "loggedOut": { "message": "OdhlÃĄÅĄení" }, + "loggedOutDesc": { + "message": "Byli jste odhlÃĄÅĄeni ze svÊho Ãēčtu." + }, "loginExpired": { "message": "Platnost přihlÃĄÅĄení vyprÅĄela." }, + "logIn": { + "message": "PřihlÃĄsit se" + }, + "logInToBitwarden": { + "message": "PřihlÃĄsit se do Bitwardenu" + }, + "restartRegistration": { + "message": "Restartovat registraci" + }, + "expiredLink": { + "message": "Platnost odkazu vyprÅĄela" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Restartujte registraci nebo se zkuste přihlÃĄsit." + }, + "youMayAlreadyHaveAnAccount": { + "message": "UÅž moÅžnÃĄ mÃĄte Ãēčet" + }, "logOutConfirmation": { "message": "Opravdu se chcete odhlÃĄsit?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "SloÅžka byla přidÃĄna" }, - "changeMasterPass": { - "message": "Změnit hlavní heslo" - }, - "changeMasterPasswordConfirmation": { - "message": "Hlavní heslo si můŞete změnit na webovÊ strÃĄnce bitwarden.com. Chcete tuto strÃĄnku nyní otevřít?" - }, "twoStepLoginConfirmation": { "message": "DvoufÃĄzovÊ přihlÃĄÅĄení činí VÃĄÅĄ Ãēčet mnohem bezpečnějÅĄÃ­m díky nutnosti po kaÅždÊm ÃēspÄ›ÅĄnÊm přihlÃĄÅĄení zadat ověřovací kÃŗd získanÃŊ z bezpečnostního klíče, aplikace, SMS, telefonního hovoru nebo e-mailu. DvoufÃĄzovÊ přihlÃĄÅĄení lze aktivovat na webovÊ strÃĄnce bitwarden.com. Chcete tuto strÃĄnku nyní otevřít?" }, + "twoStepLoginConfirmationContent": { + "message": "Vytvořte svůj Ãēčet bezpečnějÅĄÃ­m nastavením dvoufÃĄzovÊho přihlÃĄÅĄení ve webovÊ aplikaci Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Pokračovat do webovÊ aplikace?" + }, "editedFolder": { "message": "SloÅžka byla uloÅžena" }, @@ -552,6 +936,10 @@ "newUri": { "message": "NovÃĄ URI" }, + "addDomain": { + "message": "Přidat domÊnu", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "PoloÅžka byla přidÃĄna" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "PtÃĄt se na přidÃĄní přihlÃĄÅĄení" }, + "vaultSaveOptionsTitle": { + "message": "UloÅžit do voleb trezoru" + }, "addLoginNotificationDesc": { "message": "ZeptÃĄ se na uloÅžení Ãēdajů, pokud nebyly v trezoru nalezeny." }, + "addLoginNotificationDescAlt": { + "message": "PoÅžÃĄdÃĄ o přidÃĄní poloÅžky, pokud nebyla nalezena v trezoru. Platí pro vÅĄechny přihlÃĄÅĄenÊ Ãēčty." + }, + "showCardsInVaultView": { + "message": "Zobrazit karty jako nÃĄvrhy automatickÊho vyplňovÃĄní v zobrazení trezoru" + }, "showCardsCurrentTab": { "message": "Zobrazit platební karty na obrazovce Karta" }, "showCardsCurrentTabDesc": { "message": "Pro snadnÊ vyplnění zobrazí platební karty na obrazovce Karta." }, + "showIdentitiesInVaultView": { + "message": "Zobrazit identity jako nÃĄvrhy automatickÊho vyplňovÃĄní v zobrazení trezoru" + }, "showIdentitiesCurrentTab": { "message": "Zobrazit identity na obrazovce Karta" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Zeptat se na aktualizaci hesla pro přihlÃĄÅĄení, pokud je na webovÊ strÃĄnce zjiÅĄtěno pouÅžití jinÊho hesla." }, + "changedPasswordNotificationDescAlt": { + "message": "VyÅžÃĄdÃĄ aktualizaci hesla k přihlÃĄÅĄení, pokud je na webu zjiÅĄtěna změna. Platí pro vÅĄechny přihlÃĄÅĄenÊ Ãēčty." + }, + "enableUsePasskeys": { + "message": "Zeptat se na uloÅžení a pouÅžití přístupovÃŊch hesel" + }, + "usePasskeysDesc": { + "message": "ZeptÃĄ se na uloÅžení novÊho hesla nebo se přihlÃĄsí pomocí přístupovÃŊch hesel uloÅženÃŊch ve VaÅĄem trezoru. Platí pro vÅĄechny přihlÃĄÅĄenÊ Ãēčty." + }, "notificationChangeDesc": { "message": "Chcete aktualizovat toto heslo v Bitwardenu?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Odemknout" }, + "additionalOptions": { + "message": "DalÅĄÃ­ volby" + }, "enableContextMenuItem": { "message": "Zobrazit volby v kontextovÊm menu" }, "contextMenuItemDesc": { - "message": "PouÅžijte pravÊ tlačítko pro přístup k vytvoření hesla a odpovídajícímu přihlÃĄÅĄení pro tuto strÃĄnku. " + "message": "PouÅžijte pravÊ tlačítko pro přístup k vytvoření hesla a odpovídajícímu přihlÃĄÅĄení pro tuto strÃĄnku." + }, + "contextMenuItemDescAlt": { + "message": "PouÅžije pravÊ tlačítko pro přístup k vytvoření hesla a odpovídajícímu přihlÃĄÅĄení pro tuto strÃĄnku. Platí pro vÅĄechny přihlÃĄÅĄenÊ Ãēčty." }, "defaultUriMatchDetection": { "message": "VÃŊchozí zjiÅĄÅĨovÃĄní shody URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Vyberte vÃŊchozí způsob, jakÃŊm se detekuje shoda URI přihlaÅĄovacích Ãēdajů. PouŞívÃĄ se například pro automatickÊ vyplňovÃĄní." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Změní barevnÃŊ motiv aplikace." }, + "themeDescAlt": { + "message": "Změní barevnÃŊ motiv aplikace. Platí pro vÅĄechny přihlÃĄÅĄenÊ Ãēčty." + }, "dark": { "message": "TmavÃŊ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "TmavÃŊ (solarizovanÃŊ)", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Exportovat z" + }, "exportVault": { "message": "Exportovat trezor" }, "fileFormat": { "message": "FormÃĄt souboru" }, + "fileEncryptedExportWarningDesc": { + "message": "Tento soubor exportu bude chrÃĄněn heslem a k deÅĄifrovÃĄní bude vyÅžadovat heslo souboru." + }, + "filePassword": { + "message": "Heslo souboru" + }, + "exportPasswordDescription": { + "message": "Toto heslo bude pouÅžito pro export a import tohoto souboru" + }, + "accountRestrictedOptionDescription": { + "message": "Pro zaÅĄifrovÃĄní exportu a omezení importu pouze na aktuÃĄlní Ãēčet Bitwardenu pouÅžijte ÅĄifrovací klíč VaÅĄeho Ãēčtu odvozenÃŊ z uÅživatelskÊho jmÊna a hlavního hesla." + }, + "passwordProtectedOptionDescription": { + "message": "Nastavte heslo pro ÅĄifrovÃĄní exportu a importujte ho do libovolnÊho Ãēčtu Bitwardenu pomocí hesla pro deÅĄifrovÃĄní." + }, + "exportTypeHeading": { + "message": "Typ exportu" + }, + "accountRestricted": { + "message": "Účet je omezenÃŊ" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Heslo souboru\" a \"Potvrzení hesla souboru\" se neshodují." + }, "warning": { "message": "VAROVÁNÍ", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "SdílenÊ" }, - "learnOrg": { - "message": "Více o organizacích" - }, - "learnOrgConfirmation": { - "message": "Bitwarden VÃĄm umoŞňuje sdílet poloÅžky v trezoru s ostatními prostřednictvím organizace. Chcete přejít na bitwarden.com a dozvědět se více?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden pro bvyznys VÃĄm umoŞňuje sdílet poloÅžky v trezoru s ostatními prostřednictvím organizace. Více informací naleznete na bitwarden.com." }, "moveToOrganization": { "message": "Přesunout do organizace" @@ -762,6 +1204,9 @@ "file": { "message": "Soubor" }, + "fileToShare": { + "message": "Soubor ke sdílení" + }, "selectFile": { "message": "Zvolte soubor" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB ÅĄifrovanÊho ÃēloÅžiÅĄtě pro přílohy." }, + "premiumSignUpEmergency": { + "message": "NouzovÃŊ přístup" + }, "premiumSignUpTwoStepOptions": { "message": "Volby proprietÃĄlních dvoufÃĄzovÃŊch přihlÃĄÅĄení jako je YubiKey a Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "PrÊmiovÊ členství můŞete zakoupit na webovÊ strÃĄnce bitwarden.com. Chcete tuto strÃĄnku nyní otevřít?" }, + "premiumPurchaseAlertV2": { + "message": "Premium si můŞete zakoupit v nastavení Ãēčtu ve webovÊ aplikaci Bitwarden." + }, "premiumCurrentMember": { "message": "Jste prÊmiovÃŊm členem!" }, "premiumCurrentMemberThanks": { "message": "Děkujeme za podporu Bitwardenu." }, + "premiumFeatures": { + "message": "Přejděte na Premium a získÃĄte:" + }, "premiumPrice": { "message": "VÅĄe jen za $PRICE$ ročně!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "VÅĄe jen za $PRICE$ ročně!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Obnova je dokončena" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Ověřovací aplikace" }, - "authenticatorAppDesc": { - "message": "PouÅžijte ověřovací aplikaci (jako je Authy nebo Google Authenticator) pro generovÃĄní časově omezenÃŊch kÃŗdů.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Zadejte kÃŗd vygenerovanÃŊ ověřovací aplikací, jako je AutentikÃĄtor Bitwarden.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { + "yubiKeyTitleV2": { "message": "Bezpečnostní klíč YubiKey OTP" }, "yubiKeyDesc": { "message": "PouÅžije YubiKey pro přístup k VaÅĄemu trezoru. Podporuje YubiKey 4, 4 Nano, 4C a NEO." }, - "duoDesc": { - "message": "Ověření pomocí Duo Security prostřednictvím aplikace Duo Mobile, SMS, telefonního hovoru nebo bezpečnostního klíče U2F.", + "duoDescV2": { + "message": "Zadejte kÃŗd vygenerovanÃŊ DUO Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-mail" }, - "emailDesc": { - "message": "Ověřovací kÃŗdy VÃĄm budou zaslÃĄny e-mailem." + "emailDescV2": { + "message": "Zadejte kÃŗd odeslanÃŊ na VÃĄÅĄ e-mail." }, "selfHostedEnvironment": { "message": "Vlastní hostovanÊ prostředí" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Zadejte zÃĄkladní URL adresu vlastní hostovanÊ aplikace Bitwarden." }, + "selfHostedBaseUrlHint": { + "message": "Zadejte zÃĄkladní URL adresu VaÅĄÃ­ vlastní hostovanÊ aplikace Bitwarden. Příklad: https://bitwarden.spolecnost.cz" + }, + "selfHostedCustomEnvHeader": { + "message": "Pro rozÅĄÃ­Å™enÃĄ nastavení můŞete zadat zÃĄkladní URL adresu kaÅždÊ sluÅžby zvlÃĄÅĄÅĨ." + }, + "selfHostedEnvFormInvalid": { + "message": "Musíte přidat buď zÃĄkladní adresu URL serveru nebo alespoň jedno vlastní prostředí." + }, "customEnvironment": { "message": "Vlastní prostředí" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL serveru" }, + "selfHostBaseUrl": { + "message": "Adresa URL serveru vlastního hostovÃĄní", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL API serveru" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "URL adresy vlastního prostředí byly uloÅženy" }, + "showAutoFillMenuOnFormFields": { + "message": "Zobrazit menu automatickÊho vyplňovÃĄní v polích formulÃĄÅ™e", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "NÃĄvrhy automatickÊho vyplňovÃĄní" + }, + "showInlineMenuLabel": { + "message": "Zobrazit nÃĄvrhy automatickÊho vyplňovÃĄní v polích formulÃĄÅ™e" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Zobrazit identity jako nÃĄvrhy" + }, + "showInlineMenuCardsLabel": { + "message": "Zobrazit karty jako nÃĄvrhy" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Zobrazit nÃĄvrhy, kdyÅž je vybrÃĄna ikona" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "PouÅžije se na vÅĄechny přihlÃĄÅĄenÊ Ãēčty." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Abyste se vyhnuli konfliktům, vypněte v nastavení VaÅĄeho prohlíŞeče zabudovanÃŊ sprÃĄvce hesel." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Upravit nastavení prohlíŞeče" + }, + "autofillOverlayVisibilityOff": { + "message": "VYP.", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "KdyÅž je vybrÃĄno pole (zaměřeno)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "KdyÅž je vybrÃĄna ikona automatickÊho vyplňovÃĄní", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Automaticky vyplnit Ãēdaje při načtení strÃĄnky" + }, "enableAutoFillOnPageLoad": { "message": "Automaticky vyplnit Ãēdaje při načtení strÃĄnky" }, "enableAutoFillOnPageLoadDesc": { "message": "Pokud je zjiÅĄtěn přihlaÅĄovací formulÃĄÅ™, automaticky se při načítÃĄní webovÊ strÃĄnky vyplní přihlaÅĄovací Ãēdaje." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$VarovÃĄní:$CLOSETAG$ KompromitovanÊ nebo nedůvěryhodnÊ webovÊ strÃĄnky mohou vyuŞívat automatickÊ vyplňovÃĄní při načítÃĄní strÃĄnky.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "KompromitovanÊ nebo nedůvěryhodnÊ webovÊ strÃĄnky mohou zneuŞívat automatickÊ vyplňovÃĄní při načítÃĄní strÃĄnky." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "DalÅĄÃ­ informace o rizicích" + }, "learnMoreAboutAutofill": { "message": "Více informací o automatickÊm vyplňovÃĄní" }, @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "Otevřít trezor v postranním panelu" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "Automaticky vyplní poslední pouÅžitÊ přihlaÅĄovací Ãēdaje pro tuto strÃĄnku." }, + "commandAutofillCardDesc": { + "message": "Automaticky vyplní poslední pouÅžitou kartu pro tuto strÃĄnku." + }, + "commandAutofillIdentityDesc": { + "message": "Automaticky vyplní poslední pouÅžitou identitu pro tuto strÃĄnku." + }, "commandGeneratePasswordDesc": { "message": "Vygeneruje a zkopíruje novÊ nÃĄhodnÊ heslo do schrÃĄnky." }, "commandLockVaultDesc": { "message": "Zamkne trezor." }, - "privateModeWarning": { - "message": "Podpora soukromÊho reÅžimu je experimentÃĄlní a některÊ funkce jsou omezenÊ." - }, "customFields": { "message": "Vlastní pole" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "ZaÅĄkrtÃĄvací políčko" + }, "cfTypeLinked": { "message": "PropojenÊ", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Zobrazí rozeznatelnÃŊ obrÃĄzek vedle kaÅždÊho přihlÃĄÅĄení." }, + "faviconDescAlt": { + "message": "Zobrazí rozeznatelnÃŊ obrÃĄzek vedle kaÅždÊho přihlÃĄÅĄení. Platí pro vÅĄechny přihlÃĄÅĄenÊ Ãēčty." + }, "enableBadgeCounter": { "message": "Zobrazovat počet uloÅženÃŊch přihlaÅĄovacích Ãēdajů na strÃĄnce" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identita" }, + "typeSshKey": { + "message": "SSH klíč" + }, + "newItemHeader": { + "message": "NovÊ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Upravit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Zobrazit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Historie hesel" }, + "generatorHistory": { + "message": "Historie generÃĄtoru" + }, + "clearGeneratorHistoryTitle": { + "message": "Vymazat historii generÃĄtoru" + }, + "cleargGeneratorHistoryDescription": { + "message": "Pokud budete pokračovat, vÅĄechny poloÅžky budou trvale smazÃĄny z historie generÃĄtoru. Jste si jisti, Åže chcete pokračovat?" + }, "back": { "message": "Zpět" }, "collections": { "message": "Kolekce" }, + "nCollections": { + "message": "$COUNT$ kolekcí", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "OblíbenÊ" }, @@ -1282,6 +1874,10 @@ "message": "ZÃĄkladní domÊna", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "ZÃĄkladní domÊna (doporučeno)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "NÃĄzev domÊny", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ZjiÅĄÅĨovÃĄní shody", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "VÃŊchozí zjiÅĄÅĨovÃĄní shody", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Přepnout volby" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Nejsou k dispozici ÅžÃĄdnÃĄ hesla." }, + "clearHistory": { + "message": "Vymazat historii" + }, + "nothingToShow": { + "message": "Nic k zobrazení" + }, + "nothingGeneratedRecently": { + "message": "NedÃĄvno jste nic nevygenerovali" + }, "remove": { "message": "Odebrat" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Odemknout pomocí PIN" }, + "setYourPinTitle": { + "message": "Nastavit PIN" + }, + "setYourPinButton": { + "message": "Nastavit PIN" + }, "setYourPinCode": { "message": "Nastavte svůj PIN kÃŗd pro odemknutí trezoru. Pokud se zcela odhlÃĄsíte z aplikace bude VÃĄÅĄ aktuÃĄlní PIN resetovÃĄn." }, + "setYourPinCode1": { + "message": "VÃĄÅĄ PIN bude pouÅžit k odemknutí Bitwardenu namísto hlavního hesla. Pokud se někdy plně odhlÃĄsíte z Bitwarden, VÃĄÅĄ PIN kÃŗd se obnoví." + }, "pinRequired": { "message": "Je vyÅžadovÃĄn PIN kÃŗd." }, "invalidPin": { "message": "NeplatnÃŊ PIN kÃŗd." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "PříliÅĄ mnoho neplatnÃŊch pokusů o zadÃĄní PINu. OdhlÃĄÅĄeno." + }, "unlockWithBiometrics": { "message": "Odemknout pomocí biometrie" }, + "unlockWithMasterPassword": { + "message": "Odemknout pomocí hlavního hesla" + }, "awaitDesktop": { "message": "ČekÃĄ se na potvrzení z aplikace v počítači" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Zamknout trezor při restartu prohlíŞeče pomocí hlavního hesla" }, + "lockWithMasterPassOnRestart1": { + "message": "VyÅžadovat hlavní heslo při restartu prohlíŞeče" + }, "selectOneCollection": { "message": "Musíte vybrat alespoň jednu kolekci." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Jedna nebo více zÃĄsad organizace ovlivňují nastavení generÃĄtoru." }, + "passwordGenerator": { + "message": "GenerÃĄtor hesla" + }, + "usernameGenerator": { + "message": "GenerÃĄtor uÅživatelskÊho jmÊna" + }, + "useThisPassword": { + "message": "PouŞít toto heslo" + }, + "useThisUsername": { + "message": "PouŞít toto uÅživatelskÊ jmÊno" + }, + "securePasswordGenerated": { + "message": "BezpečnÊ heslo bylo vygenerovÃĄno! Nezapomeňte takÊ aktualizovat heslo na webu." + }, + "useGeneratorHelpTextPartOne": { + "message": "PouÅžijte generÃĄtor", + "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": "pro vytvoření silnÊho jedinečnÊho hesla", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Akce při vyprÅĄení časovÊho limitu" }, + "vaultTimeoutAction1": { + "message": "Akce vyprÅĄení časovÊho limitu" + }, "lock": { "message": "Zamknout", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "KoÅĄ", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "PoloÅžka byla obnovena" }, + "alreadyHaveAccount": { + "message": "UÅž mÃĄte Ãēčet?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Po vyprÅĄení časovÊho limitu dojde k odhlÃĄÅĄení. Přístup k trezoru bude odebrÃĄn a pro opětovnÊ přihlÃĄÅĄení bude vyÅžadovÃĄno online ověření. Opravdu chcete pouŞít toto nastavení?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Automaticky vyplnit a uloÅžit" }, + "fillAndSave": { + "message": "Vyplnit a uloÅžit" + }, "autoFillSuccessAndSavedUri": { "message": "PoloÅžka byla automaticky vyplněna a URI bylo uloÅženo" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "VaÅĄe novÊ hlavní heslo nesplňuje poÅžadavky zÃĄsad organizace." }, + "receiveMarketingEmailsV2": { + "message": "DostÃĄvejte do svÊ e-mailovÊ schrÃĄnky rady, oznÃĄmení a příleÅžitosti k vÃŊzkumu od společnosti Bitwarden." + }, + "unsubscribe": { + "message": "OdhlÃĄsit odběr" + }, + "atAnyTime": { + "message": "kdykoli." + }, + "byContinuingYouAgreeToThe": { + "message": "PokračovÃĄním souhlasíte s" + }, + "and": { + "message": "a" + }, "acceptPolicies": { "message": "ZaÅĄkrtnutím tohoto políčka souhlasíte s nÃĄsledujícím:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "OK" }, + "errorRefreshingAccessToken": { + "message": "Chyba aktualizace přístupovÊho tokenu" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Nebyly nalezeny ÅžÃĄdnÊ obnovovací tokeny nebo API klíče. Zkuste se odhlÃĄsit a znovu se přihlÃĄsit." + }, "desktopSyncVerificationTitle": { "message": "Ověření synchronizace s aplikací pro počítač" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Neshoda Ãēčtů" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Neshoda biometrickÊho klíče" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "BiometrickÊ odemknutí se nezdařilo. Zkuste znovu nastavit biometrickÊ prvky." + }, "biometricsNotEnabledTitle": { "message": "Biometrie není nastavena" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Biometrie v prohlíŞeči není na tomto zařízení podporovÃĄna." }, + "biometricsNotUnlockedTitle": { + "message": "UÅživatel uzamčen nebo odhlÃĄÅĄen" + }, + "biometricsNotUnlockedDesc": { + "message": "Odemkněte tohoto uÅživatele v programu pro počítač a zkuste to znovu." + }, + "biometricsNotAvailableTitle": { + "message": "BiometrickÊ odemknutí není k dispozici" + }, + "biometricsNotAvailableDesc": { + "message": "BiometrickÊ odemknutí je momentÃĄlně nedostupnÊ. Opakujte akci později." + }, "biometricsFailedTitle": { "message": "Biometrika selhala" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ZÃĄsady organizace ovlivňují moÅžnosti vlastnictví." }, + "personalOwnershipPolicyInEffectImports": { + "message": "ZÃĄsady organizace zablokovaly importovÃĄní poloÅžek do VaÅĄeho osobního trezoru." + }, + "domainsTitle": { + "message": "DomÊny", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "VyloučenÊ domÊny" }, "excludedDomainsDesc": { "message": "Bitwarden nebude ÅžÃĄdat o uloÅžení přihlaÅĄovacích Ãēdajů pro tyto domÊny. Aby se změny projevily, musíte strÃĄnku obnovit." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden nebude ÅžÃĄdat o uloÅžení přihlaÅĄovacích Ãēdajů pro tyto domÊny pro vÅĄechny přihlÃĄÅĄenÊ Ãēčty. Aby se změny projevily, musíte strÃĄnku obnovit." + }, + "websiteItemLabel": { + "message": "WebovÃĄ strÃĄnka $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ není platnÃĄ domÊna", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "VyloučenÊ změny domÊny byly uloÅženy" + }, + "limitSendViews": { + "message": "Omezit zobrazení" + }, + "limitSendViewsHint": { + "message": "Po dosaÅžení limitu nebude nikdo moci zobrazit tento Send.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "ZbÃŊvÃĄ $ACCESSCOUNT$ zobrazení", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Podrobnosti Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Prohledat Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text ke sdílení" + }, "sendTypeFile": { "message": "Soubor" }, @@ -1666,6 +2406,9 @@ "message": "VÅĄechny Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Ve vÃŊchozím nastavení skrÃŊt text" + }, "maxAccessCountReached": { "message": "DosaÅžen maximÃĄlní počet přístupů", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "ChrÃĄněno heslem" }, + "copyLink": { + "message": "Kopírovat odkaz" + }, "copySendLink": { "message": "Zkopírovat odkaz Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Opravdu chcete smazat tento Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Opravdu chcete tento Send trvale smazat?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Upravit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Tento Send bude trvale smazÃĄn v určenÃŊ datum a čas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Tento Send bude trvale smazÃĄn v určenÊ datum.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Datum vyprÅĄení platnosti" }, @@ -1769,6 +2523,10 @@ "message": "Volitelně vyÅžadovat heslo pro přístup k tomuto Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "PřidÃĄ volitelnÊ heslo pro příjemce pro přístup k tomuto Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "SoukromÊ poznÃĄmky o tomto Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send vytvořen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send byl ÃēspÄ›ÅĄně vytvořen!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send bude k dispozici na pÅ™Ã­ÅĄtí 1 hodinu kaÅždÊmu, kdo mÃĄ odkaz.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Send bude k dispozici na pÅ™Ã­ÅĄtích $HOURS$ hodin kaÅždÊmu, kdo mÃĄ odkaz.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send bude k dispozici na pÅ™Ã­ÅĄtí 1 den kaÅždÊmu, kdo mÃĄ odkaz.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Send bude k dispozici na pÅ™Ã­ÅĄtích $DAYS$ dnů kaÅždÊmu, kdo mÃĄ odkaz.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Odkaz Send byl zkopírovÃĄn", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send upraven", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Zobrazit rozÅĄÃ­Å™ení v novÊm okně?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Chcete-li vytvořit Send souboru, musí se zobrazit rozÅĄÃ­Å™ení v novÊm okně.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Chcete-li vybrat soubor, otevřete rozÅĄÃ­Å™ení v postranním panelu (pokud je to moÅžnÊ) nebo jej otevřete v novÊm okně klepnutím na tento banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Chcete-li vybrat soubor pomocí prohlíŞeče Safari, otevřete novÊ okno klepnutím na tento banner." }, + "popOut": { + "message": "NovÊ okno" + }, "sendFileCalloutHeader": { "message": "NeÅž začnete" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "SkrÃŊt mou e-mailovou adresu před příjemci." }, + "hideYourEmail": { + "message": "Skryje VaÅĄi e-mailovou adresu před zobrazením." + }, "sendOptionsPolicyInEffect": { "message": "Jedna nebo více zÃĄsad organizace ovlivňuje nastavení Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Je vyÅžadovÃĄno ověření e-mailu" }, + "emailVerifiedV2": { + "message": "E-mail byl ověřen" + }, "emailVerificationRequiredDesc": { "message": "Abyste mohli tuto funkci pouŞívat, musíte ověřit svůj e-mail. Svůj e-mail můŞete ověřit ve webovÊm trezoru." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "VaÅĄe hlavní heslo nesplňuje jednu nebo více zÃĄsad VaÅĄÃ­ organizace. Pro přístup k trezoru musíte nyní aktualizovat svÊ hlavní heslo. PokračovÃĄní VÃĄs odhlÃĄsí z VaÅĄÃ­ aktuÃĄlní relace a bude nutnÊ se přihlÃĄsit. Aktivní relace na jinÃŊch zařízeních mohou zůstat aktivní aÅž po dobu jednÊ hodiny." }, + "tdeDisabledMasterPasswordRequired": { + "message": "VaÅĄe organizace zakÃĄzala ÅĄifrovÃĄní pomocí důvěryhodnÊho zařízení. Nastavte hlavní heslo pro přístup k trezoru." + }, "resetPasswordPolicyAutoEnroll": { "message": "AutomatickÃĄ registrace" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Vyberte sloÅžku..." }, - "ssoCompleteRegistration": { - "message": "Chcete-li dokončit přihlÃĄÅĄení pomocí SSO, nastavte hlavní přístupovÊ heslo k VaÅĄemu trezoru." + "noFoldersFound": { + "message": "Nebyly nalezeny ÅžÃĄdnÊ sloÅžky", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "OprÃĄvnění VaÅĄÃ­ organizace byla aktualizovÃĄna. To vyÅžaduje nastavení hlavního hesla.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "VaÅĄe organizace vyÅžaduje nastavení hlavního hesla.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "z $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Je vyÅžadovÃĄno ověření", + "description": "Default title for the user verification dialog." }, "hours": { "message": "hodin" @@ -1904,6 +2740,9 @@ "minutes": { "message": "minut" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Na volby časovÊho limitu byly uplatněny poÅžadavky podnikovÃŊch zÃĄsad" + }, "vaultTimeoutPolicyInEffect": { "message": "Pravidla VaÅĄÃ­ organizace ovlivňují časovÃŊ limit trezoru. MaximÃĄlní povolenÃŊ časovÃŊ limit trezoru je $HOURS$ hodin a $MINUTES$ minut.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "MaximÃĄlně $HOURS$ hodin a $MINUTES$ minut.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "ČasovÃŊ limit překračuje omezení stanovenÊ VaÅĄÃ­ organizací: maximÃĄlně $HOURS$ hodin a $MINUTES$ minut", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Pravidla VaÅĄÃ­ organizace mají vliv na časovÃŊ limit trezoru. MaximÃĄlní povolenÃŊ časovÃŊ limit trezoru je $HOURS$ hodin a $MINUTES$ minut. Akce po časovÊm limitu trezoru je nastavena na $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "ExportovÃĄní trezoru organizace" + }, + "exportingOrganizationVaultDesc": { + "message": "ExportovÃĄn bude jen trezor organizace přidruÅženÃŊ k poloÅžce $ORGANIZATION$. Osobní poloÅžky trezoru a poloÅžky z jinÃŊch organizací nebudou zahrnuty.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Chyba" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Vygenerovat uÅživatelskÊ jmÊno" }, + "generateEmail": { + "message": "Vygenerovat e-mail" + }, + "generatorBoundariesHint": { + "message": "Hodnota musí bÃŊt mezi $MIN$ a $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Typ uÅživatelskÊho jmÊna" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Vygenerovat e-mailovÃŊ alias pomocí externí sluÅžby pro přesměrovÃĄní." }, + "forwarderDomainName": { + "message": "E-mailovÃĄ domÊna", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Vyberte domÊnu, kterÃĄ je podporovÃĄna vybranou sluÅžbou", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Chyba $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "VygenerovÃĄno Bitwardenem.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "WebovÃĄ strÃĄnka: $WEBSITE$. VygenerovÃĄno Bitwardenem.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "NeplatnÃŊ token API $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "NeplatnÃŊ token API $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nelze získat maskovanÊ ID e-mailovÊho Ãēčtu $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "NeplatnÃĄ domÊna $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "NeplatnÊ URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "DoÅĄlo k neznÃĄmÊ chybě $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "NeznÃĄmÃŊ přeposílatel: $SERVICENAME$.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "NÃĄzev hostitele", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Jak na automatickÊ vyplňovÃĄní" }, "autofillSelectInfoWithCommand": { - "message": "Vyberte poloÅžku z tÊto strÃĄnky nebo pouÅžijte zkratku: $COMMAND$", + "message": "Vyberte poloÅžku z tÊto obrazovky, pouÅžijte zkratku $COMMAND$ nebo prozkoumejte dalÅĄÃ­ volby v nastavení.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Vyberte poloÅžku z tÊto strÃĄnky nebo nastavte zkratku v nastavení." + "message": "Vyberte poloÅžku z tÊto obrazovky nebo prozkoumejte dalÅĄÃ­ volby v nastavení." }, "gotIt": { "message": "Rozumím" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Nastavení automatickÊho vyplňovÃĄní" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "ZkrÃĄtka automatickÊho vyplňovÃĄní" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Změnit zkratku" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Spravovat zÃĄstupce" + }, "autofillShortcut": { - "message": "KlÃĄvesovÃĄ kombinace pro automatickÊ vyplňovÃĄní" + "message": "KlÃĄvesovÃĄ zkratka pro automatickÊ vyplňovÃĄní" }, - "autofillShortcutNotSet": { - "message": "KlÃĄvesovÃĄ kombinace pro automatickÊ vyplňovÃĄní není nastavena. Změňte ji v nastavení prohlíŞeče." + "autofillLoginShortcutNotSet": { + "message": "KlÃĄvesovÃĄ zkratka pro automatickÊ vyplnění přihlÃĄÅĄení není nastavena. Změňte ji v nastavení prohlíŞeče." }, - "autofillShortcutText": { - "message": "KlÃĄvesovÃĄ kombinace pro automatickÊ vyplňovÃĄní je: $COMMAND$. Změňte ji v nastavení prohlíŞeče.", + "autofillLoginShortcutText": { + "message": "KlÃĄvesovÃĄ zkratka pro automatickÊ vyplnění přihlÃĄÅĄení je $COMMAND$. Spravujte vÅĄechny zkratky v nastavení prohlíŞeče.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "VÃŊchozí klÃĄvesovÃĄ kombinace pro automatickÊ vyplňovÃĄní: $COMMAND$.", + "message": "VÃŊchozí klÃĄvesovÃĄ zkratka pro automatickÊ vyplňovÃĄní: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "PřihlaÅĄovÃĄní na" - }, "opensInANewWindow": { "message": "Otevře se v novÊm okně" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Je vyÅžadovÃĄn SSO identifikÃĄtor organizace." }, + "creatingAccountOn": { + "message": "VytvÃĄÅ™ení Ãēčtu na" + }, + "checkYourEmail": { + "message": "Zkontrolujte VÃĄÅĄ e-mail" + }, + "followTheLinkInTheEmailSentTo": { + "message": "NÃĄsledujte pokyny v e-mailu poslanÊm na" + }, + "andContinueCreatingYourAccount": { + "message": "a pokračujte ve vytvÃĄÅ™ení VaÅĄeho Ãēčtu." + }, + "noEmail": { + "message": "ÅŊÃĄdnÃŊ e-mail?" + }, + "goBack": { + "message": "Zpět" + }, + "toEditYourEmailAddress": { + "message": "pro Ãēpravu VaÅĄÃ­ e-mailovÊ adresy." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Přístup byl odepřen. NemÃĄte oprÃĄvnění k zobrazení tÊto strÃĄnky." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Zařízení zařazeno mezi důvěryhodnÊ" }, + "sendsNoItemsTitle": { + "message": "ÅŊÃĄdnÃĄ aktivní Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "PouÅžijte Send pro bezpečnÊ sdílení ÅĄifrovanÃŊch informací s kÃŊmkoliv.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Je vyÅžadovÃĄn vstup." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 pole vyÅžaduje VaÅĄi pozornost." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ polí vyÅžaduje VaÅĄi pozornost.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Vybrat --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Přepnout sbalení", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Importovat data do Bitwardenu?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "ChrÃĄnit VaÅĄe data LastPass a importovat do Bitwardenu?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "UloÅžit jako neÅĄifrovanÃŊ soubor", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importovat do Bitwardenu", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ImportovÃĄní...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data byla ÃēspÄ›ÅĄně importovÃĄna!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Chyba při importu. Podrobnosti naleznete v konzoli.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Při importu doÅĄlo k chybě sítě.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "DomÊna aliasu" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "PoloÅžky se ÅžÃĄdostí o změnu hlavního hesla nemohou bÃŊt automaticky vyplněny při načítÃĄní strÃĄnky. AutomatickÊ vyplnění při načítÃĄní strÃĄnky je vypnuto.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "AutomatickÊ vyplnění při načítÃĄní strÃĄnky bylo nastaveno na vÃŊchozí nastavení.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Pro Ãēpravu tohoto pole vypněte poÅžadavek na hlavní heslo", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Přepnout boční navigaci" + }, + "skipToContent": { + "message": "Přeskočit na obsah" + }, + "bitwardenOverlayButton": { + "message": "Tlačítko nabídky automatickÊho vyplňovÃĄní Bitwardenu", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Přepnout nabídku automatickÊho vyplňovÃĄní Bitwardenu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Nabídka automatickÊho vyplňovÃĄní Bitwardenu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Odemkněte VÃĄÅĄ Ãēčet pro zobrazení odpovídajících přihlaÅĄovacích Ãēdajů", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Odemkněte VÃĄÅĄ Ãēčet pro zobrazení nÃĄvrhů automatickÊho vyplňovÃĄní", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Odemknout Ãēčet", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Odemknout Ãēčet, otevře se v novÊm okně", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Vyplnit přihlaÅĄovací Ãēdaje pro", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "ÄŒÃĄstečnÊ uÅživatelskÊ jmÊno", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "ÅŊÃĄdnÊ poloÅžky k zobrazení", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "NovÃĄ poloÅžka", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Přidat novou poloÅžku trezoru", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "NovÊ přihlÃĄÅĄení", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Přidat do trezoru novou poloÅžku pro přihlÃĄÅĄení, otevře se v novÊm okně", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "NovÃĄ karta", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Přidat do trezoru novou poloÅžku karty, otevře se v novÊm okně", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "NovÃĄ identita", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Přidat do trezoru novou identitu, otevře se v novÊm okně", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Nabídka automatickÊho vyplňovÃĄní Bitwardenu. Pro vÃŊběr stiskněte ÅĄipku dolů.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Zapnout" + }, + "ignore": { + "message": "Ignorovat" + }, + "importData": { + "message": "Importovat data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Chyba importu" + }, + "importErrorDesc": { + "message": "Vyskytl se problÊm s daty, kterÊ jste se pokusili importovat. VyřeÅĄte níŞe uvedenÊ chyby ve zdrojovÊm souboru a zkuste to znovu." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "VyřeÅĄte chyby níŞe a zkuste to znovu." + }, + "description": { + "message": "Popis" + }, + "importSuccess": { + "message": "Data byla ÃēspÄ›ÅĄně importovÃĄna" + }, + "importSuccessNumberOfItems": { + "message": "Bylo importovÃĄno celkem $AMOUNT$ poloÅžek.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Zkusit znovu" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Pro tuto akci je vyÅžadovÃĄno ověření. Nastavte PIN kÃŗd pro pokračovÃĄní." + }, + "setPin": { + "message": "Nastavit PIN" + }, + "verifyWithBiometrics": { + "message": "Ověřit pomocí biometrie" + }, + "awaitingConfirmation": { + "message": "ČekÃĄ na potvrzení" + }, + "couldNotCompleteBiometrics": { + "message": "Nelze dokončit biometrii." + }, + "needADifferentMethod": { + "message": "Potřebujete jinou metodu?" + }, + "useMasterPassword": { + "message": "PouŞít hlavní heslo" + }, + "usePin": { + "message": "PouŞít PIN" + }, + "useBiometrics": { + "message": "PouŞít biometrii" + }, + "enterVerificationCodeSentToEmail": { + "message": "Zadejte ověřovací kÃŗd, kterÃŊ byl odeslÃĄn do VaÅĄeho e-mailu." + }, + "resendCode": { + "message": "Znovu odeslat kÃŗd" + }, + "total": { + "message": "Celkem" + }, + "importWarning": { + "message": "Importujete data do organizace $ORGANIZATION$. VaÅĄe data mohou bÃŊt sdílena s členy tÊto organizace. Chcete pokračovat?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Chyba při připojovÃĄní ke sluÅžbě Duo. PouÅžijte jinou dvoufÃĄzovou metodu přihlÃĄÅĄení nebo kontaktujte Duo o pomoc." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "SpusÅĨte DUO a pro dokončení přihlÃĄÅĄení postupujte podle kroků." + }, + "duoRequiredForAccount": { + "message": "Pro VÃĄÅĄ Ãēčet je vyÅžadovÃĄno dvoufÃĄzovÊ přihlÃĄÅĄení DUO." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Pro dokončení přihlÃĄÅĄení pouÅžijte vyskakovací okno rozÅĄÃ­Å™ení." + }, + "popoutExtension": { + "message": "Zobrazit okno s doplňkem" + }, + "launchDuo": { + "message": "Spustit DUO" + }, + "importFormatError": { + "message": "Data nemají sprÃĄvnÃŊ formÃĄt. Zkontrolujte importovanÃŊ soubor a zkuste to znovu." + }, + "importNothingError": { + "message": "Nebylo nic importovÃĄno." + }, + "importEncKeyError": { + "message": "Chyba při deÅĄifrovÃĄní exportovanÊho souboru. VÃĄÅĄ ÅĄifrovací klíč se neshoduje s klíčem pouÅžitÃŊm během exportu dat." + }, + "invalidFilePassword": { + "message": "NeplatnÊ heslo souboru, pouÅžijte heslo zadanÊ při vytvoření souboru exportu." + }, + "destination": { + "message": "Cíl" + }, + "learnAboutImportOptions": { + "message": "Více o volbÃĄch importu" + }, + "selectImportFolder": { + "message": "Zvolte sloÅžku" + }, + "selectImportCollection": { + "message": "Zvolte kolekci" + }, + "importTargetHint": { + "message": "Pokud chcete obsah importovanÊho souboru přesunout do sloÅžky $DESTINATION$, vyberte tuto volbu", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Soubor obsahuje nepřiřazenÊ poloÅžky." + }, + "selectFormat": { + "message": "Vyberte formÃĄt importovanÊho souboru" + }, + "selectImportFile": { + "message": "Vyberte soubor pro import" + }, + "chooseFile": { + "message": "Vybrat soubor" + }, + "noFileChosen": { + "message": "Není vybrÃĄn ÅžÃĄdnÃŊ soubor" + }, + "orCopyPasteFileContents": { + "message": "nebo zkopírujte a vloÅžte obsah souboru" + }, + "instructionsFor": { + "message": "Instrukce pro $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Potvrdit import trezoru" + }, + "confirmVaultImportDesc": { + "message": "Tento soubor je chrÃĄněn heslem. Zadejte heslo souboru pro import dat." + }, + "confirmFilePassword": { + "message": "Potvrzení hesla souboru" + }, + "exportSuccess": { + "message": "Data trezoru byla exportovÃĄna" + }, + "typePasskey": { + "message": "PřístupovÃŊ klíč" + }, + "accessing": { + "message": "PřistupovÃĄní" + }, + "passkeyNotCopied": { + "message": "PřístupovÃŊ klíč nebude zkopírovÃĄn" + }, + "passkeyNotCopiedAlert": { + "message": "PřístupovÃŊ klíč nebude zkopírovÃĄn do duplikovanÊ poloÅžky. Chete pokračovat v duplikovÃĄní tÊto poloÅžky?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Ověření vyÅžadovanÊ iniciÃĄtorem webu. Tato funkce jeÅĄtě není implementovÃĄna pro Ãēčty bez hlavního hesla." + }, + "logInWithPasskeyQuestion": { + "message": "PřihlÃĄsit se pomocí přístupovÊho klíče?" + }, + "passkeyAlreadyExists": { + "message": "PřístupovÃŊ klíč pro tuto aplikaci jiÅž existuje." + }, + "noPasskeysFoundForThisApplication": { + "message": "Pro tuto aplikaci nebyly nalezeny ÅžÃĄdnÊ přístupovÊ klíče." + }, + "noMatchingPasskeyLogin": { + "message": "Pro tuto strÃĄnku nemÃĄte ÅžÃĄdnÊ přihlaÅĄovací Ãēdaje." + }, + "noMatchingLoginsForSite": { + "message": "ÅŊÃĄdnÊ odpovídající přihlaÅĄovací Ãēdaje pro tento web" + }, + "searchSavePasskeyNewLogin": { + "message": "Vyhledat nebo uloÅžit přístupovÃŊ klíč jako novÊ přihlÃĄÅĄení" + }, + "confirm": { + "message": "Potvrdit" + }, + "savePasskey": { + "message": "UloÅžit přístupovÃŊ klíč" + }, + "savePasskeyNewLogin": { + "message": "UloÅžit přístupovÃŊ klíč jako novÊ přihlÃĄÅĄení" + }, + "chooseCipherForPasskeySave": { + "message": "Vyberte přihlÃĄÅĄení pro uloÅžení tohoto přístupovÊho klíče" + }, + "chooseCipherForPasskeyAuth": { + "message": "Vyberte přístupovÃŊ klíč, kterÃŊm se chcete přihlÃĄsit" + }, + "passkeyItem": { + "message": "PoloÅžka přístupovÊho klíče" + }, + "overwritePasskey": { + "message": "Přepsat přístupovÃŊ klíč?" + }, + "overwritePasskeyAlert": { + "message": "Tato poloÅžka jiÅž obsahuje přístupovÃŊ klíč. Jste si jisti, Åže chcete přepsat aktuÃĄlní přístupovÃŊ klíč?" + }, + "featureNotSupported": { + "message": "Funkce nyní není podporovÃĄna" + }, + "yourPasskeyIsLocked": { + "message": "Pro pouÅžití přístupovÊho klíče je vyÅžadovÃĄno ověření. Chcete-li pokračovat, ověřte svou identitu." + }, + "multifactorAuthenticationCancelled": { + "message": "VícefÃĄzovÊ ověření zruÅĄeno" + }, + "noLastPassDataFound": { + "message": "Nebyla nalezena ÅžÃĄdnÃĄ data LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "NesprÃĄvnÊ uÅživatelskÊ jmÊno nebo heslo" + }, + "incorrectPassword": { + "message": "NesprÃĄvnÊ heslo" + }, + "incorrectCode": { + "message": "NesprÃĄvnÃŊ kÃŗd" + }, + "incorrectPin": { + "message": "NesprÃĄvnÃŊ PIN" + }, + "multifactorAuthenticationFailed": { + "message": "VícefaktorovÊ ověření se nezdařilo" + }, + "includeSharedFolders": { + "message": "Zahrnout sdílenÊ sloÅžky" + }, + "lastPassEmail": { + "message": "E-mail LastPass" + }, + "importingYourAccount": { + "message": "ImportovÃĄní VaÅĄeho Ãēčtu..." + }, + "lastPassMFARequired": { + "message": "Je vyÅžadovÃĄno vícefaktorovÊ ověření LastPass" + }, + "lastPassMFADesc": { + "message": "Zadejte jednorÃĄzovÃŊ kÃŗd z VaÅĄÃ­ ověřovací aplikace" + }, + "lastPassOOBDesc": { + "message": "Schvalte ÅžÃĄdost o přihlÃĄÅĄení ve VaÅĄÃ­ ověřovací aplikaci nebo zadejte jednorÃĄzovÊ heslo." + }, + "passcode": { + "message": "Heslo" + }, + "lastPassMasterPassword": { + "message": "Hlavní heslo LastPass" + }, + "lastPassAuthRequired": { + "message": "Je vyÅžadovÃĄno ověření LastPass" + }, + "awaitingSSO": { + "message": "ČekÃĄ se na ověření SSO" + }, + "awaitingSSODesc": { + "message": "Pokračujte v přihlÃĄÅĄení pomocí přihlaÅĄovacích Ãēdajů VaÅĄÃ­ společnosti." + }, + "seeDetailedInstructions": { + "message": "Podívejte se na podrobnÊ pokyny na naÅĄem webu s nÃĄpovědou na", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importovat přímo z LastPass" + }, + "importFromCSV": { + "message": "Importovat z CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Zkuste to znovu nebo vyhledejte e-mail od LastPass pro ověření, Åže jste to Vy." + }, + "collection": { + "message": "Kolekce" + }, + "lastPassYubikeyDesc": { + "message": "VloÅžte YubiKey spojenÃŊ s VaÅĄÃ­m Ãēčtem LastPass do USB portu VaÅĄeho počítače a stiskněte jeho tlačítko." + }, + "switchAccount": { + "message": "Přepnout Ãēčet" + }, + "switchAccounts": { + "message": "Přepnout Ãēčty" + }, + "switchToAccount": { + "message": "Přepnout na Ãēčet" + }, + "activeAccount": { + "message": "Aktivní Ãēčet" + }, + "availableAccounts": { + "message": "DostupnÊ Ãēčty" + }, + "accountLimitReached": { + "message": "Byl dosaÅžen limit Ãēčtu. Pro přidÃĄní dalÅĄÃ­ho Ãēčtu se odhlaste." + }, + "active": { + "message": "aktivní" + }, + "locked": { + "message": "uzamčeno" + }, + "unlocked": { + "message": "odemčeno" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hostovÃĄno na" + }, + "useDeviceOrHardwareKey": { + "message": "PouÅžijte VaÅĄe zařízení nebo hardwarovÃŊ klíč" + }, + "justOnce": { + "message": "Jen jednou" + }, + "alwaysForThisSite": { + "message": "VÅždy pro tuto strÃĄnku" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ přidÃĄn do vyloučenÃŊch domÊn.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "SpolečnÊ formÃĄty", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Pokračovat do nastavení prohlíŞeče?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Pokračovat do Centra nÃĄpovědy?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Změňte nastavení automatickÊho vyplňovÃĄní a sprÃĄvy hesel.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "MůŞete zobrazit a nastavit zkratky rozÅĄÃ­Å™ení v nastavení prohlíŞeče.", + "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": "Změňte nastavení automatickÊho vyplňovÃĄní a sprÃĄvy hesel.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "MůŞete zobrazit a nastavit zkratky rozÅĄÃ­Å™ení v nastavení prohlíŞeče.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Nastavit Bitwarden jako vÃŊchozí sprÃĄvce hesel?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "IgnorovÃĄní tÊto volby můŞe způsobit konflikty mezi nabídkou automatickÊho vyplňovÃĄní Bitwardenu a VaÅĄÃ­m prohlíŞečem.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Nastavit Bitwarden jako vÃŊchozí sprÃĄvce hesel", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Bitwarden nelze nastavit jako vÃŊchozí sprÃĄvce hesel", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Pro nastavení jako vÃŊchozí sprÃĄvce hesel musíte Bitwardenu udělit oprÃĄvnění zabezpečení v prohlíŞeči.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Nastavit jako vÃŊchozí", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Pověření byla ÃēspÄ›ÅĄně uloÅžena!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Heslo uloÅženo!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Pověření byla ÃēspÄ›ÅĄně aktualizovÃĄna!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Heslo aktualizovÃĄno!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Chyba při uklÃĄdÃĄní přihlaÅĄovacích Ãēdajů. Podrobnosti naleznete v konzoli.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Úspěch" + }, + "removePasskey": { + "message": "Odebrat přístupovÃŊ klíč" + }, + "passkeyRemoved": { + "message": "PřístupovÃŊ klíč byl odebrÃĄn" + }, + "autofillSuggestions": { + "message": "NÃĄvrhy automatickÊho vyplňovÃĄní" + }, + "autofillSuggestionsTip": { + "message": "UloÅžit přihlaÅĄovací Ãēdaje pro tuto strÃĄnku do automatickÊho vyplňovÃĄní" + }, + "yourVaultIsEmpty": { + "message": "VÃĄÅĄ trezor je prÃĄzdnÃŊ" + }, + "noItemsMatchSearch": { + "message": "HledÃĄní neodpovídají ÅžÃĄdnÊ poloÅžky" + }, + "clearFiltersOrTryAnother": { + "message": "VymaÅžte filtry nebo zkuste jinÃŊ hledanÃŊ vÃŊraz" + }, + "copyInfoTitle": { + "message": "Kopírovat informace - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Kopírovat poznÃĄmku - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Více voleb, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Více voleb - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Zobrazit poloÅžku - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "AutomatickÊ vyplnění - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "ÅŊÃĄdnÊ hodnoty ke zkopírovÃĄní" + }, + "assignToCollections": { + "message": "Přiřadit ke kolekcím" + }, + "copyEmail": { + "message": "Kopírovat e-mail" + }, + "copyPhone": { + "message": "Kopírovat telefon" + }, + "copyAddress": { + "message": "Kopírovat adresu" + }, + "adminConsole": { + "message": "Konzole sprÃĄvce" + }, + "accountSecurity": { + "message": "Zabezpečení Ãēčtu" + }, + "notifications": { + "message": "OznÃĄmení" + }, + "appearance": { + "message": "Vzhled" + }, + "errorAssigningTargetCollection": { + "message": "Chyba při přiřazovÃĄní cílovÊ kolekce." + }, + "errorAssigningTargetFolder": { + "message": "Chyba při přiřazovÃĄní cílovÊ sloÅžky." + }, + "viewItemsIn": { + "message": "Zobrazit poloÅžky v $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Zpět do $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "NovÊ" + }, + "removeItem": { + "message": "Odebrat $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "PoloÅžky bez sloÅžky" + }, + "itemDetails": { + "message": "Detaily poloÅžky" + }, + "itemName": { + "message": "NÃĄzev poloÅžky" + }, + "cannotRemoveViewOnlyCollections": { + "message": "NemůŞete odebrat kolekce s oprÃĄvněními jen pro zobrazení: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organizace je deaktivovÃĄna" + }, + "owner": { + "message": "Vlastník" + }, + "selfOwnershipLabel": { + "message": "Vy", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "K poloÅžkÃĄm v deaktivovanÊ organizaci nemÃĄte přístup. PoÅžÃĄdejte o pomoc vlastníka organizace." + }, + "additionalInformation": { + "message": "DalÅĄÃ­ informace" + }, + "itemHistory": { + "message": "Historie poloÅžky" + }, + "lastEdited": { + "message": "Naposledy upraveno" + }, + "ownerYou": { + "message": "Vlastník: Vy" + }, + "linked": { + "message": "Propojeno" + }, + "copySuccessful": { + "message": "KopírovÃĄní bylo ÃēspÄ›ÅĄnÊ" + }, + "upload": { + "message": "NahrÃĄt" + }, + "addAttachment": { + "message": "Přidat přílohu" + }, + "maxFileSizeSansPunctuation": { + "message": "MaximÃĄlní velikost souboru je 500 MB" + }, + "deleteAttachmentName": { + "message": "Smazat přílohu $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "StÃĄhnout $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Opravdu chcete tuto přílohu navÅždy smazat?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "VolnÊ organizace nemohou pouŞívat přílohy" + }, + "filters": { + "message": "Filtry" + }, + "personalDetails": { + "message": "Osobní Ãēdaje" + }, + "identification": { + "message": "Identifikace" + }, + "contactInfo": { + "message": "Kontaktní informace" + }, + "downloadAttachment": { + "message": "StahovÃĄní - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "číslo karty končí", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "PřihlaÅĄovací Ãēdaje" + }, + "authenticatorKey": { + "message": "Ověřovací klíč" + }, + "autofillOptions": { + "message": "Volby automatickÊho vyplňovÃĄní" + }, + "websiteUri": { + "message": "WebovÃĄ strÃĄnka (URI)" + }, + "websiteUriCount": { + "message": "WebovÃĄ strÃĄnka (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "WebovÃĄ strÃĄnka přidÃĄna" + }, + "addWebsite": { + "message": "Přidat webovou strÃĄnku" + }, + "deleteWebsite": { + "message": "Vymazat webovou strÃĄnku" + }, + "defaultLabel": { + "message": "VÃŊchozí ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Zobrazit detekci shody $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "SkrÃŊt detekci shody $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Automaticky vyplnit při načtení strÃĄnky?" + }, + "cardExpiredTitle": { + "message": "ProÅĄlÃĄ karta" + }, + "cardExpiredMessage": { + "message": "Pokud jste ji obnovili, aktualizujte informace o kartě" + }, + "cardDetails": { + "message": "Podrobnosti karty" + }, + "cardBrandDetails": { + "message": "Podrobnosti o $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Povolit animace" + }, + "showAnimations": { + "message": "Zobrazit animaci" + }, + "addAccount": { + "message": "Přidat Ãēčet" + }, + "loading": { + "message": "NačítÃĄní" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "PřístupovÊ klíče", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Hesla", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "PřihlÃĄsit se pomocí přístupovÊho klíče", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Přiřadit" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Jen členovÊ organizace s přístupem k těmto kolekcím budou moci vidět poloÅžku." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Jen členovÊ organizace s přístupem k těmto kolekcím budou moci vidět poloÅžky." + }, + "bulkCollectionAssignmentWarning": { + "message": "Vybrali jste $TOTAL_COUNT$ poloÅžek. NemůŞete aktualizovat $READONLY_COUNT$ poloÅžek, protoÅže nemÃĄte oprÃĄvnění k ÃēpravÃĄm.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Přidat pole" + }, + "add": { + "message": "Přidat" + }, + "fieldType": { + "message": "Typ pole" + }, + "fieldLabel": { + "message": "Popis pole" + }, + "textHelpText": { + "message": "PouÅžijte textovÃĄ pole pro data jako bezpečnostní otÃĄzky" + }, + "hiddenHelpText": { + "message": "PouÅžijte skrytÃĄ pole pro citlivÃĄ data, jako je heslo" + }, + "checkBoxHelpText": { + "message": "PouÅžijte zaÅĄkrtÃĄvací políčka, pokud chcete automaticky vyplnit zaÅĄkrtÃĄvací políčko formulÃĄÅ™e (např. pro zapamatovÃĄní e-mailu)" + }, + "linkedHelpText": { + "message": "PouÅžijte propojenÊ pole, pokud mÃĄte problÊmy s automatickÃŊm vyplňovÃĄním na konkrÊtní webovÊ strÃĄnce." + }, + "linkedLabelHelpText": { + "message": "Zadejte ID pole z HTML, nÃĄzev, popisek nebo zÃĄstupnÃŊ znak pole." + }, + "editField": { + "message": "Upravit pole" + }, + "editFieldLabel": { + "message": "Upravit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Smazat $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ - přidÃĄno", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Změnit pořadí $LABEL$. PouÅžijte ÅĄipky pro posunutí poloÅžky nahoru nebo dolů.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ - přesunuto nahoru, pozice $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Vyberte kolekce pro přiřazení" + }, + "personalItemTransferWarningSingular": { + "message": "1 poloÅžka bude trvale převedena do vybranÊ organizace. Tuto poloÅžku jiÅž nebudete vlastnit." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ poloÅžek bude trvale převedeno do vybranÊ organizace. Tyto poloÅžky jiÅž nebudete vlastnit.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 poloÅžka bude trvale převedena do $ORG$. Tuto poloÅžku jiÅž nebudete vlastnit.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ poloÅžek bude trvale převedeno do $ORG$. Tyto poloÅžky jiÅž nebudete vlastnit.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Kolekce byly ÃēspÄ›ÅĄně přiřazeny" + }, + "nothingSelected": { + "message": "Nevybrali jste ÅžÃĄdnÊ poloÅžky." + }, + "movedItemsToOrg": { + "message": "VybranÊ poloÅžky přesunuty do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "PoloÅžky přesunuty do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "PoloÅžka přesunuta do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ - přesunuto dolů, pozice $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Umístění poloÅžky" + }, + "fileSend": { + "message": "Send souboru" + }, + "fileSends": { + "message": "Sends se soubory" + }, + "textSend": { + "message": "Send textu" + }, + "textSends": { + "message": "Sends s texty" + }, + "bitwardenNewLook": { + "message": "Bitwarden mÃĄ novÃŊ vzhled!" + }, + "bitwardenNewLookDesc": { + "message": "Je snazÅĄÃ­ a intuitivnějÅĄÃ­ neÅž kdy jindy automaticky vyplňovat a vyhledÃĄvat z karty trezor. Mrkněte se!" + }, + "accountActions": { + "message": "Činnosti Ãēčtu" + }, + "showNumberOfAutofillSuggestions": { + "message": "Zobrazit počet nÃĄvrhů automatickÊho vyplňovÃĄní přihlÃĄÅĄení na ikoně rozÅĄÃ­Å™ení" + }, + "systemDefault": { + "message": "SystÊmovÃŊ vÃŊchozí" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Na toto nastavení byly uplatněny poÅžadavky podnikovÃŊch zÃĄsad" + }, + "sshPrivateKey": { + "message": "SoukromÃŊ klíč" + }, + "sshPublicKey": { + "message": "VeřejnÃŊ klíč" + }, + "sshFingerprint": { + "message": "Otisk prstu" + }, + "sshKeyAlgorithm": { + "message": "Typ klíče" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048 bitovÃŊ" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072 bitovÃŊ" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096 bitovÃŊ" + }, + "retry": { + "message": "Opakovat" + }, + "vaultCustomTimeoutMinimum": { + "message": "MinimÃĄlní vlastní časovÃŊ limit je 1 minuta." + }, + "additionalContentAvailable": { + "message": "Je k dispozici dalÅĄÃ­ obsah" + }, + "fileSavedToDevice": { + "message": "Soubor byl uloÅžen. MůŞete jej nalÊzt ve staÅženÊ sloÅžce v zařízení." + }, + "showCharacterCount": { + "message": "Zobrazit počet znaků" + }, + "hideCharacterCount": { + "message": "SkrÃŊt počet znaků" + }, + "itemsInTrash": { + "message": "PoloÅžky v koÅĄi" + }, + "noItemsInTrash": { + "message": "ÅŊÃĄdnÊ poloÅžky v koÅĄi" + }, + "noItemsInTrashDesc": { + "message": "PoloÅžky, kterÊ smaÅžete, se zde zobrazí a budou trvale smazÃĄny po 30 dnech." + }, + "trashWarning": { + "message": "PoloÅžky, kterÊ byly v koÅĄi dÊle neÅž 30 dní, budou automaticky smazÃĄny." + }, + "restore": { + "message": "Obnovit" + }, + "deleteForever": { + "message": "Smazat navÅždy" + }, + "noEditPermissions": { + "message": "NemÃĄte oprÃĄvnění upravit tuto poloÅžku" + }, + "authenticating": { + "message": "OvěřovÃĄní" + }, + "fillGeneratedPassword": { + "message": "Vyplnit vygenerovanÊ heslo", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Heslo bylo znovu vygenerovÃĄno", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "UloÅžit přihlÃĄÅĄení do Bitwardenu?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Mezera", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilda", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "ZpětnÃŊ apostrof", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Vykřičník", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "ZavinÃĄÄ", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "MříŞka", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dolar", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Procento", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "StÅ™Ã­ÅĄka", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Hvězdička", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "LevÃĄ zÃĄvorka", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "PravÃĄ zÃĄvorka", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "PodtrŞítko", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Spojovník", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Rovnítko", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "LevÃĄ sloÅženÃĄ zÃĄvorka", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "PravÃĄ sloÅženÃĄ zÃĄvorka", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "LevÃĄ hranatÃĄ zÃĄvorka", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "PravÃĄ hranatÃĄ zÃĄvorka", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "SvislÃĄ ÄÃĄra", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "ZpětnÊ lomítko", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Dvojtečka", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Středník", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "DvojitÃĄ uvozovka", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Apostrof", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "MenÅĄÃ­ neÅž", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "VětÅĄÃ­ neÅž", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "ÄŒÃĄrka", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Tečka", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Otazník", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Lomítko", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "VÅĄechna malÃĄ písmena" + }, + "uppercaseAriaLabel": { + "message": "VÅĄechna velkÃĄ písmena" + }, + "generatedPassword": { + "message": "VygenerovanÊ heslo" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index c7817b42bce..de65c96e17f 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3,27 +3,45 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Rheolydd cyfineiriau am ddim", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Rheolydd cyfrineiriau diogel a rhad ac am ddim ar gyfer eich holl ddyfeisiau.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Mewngofnodwch neu crÃĢwch gyfrif newydd i gael mynediad i'ch cell ddiogel." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Creu cyfrif" }, - "login": { - "message": "Mewngofnodi" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Gosod cyfrinair cryf" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" }, "cancel": { - "message": "Cancel" + "message": "Canslo" }, "close": { "message": "Cau" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,8 +119,11 @@ "copyPassword": { "message": "Copïo cyfrinair" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { - "message": "Copy note" + "message": "Copïo'r nodyn" }, "copyUri": { "message": "Copïo URI" @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Llenwi'n awtomatig" }, + "autoFillLogin": { + "message": "Llenwi manylion mewngofnodi" + }, + "autoFillCard": { + "message": "Llenwi manylion cerdyn" + }, + "autoFillIdentity": { + "message": "Llenwi hunaniaeth" + }, "generatePasswordCopied": { "message": "Cynhyrchu cyfrinair (wedi'i gopïo)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "Dim cardiau" + }, + "noIdentities": { + "message": "Dim eitemau hunaniaeth" + }, + "addLoginMenu": { + "message": "Ychwanegu manylion mewngofnodi" + }, + "addCardMenu": { + "message": "Ychwanegu cerdyn" + }, + "addIdentityMenu": { + "message": "Ychwanegu eitem hunaniaeth" + }, "unlockVaultMenu": { "message": "Datgloi'ch cell" }, @@ -107,7 +223,7 @@ "message": "Mewngofnodi i'ch cell" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Ychwanegu manylion mewngofnodi" @@ -115,6 +231,18 @@ "addItem": { "message": "Ychwanegu eitem" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -122,13 +250,13 @@ "message": "Enter your account email address to receive your master password hint." }, "getMasterPasswordHint": { - "message": "Get master password hint" + "message": "Anfon awgrym o'ch prif gyfrinair" }, "continue": { "message": "Parhau" }, "sendVerificationCode": { - "message": "Send a verification code to your email" + "message": "Anfon cod dilysu i'ch cyfeiriad ebost" }, "sendCode": { "message": "Anfod cod" @@ -142,29 +270,83 @@ "confirmIdentity": { "message": "Cadarnhewch eich hunaniaeth i barhau." }, - "account": { - "message": "Cyfrif" - }, "changeMasterPassword": { - "message": "Change master password" + "message": "Newid y prif gyfrinair" + }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." }, "fingerprintPhrase": { - "message": "Fingerprint phrase", + "message": "Ymadrodd unigryw", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "Your account's fingerprint phrase", + "message": "Ymadrodd unigryw eich cyfrif", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "Two-step login" + "message": "Mewngofnodi dau agm" }, "logOut": { "message": "Allgofnodi" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Ynghylch" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Dilyswr Bitwarden" + }, + "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" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Fersiwn" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Golygu ffolder" }, + "newFolder": { + "message": "Ffolder newydd" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Dileu'r ffolder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Cynhyrchydd", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Cynhyrchu cyfrineiriau cryf ac unigryw ar gyfer eich cyfrifon yn awtomatig." }, - "bitWebVault": { - "message": "Cell we Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Mewnforio eitemau" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Cynhyrchu cyfrinair" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Ailgynhyrchu cyfrinair" }, @@ -244,17 +447,60 @@ "length": { "message": "Hyd" }, + "passwordMinLength": { + "message": "Hyd lleiaf cyfrineiriau" + }, "uppercase": { - "message": "Priflythrennau (A-Z)" + "message": "Priflythrennau (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Llythrennau bach (a-z)" + "message": "Llythrennau bach (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Rhifau (0-9)" + "message": "Rhifau (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Nodau arbennig (!@#$%^&*)" + "message": "Nodau arbennig (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Nifer o eiriau" @@ -270,13 +516,22 @@ "message": "Cynnwys rhif" }, "minNumbers": { - "message": "Minimum numbers" + "message": "Isafswm rhifau" }, "minSpecial": { - "message": "Minimum special" + "message": "Isafswm nodau arbennig" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Osgoi nodau amwys", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Chwilio'r gell" @@ -285,13 +540,13 @@ "message": "Golygu" }, "view": { - "message": "View" + "message": "Gweld" }, "noItemsInList": { "message": "Does dim eitemau i'w rhestru." }, "itemInformation": { - "message": "Item information" + "message": "Gwybodaeth am yr eitem" }, "username": { "message": "Enw defnyddiwr" @@ -299,62 +554,113 @@ "password": { "message": "Cyfrinair" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Cyfrinymadrodd" }, "favorite": { "message": "Ffefrynnu" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Nodiadau" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nodyn" }, "editItem": { - "message": "Edit item" + "message": "Golygu'r eitem" }, "folder": { "message": "Ffolder" }, "deleteItem": { - "message": "Delete item" + "message": "Dileu'r eitem" }, "viewItem": { - "message": "View item" + "message": "Gweld yr eitem" }, "launch": { "message": "Lansio" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Gwefan" }, "toggleVisibility": { - "message": "Toggle visibility" + "message": "Toglo gwelededd" }, "manage": { "message": "Rheoli" }, "other": { - "message": "Other" + "message": "Gosodiadau eraill" + }, + "unlockMethods": { + "message": "Dewisiadau datgloi" }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Dewisiadau eraill" + }, "rateExtension": { - "message": "Rate the extension" + "message": "Rhoi eich barn ar yr estyniad" }, "rateExtensionDesc": { "message": "Ystyriwch ein helpu ni gydag adolygiad da!" }, "browserNotSupportClipboard": { - "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + "message": "Dyw eich porwr gwe ddim yn cefnogi copïo drwy'r clipfwrdd yn hawdd. Copïwch Ãĸ llaw yn lle." }, "verifyIdentity": { "message": "Gwirio'ch hunaniaeth" }, "yourVaultIsLocked": { - "message": "Mae eich cell dan glo. Gwiriwch eich hunaniaeth i barhau." + "message": "Mae eich cell ar glo. Gwiriwch eich hunaniaeth i barhau." + }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" }, "unlock": { "message": "Datgloi" @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Cloi'r gell" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Cloi nawr" }, + "lockAll": { + "message": "Cloi'r cwbl" + }, "immediately": { "message": "ar unwaith" }, @@ -418,14 +730,26 @@ "message": "On system lock" }, "onRestart": { - "message": "On browser restart" + "message": "wrth ailgychwyn y porwr" }, "never": { - "message": "byth" + "message": "Byth" }, "security": { "message": "Diogelwch" }, + "confirmMasterPassword": { + "message": "Cadarnhau'r prif gyfrinair" + }, + "masterPassword": { + "message": "Prif gyfrinair" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "Bu gwall" }, @@ -457,17 +781,32 @@ "newAccountCreated": { "message": "Mae eich cyfrif newydd wedi cael ei greu! Gallwch bellach fewngofnodi." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "Rydym ni wedi anfon ebost atoch gydag awgrym ar gyfer eich prif gyfrinair." }, "verificationCodeRequired": { "message": "Mae angen cod dilysu." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Cod dilysu annilys" }, "valueCopied": { - "message": "$VALUE$ copied", + "message": "$VALUE$ wedi'i gopïo", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -477,22 +816,67 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Mae eich sesiwn wedi dod i ben." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Ydych chi'n siÅĩr eich bod am allgofnodi?" }, "yes": { - "message": "Yes" + "message": "Ydw" }, "no": { - "message": "No" + "message": "Na" }, "unexpectedError": { "message": "An unexpected error has occurred." @@ -501,17 +885,17 @@ "message": "Mae angen enw." }, "addedFolder": { - "message": "Folder added" - }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Ffolder wedi'i hychwanegu" }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Ffolder wedi'i chadw" }, @@ -528,10 +912,10 @@ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." }, "syncingComplete": { - "message": "Syncing complete" + "message": "Cysoni wedi'i gwblhau" }, "syncingFailed": { - "message": "Syncing failed" + "message": "Methwyd Ãĸ chysoni" }, "passwordCopied": { "message": "Cyfrinair wedi'i gopïo" @@ -552,6 +936,10 @@ "newUri": { "message": "URI newydd" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Eitem wedi'i hychwanegu" }, @@ -577,13 +965,13 @@ "message": "Are you sure you want to overwrite the current username?" }, "searchFolder": { - "message": "Search folder" + "message": "Chwilio drwy'r ffolder" }, "searchCollection": { - "message": "Search collection" + "message": "Chwilio drwy'r casgliad" }, "searchType": { - "message": "Search type" + "message": "Chwilio drwy'r math hwn" }, "noneFolder": { "message": "Dim ffolder", @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clirio'r clipfwrdd", @@ -616,7 +1016,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Should Bitwarden remember this password for you?" + "message": "A ddylai Bitwarden gofio'r cyfrinair hwn i chi?" }, "notificationAddSave": { "message": "Cadw" @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Diweddaru" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Datgloi" }, + "additionalOptions": { + "message": "Dewisiadau ychwanegol" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Thema" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Tywyll", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Allforio'r gell" }, "fileFormat": { "message": "Fformat y ffeil" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "RHYBUDD", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "Ffeil" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Dewis ffeil" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "Storfa 1GB wedi'i hamgryptio ar gyfer atodiadau ffeiliau." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Dewisiadau mewngofnodi dau gam perchenogol megis YubiKey a Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Mae gennych aelodaeth uwch!" }, "premiumCurrentMemberThanks": { "message": "Diolch am gefnogi Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "Hyn oll am $PRICE$ y flwyddyn!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -862,7 +1325,7 @@ } }, "verificationCodeEmailSent": { - "message": "Verification email sent to $EMAIL$.", + "message": "Anfonwyd ebost dilysu i $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -874,13 +1337,13 @@ "message": "Fy nghofio i" }, "sendVerificationCodeEmailAgain": { - "message": "Send verification code email again" + "message": "Anfon ebost Ãĸ chod dilysu eto" }, "useAnotherTwoStepMethod": { "message": "Use another two-step login method" }, "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." + "message": "Rhowch eich YubiKey i mewn i borth USB eich cyfrifiadur, yna gwasgwch y botwm." }, "insertU2f": { "message": "Insert your security key into your computer's USB port. If it has a button, touch it." @@ -913,20 +1376,20 @@ "message": "Cod adfer" }, "authenticatorAppTitle": { - "message": "Authenticator app" + "message": "Ap dilysu" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Ebost" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Amgylchedd addasedig" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,14 +1454,73 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Diffoddwch osodiadau rheolydd cyfrineiriau eich porwr er mwyn osgoi gwrthdaro." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { "message": "Llenwi'n awtomatig wrth i dudalen lwytho os canfyddir ffurflen mewngofnodi." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { "message": "Dysgu mwy am lenwi'n awtomatig" @@ -994,19 +1529,19 @@ "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Defnyddio'r gosodiad rhagosodedig" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Cloi'r gell" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Meysydd addasedig" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Gwerth Boole" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Dangos delwedd adnabyddadwy wrth ymyl pob eitem." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,8 +1773,47 @@ "typeIdentity": { "message": "Hunaniaeth" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { - "message": "Password history" + "message": "Hanes cyfrineiriau" + }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" }, "back": { "message": "Yn ôl" @@ -1238,6 +1821,15 @@ "collections": { "message": "Casgliadau" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Ffefrynnau" }, @@ -1245,7 +1837,7 @@ "message": "Syumd i ffenestr newydd" }, "refresh": { - "message": "Refresh" + "message": "Adnewyddu" }, "cards": { "message": "Cardiau" @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1291,22 +1887,22 @@ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { - "message": "Exact" + "message": "Union gywir" }, "startsWith": { - "message": "Starts with" + "message": "Yn dechrau Ãĸ" }, "regEx": { "message": "Mynegiant rheolaidd", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match detection", - "description": "URI match detection for auto-fill." + "message": "Cymharu URIs", + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1324,7 +1920,7 @@ "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { - "message": "Types" + "message": "Mathau" }, "allItems": { "message": "Pob eitem" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Does dim cyfrineiriau i'w rhestru." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Tynnu" }, @@ -1347,7 +1952,7 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Password updated", + "message": "Cyfrinair wedi'i ddiweddaru", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1390,17 +1995,32 @@ "unlockWithPin": { "message": "Datgloi Ãĸ PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Mae angen cod PIN." }, "invalidPin": { "message": "Cod PIN annilys." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Datgloi Ãĸ biometreg" + }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Cloi", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Sbwriel", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Llenwi'n awtomatig a chadw" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "Drwy dicio'r blwch hwn, rydych yn cytuno i'r canlynol:" }, @@ -1557,11 +2227,17 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Gwiriwch fod y rhaglen bwrdd gwaith yn dangos yr ymadrodd hwn: " }, "desktopIntegrationDisabledTitle": { "message": "Browser integration is not set up" @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Parthau wedi'u heithrio" }, "excludedDomainsDesc": { "message": "Fydd Bitwarden ddim yn gofyn i gadw manylion mewngofnodi'r parthau hyn. Rhaid i chi ail-lwytho'r dudalen i newidiadau ddod i rym." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "Dyw $DOMAIN$ ddim yn barth dilys", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Chwilio drwy Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Testun" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Ffeil" }, @@ -1666,6 +2406,9 @@ "message": "Pob Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Dyddiad dod i ben" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1796,7 +2554,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "New password" + "message": "Cyfrinair newydd" }, "sendDisabled": { "message": "Send removed", @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Cyn i chi ddechrau" }, @@ -1831,7 +2636,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage2": { - "message": "click here", + "message": "cliciwch yma", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage3": { @@ -1856,11 +2661,14 @@ "hideEmail": { "message": "Cuddio fy nghyfeiriad ebost rhag derbynwyr." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "Ailofyn am y prif gyfrinair" }, "passwordConfirmation": { "message": "Master password confirmation" @@ -1871,14 +2679,17 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated master password" + "message": "Diweddarwyd y prif gyfrinair" }, "updateMasterPassword": { - "message": "Update master password" + "message": "Diweddaru'r prif gyfrinair" }, "updateMasterPasswordWarning": { "message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Dewis ffolder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Gwall" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Cynhyrchu enw defnyddiwr" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Math o enw defnyddiwr" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2072,7 +3076,7 @@ "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "loggingInTo": { - "message": "Logging in to $DOMAIN$", + "message": "Yn mewngofnodi i $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -2084,13 +3088,13 @@ "message": "Settings have been edited" }, "environmentEditedClick": { - "message": "Click here" + "message": "Cliciwch yma" }, "environmentEditedReset": { "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server version" + "message": "Fersiwn y gweinydd" }, "selfHostedServer": { "message": "self-hosted" @@ -2108,7 +3112,7 @@ } }, "lastSeenOn": { - "message": "last seen on: $DATE$", + "message": "gwelwyd ddiwethaf: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2117,16 +3121,16 @@ } }, "loginWithMasterPassword": { - "message": "Log in with master password" + "message": "Mewngofnodi Ãĸ'ch prif gyfrinair" }, "loggingInAs": { - "message": "Logging in as" + "message": "Yn mewngofnodi fel" }, "notYou": { - "message": "Not you?" + "message": "Nid chi?" }, "newAroundHere": { - "message": "New around here?" + "message": "Ydych chi'n newydd?" }, "rememberEmail": { "message": "Cofio'r ebost" @@ -2138,10 +3142,10 @@ "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Ymadrodd unigryw" }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + "message": "Sicrhewch fod eich cell wedi'i datgloi a bod yr ymadrodd unigryw yn cyfateb i'r un ar y ddyfais arall." }, "resendNotification": { "message": "Resend notification" @@ -2159,10 +3163,10 @@ "message": "Exposed Master Password" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Cafodd y cyfrinair ei ganfod mewn achos o ddatgelu data. Defnyddiwch gyfrinair unigryw i ddiogelu eich cyfrif. Ydych chi wir eisiau defnyddio cyfrinair sydd wedi'i ddatgelu?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Prif gyfrinair gwan ac wedi'i ddatgelu" }, "weakAndBreachedMasterPasswordDesc": { "message": "Cyfrinair gwan a gafodd ei ganfod mewn achos o ddatgelu data. Defnyddiwch gyfrinair cryf ac unigryw i ddiogelu eich cyfrif. Ydych chi wir eisiau defnyddio cyfrinair sydd wedi'i ddatgelu?" @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { "message": "Sut i lenwi'n awtomatig" }, "autofillSelectInfoWithCommand": { - "message": "Dewiswch eitem o'r dudalen hon neu ddefnyddio'r llwybr byr: $COMMAND$", + "message": "Dewiswch eitem o'r sgrin hon, defnyddiwch y llwybr byr $COMMAND$, neu darganfyddwch ddewisiadau eraill yn y gosodiadau.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Iawn" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Gosodiadau llenwi awtomatig" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "Dim ebost?" + }, + "goBack": { + "message": "Ewch yn ôl" + }, + "toEditYourEmailAddress": { + "message": "i olygu eich cyfeiriad ebost." + }, "eu": { "message": "UE", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Mynediad wedi ei wrthod. Does gennych chi ddim caniatÃĸd i weld y dudalen hon." }, @@ -2292,7 +3317,7 @@ "message": "You will be notified once approved." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "Trafferth mewngofnodi?" }, "loginApproved": { "message": "Login approved" @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2365,10 +3398,10 @@ "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "Dyw'r mewnbwn ddim yn gyfeiriad ebost." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "Mae $COUNT$ o feysydd uchod angen sylw.", "placeholders": { "count": { "content": "$1", @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Dewis --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Hoffech chi fewnforio'ch data i Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Yn mewnforio...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Cafodd y data ei fewnforio'n llwyddiannus!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Neidio i'r cynnwys" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Datglowch eich cyfrif i weld manylion mewngofnodi sy'n cyfateb", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Datgloi eich cyfrif", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Dim eitemau i'w dangos", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Eitem newydd", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Ychwanegu eitem newydd i'r gell", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Anwybyddu" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Disgrifiad" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "Cafodd cyfanswm o $AMOUNT$ eitem eu mewnforio.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Gosod PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Defnyddio PIN" + }, + "useBiometrics": { + "message": "Defnyddio biometreg" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Cyfanswm" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Chafodd dim ei fewnforio." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Dysgu am eich dewisiadau mewnforio" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Cadarnhau" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Enw defnyddiwr neu gyfrinair anghywir" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "Ebost LastPass" + }, + "importingYourAccount": { + "message": "Yn mewnforio eich cyfrif..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "Prif gyfrinair LastPass" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Mewnforio'n uniongyrchol o LastPass" + }, + "importFromCSV": { + "message": "Mewnforio o CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Casgliad" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Newid cyfrif" + }, + "switchAccounts": { + "message": "Newid cyfrif" + }, + "switchToAccount": { + "message": "Newid i gyfrif" + }, + "activeAccount": { + "message": "Cyfrif gweithredol" + }, + "availableAccounts": { + "message": "Cyfrifon ar gael" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "gweinydd" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Unwaith yn unig" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "Ychwanegwyd $DOMAIN$ i'r parthau wedi'u heithrio.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Fformatau cyffredin", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Hoffech chi wneud Bitwarden yn rheolydd cyfrineiriau rhagosodedig?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Golwg" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Ychwanegu cyfrif" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Ychwanegu" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index cce307701b2..0529effb15a 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Gratis adgangskodemanager", + "message": "Bitwarden AdgangskodehÃĨndtering", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "En sikker og gratis adgangskodemanager til alle dine enheder.", - "description": "Extension description" + "message": "Hjemme, pÃĨ arbejde eller pÃĨ farten sikrer Bitwarden nemt alle adgangskoder, adgangskort og sensitive oplysninger", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log ind eller opret en ny konto for at fÃĨ adgang til din sikre boks." }, + "inviteAccepted": { + "message": "Invitation accepteret" + }, "createAccount": { "message": "Opret konto" }, - "login": { - "message": "Log ind" + "newToBitwarden": { + "message": "Ny pÃĨ Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log ind med adgangsnøgle" + }, + "useSingleSignOn": { + "message": "Brug Single Sign-On" + }, + "welcomeBack": { + "message": "Velkommen tilbage" + }, + "setAStrongPassword": { + "message": "Indstil en stÃĻrk adgangskode" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Afslut kontooprettelsen med at indstille en adgangskode" }, "enterpriseSingleSignOn": { "message": "Virksomheds Single-Sign-On" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Et tip til hovedadgangskoden kan hjÃĻlpe dig med at huske din adgangskode, hvis du glemmer den." }, + "masterPassHintText": { + "message": "Glemmer du din adgangskode, kan adgangskodetippet sendes til din e-mail. $CURRENT$/$MAXIMUM$ tegns maksimum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Indtast hovedadgangskode igen" }, "masterPassHint": { "message": "Hovedadgangskodetip (valgfrit)" }, + "joinOrganization": { + "message": "Bliv medlem af organisation" + }, + "joinOrganizationName": { + "message": "Bliv nedlem af $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "FÃĻrdiggør tilmeldingen til denne organisation ved at opsÃĻtte en hovedadgangskode." + }, "tab": { "message": "Fane" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "KopiÊr adgangskode" }, + "copyPassphrase": { + "message": "KopiÊr adgangssÃĻtning" + }, "copyNote": { "message": "KopiÊr notat" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "KopiÊr sikkerhedskode" }, + "copyName": { + "message": "KopiÊr navn" + }, + "copyCompany": { + "message": "KopiÊr virksomhed" + }, + "copySSN": { + "message": "KopiÊr CPR-nummer" + }, + "copyPassportNumber": { + "message": "KopiÊr pasnummer" + }, + "copyLicenseNumber": { + "message": "Kopier licensnummer" + }, + "copyPrivateKey": { + "message": "KopiÊr privat nøgle" + }, + "copyPublicKey": { + "message": "KopiÊr offentlig nøgle" + }, + "copyFingerprint": { + "message": "KopiÊr fingeraftryk" + }, + "copyCustomField": { + "message": "KopiÊr $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "KopiÊr websted" + }, + "copyNotes": { + "message": "KopiÊr notater" + }, + "fill": { + "message": "Udfyld", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-udfyld" + "message": "Autoudfyld" + }, + "autoFillLogin": { + "message": "Autoudfyld login" + }, + "autoFillCard": { + "message": "Autoudfyld kort" + }, + "autoFillIdentity": { + "message": "Autoudfyld identitet" }, "generatePasswordCopied": { "message": "GenerÊr adgangskode (kopieret)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Ingen matchende logins" }, + "noCards": { + "message": "Ingen kort" + }, + "noIdentities": { + "message": "Ingen identiteter" + }, + "addLoginMenu": { + "message": "Tilføj login" + }, + "addCardMenu": { + "message": "Tilføj kort" + }, + "addIdentityMenu": { + "message": "Tilføj identitet" + }, "unlockVaultMenu": { "message": "LÃĨs din boks op" }, @@ -107,7 +223,7 @@ "message": "Log ind pÃĨ din boks" }, "autoFillInfo": { - "message": "Der findes ingen login til at auto-udfylde i den nuvÃĻrende browserfane." + "message": "Der findes ingen logins at autoudfylde i den aktuelle webbrowserfane." }, "addLogin": { "message": "Tilføj et login" @@ -115,6 +231,18 @@ "addItem": { "message": "Tilføj element" }, + "accountEmail": { + "message": "Konto-e-mail" + }, + "requestHint": { + "message": "Anmod om tip" + }, + "requestPasswordHint": { + "message": "Anmod om adgangskodetip" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Angiv kontoens e-mailadresse og fÃĨ et adgangskodetip fremsendt" + }, "passwordHint": { "message": "Adgangskodetip" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "BekrÃĻft din identitet for at fortsÃĻtte." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Skift hovedadgangskode" }, + "continueToWebApp": { + "message": "FortsÃĻt til web-app?" + }, + "continueToWebAppDesc": { + "message": "Tjek flere funktioner ud i Bitwarden-kontoen pÃĨ web-appen." + }, + "continueToHelpCenter": { + "message": "FortsÃĻt til HjÃĻlpecenter?" + }, + "continueToHelpCenterDesc": { + "message": "LÃĻs mere i HjÃĻlpecenter om, hvordan man bruger Bitwarden." + }, + "continueToBrowserExtensionStore": { + "message": "FortsÃĻt til webbrowserudvidelsesbutik?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "HjÃĻlp andre med at finde ud af, om Bitwarden er det rigtige for dem. Besøg App Store og skriv en bedømmelse nu." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Hovedadgangskoden kan ÃĻndres via Bitwarden web-appen." + }, "fingerprintPhrase": { "message": "FingeraftrykssÃĻtning", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log ud" }, + "aboutBitwarden": { + "message": "Om Bitwarden" + }, "about": { "message": "Om" }, + "moreFromBitwarden": { + "message": "Mere fra Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "FortsÃĻt til bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator muliggør at gemme godkendelsesnøgler og generere TOTP-koder til 2-trinsbekrÃĻftelsesstrømme. FÃĨ mere at vide pÃĨ bitwarden.com-webstedet" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Gem, hÃĨndtÊr og del udviklerhemmeligheder pÃĨ sikker vis med Bitwarden Secrets Manager. FÃĨ mere at vide pÃĨ bitwarden.com-webstedet." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Skab problemfrie og sikre loginoplevelser uden traditionelle adgangskoder med Passwordless.dev. Find ud af mere pÃĨ bitwarden.com-webstedet." + }, + "freeBitwardenFamilies": { + "message": "Gratis Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Du er berettiget til Gratis Bitwarden Families. Indløs dette tilbud i dag i web-appen." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "RedigÊr mappe" }, + "newFolder": { + "message": "Ny mappe" + }, + "folderName": { + "message": "Mappenavn" + }, + "folderHintText": { + "message": "Indlejr en mappe ved at tilføje den overordnede mappes navn efterfulgt af en “/”. F.eks.: Social/Fora" + }, + "noFoldersAdded": { + "message": "Ingen mapper tilføjet" + }, + "createFoldersToOrganize": { + "message": "Opret mapper for at organisere boks-emner" + }, + "deleteFolderPermanently": { + "message": "Sikker pÃĨ, at denne mappe skal slettes permanent?" + }, "deleteFolder": { "message": "Slet mappe" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Opret automatisk stÃĻrke, unikke adgangskoder til dine logins." }, - "bitWebVault": { - "message": "Bitwarden web-boks" + "bitWebVaultApp": { + "message": "Bitwarden web-app" }, "importItems": { "message": "ImportÊr elementer" @@ -235,6 +435,9 @@ "generatePassword": { "message": "GenerÊr adgangskode" }, + "generatePassphrase": { + "message": "GenerÊr adgangssÃĻtning" + }, "regeneratePassword": { "message": "RegenerÊr adgangskode" }, @@ -244,17 +447,60 @@ "length": { "message": "LÃĻngde" }, + "passwordMinLength": { + "message": "MinimumslÃĻngde pÃĨ adgangskode" + }, "uppercase": { - "message": "Store bogstaver (A-Z)" + "message": "Store bogstaver (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "SmÃĨ bogstaver (a-z)" + "message": "SmÃĨ bogstaver (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Tal (0-9)" + "message": "Tal (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Specialtegn (!@#$%^&*)" + "message": "Specialtegn (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "InkludÊr", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "InkludÊr majuskler", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "InkludÊr minuskler", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "InkludÊr tal", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "InkludÊr specialtegn", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Antal ord" @@ -276,7 +522,16 @@ "message": "Mindste antal specialtegn" }, "avoidAmbChar": { - "message": "UndgÃĨ tvetydige tegn" + "message": "UndgÃĨ tvetydige tegn", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "UndgÃĨ tvetydige tegn", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Virksomhedspolitikkrav gør sig gÃĻldende pÃĨ generatorvalgmulighder.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Søg i boks" @@ -299,15 +554,30 @@ "password": { "message": "Adgangskode" }, + "totp": { + "message": "Godkendelseshemmelighed" + }, "passphrase": { "message": "AdgangssÃĻtning" }, "favorite": { "message": "Favorit" }, + "unfavorite": { + "message": "Fjern fra favorit" + }, + "itemAddedToFavorites": { + "message": "Emne føjet til favoritter" + }, + "itemRemovedFromFavorites": { + "message": "Emne fjernet fra favoritter" + }, "notes": { "message": "Notater" }, + "privateNote": { + "message": "Privat notat" + }, "note": { "message": "Notat" }, @@ -326,6 +596,18 @@ "launch": { "message": "Start" }, + "launchWebsite": { + "message": "Åbn websted" + }, + "launchWebsiteName": { + "message": "Åbn webstedet $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Hjemmeside" }, @@ -338,9 +620,24 @@ "other": { "message": "Andre" }, + "unlockMethods": { + "message": "OplÃĨsningsmuligheder" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "OpsÃĻt en oplÃĨsningsmetode til at ÃĻndre bokstimeouthandlingen." }, + "unlockMethodNeeded": { + "message": "OpsÃĻt en oplÃĨsningsmetode i Indstillinger" + }, + "sessionTimeoutHeader": { + "message": "Sessionstimeout" + }, + "vaultTimeoutHeader": { + "message": "Boks-timeout" + }, + "otherOptions": { + "message": "Andre innstillinger" + }, "rateExtension": { "message": "Bedøm udvidelsen" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Din boks er lÃĨst. BekrÃĻft din identitet for at fortsÃĻtte." }, + "yourVaultIsLockedV2": { + "message": "Boksen er lÃĨst" + }, + "yourAccountIsLocked": { + "message": "Kontoen er lÃĨst" + }, + "or": { + "message": "eller" + }, "unlock": { "message": "LÃĨs op" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Boks timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "LÃĨs nu" }, + "lockAll": { + "message": "LÃĨs alle" + }, "immediately": { "message": "Straks" }, @@ -426,6 +738,18 @@ "security": { "message": "Sikkerhed" }, + "confirmMasterPassword": { + "message": "BekrÃĻft hovedadgangskode" + }, + "masterPassword": { + "message": "Hovedadgangskode" + }, + "masterPassImportant": { + "message": "Hovedadgangskoden kan ikke gendannes, hvis den glemmes!" + }, + "masterPassHintLabel": { + "message": "Hovedadgangskodetip" + }, "errorOccurred": { "message": "Der er opstÃĨet en fejl" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Din nye konto er oprettet! Du kan nu logge ind." }, + "newAccountCreated2": { + "message": "Din nye konto er oprettet!" + }, + "youHaveBeenLoggedIn": { + "message": "Du er blevet logget ind!" + }, + "youSuccessfullyLoggedIn": { + "message": "Du er nu logget ind" + }, + "youMayCloseThisWindow": { + "message": "Dette vindue kan nu lukkes" + }, "masterPassSent": { "message": "Vi har sendt dig en e-mail med dit hovedadgangskodetip." }, "verificationCodeRequired": { "message": "BekrÃĻftelseskode er pÃĨkrÃĻvet." }, + "webauthnCancelOrTimeout": { + "message": "Godkendelsen blev afbrudt eller tog for lang tid. Forsøg igen." + }, "invalidVerificationCode": { "message": "Ugyldig bekrÃĻftelseskode" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Ikke i stand til at auto-udfylde det valgte element pÃĨ denne side. KopiÊr og indsÃĻt dataene i stedet for." + "message": "Ikke i stand til at autoudfylde det valgte emne pÃĨ denne side. KopiÊr og indsÃĻt informationen i stedet." + }, + "totpCaptureError": { + "message": "Kan ikke skanne QR-koden fra den aktuelle webside" + }, + "totpCaptureSuccess": { + "message": "Godkendelsesnøgle tilføjet" + }, + "totpCapture": { + "message": "Skan godkendelses QR-kode fra den aktuelle webside" + }, + "totpHelperTitle": { + "message": "Gør 2-trinsbekrÃĻftelse problemfri" + }, + "totpHelper": { + "message": "Bitwarden kan gemme og udfylde 2-trinsbekrÃĻftelseskoder. KopiÊr og indsÃĻt nøglen i dette felt." + }, + "totpHelperWithCapture": { + "message": "Bitwarden kan gemme og udfylde 2-trinsbekrÃĻftelseskoder. VÃĻlg kameraikonet for at tage et skÃĻrmfoto af dette websteds godkendelses-QR-kode, eller kopiÊr og indsÃĻt nøglen i dette felt." + }, + "learnMoreAboutAuthenticators": { + "message": "LÃĻs mere om autentifikatorer" + }, + "copyTOTP": { + "message": "KopiÊr godkendelsesnøgle (TOTP)" }, "loggedOut": { "message": "Logget ud" }, + "loggedOutDesc": { + "message": "Der er blevet logget ud af kontoen." + }, "loginExpired": { "message": "Din login-session er udløbet." }, + "logIn": { + "message": "Log ind" + }, + "logInToBitwarden": { + "message": "Log ind pÃĨ Bitwarden" + }, + "restartRegistration": { + "message": "Genstart registrering" + }, + "expiredLink": { + "message": "Udløbet link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Genstart registreringen eller prøv at logge ind." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Har allerede oprettet en konto?" + }, "logOutConfirmation": { "message": "Er du sikker pÃĨ, du vil logge ud?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Mappe tilføjet" }, - "changeMasterPass": { - "message": "Skift hovedadgangskode" - }, - "changeMasterPasswordConfirmation": { - "message": "Du kan ÃĻndre din hovedadgangskode i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?" - }, "twoStepLoginConfirmation": { "message": "To-trins login gør din konto mere sikker ved at krÃĻve, at du verificerer dit login med en anden enhed, sÃĨsom en sikkerhedsnøgle, autentificeringsapp, SMS, telefonopkald eller e-mail. To-trins login kan aktiveres i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?" }, + "twoStepLoginConfirmationContent": { + "message": "Øg kontosikkerheden ved at oprette totrinsindlogning i Bitwarden web-appen." + }, + "twoStepLoginConfirmationTitle": { + "message": "FortsÃĻt til web-app?" + }, "editedFolder": { "message": "Mappe gemt" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Ny URI" }, + "addDomain": { + "message": "Tilføj domÃĻne", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Element tilføjet" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Spørg om at tilføje login" }, + "vaultSaveOptionsTitle": { + "message": "Gem i boksindstillinger" + }, "addLoginNotificationDesc": { "message": "Spørg om at tilføje et element, hvis et ikke findes i din boks." }, + "addLoginNotificationDescAlt": { + "message": "Anmod om at tilføje et emne, hvis intet ikke findes i boksen. GÃĻlder alle indloggede konti." + }, + "showCardsInVaultView": { + "message": "Vis kort som Autoudfyldningsforslag ved Boks-visning" + }, "showCardsCurrentTab": { "message": "Vis kort pÃĨ fanebladet" }, "showCardsCurrentTabDesc": { - "message": "Vis kortelementer pÃĨ fanebladet for nem auto-udfyldning." + "message": "Vis kortemner pÃĨ siden Fane for nem autoudfyldning." + }, + "showIdentitiesInVaultView": { + "message": "Vis identiteter som Autoudfyldningsforslag ved Boks-visning" }, "showIdentitiesCurrentTab": { "message": "Vis identiteter pÃĨ fanebladet" }, "showIdentitiesCurrentTabDesc": { - "message": "Vis identitetselementer pÃĨ fanebladet for nem auto-udfyldning." + "message": "Vis identitetsemner pÃĨ siden Fane for nem autoudfyldning." }, "clearClipboard": { "message": "Ryd udklipsholder", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Bed om at opdatere et logins adgangskode, nÃĨr der registreres en ÃĻndring pÃĨ en hjemmeside." }, + "changedPasswordNotificationDescAlt": { + "message": "Anmod om at opdatere en login-adgangskode ved registreret ÃĻndring pÃĨ et websted. GÃĻlder alle indloggede konti." + }, + "enableUsePasskeys": { + "message": "Spørg om at gemme og bruge adgangsnøgler" + }, + "usePasskeysDesc": { + "message": "Spørg om at gemme nye adgangsnøgler eller logge ind med adgangsnøgler gemt i Boksen. GÃĻlder for alle indloggede konti." + }, "notificationChangeDesc": { "message": "Vil du opdatere denne adgangskode i Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "OpdatÊr" }, "notificationUnlockDesc": { - "message": "OplÃĨs din Bitwarden boks for at fÃĻrdiggøre autoudfyldanmodningen." + "message": "OplÃĨs Bitwarden-boksen for at fÃĻrdiggøre autoudfyldningsanmodningen." }, "notificationUnlock": { "message": "OplÃĨs" }, + "additionalOptions": { + "message": "Yderligere indstillinger" + }, "enableContextMenuItem": { "message": "Vis indstillinger i kontekstmenuen" }, "contextMenuItemDesc": { - "message": "Brug et sekundÃĻrt klik for at fÃĨ adgang til adgangskodegenerering og matchende logins til hjemmesiden." + "message": "Brug et sekundÃĻrt klik for at tilgÃĨ adgangskodegenerering og matchende logins til webstedet." + }, + "contextMenuItemDescAlt": { + "message": "Brug et sekundÃĻrt klik for at fÃĨ adgang til adgangskodegenerering og matchende logins til webstedet. GÃĻlder alle indloggede konti." }, "defaultUriMatchDetection": { "message": "Standard URI matchmetode", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "VÃĻlg den standard mÃĨde, som URI matchmetode hÃĨndteres til logins, nÃĨr du udfører handlinger som f.eks. Auto-udfyld." + "message": "VÃĻlg standardmÃĨden for hÃĨndtering af URI-matchdetektering til logins, nÃĨr der udføres handlinger, sÃĨsom f.eks. Autoudfyld." }, "theme": { "message": "Tema" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Skift applikationens farvetema." }, + "themeDescAlt": { + "message": "Skift applikationens farvetema. GÃĻlder for alle indloggede konti." + }, "dark": { "message": "Mørk", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solariseret mørk", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "EksportÊr fra" + }, "exportVault": { "message": "EksportÊr boks" }, "fileFormat": { "message": "Filformat" }, + "fileEncryptedExportWarningDesc": { + "message": "Denne fileksport vil vÃĻre adgangskodebeskyttet og krÃĻve filadgangskoden at dekryptere." + }, + "filePassword": { + "message": "Filadgangskode" + }, + "exportPasswordDescription": { + "message": "Denne adgangskode vil blive brugt ved eksport og import af denne fil" + }, + "accountRestrictedOptionDescription": { + "message": "Brug kontokrypteringsnøglen, dannet af kontobrugernavn og Hovedadgangskode, for at kryptere eksporten og hindre import til andre end den aktuelle Bitwarden-konto." + }, + "passwordProtectedOptionDescription": { + "message": "OpsÃĻt en adgangskode til bÃĨde at kryptere eksporten samt dekryptere denne ved import til enhver Bitwarden-konto." + }, + "exportTypeHeading": { + "message": "Eksporttype" + }, + "accountRestricted": { + "message": "Konto begrÃĻnset" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“Filadgangskode” og “BekrÃĻft filadgangskode“ matcher ikke." + }, "warning": { "message": "ADVARSEL", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Delt" }, - "learnOrg": { - "message": "FÃĨ mere at vide om organisationer" - }, - "learnOrgConfirmation": { - "message": "Bitwarden giver dig mulighed for at dele elementer i din boks med andre ved hjÃĻlp af en organisation. Vil du besøge bitwarden.com-webstedet for at fÃĨ mere at vide?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden Business muliggør deling af emner i din Boks med andre vha. en organisation. Find ud af mere pÃĨ bitwarden.com-webstedet." }, "moveToOrganization": { "message": "Flyt til organisation" @@ -762,6 +1204,9 @@ "file": { "message": "Fil" }, + "fileToShare": { + "message": "Fil, der skal deles" + }, "selectFile": { "message": "VÃĻlg en fil" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB krypteret lager til vedhÃĻftede filer." }, + "premiumSignUpEmergency": { + "message": "Nødadgang" + }, "premiumSignUpTwoStepOptions": { "message": "ProprietÃĻre totrins-login muligheder, sÃĨsom YubiKey og Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Du kan købe premium-medlemskab i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?" }, + "premiumPurchaseAlertV2": { + "message": "Der kan købes Premium fra kontoindstillingerne via Bitwarden web-appen." + }, "premiumCurrentMember": { "message": "Du er premium-medlem!" }, "premiumCurrentMemberThanks": { "message": "Tak fordi du støtter Bitwarden." }, + "premiumFeatures": { + "message": "OpgradÊr til Premium og modtag:" + }, "premiumPrice": { "message": "Alt dette for kun $PRICE$ /ÃĨr!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Alt dette for kun $PRICE$ pr. ÃĨr!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Opdatering fÃĻrdig" }, @@ -838,7 +1301,7 @@ "message": "KopiÊr TOTP automatisk" }, "disableAutoTotpCopyDesc": { - "message": "Hvis et login har en autentificeringsnøgle, sÃĨ kopiÊr TOTP-bekrÃĻftelseskoden til din udklipsholder, nÃĨr du auto-udfylder login." + "message": "Har et login har en autentificeringsnøgle, kopiÊr TOTP-bekrÃĻftelseskoden til udklipsholderen, nÃĨr login autoudfyldes." }, "enableAutoBiometricsPrompt": { "message": "Bed om biometri ved start" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Autentificerings-app" }, - "authenticatorAppDesc": { - "message": "Brug en autentificerings app (f.eks. Authy eller Google Autentificering) til at generere tidsbaserede bekrÃĻftelseskoder.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Angiv en kode genereret af en godkendelses-app sÃĨsom Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP sikkerhedsnøgle" + "yubiKeyTitleV2": { + "message": "Yubico OTP-sikkerhedsnøgle" }, "yubiKeyDesc": { "message": "Brug en YubiKey til at fÃĨ adgang til din konto. Virker med YubiKey 4, 4 Nano, 4C og NEO enheder." }, - "duoDesc": { - "message": "BekrÃĻft med Duo sikkerhed ved hjÃĻlp af Duo Mobile app, SMS, telefonopkald eller U2F sikkerhedsnøgle.", + "duoDescV2": { + "message": "Angiv en kode genereret af Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-mail" }, - "emailDesc": { - "message": "BekrÃĻftelseskoder vil blive e-mailet til dig." + "emailDescV2": { + "message": "Angiv en kode tilsendt pr. e-mail." }, "selfHostedEnvironment": { "message": "Selv-hosted miljø" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Angiv grund-URL'en i din lokal-hostede Bitwarden-installation." }, + "selfHostedBaseUrlHint": { + "message": "Angiv basis-URL'en for den lokalt-hosted Bitwarden-installation. Eks.: https://bitwarden.firma.dk" + }, + "selfHostedCustomEnvHeader": { + "message": "Til avancerede brugere. Man kan angive basis-URL'en for hver tjeneste uafhÃĻngigt." + }, + "selfHostedEnvFormInvalid": { + "message": "Der skal tilføjes enten basis server-URL'en eller mindst Êt tilpasset miljø." + }, "customEnvironment": { "message": "Brugerdefineret miljø" }, @@ -960,8 +1432,12 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "URL til selv-hostet server", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { - "message": "API server URL" + "message": "API-server URL" }, "webVaultUrl": { "message": "Web-boks server URL" @@ -978,14 +1454,73 @@ "environmentSaved": { "message": "Miljøets URLs er blevet gemt." }, + "showAutoFillMenuOnFormFields": { + "message": "Vis autoudfyldningsmenu i formularfelter", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autoudfyldningsforslag" + }, + "showInlineMenuLabel": { + "message": "Vis autoudfyld-menu i formularfelter" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Vis identiteter som forslag" + }, + "showInlineMenuCardsLabel": { + "message": "Vis kort som forslag" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Vis forslag, nÃĨr ikonet vÃĻlges" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "GÃĻlder for alle indloggede konti." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "SlÃĨ indstillingerne til webbrowsers indbyggede adgangskodehÃĨndtering fra for at undgÃĨ konflikter." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "RedigÊr webbrowserindstillinger." + }, + "autofillOverlayVisibilityOff": { + "message": "Fra", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "NÃĨr felt er valgt (i fokus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "NÃĨr autoudfyldikon vÃĻlges", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autoudfyld ved sideindlÃĻsning" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-udfyld ved sideindlÃĻsning" + "message": "Autoudfyld ved sideindlÃĻsning" }, "enableAutoFillOnPageLoadDesc": { - "message": "Hvis der registreres en loginformular, sÃĨ auto-udfyld, nÃĨr websiden indlÃĻses." + "message": "Registreres en loginformular, autoudfyld nÃĨr websiden indlÃĻses." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Advarsel:$CLOSETAG$ Kompromitterede eller ikke-betroede websteder kan misbruge autofyld ved sideindlÃĻsning.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Kompromitterede eller ikke-betroede websteder kan udnytte autoudfyldning ved sideindlÃĻsning." + "message": "Kompromitterede eller ikke-betroede websteder kan misbruge autoudfyldning ved sideindlÃĻsning." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "LÃĻs mere om risici" }, "learnMoreAboutAutofill": { "message": "LÃĻs mere om autoudfyldning" @@ -994,19 +1529,19 @@ "message": "Standardindstilling for autofyld for loginelementer" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Du kan deaktivere auto-udfyld ved sideindlÃĻsning for individuelle login-elementer fra elementets redigeringsvisning." + "message": "Autoudfyldning ved sideindlÃĻsning kan slÃĨs fra for individuelle loginemner fra emnets redigeringsvisning." }, "itemAutoFillOnPageLoad": { - "message": "Auto-udfyld ved sideindlÃĻsning (hvis aktiveret i Indstillinger)" + "message": "Autoudfyld ved sideindlÃĻsning (hvis opsat i Indstillinger)" }, "autoFillOnPageLoadUseDefault": { "message": "Anvend standardindstilling" }, "autoFillOnPageLoadYes": { - "message": "Auto-udfyld ved sideindlÃĻsning" + "message": "Autoudfyld ved sideindlÃĻsning" }, "autoFillOnPageLoadNo": { - "message": "Auto-udfyld ikke ved sideindlÃĻsning" + "message": "Autoudfyld ikke ved sideindlÃĻsning" }, "commandOpenPopup": { "message": "Åbn boks popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Åbn boks i sidebjÃĻlken" }, - "commandAutofillDesc": { - "message": "Auto-udfyld det sidste anvendte login for den aktuelle hjemmeside" + "commandAutofillLoginDesc": { + "message": "Autoudfyld det senest anvendte login for det aktuelle websted" + }, + "commandAutofillCardDesc": { + "message": "Autoudfyld det senest anvendte kort for det aktuelle websted" + }, + "commandAutofillIdentityDesc": { + "message": "Autoudfyld den senest anvendte identitet for det aktuelle websted" }, "commandGeneratePasswordDesc": { "message": "GenerÊr en ny tilfÃĻldig adgangskode og kopiÊr den til udklipsholderen" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "LÃĨs boksen" }, - "privateModeWarning": { - "message": "Understøttelse af privat tilstand er eksperimentel, og nogle funktioner er begrÃĻnsede." - }, "customFields": { "message": "Brugerdefinerede felter" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolsk" }, + "cfTypeCheckbox": { + "message": "Afkrydsningsfelt" + }, "cfTypeLinked": { "message": "Forbundet", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Vis et genkendeligt billede ud for hvert login." }, + "faviconDescAlt": { + "message": "Vis et genkendeligt billede ved siden af hvert login. GÃĻlder for alle indloggede konti." + }, "enableBadgeCounter": { "message": "Vis badge-tÃĻller" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitet" }, + "typeSshKey": { + "message": "SSH-nøgle" + }, + "newItemHeader": { + "message": "Ny $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "RedigÊr $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Vis $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Adgangskodehistorik" }, + "generatorHistory": { + "message": "Generatorhistorik" + }, + "clearGeneratorHistoryTitle": { + "message": "Ryd generatorhistorik" + }, + "cleargGeneratorHistoryDescription": { + "message": "FortsÃĻtter man, slettes alle poster permanent fra generatorens historik. Sikker pÃĨ, at handlingen skal udføres?" + }, "back": { "message": "Tilbage" }, "collections": { "message": "Samlinger" }, + "nCollections": { + "message": "$COUNT$ samlinger", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoritter" }, @@ -1282,6 +1874,10 @@ "message": "Grund-domÃĻne", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "BasisdomÃĻne (anbefalet)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "DomÃĻnenavn", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Matchmetode", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Standard matchmetode", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Skift indstillinger" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Der er ingen kodeord at vise." }, + "clearHistory": { + "message": "Ryd historik" + }, + "nothingToShow": { + "message": "Intet at vise" + }, + "nothingGeneratedRecently": { + "message": "Intet genereret for nylig" + }, "remove": { "message": "Fjern" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "LÃĨs op med pinkode" }, + "setYourPinTitle": { + "message": "Indstil PIN-kode" + }, + "setYourPinButton": { + "message": "Indstil PIN-kode" + }, "setYourPinCode": { "message": "Indstil din pinkode til at lÃĨse Bitwarden op. Dine pin-indstillinger nulstilles, hvis du nogensinde logger helt ud af programmet." }, + "setYourPinCode1": { + "message": "PIN-koden vil blive brugt til oplÃĨsning af Bitwarden i stedet for hovedadgangskoden. PIN-koden nulstilles, hvis man logger helt ud af Bitwarden." + }, "pinRequired": { "message": "Pinkode er pÃĨkrÃĻvet." }, "invalidPin": { "message": "Ugyldig pinkode." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "For mange ugyldige PIN-koder indtastet. Logger ud." + }, "unlockWithBiometrics": { "message": "LÃĨs op med biometri" }, + "unlockWithMasterPassword": { + "message": "OplÃĨs med hovedadgangskode" + }, "awaitDesktop": { "message": "Afventer bekrÃĻftelse fra skrivebordet" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "LÃĨs med hovedadgangskode ved genstart af browseren" }, + "lockWithMasterPassOnRestart1": { + "message": "KrÃĻver hovedadgangskode efter genstart af webbrowseren" + }, "selectOneCollection": { "message": "Du skal vÃĻlge minimum Ên samling." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Én eller flere organisationspolitikker pÃĨvirker dine generatorindstillinger." }, + "passwordGenerator": { + "message": "Adgangskodegenerator" + }, + "usernameGenerator": { + "message": "Brugernavngenerator" + }, + "useThisPassword": { + "message": "Anvend denne adgangskode" + }, + "useThisUsername": { + "message": "Anvend dette brugernavn" + }, + "securePasswordGenerated": { + "message": "Sikker adgangskode genereret! Glem ikke at opdatere adgangskoden pÃĨ webstedet ogsÃĨ." + }, + "useGeneratorHelpTextPartOne": { + "message": "Anvend generatoren", + "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": "til at oprette en stÃĻrk, unik adgangskode", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Boks timeout-handling" }, + "vaultTimeoutAction1": { + "message": "Timeouthandling" + }, "lock": { "message": "LÃĨs", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkurv", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Element gendannet" }, + "alreadyHaveAccount": { + "message": "Har allerede en konto?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Ved at logge ud fjernes al adgang til din boks og krÃĻver online-godkendelse efter timeout-perioden. Er du sikker pÃĨ, at du vil bruge denne indstilling?" }, @@ -1461,17 +2113,20 @@ "autoFillAndSave": { "message": "Autoudfyld og gem" }, + "fillAndSave": { + "message": "Udfyld og gem" + }, "autoFillSuccessAndSavedUri": { - "message": "Autoudfyldte element og URI gemt" + "message": "Emne autoudfyldt og URI gemt" }, "autoFillSuccess": { - "message": "Autoudfyldte element" + "message": "Emne autoudfyldt " }, "insecurePageWarning": { "message": "Advarsel: Dette er en ikke-sikret HTTP side, og alle indsendte oplysninger kan potentielt ses og ÃĻndres af andre. Dette login blev oprindeligt gemt pÃĨ en sikker (HTTPS) side." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "Ønsker dette login stadig udfyldt?" }, "autofillIframeWarning": { "message": "Formularen hostes af et andet domÃĻne end URI'en for det gemte login. VÃĻlg OK for at autoudfylde alligevel, eller Afbryd for at stoppe." @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Din nye hovedadgangskode opfylder ikke politikkravene." }, + "receiveMarketingEmailsV2": { + "message": "FÃĨ rÃĨd, bekendtgørelser og forskningsmuligheder fra Bitwarden i indbakken." + }, + "unsubscribe": { + "message": "Afmeld" + }, + "atAnyTime": { + "message": "til enhver tid." + }, + "byContinuingYouAgreeToThe": { + "message": "Ved at fortsÃĻtte, accepterer du" + }, + "and": { + "message": "og" + }, "acceptPolicies": { "message": "Ved at markere dette felt accepterer du følgende:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Adgangstoken genopfriskningsfejl" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Ingen genopfriskningstoken eller API-nøgler fundet. Prøv at logge ud og dernÃĻst ind igen." + }, "desktopSyncVerificationTitle": { "message": "Verifikation af skrivebordssynkronisering" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Konto mismatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometrisk nøgle matcher ikke" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrisk oplÃĨsning mislykkedes. Den hemmelige biometriske nøgle kunne ikke oplÃĨse boksen. Prøv at opsÃĻtte biometri igen." + }, "biometricsNotEnabledTitle": { "message": "Biometri ikke aktiveret" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "Browserbiometri understøttes ikke pÃĨ denne enhed." }, + "biometricsNotUnlockedTitle": { + "message": "Bruger lÃĨst eller logget ud" + }, + "biometricsNotUnlockedDesc": { + "message": "OplÃĨs denne bruger op i computerprogrammet og forsøg igen." + }, + "biometricsNotAvailableTitle": { + "message": "Biometrisk oplÃĨsning utilgÃĻngelig" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrisk oplÃĨsning er p.t. ikke tilgÃĻngelig. Prøv igen senere." + }, "biometricsFailedTitle": { "message": "Biometri mislykkedes" }, "biometricsFailedDesc": { - "message": "Biometri kan ikke fuldføres, overvej at bruge en hovedadgangskode eller logge ud og ind igen. FortsÃĻtter problemet, kontakt Bitwarden-supporten." + "message": "Biometri kan ikke gennemføres. Overvej at bruge en hovedadgangskode eller at logge ud. FortsÃĻtter problemet, kontakt Bitwarden-supporten." }, "nativeMessaginPermissionErrorTitle": { "message": "Tilladelse ikke givet" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "En organisationspolitik pÃĨvirker dine ejerskabsmuligheder." }, + "personalOwnershipPolicyInEffectImports": { + "message": "En organisationspolitik hindrer import af emner til den individuelle boks." + }, + "domainsTitle": { + "message": "DomÃĻner", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Ekskluderede domÃĻner" }, "excludedDomainsDesc": { "message": "Bitwarden vil ikke bede om at gemme login-detaljer for disse domÃĻner. Du skal opdatere siden for at ÃĻndringerne kan trÃĻde i kraft." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden vil ikke anmode om at gemme login-detaljer for disse domÃĻner for alle indloggede konti. Siden skal opfriskes for at effektuere ÃĻndringerne." + }, + "websiteItemLabel": { + "message": "Websted $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ er ikke et gyldigt domÃĻne", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Ekskluderet domÃĻne-ÃĻndringer gemt" + }, + "limitSendViews": { + "message": "BegrÃĻns visninger" + }, + "limitSendViewsHint": { + "message": "Ingen kan se denne Send efter grÃĻnsen er nÃĨet.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ visninger tilbage", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send-detaljer", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Søg i Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Tekst, der skal deles" + }, "sendTypeFile": { "message": "Fil" }, @@ -1666,6 +2406,9 @@ "message": "Alle Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Skjul tekst som standard" + }, "maxAccessCountReached": { "message": "Maksimalt adgangsantal nÃĨet", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Kodeordsbeskyttet" }, + "copyLink": { + "message": "KopiÊr link" + }, "copySendLink": { "message": "KopiÊr Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Er du sikker pÃĨ, at du vil slette denne Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Sikker pÃĨ, at denne Send skal slettes permanent?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "RedigÊr Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send'en slettes permanent pÃĨ den angivne dato og tid.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Denne Send slettes permanent pÃĨ denne dato.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Udløbsdato" }, @@ -1769,6 +2523,10 @@ "message": "Valgfrit brugeradgangskodekrav for at tilgÃĨ denne Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Tilføj en valgfri adgangskode til modtagere for adgang til denne Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notater om denne Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send oprettet", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send er hermed oprettet!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Denne Send vil vÃĻre tilgÃĻngelig for alle med linket den kommende time.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Denne Send vil vÃĻre tilgÃĻngelig for alle med linket de kommende $HOURS$ timer.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Denne Send vil vÃĻre tilgÃĻngelig for alle med linket den kommende dag.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Denne Send vil vÃĻre tilgÃĻngelig for alle med linket de kommende $DAYS$ dage.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send-link kopieret", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send gemt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop udvidelsen ud?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "For at oprette en fil-Send, skal udvidelsen poppes ud i et nyt vindue.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "For at vÃĻlge en fil, ÃĨben udvidelsen i sidepanelet (om muligt) eller pop ud til et nyt vindue ved at klikke pÃĨ dette banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "For at vÃĻlge en fil i Safari skal du ÃĨbne i et nyt vindue ved at klikke pÃĨ dette banner." }, + "popOut": { + "message": "Pop ud" + }, "sendFileCalloutHeader": { "message": "Før du starter" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Skjul min e-mailadresse for modtagere." }, + "hideYourEmail": { + "message": "Skjul e-mailadressen for modtagere." + }, "sendOptionsPolicyInEffect": { "message": "Én eller flere organisationspolitikker pÃĨvirker dine Send-valgmuligheder." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "E-mailbekrÃĻftelse krÃĻves" }, + "emailVerifiedV2": { + "message": "E-mail bekrÃĻftet" + }, "emailVerificationRequiredDesc": { "message": "Du skal bekrÃĻfte din e-mail for at bruge denne funktion. Du kan bekrÃĻfte din e-mail i web-boksen." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Din hovedadgangskode overholder ikke en eller flere organisationspolitikker. For at fÃĨ adgang til boksen skal hovedadgangskode opdateres nu. FortsÃĻttes, logges du ud af den nuvÃĻrende session og vil skulle logger ind igen. Aktive sessioner pÃĨ andre enheder kan forblive aktive i op til Ên time." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Organisationen har deaktiveret betroet enhedskryptering. OpsÃĻt en hovedadgangskode for at tilgÃĨ boksen." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatisk tilmelding" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "VÃĻlg mappe..." }, - "ssoCompleteRegistration": { - "message": "For at fuldføre indlogning med SSO skal du opsÃĻtte en hovedadgangskode for at fÃĨ adgang til samt beskytte din boks." + "noFoldersFound": { + "message": "Ingen mapper fundet", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Organisationstilladelserne er blevet opdateret, og der krÃĻves nu oprettelse af en hovedadgangskode.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Organisationen krÃĻver, at der oprettes en hovedadgangskode.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "ud af $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "BekrÃĻftelse krÃĻves", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Timer" @@ -1904,8 +2740,37 @@ "minutes": { "message": "Minutter" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Virksomhedspolitikkrav er anvendt pÃĨ disse timeoutindstillinger" + }, "vaultTimeoutPolicyInEffect": { - "message": "Organisationspolitikker har sat maks. tilladt boks-timeout. til $HOURS$ time(r) og $MINUTES$ minut(ter).", + "message": "Organisationspolitikkerne har fastsat den maksimalt tilladte boks-timeout til $HOURS$ time(r) og $MINUTES$ minut(ter).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ time(r) og $MINUTES$ minut(ter) maks.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout overskrider den af organisationen angivne restriktion: $HOURS$ time(r) og $MINUTES$ minut(ter) maks.", "placeholders": { "hours": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Eksport af organisationsboks" + }, + "exportingOrganizationVaultDesc": { + "message": "Kun organisationsboksen tilknyttet $ORGANIZATION$ eksporteres. Emner i individuelle bokse eller andre organisationer medtages ikke.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Fejl" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "GenerÊr brugernavn" }, + "generateEmail": { + "message": "GenerÊr e-mail" + }, + "generatorBoundariesHint": { + "message": "VÃĻrdi skal vÃĻre mellem $MIN$ og $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Brugernavnstype" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "GenerÊr et e-mail alias med en ekstern viderestillingstjeneste." }, + "forwarderDomainName": { + "message": "E-maildomÃĻne", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "VÃĻlg et domÃĻne understøttet af den valgte tjeneste", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$-fejl: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Genereret af Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Websted: $WEBSITE$. Genereret af Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Ugyldigt $SERVICENAME$ API-token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Ugyldigt $SERVICENAME$ API-token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Kan ikke fÃĨ $SERVICENAME$ maskeret e-mailkonto-ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Ugyldigt $SERVICENAME$-domÃĻne.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Ugyldig $SERVICENAME$-URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ukendt $SERVICENAME$-fejl opstod.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Ukendt videresender: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "VÃĻrtsnavn", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "SÃĨdan autoudfyldes" }, "autofillSelectInfoWithCommand": { - "message": "VÃĻlg et element fra denne side eller brug genvejen: $COMMAND$", + "message": "VÃĻlg et emne fra denne skÃĻrm, brug genvejen $COMMAND$ eller udforsk andre valgmuligheder i Indstillinger.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "VÃĻlg et element fra denne side eller opret en genvej i Indstillinger." + "message": "VÃĻlg et emne fra denne skÃĻrm eller udforsk andre valgmuligheder i Indstillinger." }, "gotIt": { "message": "ForstÃĨet" }, "autofillSettings": { - "message": "Autoudfyldelsesindstillinger" + "message": "Autoudfyldnigsindstillinger" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autoudfyld-genvej" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Ændre genvej" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "HÃĨndtÊr genveje" }, "autofillShortcut": { "message": "Autoudfyld-tastaturgenvej" }, - "autofillShortcutNotSet": { - "message": "Autoudfyldningsgenvejen er ikke opsat. Ændr dette i browserens indstillinger." + "autofillLoginShortcutNotSet": { + "message": "Autoudfyldningsgenvejen er ikke opsat. Ændr dette i webbrowserens indstillinger." }, - "autofillShortcutText": { - "message": "Autoudfyldningsgenvejen er: $COMMAND$. Ændr dette i browserens indstillinger.", + "autofillLoginShortcutText": { + "message": "Autoudfyldningsgenvejen er $COMMAND$. Ændr dette i webbrowserens indstillinger.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logger ind pÃĨ" - }, "opensInANewWindow": { "message": "Åbnes i et nyt vindue" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organisations SSO-identifikator krÃĻves." }, + "creatingAccountOn": { + "message": "Opretter konto pÃĨ" + }, + "checkYourEmail": { + "message": "Tjek din e-mail" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Følg linket i e-mailen sendt til" + }, + "andContinueCreatingYourAccount": { + "message": "og fortsÃĻt med kontooprettelsen." + }, + "noEmail": { + "message": "Ingen e-mail?" + }, + "goBack": { + "message": "GÃĨ tilbage" + }, + "toEditYourEmailAddress": { + "message": "for at redigere e-mailadressen." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Adgang nÃĻgtet. Nødvendig tilladelse til at se siden mangler." }, @@ -2277,7 +3302,7 @@ "message": "Generelt" }, "display": { - "message": "Display" + "message": "SkÃĻrm" }, "accountSuccessfullyCreated": { "message": "Konto oprettet!" @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Enhed betroet" }, + "sendsNoItemsTitle": { + "message": "Ingen aktive Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Brug Send til at dele krypterede oplysninger sikkert med nogen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input obligatorisk." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 felt krÃĻver opmÃĻrksomhed." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ felter krÃĻver opmÃĻrksomhed.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- VÃĻlg --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Fold sammen/ud", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "ImportÊr data til Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Beskyt LastPass-data og importÊr dem til Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Gem som ukrypteret fil", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "ImportÊr til Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importerer...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data er nu importeret!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Fejl under import. Tjek konsollen for detaljer.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "NetvÃĻrksfejl opstod under import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "AliasdomÃĻne" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Emner, hvor der anmodes om hovedadgangskode igen, kan ikke autoudfyldes ved sideindlÃĻsning. Autoudfyldning ved sideindlÃĻsning er slÃĨet fra.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autoudfyldning ved sideindlÃĻsning sat til standardindstillingen.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "SlÃĨ anmodning om hovedadgangskode igen fra for at redigere dette felt", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "SlÃĨ sidenavigering til/fra" + }, + "skipToContent": { + "message": "Spring til indhold" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autoudfyld-menuknap", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "SlÃĨ Bitwarden autoudfyld--menu til/fra", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autoudfyld-menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "OplÃĨs kontoen for at se matchende logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "OplÃĨs kontoen for at fÃĨ vist autoudfyldningsforslag", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "OplÃĨs konto", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "OplÃĨs kontoen, ÃĨbnes i et nyt vindue", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Angiv legitimationsoplysninger for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Delvis brugernavn", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Ingen emner at vise", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nyt emne", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Tilføj nyt Boks-emne", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Nyt login", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Tilføj nyt boks-login emne, ÃĨbnes i et nyt vindue", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Nyt kort", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Tilføj nyt boks-kort emne, ÃĨbnes i et nyt vindue", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Ny identitet", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Tilføj nyt boks-identitetsemne, ÃĨbnes i et nyt vindue", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden autoudfyld-menu tilgÃĻngelig. Tryk pÃĨ pil ned-tasten for at vÃĻlge.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "SlÃĨ til" + }, + "ignore": { + "message": "IgnorÊr" + }, + "importData": { + "message": "ImportÊr data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Importfejl" + }, + "importErrorDesc": { + "message": "Der var et problem med de data, som blev forsøgt importeret. Ret nedenstÃĨende fejl i kildefilen, og forsøg igen." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Ret fejlene nedenfor og forsøg igen." + }, + "description": { + "message": "Beskriveslse" + }, + "importSuccess": { + "message": "Data er hermed importeret" + }, + "importSuccessNumberOfItems": { + "message": "I alt $AMOUNT$ emner blev importeret.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Forsøg igen" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "BekrÃĻftelse krÃĻves for denne handling. OpsÃĻt en PIN-kode for at fortsÃĻtte." + }, + "setPin": { + "message": "OpsÃĻt PIN-kode" + }, + "verifyWithBiometrics": { + "message": "BekrÃĻft med biometri" + }, + "awaitingConfirmation": { + "message": "Afventer bekrÃĻftelse" + }, + "couldNotCompleteBiometrics": { + "message": "Kunne ikke fÃĻrdiggøre biometri." + }, + "needADifferentMethod": { + "message": "Brug for en anden metode?" + }, + "useMasterPassword": { + "message": "Brug hovedadgangskode" + }, + "usePin": { + "message": "Brug PIN-kode" + }, + "useBiometrics": { + "message": "Brug biometri" + }, + "enterVerificationCodeSentToEmail": { + "message": "Angiv bekrÃĻftelseskoden tilsendt pr. e-mail." + }, + "resendCode": { + "message": "Send kode igen" + }, + "total": { + "message": "I alt" + }, + "importWarning": { + "message": "Data, som kan blive delt med organisationsmedlemmerne, er ved at blive importeret til $ORGANIZATION$. FortsÃĻt?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Fejl under forbindelsesoprettelsen til Duo-tjenesten. Brug en anden totrins-indlogningsmetode eller kontakt Duo for hjÃĻlp." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Start Duo og følg trinnene for at fuldføre indlogningen." + }, + "duoRequiredForAccount": { + "message": "Duo-totrinsindlogning krÃĻves for kontoen." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Pop udvidelsen ud for at fuldføre indlogning." + }, + "popoutExtension": { + "message": "Pop ud-udvidelse" + }, + "launchDuo": { + "message": "Start Duo" + }, + "importFormatError": { + "message": "Data er ikke korrekt formateret. Tjek importfilen og forsøg igen." + }, + "importNothingError": { + "message": "Intet blev importeret." + }, + "importEncKeyError": { + "message": "Fejl under dekryptering af eksporteret fil. Krypteringsnøglen matcher ikke den til dataeksporten anvendte krypteringsnøgle." + }, + "invalidFilePassword": { + "message": "Ugyldig filadgangskode. Brug samme adgangskode som under oprettelsen af eksportfilen." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "LÃĻs om importmuligheder" + }, + "selectImportFolder": { + "message": "VÃĻlg en mappe" + }, + "selectImportCollection": { + "message": "VÃĻlg en samling" + }, + "importTargetHint": { + "message": "VÃĻlg denne indstilling, hvis importeret filindhold skal flyttet til en $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Fil indeholder ikke-tildelte emner." + }, + "selectFormat": { + "message": "VÃĻlg formatet for importfilen" + }, + "selectImportFile": { + "message": "VÃĻlg importfil" + }, + "chooseFile": { + "message": "VÃĻlg fil" + }, + "noFileChosen": { + "message": "Ingen fil valgt" + }, + "orCopyPasteFileContents": { + "message": "eller kopiÊr/indsÃĻt importfilens indhold" + }, + "instructionsFor": { + "message": "$NAME$-vejledning", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "BekrÃĻft Boks-import" + }, + "confirmVaultImportDesc": { + "message": "Denne fil er adgangskodebeskyttet. Angiv filadgangskoden for at importere data." + }, + "confirmFilePassword": { + "message": "BekrÃĻft filadgangskode" + }, + "exportSuccess": { + "message": "Boksdata eksporteret" + }, + "typePasskey": { + "message": "Adgangsnøgle" + }, + "accessing": { + "message": "TilgÃĨr" + }, + "passkeyNotCopied": { + "message": "Adgangsnøglen kopieres ikke" + }, + "passkeyNotCopiedAlert": { + "message": "Adgangsnøglen kopieres ikke til det klonede emne. FortsÃĻt kloningen af emnet alligevel?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "BekrÃĻftelse krÃĻvet af startwebstedet. Denne funktion er endnu ikke implementeret for konti uden hovedadgangskode." + }, + "logInWithPasskeyQuestion": { + "message": "Log ind med adgangsnøgle?" + }, + "passkeyAlreadyExists": { + "message": "En adgangsnøgle findes allerede til denne applikation." + }, + "noPasskeysFoundForThisApplication": { + "message": "Ingen adgangsnøgler fundet til denne applikation." + }, + "noMatchingPasskeyLogin": { + "message": "Der er intet matchende login til dette websted." + }, + "noMatchingLoginsForSite": { + "message": "Ingen matchende logins for dette websted" + }, + "searchSavePasskeyNewLogin": { + "message": "Søg eller gem adgangsnøgle som nyt login" + }, + "confirm": { + "message": "BekrÃĻft" + }, + "savePasskey": { + "message": "Gem adgangsnøgle" + }, + "savePasskeyNewLogin": { + "message": "Gem adgangsnøgle som nyt login" + }, + "chooseCipherForPasskeySave": { + "message": "VÃĻlg et login at gemme denne adgangsnøgle til" + }, + "chooseCipherForPasskeyAuth": { + "message": "VÃĻlg en adgangsnøgle at logge ind med" + }, + "passkeyItem": { + "message": "Adgangsnøgleemne" + }, + "overwritePasskey": { + "message": "Overskriv adgangsnøgle?" + }, + "overwritePasskeyAlert": { + "message": "Emnet indeholder allerede en adgangsnøgle. Sikker pÃĨ, at den aktuelle adgangsnøgle skal overskrives?" + }, + "featureNotSupported": { + "message": "Funktionen understøttes ikke endnu" + }, + "yourPasskeyIsLocked": { + "message": "Godkendelse krÃĻves for brug af adgangsnøgle. BekrÃĻft din identitet for at fortsÃĻtte." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifaktorgodkendelse afbrudt" + }, + "noLastPassDataFound": { + "message": "Ingen LastPass-data fundet" + }, + "incorrectUsernameOrPassword": { + "message": "Forkert brugernavn eller adgangskode" + }, + "incorrectPassword": { + "message": "Forkert adgangskode" + }, + "incorrectCode": { + "message": "Forkert kode" + }, + "incorrectPin": { + "message": "Forkert PIN-kode" + }, + "multifactorAuthenticationFailed": { + "message": "Multifaktorgodkendelse mislykkedes" + }, + "includeSharedFolders": { + "message": "Medtag delte mapper" + }, + "lastPassEmail": { + "message": "LastPass e-mail" + }, + "importingYourAccount": { + "message": "Importerer kontoen..." + }, + "lastPassMFARequired": { + "message": "LastPass-multifaktorgodkendelse krÃĻves" + }, + "lastPassMFADesc": { + "message": "Angiv engangskoden fra godkendelses-appen" + }, + "lastPassOOBDesc": { + "message": "Godkend loginanmodningen i godkendelses-appen eller angiv en engangskode." + }, + "passcode": { + "message": "Adgangskode" + }, + "lastPassMasterPassword": { + "message": "LastPass-hovedadgangskode" + }, + "lastPassAuthRequired": { + "message": "LastPass-godkendelse krÃĻves" + }, + "awaitingSSO": { + "message": "Afventer SSO-godkendelse" + }, + "awaitingSSODesc": { + "message": "FortsÃĻt indlogningen med virksomhedslegitimationsoplysningerne." + }, + "seeDetailedInstructions": { + "message": "Se detaljeret vejledning pÃĨ vores hjÃĻlpeside pÃĨ", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import direkte fra LastPass" + }, + "importFromCSV": { + "message": "Import fra CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Forsøg igen eller kig efter en e-mail fra LastPass for at bekrÃĻfte, at det er dig." + }, + "collection": { + "message": "Samling" + }, + "lastPassYubikeyDesc": { + "message": "IndsÃĻt den til LastPass-kontoen tilknyttede YubiKey i computers USB-port, og tryk dernÃĻst pÃĨ dens knap." + }, + "switchAccount": { + "message": "Skift konto" + }, + "switchAccounts": { + "message": "Skift konti" + }, + "switchToAccount": { + "message": "Skift til konto" + }, + "activeAccount": { + "message": "Aktiv konto" + }, + "availableAccounts": { + "message": "TilgÃĻngelige konti" + }, + "accountLimitReached": { + "message": "Kontokvote nÃĨet. Log ud af en konto for at tilføje en anden." + }, + "active": { + "message": "aktiv" + }, + "locked": { + "message": "lÃĨst" + }, + "unlocked": { + "message": "oplÃĨst" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hostet hos" + }, + "useDeviceOrHardwareKey": { + "message": "Brug din enhed eller hardwarenøgle" + }, + "justOnce": { + "message": "Kun Ên gang" + }, + "alwaysForThisSite": { + "message": "Altid for dette websted" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ føjet til undtagne domÃĻner.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Almindelige formater", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "FortsÃĻt til Browserindstillinger?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "FortsÃĻt til HjÃĻlpecenter?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Skift browserens indstillinger for autofyldning og adgangskodehÃĨndtering.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "Man kan se og indstille udvidelsesgenveje via Browserindstillinger.", + "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": "Skift browserens indstillinger for autofyldning og adgangskodehÃĨndtering.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "Man kan se og indstille udvidelsesgenveje via Browserindstillinger.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Lad Bitwarden hÃĨndtere adgangskoder som standard?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoreres denne indstilling, kan det forÃĨrsage konflikter mellem Bitwardens og webbrowserens autoudfyldningsforslag.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Lad Bitwarden hÃĨndtere adgangskoder som standard", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Kan ikke indstille Bitwarden som standard adgangskodehÃĨndtering", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Der skal tildeles webbrowser fortrolighedstilladelser til Bitwarden for at indstille den til at hÃĨndtere adgangskoder som standard.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Gør til standard", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Legitimationsoplysninger er gemt!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Adgangskode gemt!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Legitimationsoplysninger er opdateret!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Adgangskode opdateret!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Fejl under import. Tjek konsollen for detaljer.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Gennemført" + }, + "removePasskey": { + "message": "Fjern adgangsnøgle" + }, + "passkeyRemoved": { + "message": "Adgangsnøgle fjernet" + }, + "autofillSuggestions": { + "message": "Autoudfyldningsforslag" + }, + "autofillSuggestionsTip": { + "message": "Gem et loginemne for dette websted til autoudfyldning" + }, + "yourVaultIsEmpty": { + "message": "Boksen er tom" + }, + "noItemsMatchSearch": { + "message": "Ingen emner matcher søgningen" + }, + "clearFiltersOrTryAnother": { + "message": "Ryd filtre eller prøv med et andet søgeord" + }, + "copyInfoTitle": { + "message": "KopiÊr info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "KopiÊr notat - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Flere valgmuligheder, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Flere valgmuligheder - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Vis emne - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autoudfyld - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Ingen vÃĻrdier at kopiere" + }, + "assignToCollections": { + "message": "Tildel til samlinger" + }, + "copyEmail": { + "message": "KopiÊr e-mail" + }, + "copyPhone": { + "message": "KopiÊr telefon" + }, + "copyAddress": { + "message": "KopiÊr addresse" + }, + "adminConsole": { + "message": "Admin-konsol" + }, + "accountSecurity": { + "message": "Kontosikkerhed" + }, + "notifications": { + "message": "Notifikationer" + }, + "appearance": { + "message": "Udseende" + }, + "errorAssigningTargetCollection": { + "message": "Fejl ved tildeling af mÃĨlsamling." + }, + "errorAssigningTargetFolder": { + "message": "Fejl ved tildeling af mÃĨlmappe." + }, + "viewItemsIn": { + "message": "Vis emner i $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Retur til $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Ny/Nyt" + }, + "removeItem": { + "message": "Fjern $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Emner uden mappe" + }, + "itemDetails": { + "message": "Emnedetaljer" + }, + "itemName": { + "message": "Emnenavn" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organisation er deaktiveret" + }, + "owner": { + "message": "Ejer" + }, + "selfOwnershipLabel": { + "message": "Dig", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Emner i deaktiverede organisationer kan ikke tilgÃĨs. Kontakt organisationsejeren for assistance." + }, + "additionalInformation": { + "message": "Yderligere oplysninger" + }, + "itemHistory": { + "message": "Emnehistorik" + }, + "lastEdited": { + "message": "Senest redigeret" + }, + "ownerYou": { + "message": "Ejer: Dig" + }, + "linked": { + "message": "Linket" + }, + "copySuccessful": { + "message": "Kopieret" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Tilføj vedhÃĻftning" + }, + "maxFileSizeSansPunctuation": { + "message": "Maks. filstørrelse er 500 MB" + }, + "deleteAttachmentName": { + "message": "Slet vedhÃĻftelse $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Sikker pÃĨ, at denne vedhÃĻftning skal slettes permanent?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Gratis organisationer kan ikke bruge vedhÃĻftninger" + }, + "filters": { + "message": "Filtre" + }, + "personalDetails": { + "message": "Personlige oplysninger" + }, + "identification": { + "message": "Identifikation" + }, + "contactInfo": { + "message": "Kontaktoplysninger" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "kortnummer slutter med", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login-legitimationsoplysninger" + }, + "authenticatorKey": { + "message": "Godkendelsesnøgle" + }, + "autofillOptions": { + "message": "Autoudfyldningsindstillinger" + }, + "websiteUri": { + "message": "Websted (URI)" + }, + "websiteUriCount": { + "message": "Websted (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Websted tilføjet" + }, + "addWebsite": { + "message": "Tilføj websted" + }, + "deleteWebsite": { + "message": "Slet websted" + }, + "defaultLabel": { + "message": "Standard ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Vis matchdetektion $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Skjul matchdetektion $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autoudfyld ved sideindlÃĻsning?" + }, + "cardExpiredTitle": { + "message": "Udløbet kort" + }, + "cardExpiredMessage": { + "message": "Er det blevet fornyet, opdatÊr venligst kortoplysningerne" + }, + "cardDetails": { + "message": "Kortoplysninger" + }, + "cardBrandDetails": { + "message": "$BRAND$ oplysninger", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "AktivÊr animationer" + }, + "showAnimations": { + "message": "Vis animationer" + }, + "addAccount": { + "message": "Tilføj konto" + }, + "loading": { + "message": "IndlÃĻser" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Adgangsnøgler", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Adgangskoder", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log ind med adgangsnøgle", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Tildel" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Kun organisationsmedlemmer med adgang til disse samlinger vil kunne se emnet." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Kun organisationsmedlemmer med adgang til disse samlinger vil kunne se emnerne." + }, + "bulkCollectionAssignmentWarning": { + "message": "Der er valgt $TOTAL_COUNT$ emner. $READONLY_COUNT$ af emnerne kan ikke opdateres grundet manglende redigeringsrettigheder.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Tilføj felt" + }, + "add": { + "message": "Tilføj" + }, + "fieldType": { + "message": "Felttype" + }, + "fieldLabel": { + "message": "Feltetiket" + }, + "textHelpText": { + "message": "Brug tekstfelter til data, sÃĨsom sikkerhedsspørgsmÃĨl" + }, + "hiddenHelpText": { + "message": "Brug skjulte felter til sensitive data, sÃĨsom en adgangskode" + }, + "checkBoxHelpText": { + "message": "Brug afkrydsningsfelter, hvis et formularafkrydsningsfelt skal autoudfyldes, sÃĨsom en husket e-mail" + }, + "linkedHelpText": { + "message": "Brug et linket felt ved autoudfyldningsproblemer for et bestemt websted." + }, + "linkedLabelHelpText": { + "message": "Angiv feltets HTML-ID, navn, aria-label eller variabel." + }, + "editField": { + "message": "RedigÊr felt" + }, + "editFieldLabel": { + "message": "RedigÊr $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Slet $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ tilføjet", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "OmarrangÊr $LABEL$. Brug piletasterne til at flytte elementet op eller ned.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ flyttet op, position $INDEX$ af $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "VÃĻlg samlinger at tildele" + }, + "personalItemTransferWarningSingular": { + "message": "1 emne overføres permanent til den valgte organisation. Man vil ikke lÃĻngere vÃĻre ejeren af dette emne." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ emner overføres permanent til den valgte organisation. Man vil ikke lÃĻngere vÃĻre ejeren af disse emner.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 emne overføres permanent til $ORG$. Man vil ikke lÃĻngere vÃĻre ejeren af dette emne.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ emner overføres permanent til $ORG$. Man vil ikke lÃĻngere vÃĻre ejeren af disse emner.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Samlinger hermed tildelt" + }, + "nothingSelected": { + "message": "Ingenting er valgt." + }, + "movedItemsToOrg": { + "message": "Valgte emner flyttet til $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Emner flyttet til $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Emne flyttet til $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ flyttet ned, position $INDEX$ af $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Emneplacering" + }, + "fileSend": { + "message": "Fil Send" + }, + "fileSends": { + "message": "Fil-Sends" + }, + "textSend": { + "message": "Tekst Send" + }, + "textSends": { + "message": "Tekst-Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden har fÃĨet et nyt look!" + }, + "bitwardenNewLookDesc": { + "message": "Det er lettere og mere intuitivt end nogensinde at autoudfylde og søge via fanen Boks. Tag et kig omkring!" + }, + "accountActions": { + "message": "Kontohandlinger" + }, + "showNumberOfAutofillSuggestions": { + "message": "Vis antal login-autoudfyldningsforslag pÃĨ udvidelsesikon" + }, + "systemDefault": { + "message": "Systemstandard" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Virksomhedspolitikkrav er anvendt pÃĨ denne indstilling" + }, + "sshPrivateKey": { + "message": "Privat nøgle" + }, + "sshPublicKey": { + "message": "Offentlig nøgle" + }, + "sshFingerprint": { + "message": "Fingeraftryk" + }, + "sshKeyAlgorithm": { + "message": "Nøgletype" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Forsøg igen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Tilpasset minimumstimeout udgør 1 minut." + }, + "additionalContentAvailable": { + "message": "Yderligere indhold er tilgÃĻngeligt" + }, + "fileSavedToDevice": { + "message": "Fil gemt pÃĨ enheden. HÃĨndtÊr fra enhedens downloads." + }, + "showCharacterCount": { + "message": "Vis tegnantal" + }, + "hideCharacterCount": { + "message": "Skjul tegnantal" + }, + "itemsInTrash": { + "message": "Emner i papirkurv" + }, + "noItemsInTrash": { + "message": "Ingen emner i papirkurv" + }, + "noItemsInTrashDesc": { + "message": "Emner, som slettes, vil fremgÃĨ her og slettes permanent efter 30 dage" + }, + "trashWarning": { + "message": "Emner, som har vÃĻret i papirkurven i over 30 dage, slettes automatisk" + }, + "restore": { + "message": "Gendan" + }, + "deleteForever": { + "message": "Slet permanent" + }, + "noEditPermissions": { + "message": "Ingen tilladelse til at redigere dette emne" + }, + "authenticating": { + "message": "Godkender" + }, + "fillGeneratedPassword": { + "message": "Udfyld genereret adgangskode", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Adgangskode genereret igen", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Gem login til Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Mellemrum", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Accent grave", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "UdrÃĨbstegn", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "Snabel-a", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash-tegn", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar-tegn", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Procenttegn", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Cirkumfleks", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Og-tegn", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Stjerne", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Venstre parentes", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Højre parentes", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Understregning", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Bindestreg", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Lighedstegn", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Venstre tuborg", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Højre tuborg", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Venstre klamme", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Højre klamme", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Lodret streg", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Omvendt skrÃĨstreg", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Kolon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semikolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Dobbelt anførselstegn", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Enkelt anførselstegn", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Mindre end", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Større end", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Komma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Punktum", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "SpørgsmÃĨlstegn", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "SkrÃĨstreg", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Minuskel" + }, + "uppercaseAriaLabel": { + "message": "Majuskel" + }, + "generatedPassword": { + "message": "Genereret adgangskode" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 1b3eb19ee8e..de915ac2717 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Kostenloser Passwortmanager", + "message": "Bitwarden Passwortmanager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Ein sicherer und kostenloser Passwortmanager fÃŧr all deine Geräte.", - "description": "Extension description" + "message": "Bitwarden schÃŧtzt alle deine PasswÃļrter, Passkeys und vertrauliche Informationen - egal, wo du bist.", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Melde dich an oder erstelle ein neues Konto, um auf deinen Tresor zuzugreifen." }, + "inviteAccepted": { + "message": "Einladung angenommen" + }, "createAccount": { "message": "Konto erstellen" }, - "login": { - "message": "Anmelden" + "newToBitwarden": { + "message": "Neu bei Bitwarden?" + }, + "logInWithPasskey": { + "message": "Mit Passkey anmelden" + }, + "useSingleSignOn": { + "message": "Single Sign-on verwenden" + }, + "welcomeBack": { + "message": "Willkommen zurÃŧck" + }, + "setAStrongPassword": { + "message": "Lege ein starkes Passwort fest" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Schließe die Erstellung deines Kontos ab, indem du ein Passwort festlegst" }, "enterpriseSingleSignOn": { "message": "Enterprise Single-Sign-On" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Ein Master-Passwort-Hinweis kann dir helfen, dich an das Passwort zu erinnern, sofern du es vergessen hast." }, + "masterPassHintText": { + "message": "Wenn du dein Passwort vergessen hast, kann der Passwort-Hinweis an deine E-Mail-Adresse gesendet werden. Maximal $CURRENT$/$MAXIMUM$ Zeichen.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Master-Passwort erneut eingeben" }, "masterPassHint": { "message": "Master-Passwort-Hinweis (optional)" }, + "joinOrganization": { + "message": "Organisation beitreten" + }, + "joinOrganizationName": { + "message": "$ORGANIZATIONNAME$ beitreten", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Schließe den Beitritt zu dieser Organisation ab, indem du ein Master-Passwort festlegst." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Passwort kopieren" }, + "copyPassphrase": { + "message": "Passphrase kopieren" + }, "copyNote": { "message": "Notiz kopieren" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Sicherheitscode kopieren" }, + "copyName": { + "message": "Name kopieren" + }, + "copyCompany": { + "message": "Unternehmen kopieren" + }, + "copySSN": { + "message": "Sozialversicherungsnummer kopieren" + }, + "copyPassportNumber": { + "message": "Passnummer kopieren" + }, + "copyLicenseNumber": { + "message": "Lizenznummer kopieren" + }, + "copyPrivateKey": { + "message": "Privaten SchlÃŧssel kopieren" + }, + "copyPublicKey": { + "message": "Öffentlichen SchlÃŧssel kopieren" + }, + "copyFingerprint": { + "message": "Fingerabdruck kopieren" + }, + "copyCustomField": { + "message": "$FIELD$ kopieren", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Website kopieren" + }, + "copyNotes": { + "message": "Notizen kopieren" + }, + "fill": { + "message": "AusfÃŧllen", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-AusfÃŧllen" }, + "autoFillLogin": { + "message": "Zugangsdaten automatisch ausfÃŧllen" + }, + "autoFillCard": { + "message": "Karte automatisch ausfÃŧllen" + }, + "autoFillIdentity": { + "message": "Identität automatisch ausfÃŧllen" + }, "generatePasswordCopied": { "message": "Passwort generieren (kopiert)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Keine passenden Zugangsdaten" }, + "noCards": { + "message": "Keine Karten" + }, + "noIdentities": { + "message": "Keine Identitäten" + }, + "addLoginMenu": { + "message": "Zugangsdaten hinzufÃŧgen" + }, + "addCardMenu": { + "message": "Karte hinzufÃŧgen" + }, + "addIdentityMenu": { + "message": "Identität hinzufÃŧgen" + }, "unlockVaultMenu": { "message": "Entsperre deinen Tresor" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Eintrag hinzufÃŧgen" }, + "accountEmail": { + "message": "E-Mail-Adresse des Kontos" + }, + "requestHint": { + "message": "Hinweis anfragen" + }, + "requestPasswordHint": { + "message": "Passwort-Hinweis anfragen" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Gib deine E-Mail-Adresse ein und dein Passwort-Hinweis wird dir zugesandt" + }, "passwordHint": { "message": "Passwort-Hinweis" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Bestätige deine Identität, um fortzufahren." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Master-Passwort ändern" }, + "continueToWebApp": { + "message": "Weiter zur Web-App?" + }, + "continueToWebAppDesc": { + "message": "Entdecke weitere Funktionen deines Bitwarden-Kontos in der Web-App." + }, + "continueToHelpCenter": { + "message": "Weiter zum Hilfezentrum?" + }, + "continueToHelpCenterDesc": { + "message": "Erfahre mehr Ãŧber die Verwendung von Bitwarden im Hilfezentrum." + }, + "continueToBrowserExtensionStore": { + "message": "Weiter zum Store fÃŧr Browser-Erweiterungen?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Hilf anderen herauszufinden, ob Bitwarden fÃŧr sie das Richtige ist. Besuch den Erweiterungs-Store deines Browsers und hinterlasse jetzt eine Bewertung." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Du kannst dein Master-Passwort in der Bitwarden Web-App ändern." + }, "fingerprintPhrase": { "message": "Fingerabdruck-Phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Abmelden" }, + "aboutBitwarden": { + "message": "Über Bitwarden" + }, "about": { "message": "Über uns" }, + "moreFromBitwarden": { + "message": "Mehr von Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Weiter zu bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden fÃŧr Unternehmen" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Mit dem Bitwarden Authenticator kannst du AuthentifizierungsschlÃŧssel speichern und TOTP-Codes fÃŧr Zwei-Faktor-Verifizierungsprozesse generieren. Erfahre mehr auf der bitwarden.com Website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Speicher, verwalte und teile Entwicklergeheimnisse sicher mit dem Bitwarden Secrets Manager. Erfahre mehr auf der bitwarden.com Website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Erstelle reibungslose und sichere Anmeldeerfahrungen ohne herkÃļmmliche PasswÃļrter mit Passwordless.dev. Erfahre mehr auf der bitwarden.com Website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Du bist fÃŧr Free Bitwarden Families berechtigt. LÃļse dieses Angebot heute in der Web-App ein." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Ordner bearbeiten" }, + "newFolder": { + "message": "Neuer Ordner" + }, + "folderName": { + "message": "Ordnername" + }, + "folderHintText": { + "message": "Verschachtel einen Ordner, indem du den Namen des Ãŧbergeordneten Ordners hinzufÃŧgst, gefolgt von einem „/“. Beispiel: Social/Foren" + }, + "noFoldersAdded": { + "message": "Keine Ordner hinzugefÃŧgt" + }, + "createFoldersToOrganize": { + "message": "Erstelle Ordner, um deine Tresor-Einträge zu organisieren" + }, + "deleteFolderPermanently": { + "message": "Bist du sicher, dass du diesen Ordner dauerhaft lÃļschen willst?" + }, "deleteFolder": { "message": "Ordner lÃļschen" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Generiert automatisch ein starkes und einzigartiges Passwort." }, - "bitWebVault": { - "message": "Bitwarden Web-Tresor" + "bitWebVaultApp": { + "message": "Bitwarden Web-App" }, "importItems": { "message": "Einträge importieren" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Passwort generieren" }, + "generatePassphrase": { + "message": "Passphrase generieren" + }, "regeneratePassword": { "message": "Passwort neu generieren" }, @@ -244,17 +447,60 @@ "length": { "message": "Länge" }, + "passwordMinLength": { + "message": "Minimale Passwortlänge" + }, "uppercase": { - "message": "Großbuchstaben (A-Z)" + "message": "Großbuchstaben (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Kleinbuchstaben (a-z)" + "message": "Kleinbuchstaben (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Zahlen (0-9)" + "message": "Zahlen (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Sonderzeichen (!@#$%^&*)" + "message": "Sonderzeichen (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Einschließen", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Großbuchstaben einschließen", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Kleinbuchstaben einschließen", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Ziffern einschließen", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Sonderzeichen einschließen", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Anzahl der WÃļrter" @@ -276,7 +522,16 @@ "message": "Mindestanzahl Sonderzeichen" }, "avoidAmbChar": { - "message": "Mehrdeutige Zeichen vermeiden" + "message": "Mehrdeutige Zeichen vermeiden", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Mehrdeutige Zeichen vermeiden", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Die Unternehmensrichtlinien-Anforderungen wurden auf deine Generator-Optionen angewendet.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Tresor durchsuchen" @@ -299,15 +554,30 @@ "password": { "message": "Passwort" }, + "totp": { + "message": "Authentifikator-Geheimnis" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favoriten" }, + "unfavorite": { + "message": "Aus Favoriten entfernen" + }, + "itemAddedToFavorites": { + "message": "Eintrag zu Favoriten hinzugefÃŧgt" + }, + "itemRemovedFromFavorites": { + "message": "Eintrag aus Favoriten entfernt" + }, "notes": { "message": "Notizen" }, + "privateNote": { + "message": "Private Notiz" + }, "note": { "message": "Notiz" }, @@ -326,6 +596,18 @@ "launch": { "message": "Öffnen" }, + "launchWebsite": { + "message": "Website Ãļffnen" + }, + "launchWebsiteName": { + "message": "Website aufrufen: $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Webseite" }, @@ -338,9 +620,24 @@ "other": { "message": "Sonstige" }, + "unlockMethods": { + "message": "Entsperroptionen" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Richte eine Entsperrmethode ein, um deine Aktion bei Timeout-Timeout zu ändern." }, + "unlockMethodNeeded": { + "message": "Lege eine Entsperrmethode in den Einstellungen fest" + }, + "sessionTimeoutHeader": { + "message": "Sitzungs-Timeout" + }, + "vaultTimeoutHeader": { + "message": "Tresor-Timeout" + }, + "otherOptions": { + "message": "Andere Optionen" + }, "rateExtension": { "message": "Erweiterung bewerten" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Dein Tresor ist gesperrt. Verifiziere deine Identität, um fortzufahren." }, + "yourVaultIsLockedV2": { + "message": "Dein Tresor ist gesperrt" + }, + "yourAccountIsLocked": { + "message": "Dein Konto ist gesperrt" + }, + "or": { + "message": "oder" + }, "unlock": { "message": "Entsperren" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Tresor-Timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Jetzt sperren" }, + "lockAll": { + "message": "Alles sperren" + }, "immediately": { "message": "Sofort" }, @@ -426,6 +738,18 @@ "security": { "message": "Sicherheit" }, + "confirmMasterPassword": { + "message": "Master-Passwort bestätigen" + }, + "masterPassword": { + "message": "Master-Passwort" + }, + "masterPassImportant": { + "message": "Dein Master-Passwort kann nicht wiederhergestellt werden, wenn du es vergisst!" + }, + "masterPassHintLabel": { + "message": "Master-Passwort-Hinweis" + }, "errorOccurred": { "message": "Ein Fehler ist aufgetaucht" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Dein neues Konto wurde erstellt! Du kannst dich jetzt anmelden." }, + "newAccountCreated2": { + "message": "Dein neues Konto wurde erstellt!" + }, + "youHaveBeenLoggedIn": { + "message": "Du wurdest angemeldet!" + }, + "youSuccessfullyLoggedIn": { + "message": "Du hast dich erfolgreich angemeldet." + }, + "youMayCloseThisWindow": { + "message": "Du kannst dieses Fenster schließen." + }, "masterPassSent": { "message": "Wir haben dir eine E-Mail mit dem Master-Passwort-Hinweis geschickt." }, "verificationCodeRequired": { "message": "Verifizierungscode wird benÃļtigt." }, + "webauthnCancelOrTimeout": { + "message": "Die Authentifizierung wurde abgebrochen oder hat zu lange gedauert. Bitte versuche es erneut." + }, "invalidVerificationCode": { "message": "UngÃŧltiger Verifizierungscode" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Die Felder dieser Seite konnten nicht automatisch ausgefÃŧllt werden. Bitte Nutzernamen und/oder Passwort manuell kopieren." + "message": "Die Felder dieser Seite konnten nicht automatisch ausgefÃŧllt werden. Kopiere die Informationen und fÃŧge sie manuell ein." + }, + "totpCaptureError": { + "message": "QR-Code kann nicht von der aktuellen Webseite gescannt werden" + }, + "totpCaptureSuccess": { + "message": "AuthentifizierungsschlÃŧssel hinzugefÃŧgt" + }, + "totpCapture": { + "message": "Den Authentifizierungs-QR-Code von der aktuellen Webseite scannen" + }, + "totpHelperTitle": { + "message": "Zwei-Faktor-Authentifizierung nahtlos gestalten" + }, + "totpHelper": { + "message": "Bitwarden kann Zwei-Faktor-Authentifizierungsscodes speichern und ausfÃŧllen. Kopiere und fÃŧge den SchlÃŧssel in dieses Feld ein." + }, + "totpHelperWithCapture": { + "message": "Bitwarden kann Zwei-Faktor-Authentifizierungsscodes speichern und ausfÃŧllen. Wähle das Kamerasymbol aus, um einen Screenshot des Authenticator-QR-Codes dieser Website zu machen oder kopiere und fÃŧge den SchlÃŧssel in dieses Feld ein." + }, + "learnMoreAboutAuthenticators": { + "message": "Erfahre mehr Ãŧber Authenticator-Apps" + }, + "copyTOTP": { + "message": "AuthentifizierungsschlÃŧssel kopieren (TOTP)" }, "loggedOut": { "message": "Ausgeloggt" }, + "loggedOutDesc": { + "message": "Du wurdest von deinem Konto abgemeldet." + }, "loginExpired": { "message": "Ihre Login-Sitzung ist abgelaufen." }, + "logIn": { + "message": "Anmelden" + }, + "logInToBitwarden": { + "message": "Bei Bitwarden anmelden" + }, + "restartRegistration": { + "message": "Registrierung neu starten" + }, + "expiredLink": { + "message": "Abgelaufener Link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Bitte starte die Registrierung erneut oder versuche dich anzumelden." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Du hast mÃļglicherweise bereits ein Konto" + }, "logOutConfirmation": { "message": "Bist du sicher, dass du dich abmelden willst?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Ordner hinzugefÃŧgt" }, - "changeMasterPass": { - "message": "Master-Passwort ändern" - }, - "changeMasterPasswordConfirmation": { - "message": "Du kannst dein Master-Passwort im Bitwarden.com Web-Tresor ändern. MÃļchtest du die Seite jetzt Ãļffnen?" - }, "twoStepLoginConfirmation": { "message": "Mit der Zwei-Faktor-Authentifizierung wird dein Konto zusätzlich abgesichert, da jede Anmeldung mit einem anderen Gerät wie einem SicherheitsschlÃŧssel, einer Authentifizierungs-App, einer SMS, einem Anruf oder einer E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im bitwarden.com Web-Tresor aktiviert werden. MÃļchtest du die Website jetzt Ãļffnen?" }, + "twoStepLoginConfirmationContent": { + "message": "Mache dein Konto sicherer, indem du eine Zwei-Faktor-Authentifizierung in der Bitwarden Web-App einrichtest." + }, + "twoStepLoginConfirmationTitle": { + "message": "Weiter zur Web-App?" + }, "editedFolder": { "message": "Ordner gespeichert" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Neue URL" }, + "addDomain": { + "message": "Domain hinzufÃŧgen", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Eintrag hinzugefÃŧgt" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Nach dem HinzufÃŧgen von Zugangsdaten fragen" }, + "vaultSaveOptionsTitle": { + "message": "Optionen zum Speichern im Tresor" + }, "addLoginNotificationDesc": { "message": "Nach dem HinzufÃŧgen eines Eintrags fragen, wenn dieser nicht in deinem Tresor gefunden wurde." }, + "addLoginNotificationDescAlt": { + "message": "Nach dem HinzufÃŧgen eines Eintrags fragen, wenn er nicht in deinem Tresor gefunden wurde. Gilt fÃŧr alle angemeldeten Konten." + }, + "showCardsInVaultView": { + "message": "Karten als Vorschläge zum Auto-AusfÃŧllen in der Tresor-Ansicht anzeigen" + }, "showCardsCurrentTab": { "message": "Karten auf Tab Seite anzeigen" }, "showCardsCurrentTabDesc": { "message": "Karten-Einträge auf der Tab Seite anzeigen, um das Auto-AusfÃŧllen zu vereinfachen." }, + "showIdentitiesInVaultView": { + "message": "Identitäten als Vorschläge zum Auto-AusfÃŧllen in der Tresor-Ansicht anzeigen" + }, "showIdentitiesCurrentTab": { "message": "Identitäten auf Tab Seite anzeigen" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Nach dem Aktualisieren eines Passworts fragen, wenn eine Änderung auf einer Website erkannt wird." }, + "changedPasswordNotificationDescAlt": { + "message": "Nach dem Aktualisieren des Passworts von Zugangsdaten fragen, wenn eine Änderung auf einer Website erkannt wird. Gilt fÃŧr alle angemeldeten Konten." + }, + "enableUsePasskeys": { + "message": "Nach dem Speichern und Verwenden von Passkeys fragen" + }, + "usePasskeysDesc": { + "message": "Danach fragen neue Passkeys zu speichern oder sich mit in deinem Tresor gespeicherten Passkeys anmelden. Gilt fÃŧr alle angemeldeten Konten." + }, "notificationChangeDesc": { "message": "MÃļchtest du dieses Passwort in Bitwarden aktualisieren?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Entsperren" }, + "additionalOptions": { + "message": "Weitere Optionen" + }, "enableContextMenuItem": { "message": "KontextmenÃŧoptionen anzeigen" }, "contextMenuItemDesc": { "message": "Greife Ãŧber einen Rechtsklick auf die Erstellung von PasswÃļrtern und passende Zugangsdaten fÃŧr die Website zu." }, + "contextMenuItemDescAlt": { + "message": "Verwende einen Rechtsklick, um auf die Passwortgenerierung und die passenden Zugangsdaten fÃŧr die Website zuzugreifen. Gilt fÃŧr alle angemeldeten Konten." + }, "defaultUriMatchDetection": { "message": "Standard URI-Übereinstimmungserkennung", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Wähle die Standardmethode, mit der die URI-Match-Erkennung fÃŧr Anmeldungen bei Aktionen wie dem automatischen AusfÃŧllen behandelt wird." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Ändere das Farbschema der Anwendung." }, + "themeDescAlt": { + "message": "Ändere das Farbschema der Anwendung. Gilt fÃŧr alle angemeldeten Konten." + }, "dark": { "message": "Dunkel", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export aus" + }, "exportVault": { "message": "Tresor exportieren" }, "fileFormat": { "message": "Dateiformat" }, + "fileEncryptedExportWarningDesc": { + "message": "Dieser Datei-Export ist passwortgeschÃŧtzt und erfordert das Dateipasswort zum EntschlÃŧsseln." + }, + "filePassword": { + "message": "Dateipasswort" + }, + "exportPasswordDescription": { + "message": "Dieses Passwort wird zum Exportieren und Importieren dieser Datei verwendet" + }, + "accountRestrictedOptionDescription": { + "message": "Verwende den VerschlÃŧsselungsschlÃŧssel deines Kontos, abgeleitet vom Benutzernamen und Master-Passwort, um den Export zu verschlÃŧsseln und den Import auf das aktuelle Bitwarden-Konto zu beschränken." + }, + "passwordProtectedOptionDescription": { + "message": "Lege ein Dateipasswort fest, um den Export zu verschlÃŧsseln und importiere ihn in ein beliebiges Bitwarden-Konto, wobei das Passwort zum EntschlÃŧsseln genutzt wird." + }, + "exportTypeHeading": { + "message": "Exporttyp" + }, + "accountRestricted": { + "message": "Konto eingeschränkt" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "„Dateipasswort“ und „Dateipasswort bestätigen“ stimmen nicht Ãŧberein." + }, "warning": { "message": "ACHTUNG", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Geteilt" }, - "learnOrg": { - "message": "Erfahre mehr Ãŧber Organisationen" - }, - "learnOrgConfirmation": { - "message": "Bitwarden erlaubt es dir deine Tresor Einträge mit anderen zu teilen, wenn du einen Organisations Account hast. MÃļchtest du bitwarden.com besuchen, um mehr zu erfahren?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden fÃŧr Unternehmen erlaubt es dir, deine Tresor-Einträge mit anderen zu teilen, indem du eine Organisation verwendest. Erfahre mehr auf der bitwarden.com Website." }, "moveToOrganization": { "message": "In Organisation verschieben" @@ -762,6 +1204,9 @@ "file": { "message": "Datei" }, + "fileToShare": { + "message": "Zu teilende Datei" + }, "selectFile": { "message": "Wähle eine Datei" }, @@ -772,7 +1217,7 @@ "message": "Funktion nicht verfÃŧgbar" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "VerschlÃŧsselungscode-Migration erforderlich. Bitte melde dich Ãŧber den Web-Tresor an, um deinen VerschlÃŧsselungscode zu aktualisieren." }, "premiumMembership": { "message": "Premium-Mitgliedschaft" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB verschlÃŧsselter Speicherplatz fÃŧr Dateianhänge." }, + "premiumSignUpEmergency": { + "message": "Notfallzugriff." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietäre Optionen fÃŧr die Zwei-Faktor Authentifizierung wie YubiKey und Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Du kannst deine Premium-Mitgliedschaft im Bitwarden.com Web-Tresor kaufen. MÃļchtest du die Website jetzt besuchen?" }, + "premiumPurchaseAlertV2": { + "message": "Du kannst Premium Ãŧber deine Kontoeinstellungen in der Bitwarden Web-App kaufen." + }, "premiumCurrentMember": { "message": "Du bist jetzt Premium-Mitglied!" }, "premiumCurrentMemberThanks": { "message": "Vielen Dank, dass du Bitwarden unterstÃŧtzt." }, + "premiumFeatures": { + "message": "Upgrade auf Premium und erhalte:" + }, "premiumPrice": { "message": "Das alles fÃŧr %price% pro Jahr!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Alles fÃŧr nur $PRICE$ pro Jahr!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Aktualisierung abgeschlossen" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator App" }, - "authenticatorAppDesc": { - "message": "Verwende eine Authentifizierungs-App (wie zum Beispiel Authy oder Google Authenticator), um zeitbasierte Verifizierungscodes zu generieren.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Gib einen Code ein, der von einer Authentifizierungs-App wie dem Bitwarden Authenticator generiert wurde.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP SicherheitsschlÃŧssel" + "yubiKeyTitleV2": { + "message": "Yubico OTP-SicherheitsschlÃŧssel" }, "yubiKeyDesc": { "message": "Verwende einen YubiKey um auf dein Konto zuzugreifen. Funtioniert mit YubiKey 4, Nano 4, 4C und NEO Geräten." }, - "duoDesc": { - "message": "Verifiziere mit Duo Security, indem du die Duo Mobile App, SMS, Anrufe oder U2F SicherheitsschlÃŧssel benutzt.", + "duoDescV2": { + "message": "Gib einen von Duo Security generierten Code ein.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-Mail" }, - "emailDesc": { - "message": "Bestätigungscodes werden Ihnen per E-Mail zugesandt." + "emailDescV2": { + "message": "Gib einen an deine E-Mail-Adresse gesendeten Code ein." }, "selfHostedEnvironment": { "message": "Selbst gehostete Umgebung" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Bitte gib die Basis-URL deiner selbst gehosteten Bitwarden-Installation an." }, + "selfHostedBaseUrlHint": { + "message": "Gib die Basis-URL deiner vor Ort gehosteten Bitwarden-Installation an. Beispiel: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "FÃŧr eine erweiterte Konfiguration kannst du die Basis-URL jedes Dienstes unabhängig voneinander angeben." + }, + "selfHostedEnvFormInvalid": { + "message": "Du musst entweder die Basis-Server-URL oder mindestens eine benutzerdefinierte Umgebung hinzufÃŧgen." + }, "customEnvironment": { "message": "Benutzerdefinierte Umgebung" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Selbst gehostete Server-URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API Server-URL" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "URLs der Umgebung gespeichert" }, + "showAutoFillMenuOnFormFields": { + "message": "Auto-AusfÃŧllen MenÃŧ in Formularfeldern anzeigen", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Vorschläge zum Auto-AusfÃŧllen" + }, + "showInlineMenuLabel": { + "message": "Vorschläge zum Auto-AusfÃŧllen in Formularfeldern anzeigen" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Identitäten als Vorschläge anzeigen" + }, + "showInlineMenuCardsLabel": { + "message": "Karten als Vorschläge anzeigen" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Vorschläge anzeigen, wenn Symbol ausgewählt ist" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Gilt fÃŧr alle angemeldeten Konten." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Deaktiviere die Einstellungen des eingebauten Passwort-Managers deines Browsers, um Konflikte zu vermeiden." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Browsereinstellungen bearbeiten." + }, + "autofillOverlayVisibilityOff": { + "message": "Aus", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Wenn Feld ausgewählt ist (im Fokus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Wenn das Auto-AusfÃŧllen Symbol ausgewählt ist", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Auto-AusfÃŧllen beim Laden einer Seite" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-AusfÃŧllen beim Laden einer Seite aktivieren" + "message": "Auto-AusfÃŧllen beim Laden der Seite" }, "enableAutoFillOnPageLoadDesc": { "message": "Wenn eine Anmeldemaske erkannt wird, die Zugangsdaten automatisch ausfÃŧllen während die Webseite lädt." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warnung:$CLOSETAG$ Kompromittierte oder nicht vertrauenswÃŧrdige Websites kÃļnnen Auto-AusfÃŧllen beim Laden einer Seite missbrauchen.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Kompromittierte oder nicht vertrauenswÃŧrdige Websites kÃļnnen Auto-AusfÃŧllen beim Laden der Seite ausnutzen." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Erfahre mehr Ãŧber Risiken" + }, "learnMoreAboutAutofill": { "message": "Erfahre mehr Ãŧber Auto-AusfÃŧllen" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Tresor in der Seitenleiste Ãļffnen" }, - "commandAutofillDesc": { - "message": "Die zuletzt verwendeten Zugangsdaten fÃŧr die aktuelle Website automatisch ausfÃŧllen lassen" + "commandAutofillLoginDesc": { + "message": "Die zuletzt verwendeten Zugangsdaten fÃŧr die aktuelle Website automatisch ausfÃŧllen" + }, + "commandAutofillCardDesc": { + "message": "Die zuletzt verwendete Karte fÃŧr die aktuelle Website automatisch ausfÃŧllen" + }, + "commandAutofillIdentityDesc": { + "message": "Die zuletzt verwendete Identität fÃŧr die aktuelle Website automatisch ausfÃŧllen" }, "commandGeneratePasswordDesc": { "message": "Ein neues zufälliges Passwort generieren und in die Zwischenablage kopieren" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Den Tresor sperren" }, - "privateModeWarning": { - "message": "Die UnterstÃŧtzung des privaten Modus ist experimentell und einige Funktionen sind eingeschränkt." - }, "customFields": { "message": "Benutzerdefinierte Felder" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Ja/Nein" }, + "cfTypeCheckbox": { + "message": "Kontrollkästchen" + }, "cfTypeLinked": { "message": "VerknÃŧpft", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Ein wiedererkennbares Bild neben jeden Zugangsdaten anzeigen." }, + "faviconDescAlt": { + "message": "Ein wiedererkennbares Bild neben jeden Zugangsdaten anzeigen. Gilt fÃŧr alle angemeldeten Konten." + }, "enableBadgeCounter": { "message": "Badge-Zähler anzeigen" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identität" }, + "typeSshKey": { + "message": "SSH-SchlÃŧssel" + }, + "newItemHeader": { + "message": "Neue $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ bearbeiten", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "$TYPE$ ansehen", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Passwortverlauf" }, + "generatorHistory": { + "message": "Generator-Verlauf" + }, + "clearGeneratorHistoryTitle": { + "message": "Generator-Verlauf lÃļschen" + }, + "cleargGeneratorHistoryDescription": { + "message": "Wenn du fortfährst, werden alle Einträge dauerhaft aus dem Generator-Verlauf gelÃļscht. Bist du sicher, dass du fortfahren mÃļchtest?" + }, "back": { "message": "ZurÃŧck" }, "collections": { "message": "Sammlungen" }, + "nCollections": { + "message": "$COUNT$ Sammlungen", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoriten" }, @@ -1282,6 +1874,10 @@ "message": "Basis-Domäne", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Basis-Domain (empfohlen)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain-Name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Übereinstimmungserkennung", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Standard-Match-Erkennung", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Optionen umschalten" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Keine Einträge zum Anzeigen vorhanden." }, + "clearHistory": { + "message": "Verlauf lÃļschen" + }, + "nothingToShow": { + "message": "Nichts anzuzeigen" + }, + "nothingGeneratedRecently": { + "message": "Du hast in letzter Zeit nichts generiert" + }, "remove": { "message": "Entfernen" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Mit PIN-Code entsperren" }, + "setYourPinTitle": { + "message": "PIN festlegen" + }, + "setYourPinButton": { + "message": "PIN festlegen" + }, "setYourPinCode": { "message": "Gebe deinen PIN-Code fÃŧr das Entsperren von Bitwarden ein. Deine PIN-Einstellungen werden zurÃŧckgesetzt, wenn du dich vollständig von der Anwendung abmeldest." }, + "setYourPinCode1": { + "message": "Deine PIN wird verwendet, um Bitwarden anstatt deines Master-Passworts zu entsperren. Deine PIN wird zurÃŧckgesetzt, wenn du dich jemals vollständig von Bitwarden abgemeldet hast." + }, "pinRequired": { "message": "PIN-Code ist erforderlich." }, "invalidPin": { "message": "UngÃŧltiger PIN-Code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Zu viele ungÃŧltige PIN Eingabeversuche. Wird abgemeldet." + }, "unlockWithBiometrics": { "message": "Mit Biometrie entsperren" }, + "unlockWithMasterPassword": { + "message": "Mit Master-Passwort entsperren" + }, "awaitDesktop": { "message": "Warte auf Bestätigung vom Desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Bei Neustart des Browsers mit Master-Passwort sperren" }, + "lockWithMasterPassOnRestart1": { + "message": "Master-Passwort beim Neustart des Browsers verlangen" + }, "selectOneCollection": { "message": "Sie mÃŧssen mindestens eine Sammlung auswählen." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Eine oder mehrere Organisationsrichtlinien beeinflussen deine Generator-Einstellungen." }, + "passwordGenerator": { + "message": "Passwort-Generator" + }, + "usernameGenerator": { + "message": "Benutzernamen-Generator" + }, + "useThisPassword": { + "message": "Dieses Passwort verwenden" + }, + "useThisUsername": { + "message": "Diesen Benutzernamen verwenden" + }, + "securePasswordGenerated": { + "message": "Sicheres Passwort generiert! Vergiss nicht, auch dein Passwort auf der Website zu aktualisieren." + }, + "useGeneratorHelpTextPartOne": { + "message": "Verwende den Generator", + "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": ", um ein starkes einzigartiges Passwort zu erstellen", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Aktion bei Tresor-Timeout" }, + "vaultTimeoutAction1": { + "message": "Timeout-Aktion" + }, "lock": { "message": "Sperren", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papierkorb", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Eintrag wiederhergestellt" }, + "alreadyHaveAccount": { + "message": "Hast du bereits ein Konto?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Nach dem Ausloggen verlierest du jeglichen Zugriff auf deinen Tresor und es ist nach Ablauf der Timeout-Zeit eine Online-Authentifizierung erforderlich. Bist du sicher, dass du diese Einstellung nutzen mÃļchten?" }, @@ -1459,7 +2111,10 @@ "message": "Bestätigung der Timeout-Aktion" }, "autoFillAndSave": { - "message": "Auto-AusfÃŧllen und speichern" + "message": "Automatisch ausfÃŧllen und speichern" + }, + "fillAndSave": { + "message": "AusfÃŧllen und speichern" }, "autoFillSuccessAndSavedUri": { "message": "Eintrag automatisch ausgefÃŧllt und URI gespeichert" @@ -1539,8 +2194,23 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Ihr neues Master-Passwort entspricht nicht den Anforderungen der Richtlinie." }, + "receiveMarketingEmailsV2": { + "message": "Erhalte Ratschläge, AnkÃŧndigungen und Marktforschungsumfragen von Bitwarden in deinem Posteingang." + }, + "unsubscribe": { + "message": "Deabonnieren" + }, + "atAnyTime": { + "message": "jederzeit." + }, + "byContinuingYouAgreeToThe": { + "message": "Indem du fortfährst, stimmst du den" + }, + "and": { + "message": "und" + }, "acceptPolicies": { - "message": "Durch Anwählen dieses Kästchens erklären Sie sich mit folgendem einverstanden:" + "message": "Durch Anwählen dieses Kästchens erklärst du dich mit Folgendem einverstanden:" }, "acceptPoliciesRequired": { "message": "Die Nutzungsbedingungen und Datenschutzerklärung wurden nicht akzeptiert." @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Zugangs-Token Aktualisierungsfehler" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Kein Aktualisierungs-Token oder API-SchlÃŧssel gefunden. Bitte versuche dich ab- und wieder anzumelden." + }, "desktopSyncVerificationTitle": { "message": "Desktop-Sync-ÜberprÃŧfung" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Konten stimmen nicht Ãŧberein" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometrische SchlÃŧssel stimmen nicht Ãŧberein" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrische Entsperrung fehlgeschlagen. Der biometrische GeheimschlÃŧssel konnte den Tresor nicht entsperren. Bitte versuche Biometrie erneut einzurichten." + }, "biometricsNotEnabledTitle": { "message": "Biometrie ist nicht eingerichtet" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Biometrie im Browser wird auf diesem Gerät nicht unterstÃŧtzt." }, + "biometricsNotUnlockedTitle": { + "message": "Nutzer gesperrt oder abgemeldet" + }, + "biometricsNotUnlockedDesc": { + "message": "Bitte entsperre diesen Nutzer in der Desktop-Anwendung und versuche es erneut." + }, + "biometricsNotAvailableTitle": { + "message": "Biometrisches Entsperren nicht verfÃŧgbar" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrisches Entsperren ist derzeit nicht verfÃŧgbar. Bitte versuche es später erneut." + }, "biometricsFailedTitle": { "message": "Biometrie fehlgeschlagen" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Eine Organisationsrichtlinie beeinflusst deine EigentÃŧmer-Optionen." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Eine Organisationsrichtlinie hat das Importieren von Einträgen in deinen persÃļnlichen Tresor deaktiviert." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Ausgeschlossene Domains" }, "excludedDomainsDesc": { "message": "Bitwarden wird keine Login-Daten fÃŧr diese Domäne speichern. Du musst die Seite aktualisieren, damit die Änderungen wirksam werden." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden wird fÃŧr alle angemeldeten Konten nicht danach fragen Zugangsdaten fÃŧr diese Domains speichern. Du musst die Seite neu laden, damit die Änderungen wirksam werden." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ist keine gÃŧltige Domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Änderungen der ausgeschlossenen Domain gespeichert" + }, + "limitSendViews": { + "message": "Ansichten begrenzen" + }, + "limitSendViewsHint": { + "message": "Nach Erreichen des Limits kann niemand mehr dieses Send sehen.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ Ansichten Ãŧbrig", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send-Details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Sends suchen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Zu teilender Text" + }, "sendTypeFile": { "message": "Datei" }, @@ -1666,6 +2406,9 @@ "message": "Alle Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Text standardmäßig ausblenden" + }, "maxAccessCountReached": { "message": "Maximale Zugriffsanzahl erreicht", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "PasswortgeschÃŧtzt" }, + "copyLink": { + "message": "Link kopieren" + }, "copySendLink": { "message": "Send-Link kopieren", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Bist du sicher, dass du dieses Send lÃļschen mÃļchtest?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Bist du sicher, dass du dieses Send dauerhaft lÃļschen mÃļchtest?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Send bearbeiten", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Das Send wird am angegebenen Datum zur angegebenen Uhrzeit dauerhaft gelÃļscht.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Das Send wird an diesem Datum dauerhaft gelÃļscht.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Ablaufdatum" }, @@ -1769,6 +2523,10 @@ "message": "Optional ein Passwort verlangen, damit Benutzer auf dieses Send zugreifen kÃļnnen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "FÃŧge ein optionales Passwort hinzu, mit dem Empfänger auf dieses Send zugreifen kÃļnnen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private Notizen zu diesem Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send erstellt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send erfolgreich erstellt!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Das Send wird jedem mit dem Link fÃŧr die nächste Stunde zur VerfÃŧgung stehen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Das Send wird jedem mit dem Link fÃŧr die nächsten $HOURS$ Stunden zur VerfÃŧgung stehen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Das Send wird jedem mit dem Link fÃŧr den nächsten Tag zur VerfÃŧgung stehen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Das Send wird jedem mit dem Link fÃŧr die nächsten $DAYS$ Tage zur VerfÃŧgung stehen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send-Link kopiert", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send gespeichert", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Erweiterung in einem neuen Fenster Ãļffnen?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Um ein Datei-Send zu erstellen, musst du die Erweiterung in einem neuen Fenster Ãļffnen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Um eine Datei auszuwählen, Ãļffne die Erweiterung in der Sidebar (falls mÃļglich) oder Ãļffne sie in einem neuem Fenster, indem du auf dieses Banner klickst." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Um eine Datei mit Safari auszuwählen, Ãļffne ein neues Fenster, indem du auf dieses Banner klickst." }, + "popOut": { + "message": "Abkoppeln" + }, "sendFileCalloutHeader": { "message": "Bevor du beginnst" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Meine E-Mail-Adresse vor den Empfängern ausblenden." }, + "hideYourEmail": { + "message": "Verberge deine E-Mail-Adresse vor Betrachtern." + }, "sendOptionsPolicyInEffect": { "message": "Eine oder mehrere Organisationsrichtlinien beeinflussen deine Send Einstellungen." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "E-Mail-Verifizierung erforderlich" }, + "emailVerifiedV2": { + "message": "E-Mail-Adresse verifiziert" + }, "emailVerificationRequiredDesc": { "message": "Du musst deine E-Mail Adresse verifizieren, um diese Funktion nutzen zu kÃļnnen. Du kannst deine E-Mail im Web-Tresor verifizieren." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Dein Master-Passwort entspricht nicht einer oder mehreren Richtlinien deiner Organisation. Um auf den Tresor zugreifen zu kÃļnnen, musst du dein Master-Passwort jetzt aktualisieren. Wenn du fortfährst, wirst du von deiner aktuellen Sitzung abgemeldet und musst dich erneut anmelden. Aktive Sitzungen auf anderen Geräten kÃļnnen noch bis zu einer Stunde lang aktiv bleiben." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Deine Organisation hat die vertrauenswÃŧrdige GeräteverschlÃŧsselung deaktiviert. Bitte lege ein Master-Passwort fest, um auf deinen Tresor zuzugreifen." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatische Registrierung" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Ordner auswählen..." }, - "ssoCompleteRegistration": { - "message": "Um die Anmeldung Ãŧber SSO abzuschließen, lege bitte ein Master-Passwort fest, um auf deinen Tresor zuzugreifen und ihn zu schÃŧtzen." + "noFoldersFound": { + "message": "Keine Ordner gefunden", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Deine Organisationsberechtigungen wurden aktualisiert und verlangen, dass du ein Master-Passwort festlegen musst.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Deine Organisation verlangt, dass du ein Master-Passwort festlegen musst.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "von $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verifizierung erforderlich", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Stunden" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minuten" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Die Unternehmens-Richtlinienanforderungen wurden auf deine Timeout-Optionen angewendet" + }, "vaultTimeoutPolicyInEffect": { "message": "Deine Unternehmensrichtlinien haben das maximal zulässige Tresor-Timeout auf $HOURS$ Stunde(n) und $MINUTES$ Minute(n) festgelegt.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maximal $HOURS$ Stunde(n) und $MINUTES$ Minute(n).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Das Timeout Ãŧberschreitet die von deiner Organisation festgelegte Beschränkung: Maximal $HOURS$ Stunde(n) und $MINUTES$ Minute(n)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Deine Organisationsrichtlinien beeinflussen dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout beträgt $HOURS$ Stunde(n) und $MINUTES$ Minute(n). Deine Tresor-Timeout-Aktion ist auf $ACTION$ gesetzt.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Tresor der Organisation wird exportiert" + }, + "exportingOrganizationVaultDesc": { + "message": "Nur der mit $ORGANIZATION$ verbundene Organisationstresor wird exportiert. Einträge in persÃļnlichen Tresoren oder anderen Organisationen werden nicht berÃŧcksichtigt.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Fehler" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Benutzername generieren" }, + "generateEmail": { + "message": "E-Mail generieren" + }, + "generatorBoundariesHint": { + "message": "Wert muss zwischen $MIN$ und $MAX$ liegen", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Benutzernamenstyp" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generiere ein E-Mail-Alias mit einem externen Weiterleitungsdienst." }, + "forwarderDomainName": { + "message": "E-Mail-Domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Wähle eine Domain aus, die vom ausgewählten Dienst unterstÃŧtzt wird", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ Fehler: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Von Bitwarden generiert.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webseite: $WEBSITE$. Von Bitwarden generiert.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "UngÃŧltiger API-Token von $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "UngÃŧltiger API-Token von $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Maskierte E-Mail-Konto-ID fÃŧr $SERVICENAME$ konnte nicht abgerufen werden.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "UngÃŧltige $SERVICENAME$-Domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "UngÃŧltige $SERVICENAME$-URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unbekannter $SERVICENAME$-Fehler aufgetreten.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unbekannter Weiterleitungsdienst: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Deine Organisationsrichtlinien haben Auto-AusfÃŧllen beim Laden von Seiten aktiviert." + "message": "Deine Organisationsrichtlinien haben das automatische AusfÃŧllen beim Laden der Seite aktiviert." }, "howToAutofill": { - "message": "So funktioniert Auto-AusfÃŧllen" + "message": "So funktioniert automatisches AusfÃŧllen" }, "autofillSelectInfoWithCommand": { - "message": "Wähle einen Eintrag von dieser Seite aus oder verwende das TastaturkÃŧrzel: $COMMAND$", + "message": "Wähle einen Eintrag von dieser Bildschirmseite, verwende das TastaturkÃŧrzel $COMMAND$ oder entdecke andere Optionen in den Einstellungen.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Wähle einen Eintrag von dieser Seite aus oder lege ein TastaturkÃŧrzel in den Einstellungen fest." + "message": "Wähle einen Eintrag von dieser Bildschirmseite oder entdecke andere Optionen in den Einstellungen." }, "gotIt": { "message": "Verstanden" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Auto-AusfÃŧllen Einstellungen" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Auto-AusfÃŧllen Tastenkombination" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Tastenkombination ändern" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "TastaturkÃŧrzel verwalten" + }, "autofillShortcut": { "message": "Auto-AusfÃŧllen TastaturkÃŧrzel" }, - "autofillShortcutNotSet": { - "message": "Das Auto-AusfÃŧllen TastaturkÃŧrzel ist nicht gesetzt. Du kannst eines in den Browser-Einstellungen festlegen." + "autofillLoginShortcutNotSet": { + "message": "Das TastaturkÃŧrzel zum automatischen AusfÃŧllen von Zugangsdaten ist nicht festgelegt. Du kannst es in den Browser-Einstellungen ändern." }, - "autofillShortcutText": { - "message": "Das Auto-AusfÃŧllen TastaturkÃŧrzel ist: $COMMAND$. Du kannst es in den Browser-Einstellungen ändern.", + "autofillLoginShortcutText": { + "message": "Das TastaturkÃŧrzel zum automatischen AusfÃŧllen von Zugangsdaten ist $COMMAND$. Verwalte alle TastaturkÃŧrzel in den Browser-Einstellungen.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Standard-Auto-AusfÃŧllen TastaturkÃŧrzel: $COMMAND$.", + "message": "Standard-Auto-AusfÃŧllen Tastenkombination: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Anmelden bei" - }, "opensInANewWindow": { "message": "Wird in einem neuen Fenster geÃļffnet" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "SSO-Kennung der Organisation erforderlich." }, + "creatingAccountOn": { + "message": "Konto wird erstellt bei" + }, + "checkYourEmail": { + "message": "ÜberprÃŧfe deine E-Mail" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Folge dem Link in der E-Mail an" + }, + "andContinueCreatingYourAccount": { + "message": "und fahre mit der Erstellung deines Kontos fort." + }, + "noEmail": { + "message": "Keine E-Mail?" + }, + "goBack": { + "message": "Geh zurÃŧck" + }, + "toEditYourEmailAddress": { + "message": ", um deine E-Mail-Adresse zu bearbeiten." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Zugriff verweigert. Du hast keine Berechtigung, diese Seite anzuzeigen." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Gerät wird vertraut" }, + "sendsNoItemsTitle": { + "message": "Keine aktiven Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Verwende Send, um verschlÃŧsselte Informationen sicher mit anderen zu teilen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Eingabe ist erforderlich." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 Feld erfordert deine Aufmerksamkeit." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ Felder erfordern deine Aufmerksamkeit.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Auswählen --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Ein-/ausklappen", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Deine Daten in Bitwarden importieren?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Deine LastPass-Daten schÃŧtzen und in Bitwarden importieren?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Als unverschlÃŧsselte Datei speichern", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "In Bitwarden importieren", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Wird importiert...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Daten erfolgreich importiert!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Fehler beim Importieren. ÜberprÃŧfe die Konsole fÃŧr Details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Netzwerkfehler beim Importieren.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias-Domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Einträge, die eine erneuten Abfrage des Master-Passworts verlangen, kÃļnnen nicht beim Laden einer Seite automatisch ausgefÃŧllt werden. Auto-AusfÃŧllen beim Laden einer Seite deaktiviert.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Auto-AusfÃŧllen beim Laden einer Seite wurde auf die Standardeinstellung gesetzt.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Deaktiviere die erneute Abfrage des Master-Passworts, um dieses Feld zu bearbeiten", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Seitennavigation umschalten" + }, + "skipToContent": { + "message": "Zum Inhalt wechseln" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden Auto-AusfÃŧllen MenÃŧtaste", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Bitwarden Auto-AusfÃŧllen MenÃŧ umschalten", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden Auto-AusfÃŧllen MenÃŧ", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Entsperre dein Konto, um passende Zugangsdaten anzuzeigen", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Entsperre dein Konto, um Auto-AusfÃŧllen-Vorschläge anzuzeigen", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Konto entsperren", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Dein Konto entsperren, Ãļffnet sich in einem neuen Fenster", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Zugangsdaten ausfÃŧllen fÃŧr", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Teil-Benutzername", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Kein Eintrag zum Anzeigen", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Neuer Eintrag", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Neuen Tresor-Eintrag hinzufÃŧgen", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Neue Zugangsdaten", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Neuen Tresor-Zugangsdateneintrag hinzufÃŧgen, Ãļffnet sich in einem neuen Fenster", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Neue Karte", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Neuen Tresor-Karteneintrag hinzufÃŧgen, Ãļffnet sich in einem neuen Fenster", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Neue Identität", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Neuen Tresor-Identitätseintrag hinzufÃŧgen, Ãļffnet sich in einem neuen Fenster", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden Auto-AusfÃŧllen MenÃŧ verfÃŧgbar. DrÃŧcke die Pfeiltaste nach unten zum Auswählen.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Einschalten" + }, + "ignore": { + "message": "Ignorieren" + }, + "importData": { + "message": "Daten importieren", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Importfehler" + }, + "importErrorDesc": { + "message": "Es gab ein Problem mit den Daten, die du importieren wolltest. Bitte behebe die unten aufgefÃŧhrten Fehler in deiner Quelldatei und versuche es erneut." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Behebe die unten aufgefÃŧhrten Fehler und versuche es erneut." + }, + "description": { + "message": "Beschreibung" + }, + "importSuccess": { + "message": "Daten erfolgreich importiert" + }, + "importSuccessNumberOfItems": { + "message": "Insgesamt wurden $AMOUNT$ Einträge importiert.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Erneut versuchen" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "FÃŧr diese Aktion ist eine Verifizierung erforderlich. Lege eine PIN fest, um fortzufahren." + }, + "setPin": { + "message": "PIN festlegen" + }, + "verifyWithBiometrics": { + "message": "Mit Biometrie verifizieren" + }, + "awaitingConfirmation": { + "message": "Warten auf Bestätigung" + }, + "couldNotCompleteBiometrics": { + "message": "Biometrische Verifizierung konnte nicht abgeschlossen werden." + }, + "needADifferentMethod": { + "message": "Brauchst du eine andere Methode?" + }, + "useMasterPassword": { + "message": "Master-Passwort verwenden" + }, + "usePin": { + "message": "PIN verwenden" + }, + "useBiometrics": { + "message": "Biometrie verwenden" + }, + "enterVerificationCodeSentToEmail": { + "message": "Gib den Verifizierungscode ein, der an deine E-Mail-Adresse gesendet wurde." + }, + "resendCode": { + "message": "Code erneut senden" + }, + "total": { + "message": "Gesamt" + }, + "importWarning": { + "message": "Du importierst Daten in $ORGANIZATION$. Deine Daten kÃļnnten mit Mitgliedern dieser Organisation geteilt werden. MÃļchtest du fortfahren?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Fehler beim Verbinden mit dem Duo-Dienst. Verwende eine andere Zwei-Faktor-Authentifizierungsmethode oder kontaktiere Duo fÃŧr Hilfe." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Starte DUO und folge den Schritten, um die Anmeldung zu abzuschließen." + }, + "duoRequiredForAccount": { + "message": "FÃŧr dein Konto ist die Duo Zwei-Faktor-Authentifizierung erforderlich." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Koppel die Erweiterung ab, um die Anmeldung abzuschließen." + }, + "popoutExtension": { + "message": "Popout-Erweiterung" + }, + "launchDuo": { + "message": "DUO starten" + }, + "importFormatError": { + "message": "Die Daten sind nicht richtig formatiert. Kontrolliere bitte deine Import-Datei und versuche es erneut." + }, + "importNothingError": { + "message": "Es wurde nichts importiert." + }, + "importEncKeyError": { + "message": "Fehler beim EntschlÃŧsseln der exportierten Datei. Dein VerschlÃŧsselungscode stimmt nicht mit dem beim Export verwendeten VerschlÃŧsselungscode Ãŧberein." + }, + "invalidFilePassword": { + "message": "UngÃŧltiges Dateipasswort. Bitte verwende das Passwort, das du beim Erstellen der Exportdatei eingegeben hast." + }, + "destination": { + "message": "Ziel" + }, + "learnAboutImportOptions": { + "message": "Erfahre mehr Ãŧber deine Importoptionen" + }, + "selectImportFolder": { + "message": "Ordner auswählen" + }, + "selectImportCollection": { + "message": "Sammlung auswählen" + }, + "importTargetHint": { + "message": "Wähle diese Option, wenn der importierte Dateiinhalt in eine(n) $DESTINATION$ verschoben werden soll", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Die Datei enthält nicht zugewiesene Einträge." + }, + "selectFormat": { + "message": "Wähle das Format der Import-Datei" + }, + "selectImportFile": { + "message": "Wähle die Import-Datei aus" + }, + "chooseFile": { + "message": "Datei auswählen" + }, + "noFileChosen": { + "message": "Keine Datei ausgewählt" + }, + "orCopyPasteFileContents": { + "message": "oder kopiere und fÃŧge den Inhalt der Import-Datei hier ein" + }, + "instructionsFor": { + "message": "Anleitung fÃŧr $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Tresor-Import bestätigen" + }, + "confirmVaultImportDesc": { + "message": "Diese Datei ist passwortgeschÃŧtzt. Bitte gib das Dateipasswort ein, um Daten zu importieren." + }, + "confirmFilePassword": { + "message": "Dateipasswort bestätigen" + }, + "exportSuccess": { + "message": "Tresor-Daten exportiert" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Zugriff auf" + }, + "passkeyNotCopied": { + "message": "Passkey wird nicht kopiert" + }, + "passkeyNotCopiedAlert": { + "message": "Der Passkey wird nicht in den duplizierten Eintrag kopiert. MÃļchtest du mit dem Duplizieren dieses Eintrags fortfahren?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "ÜberprÃŧfung durch die initiierende Website erforderlich. Diese Funktion ist noch nicht fÃŧr Konten ohne Master-Passwort implementiert." + }, + "logInWithPasskeyQuestion": { + "message": "Mit Passkey anmelden?" + }, + "passkeyAlreadyExists": { + "message": "FÃŧr diese Anwendung existiert bereits ein Passkey." + }, + "noPasskeysFoundForThisApplication": { + "message": "Keine Passkeys fÃŧr diese Anwendung gefunden." + }, + "noMatchingPasskeyLogin": { + "message": "Du hast keinen passenden Zugangsdaten fÃŧr diese Website." + }, + "noMatchingLoginsForSite": { + "message": "Keine passenden Zugangsdaten fÃŧr diese Seite" + }, + "searchSavePasskeyNewLogin": { + "message": "Passkeys suchen oder als neue Zugangsdaten speichern" + }, + "confirm": { + "message": "Bestätigen" + }, + "savePasskey": { + "message": "Passkey speichern" + }, + "savePasskeyNewLogin": { + "message": "Passkey als neue Zugangsdaten speichern" + }, + "chooseCipherForPasskeySave": { + "message": "Wähle die Zugangsdaten aus, in die dieser Passkey gespeichert werden soll" + }, + "chooseCipherForPasskeyAuth": { + "message": "Wähle einen Passkey zum Anmelden" + }, + "passkeyItem": { + "message": "Passkey-Eintrag" + }, + "overwritePasskey": { + "message": "Passkey Ãŧberschreiben?" + }, + "overwritePasskeyAlert": { + "message": "Dieser Eintrag enthält bereits einen Passkey. Bist du sicher, dass du den aktuellen Passkey Ãŧberschreiben mÃļchtest?" + }, + "featureNotSupported": { + "message": "Funktion wird noch nicht unterstÃŧtzt" + }, + "yourPasskeyIsLocked": { + "message": "Authentifizierung erforderlich, um Passkeys zu verwenden. Verifiziere deine Identität, um fortzufahren." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifaktor-Authentifizierung abgebrochen" + }, + "noLastPassDataFound": { + "message": "Keine LastPass-Daten gefunden" + }, + "incorrectUsernameOrPassword": { + "message": "Falscher Benutzername oder Passwort" + }, + "incorrectPassword": { + "message": "Falsches Passwort" + }, + "incorrectCode": { + "message": "Falscher Code" + }, + "incorrectPin": { + "message": "Falsche PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifaktor-Authentifizierung fehlgeschlagen" + }, + "includeSharedFolders": { + "message": "Geteilte Ordner mit einbeziehen" + }, + "lastPassEmail": { + "message": "LastPass E-Mail-Adresse" + }, + "importingYourAccount": { + "message": "Importiere dein Konto..." + }, + "lastPassMFARequired": { + "message": "LastPass Multifaktor-Authentifizierung erforderlich" + }, + "lastPassMFADesc": { + "message": "Gib deinen Einmal-Zugangscode aus deiner Authentifizierungs-App ein" + }, + "lastPassOOBDesc": { + "message": "Bestätige die Anmeldeanfrage in deiner Authentifizierungs-App oder gib einen Einmal-Zugangscode ein." + }, + "passcode": { + "message": "Zugangscode" + }, + "lastPassMasterPassword": { + "message": "LastPass Master-Passwort" + }, + "lastPassAuthRequired": { + "message": "LastPass Authentifizierung erforderlich" + }, + "awaitingSSO": { + "message": "Warte auf SSO-Authentifizierung" + }, + "awaitingSSODesc": { + "message": "Bitte melde dich weiterhin mit deinen Firmenzugangsdaten an." + }, + "seeDetailedInstructions": { + "message": "Detaillierte Anleitungen auf unserer Hilfeseite unter", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Direkt aus LastPass importieren" + }, + "importFromCSV": { + "message": "Aus CSV importieren" + }, + "lastPassTryAgainCheckEmail": { + "message": "Versuche es erneut oder suche nach einer E-Mail von LastPass, um zu verifizieren, dass du es bist." + }, + "collection": { + "message": "Sammlung" + }, + "lastPassYubikeyDesc": { + "message": "Stecke den YubiKey, der mit deinem LastPass Konto verknÃŧpft ist, in den USB-Port deines Computers und drÃŧcke dann den Knopf des YubiKey." + }, + "switchAccount": { + "message": "Konto wechseln" + }, + "switchAccounts": { + "message": "Konten wechseln" + }, + "switchToAccount": { + "message": "Zum Konto wechseln" + }, + "activeAccount": { + "message": "Aktives Konto" + }, + "availableAccounts": { + "message": "VerfÃŧgbare Konten" + }, + "accountLimitReached": { + "message": "Kontolimit erreicht. Von einem Konto abmelden, um ein anderes hinzuzufÃŧgen." + }, + "active": { + "message": "aktiv" + }, + "locked": { + "message": "gesperrt" + }, + "unlocked": { + "message": "entsperrt" + }, + "server": { + "message": "Server" + }, + "hostedAt": { + "message": "gehostet in" + }, + "useDeviceOrHardwareKey": { + "message": "Gerät oder Hardware-SchlÃŧssel verwenden" + }, + "justOnce": { + "message": "Nur einmal" + }, + "alwaysForThisSite": { + "message": "Immer fÃŧr diese Seite" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ zu ausgeschlossenen Domains hinzugefÃŧgt.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Gängigste Formate", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Weiter zu den Browsereinstellungen?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Weiter zum Hilfezentrum?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Ändere die Auto-AusfÃŧllen- und Passwort-Verwaltungseinstellungen deines Browsers.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "Du kannst Tastenkombinationen fÃŧr Erweiterungen in den Einstellungen deines Browsers anzeigen und festlegen.", + "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": "Ändere die Auto-AusfÃŧllen- und Passwort-Verwaltungseinstellungen deines Browsers.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "Du kannst Tastenkombinationen fÃŧr Erweiterungen in den Einstellungen deines Browsers anzeigen und festlegen.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Bitwarden zum Standard-Passwort-Manager machen?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Das Ignorieren dieser Option kann zu Konflikten zwischen dem Bitwarden Auto-AusfÃŧllen MenÃŧ und dem Browser fÃŧhren.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Bitwarden zum Standard-Passwort-Manager machen", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Bitwarden konnte nicht als Standard-Passwort-Manager festgelegt werden", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Du musst Bitwarden Zugriff fÃŧr die Browser-Datenschutzberechtigungen erteilen, um Bitwarden als Standard-Passwort-Manager festzulegen.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Als Standard festlegen", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Zugangsdaten erfolgreich gespeichert!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Passwort gespeichert!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Zugangsdaten erfolgreich aktualisiert!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Passwort aktualisiert!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Fehler beim Speichern der Zugangsdaten. Details in der Konsole.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Erfolg" + }, + "removePasskey": { + "message": "Passkey entfernen" + }, + "passkeyRemoved": { + "message": "Passkey entfernt" + }, + "autofillSuggestions": { + "message": "Vorschläge zum Auto-AusfÃŧllen" + }, + "autofillSuggestionsTip": { + "message": "Speichere einen Login-Eintrag fÃŧr diese Seite zum automatischen AusfÃŧllen" + }, + "yourVaultIsEmpty": { + "message": "Dein Tresor hat keine Einträge" + }, + "noItemsMatchSearch": { + "message": "Deine Suche ergab keine Treffer" + }, + "clearFiltersOrTryAnother": { + "message": "Entferne die Filter oder versuche einen anderen Suchbegriff" + }, + "copyInfoTitle": { + "message": "Information kopieren - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Notiz kopieren - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Weitere Optionen, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Weitere Optionen - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Eintrag anzeigen - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Auto-AusfÃŧllen - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Keine Werte zum Kopieren" + }, + "assignToCollections": { + "message": "Sammlungen zuweisen" + }, + "copyEmail": { + "message": "E-Mail-Adresse kopieren" + }, + "copyPhone": { + "message": "Telefonnummer kopieren" + }, + "copyAddress": { + "message": "Adresse kopieren" + }, + "adminConsole": { + "message": "Administrator-Konsole" + }, + "accountSecurity": { + "message": "Kontosicherheit" + }, + "notifications": { + "message": "Benachrichtigungen" + }, + "appearance": { + "message": "Aussehen" + }, + "errorAssigningTargetCollection": { + "message": "Fehler beim Zuweisen der Ziel-Sammlung." + }, + "errorAssigningTargetFolder": { + "message": "Fehler beim Zuweisen des Ziel-Ordners." + }, + "viewItemsIn": { + "message": "Einträge in $NAME$ anzeigen", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "ZurÃŧck zu $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Neu" + }, + "removeItem": { + "message": "$NAME$ entfernen", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Einträge ohne Ordner" + }, + "itemDetails": { + "message": "Eintrag-Details" + }, + "itemName": { + "message": "Eintrags-Name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organisation ist deaktiviert" + }, + "owner": { + "message": "Besitzer" + }, + "selfOwnershipLabel": { + "message": "Du", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Auf Einträge in deaktivierten Organisationen kann nicht zugegriffen werden. Kontaktiere deinen OrganisationseigentÃŧmer fÃŧr UnterstÃŧtzung." + }, + "additionalInformation": { + "message": "Zusätzliche Informationen" + }, + "itemHistory": { + "message": "Eintrags-Verlauf" + }, + "lastEdited": { + "message": "Zuletzt bearbeitet" + }, + "ownerYou": { + "message": "EigentÃŧmer: Du" + }, + "linked": { + "message": "VerknÃŧpft" + }, + "copySuccessful": { + "message": "Erfolgreich kopiert" + }, + "upload": { + "message": "Hochladen" + }, + "addAttachment": { + "message": "Anhang hinzufÃŧgen" + }, + "maxFileSizeSansPunctuation": { + "message": "Die maximale DateigrÃļße beträgt 500 MB" + }, + "deleteAttachmentName": { + "message": "Anhang $NAME$ lÃļschen", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "$NAME$ herunterladen", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Bist du sicher, dass du diesen Anhang dauerhaft lÃļschen mÃļchtest?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Kostenlose Organisationen kÃļnnen Anhänge nicht verwenden" + }, + "filters": { + "message": "Filter" + }, + "personalDetails": { + "message": "PersÃļnliche Details" + }, + "identification": { + "message": "Identifikation" + }, + "contactInfo": { + "message": "Kontaktinformationen" + }, + "downloadAttachment": { + "message": "Herunterladen - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "Kartennummer endet mit", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Zugangsdaten" + }, + "authenticatorKey": { + "message": "Authenticator-SchlÃŧssel" + }, + "autofillOptions": { + "message": "Auto-AusfÃŧllen Optionen" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website hinzugefÃŧgt" + }, + "addWebsite": { + "message": "Website hinzufÃŧgen" + }, + "deleteWebsite": { + "message": "Website lÃļschen" + }, + "defaultLabel": { + "message": "Standard ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Übereinstimmungs-Erkennung anzeigen $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Übereinstimmungs-Erkennung verstecken $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Auto-AusfÃŧllen beim Laden einer Seite?" + }, + "cardExpiredTitle": { + "message": "Abgelaufene Karte" + }, + "cardExpiredMessage": { + "message": "Wenn du die Karte erneuert hast, aktualisiere die Angaben zur Karte" + }, + "cardDetails": { + "message": "Kartendetails" + }, + "cardBrandDetails": { + "message": "$BRAND$ Details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Animationen aktivieren" + }, + "showAnimations": { + "message": "Animationen anzeigen" + }, + "addAccount": { + "message": "Konto hinzufÃŧgen" + }, + "loading": { + "message": "Wird geladen" + }, + "data": { + "message": "Daten" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "PasswÃļrter", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Mit Passkey anmelden", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Zuweisen" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Nur Organisationsmitglieder mit Zugriff auf diese Sammlungen kÃļnnen die Einträge sehen." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Nur Organisationsmitglieder mit Zugriff auf diese Sammlungen kÃļnnen die Einträge sehen." + }, + "bulkCollectionAssignmentWarning": { + "message": "Du hast $TOTAL_COUNT$ Einträge ausgewählt. Du kannst $READONLY_COUNT$ der Einträge nicht aktualisieren, da du keine Bearbeitungsrechte hast.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Feld hinzufÃŧgen" + }, + "add": { + "message": "HinzufÃŧgen" + }, + "fieldType": { + "message": "Feldtyp" + }, + "fieldLabel": { + "message": "Feldbezeichnung" + }, + "textHelpText": { + "message": "Verwende Textfelder fÃŧr Daten wie Sicherheitsfragen" + }, + "hiddenHelpText": { + "message": "Verwende versteckte Felder fÃŧr vertrauliche Daten wie ein Passwort" + }, + "checkBoxHelpText": { + "message": "Verwende Kontrollkästchen, wenn du das Kontrollkästchen eines Formulars automatisch ausfÃŧllen mÃļchtest, wie eine Erinnerungs-E-Mail" + }, + "linkedHelpText": { + "message": "Verwende ein verknÃŧpftes Feld, wenn du Probleme mit dem automatischen AusfÃŧllen einer bestimmten Website hast." + }, + "linkedLabelHelpText": { + "message": "Gib die HTML-ID, den Namen oder das aria-label des Feldes ein. Verwende alternativ einen Platzhalter." + }, + "editField": { + "message": "Feld bearbeiten" + }, + "editFieldLabel": { + "message": "$LABEL$ bearbeiten", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "$LABEL$ lÃļschen", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ hinzugefÃŧgt", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "$LABEL$ umsortieren. Verwende die Pfeiltasten, um das Element nach oben oder nach unten zu verschieben.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ nach oben verschoben, Position $INDEX$ von $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Zu zuweisende Sammlungen auswählen" + }, + "personalItemTransferWarningSingular": { + "message": "1 Eintrag wird dauerhaft an die ausgewählte Organisation Ãŧbertragen. Du wirst diesen Eintrag nicht mehr besitzen." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ werden dauerhaft an die ausgewählte Organisation Ãŧbertragen. Du wirst diese Einträge nicht mehr besitzen.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 Eintrag wird dauerhaft an $ORG$ Ãŧbertragen. Du wirst diesen Eintrag nicht mehr besitzen.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ werden dauerhaft an $ORG$ Ãŧbertragen. Du wirst diese Einträge nicht mehr besitzen.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Sammlungen erfolgreich zugewiesen" + }, + "nothingSelected": { + "message": "Du hast nichts ausgewählt." + }, + "movedItemsToOrg": { + "message": "Ausgewählte Einträge in $ORGNAME$ verschoben", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Einträge verschoben nach $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Eintrag verschoben nach $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ nach unten verschoben, Position $INDEX$ von $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Eintrags-Standort" + }, + "fileSend": { + "message": "Datei-Send" + }, + "fileSends": { + "message": "Datei-Sends" + }, + "textSend": { + "message": "Text-Send" + }, + "textSends": { + "message": "Text-Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden hat einen neuen Look!" + }, + "bitwardenNewLookDesc": { + "message": "Auto-AusfÃŧllen und Suchen vom Tresor-Tab ist einfacher und intuitiver als je zuvor. Schau dich um!" + }, + "accountActions": { + "message": "Konto-Aktionen" + }, + "showNumberOfAutofillSuggestions": { + "message": "Anzahl der Vorschläge zum Auto-AusfÃŧllen von Zugangsdaten auf dem Erweiterungssymbol anzeigen" + }, + "systemDefault": { + "message": "Systemstandard" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Unternehmens-Richtlinienanforderungen wurden auf diese Einstellung angewandt" + }, + "sshPrivateKey": { + "message": "Privater SchlÃŧssel" + }, + "sshPublicKey": { + "message": "Öffentlicher SchlÃŧssel" + }, + "sshFingerprint": { + "message": "Fingerabdruck" + }, + "sshKeyAlgorithm": { + "message": "SchlÃŧsseltyp" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Erneut versuchen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Das minimal benutzerdefinierte Timeout beträgt 1 Minute." + }, + "additionalContentAvailable": { + "message": "Zusätzlicher Inhalt ist verfÃŧgbar" + }, + "fileSavedToDevice": { + "message": "Datei auf Gerät gespeichert. Greife darauf Ãŧber die Downloads deines Geräts zu." + }, + "showCharacterCount": { + "message": "Zeichenanzahl anzeigen" + }, + "hideCharacterCount": { + "message": "Zeichenanzahl ausblenden" + }, + "itemsInTrash": { + "message": "Einträge im Papierkorb" + }, + "noItemsInTrash": { + "message": "Keine Einträge im Papierkorb" + }, + "noItemsInTrashDesc": { + "message": "Einträge, die du lÃļschst, erscheinen hier und werden nach 30 Tagen dauerhaft gelÃļscht" + }, + "trashWarning": { + "message": "Einträge, die länger als 30 Tage im Papierkorb waren, werden automatisch gelÃļscht" + }, + "restore": { + "message": "Wiederherstellen" + }, + "deleteForever": { + "message": "Dauerhaft lÃļschen" + }, + "noEditPermissions": { + "message": "Du bist nicht berechtigt, diesen Eintrag zu bearbeiten" + }, + "authenticating": { + "message": "Authentifizierung" + }, + "fillGeneratedPassword": { + "message": "Generiertes Passwort ausfÃŧllen", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Passwort neu generiert", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Zugangsdaten in Bitwarden speichern?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Leerzeichen", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Abwärtsakzent", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Ausrufezeichen", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At-Zeichen", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Raute", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollarzeichen", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Prozentzeichen", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Zirkumflex", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Und-Zeichen", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Sternchen", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Linke Klammer", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Rechte Klammer", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Unterstrich", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Bindestrich", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Gleich", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Linke geschweifte Klammer", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Rechte geschweifte Klammer", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Linke eckige Klammer", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Rechte eckige Klammer", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Senkrechter Strich", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "RÃŧckstrich", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Doppelpunkt", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semikolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Doppelte AnfÃŧhrungszeichen", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Einfaches AnfÃŧhrungszeichen", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Kleiner als", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "GrÃļßer als", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Komma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Punkt", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Fragezeichen", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Schrägstrich", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Kleinbuchstaben" + }, + "uppercaseAriaLabel": { + "message": "Großbuchstaben" + }, + "generatedPassword": { + "message": "Generiertes Passwort" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 552f0b14850..0e599b6a1d5 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Î”Ī‰ĪÎĩÎŦÎŊ Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽĪ‚ ÎšĪ‰Î´ÎšÎēĪŽÎŊ", + "message": "Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽĪ‚ ÎšĪ‰Î´ÎšÎēĪŽÎŊ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "ΈÎŊÎąĪ‚ ÎąĪƒĪ†ÎąÎģÎŽĪ‚ ÎēιΚ Î´Ī‰ĪÎĩÎŦÎŊ Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽĪ‚ ÎēĪ‰Î´ÎšÎēĪŽÎŊ, ÎŗÎšÎą ΌÎģÎĩĪ‚ ĪƒÎąĪ‚ Ī„ÎšĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚.", - "description": "Extension description" + "message": "ΤÎŋ Bitwarden ÎąĪƒĪ†ÎąÎģίÎļÎĩΚ Ī€ÎąÎŊĪ„ÎŋĪ ÎēιΚ ÎĩĪÎēÎŋÎģÎą Ī„ÎŋĪ…Ī‚ ÎēĪ‰Î´ÎšÎēÎŋĪĪ‚, Ī„Îą ÎēÎģÎĩΚδΚÎŦ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎēιΚ Ī„ÎšĪ‚ ÎĩĪ…ÎąÎ¯ĪƒÎ¸ÎˇĪ„ÎĩĪ‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ĪƒÎąĪ‚", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ÎŖĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ÎŽ δΡÎŧΚÎŋĪ…ĪÎŗÎŽĪƒĪ„Îĩ έÎŊÎą ÎŊέÎŋ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ ÎąĪƒĪ†ÎąÎģÎ­Ī‚ vault ĪƒÎąĪ‚." }, + "inviteAccepted": { + "message": "Η Ī€ĪĪŒĪƒÎēÎģÎˇĪƒÎˇ Î­ÎŗÎšÎŊÎĩ ÎąĪ€ÎŋδÎĩÎēĪ„ÎŽ" + }, "createAccount": { "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ" }, - "login": { - "message": "ÎŖĪÎŊδÎĩĪƒÎˇ" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "ÎŸĪÎ¯ĪƒĪ„Îĩ έÎŊÎąÎŊ ÎšĪƒĪ‡Ī…ĪĪŒ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "ΟÎģÎŋÎēÎģÎˇĪĪŽĪƒĪ„Îĩ Ī„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚ ÎŋĪÎ¯ÎļÎŋÎŊĪ„ÎąĪ‚ έÎŊÎąÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "enterpriseSingleSignOn": { "message": "ΕÎŊÎšÎąÎ¯Îą ÎĩÎ¯ĪƒÎŋδÎŋĪ‚ ÎŗÎšÎą ÎĩĪ€ÎšĪ‡ÎĩÎšĪÎŽĪƒÎĩÎšĪ‚" @@ -32,10 +50,10 @@ "message": "ÎĨĪ€ÎŋβÎŋÎģÎŽ" }, "emailAddress": { - "message": "ΔιÎĩĪÎ¸Ī…ÎŊĪƒÎˇ email" + "message": "ΔιÎĩĪÎ¸Ī…ÎŊĪƒÎˇ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…" }, "masterPass": { - "message": "ÎšĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚" + "message": "ÎšĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "masterPassDesc": { "message": "Ο ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ ÎĩίÎŊιΚ Îŋ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„Îĩ ÎŗÎšÎą Ī„ÎˇÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ vault ĪƒÎąĪ‚. ΕίÎŊιΚ Ī€ÎŋÎģĪ ĪƒÎˇÎŧÎąÎŊĪ„ÎšÎēΌ ÎŊÎą ÎŧΡÎŊ ΞÎĩ·ÎŦ΃ÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ. ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎĩΚ Ī„ĪĪŒĪ€ÎŋĪ‚ ÎŊÎą ÎąÎŊÎąÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ ΃Îĩ Ī€ÎĩĪÎ¯Ī€Ī„Ī‰ĪƒÎˇ Ī€ÎŋĪ… Ī„ÎŋÎŊ ΞÎĩ·ÎŦ΃ÎĩĪ„Îĩ." @@ -43,11 +61,39 @@ "masterPassHintDesc": { "message": "Η Ī…Ī€ĪŒÎ´ÎĩΚΞΡ Ī„ÎŋĪ… ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ĪƒÎąĪ‚ βÎŋÎˇÎ¸ÎŽĪƒÎĩΚ ÎŊÎą Î¸Ī…ÎŧΡθÎĩÎ¯Ī„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ ĪƒÎąĪ‚, ΃Îĩ Ī€ÎĩĪÎ¯Ī€Ī„Ī‰ĪƒÎˇ Ī€ÎŋĪ… Ī„ÎŋÎŊ ΞÎĩ·ÎŦ΃ÎĩĪ„Îĩ." }, + "masterPassHintText": { + "message": "ΑÎŊ ΞÎĩ·ÎŦ΃ÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎŽĪ‚ ĪƒÎąĪ‚, Ρ Ī…Ī€ÎĩÎŊÎ¸ĪÎŧÎšĪƒÎˇ Ī„ÎŋĪ… ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ĪƒĪ„ÎąÎģÎĩί ĪƒĪ„Îŋ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋ ĪƒÎąĪ‚. $CURRENT$/$MAXIMUM$ ÎŧÎ­ÎŗÎšĪƒĪ„ÎŋΚ Ī‡ÎąĪÎąÎēĪ„ÎŽĪÎĩĪ‚.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { - "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ ΞιÎŊÎŦ Ī„ÎŋÎŊ ÎšĪĪÎšÎŋ ÎšĪ‰Î´ÎšÎēΌ" + "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ ΞιÎŊÎŦ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "masterPassHint": { - "message": "ÎĨĪ€ĪŒÎ´ÎĩΚΞΡ ÎšĪĪÎšÎŋĪ… ÎšĪ‰Î´ÎšÎēÎŋĪ (΀΁ÎŋÎąÎšĪÎĩĪ„ÎšÎēΌ)" + "message": "ÎĨĪ€ĪŒÎ´ÎĩΚΞΡ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ (΀΁ÎŋÎąÎšĪÎĩĪ„ÎšÎēΌ)" + }, + "joinOrganization": { + "message": "ÎŖĪ…ÎŧÎŧÎĩĪ„ÎŋĪ‡ÎŽ ĪƒĪ„ÎŋÎŊ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ" + }, + "joinOrganizationName": { + "message": "ÎŖĪ…ÎŧÎŧÎĩĪ„ÎŋĪ‡ÎŽ ĪƒĪ„Îŋ $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "ΟÎģÎŋÎēÎģÎˇĪĪŽĪƒĪ„Îĩ Ī„Îˇ ĪƒĪ…ÎŧÎŧÎĩĪ„ÎŋĪ‡ÎŽ ĪƒÎąĪ‚ ΃Îĩ ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ ÎŋĪÎ¯ÎļÎŋÎŊĪ„ÎąĪ‚ έÎŊÎąÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚." }, "tab": { "message": "ÎšÎąĪĪ„Î­ÎģÎą" @@ -56,10 +102,10 @@ "message": "Vault" }, "myVault": { - "message": "ΤÎŋ Vault ÎŧÎŋĪ…" + "message": "ΤÎŋ Î¸ÎˇĪƒÎąĪ…/ÎēÎšĪŒ ÎŧÎŋĪ…" }, "allVaults": { - "message": "ΌÎģÎą Ī„Îą Vaults" + "message": "ΌÎģÎą Ī„Îą Î¸ÎˇĪƒÎąĪ…/ÎēΚι" }, "tools": { "message": "Î•ĪÎŗÎąÎģÎĩÎ¯Îą" @@ -71,34 +117,104 @@ "message": "Î¤ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ÎēÎąĪĪ„Î­ÎģÎą" }, "copyPassword": { - "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "copyPassphrase": { + "message": "Copy passphrase" }, "copyNote": { - "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎŖÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇĪ‚" + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ĪƒÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇĪ‚" }, "copyUri": { "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ URI" }, "copyUsername": { - "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ΟÎŊΌÎŧÎąĪ„ÎŋĪ‚ Î§ĪÎŽĪƒĪ„Îˇ" + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ" }, "copyNumber": { - "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ Î‘ĪÎšÎ¸ÎŧÎŋĪ" + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎąĪÎšÎ¸ÎŧÎŋĪ" }, "copySecurityCode": { - "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎšĪ‰Î´ÎšÎēÎŋĪ Î‘ĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚" + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎēĪ‰Î´ÎšÎēÎŋĪ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚" + }, + "copyName": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚" + }, + "copyCompany": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎĩĪ„ÎąÎšĪÎĩÎ¯ÎąĪ‚" + }, + "copySSN": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ΑΜΚΑ" + }, + "copyPassportNumber": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎąĪÎšÎ¸ÎŧÎŋĪ Î´ÎšÎąÎ˛ÎąĪ„ÎˇĪÎ¯ÎŋĪ…" + }, + "copyLicenseNumber": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎąĪÎšÎ¸ÎŧÎŋĪ ÎŦδÎĩÎšÎąĪ‚" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ Ī„ÎŋĪ… ÂĢ$FIELD$Âģ", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎšĪƒĪ„ÎŋĪ„ĪŒĪ€ÎŋĪ…" + }, + "copyNotes": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ĪƒÎˇÎŧÎĩÎšĪŽĪƒÎĩΉÎŊ" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ" }, + "autoFillLogin": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚" + }, + "autoFillCard": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎŦĪĪ„ÎąĪ‚" + }, + "autoFillIdentity": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚" + }, "generatePasswordCopied": { - "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎšĪ‰Î´ÎšÎēÎŋĪ (ÎąÎŊĪ„ÎšÎŗĪÎŦĪ†ÎˇÎēÎĩ)" + "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ (ÎąÎŊĪ„ÎšÎŗĪÎŦĪ†ÎˇÎēÎĩ)" }, "copyElementIdentifier": { "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋĪ… Ī€ÎĩδίÎŋĪ…" }, "noMatchingLogins": { - "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ ÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎšĪ‡Î¯ĪƒÎĩÎšĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚." + "message": "ΚαÎŧÎ¯Îą ĪƒĪÎŊδÎĩĪƒÎˇ δÎĩÎŊ Ī„ÎąÎšĪÎšÎŦÎļÎĩΚ" + }, + "noCards": { + "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ ÎēÎŦ΁΄ÎĩĪ‚" + }, + "noIdentities": { + "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎĩĪ‚" + }, + "addLoginMenu": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚" + }, + "addCardMenu": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎēÎŦĪĪ„ÎąĪ‚" + }, + "addIdentityMenu": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚" }, "unlockVaultMenu": { "message": "ΞÎĩÎēÎģÎĩÎšÎ´ĪŽĪƒĪ„Îĩ Ī„Îŋ vault ĪƒÎąĪ‚" @@ -107,16 +223,28 @@ "message": "ÎŖĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ĪƒĪ„Îŋ vault ĪƒÎąĪ‚" }, "autoFillInfo": { - "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎĩĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ ÎŗÎšÎą Ī„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ, ĪƒĪ„ÎˇÎŊ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ÎēÎąĪĪ„Î­ÎģÎą Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚." + "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎĩĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ ÎŗÎšÎą ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ĪƒĪ„ÎˇÎŊ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ÎēÎąĪĪ„Î­ÎģÎą Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ." }, "addLogin": { - "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŖĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ÎŖĪÎŊδÎĩĪƒÎˇĪ‚" + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŧÎ¯ÎąĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚" }, "addItem": { - "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ΑÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + }, + "accountEmail": { + "message": "Email ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ" + }, + "requestHint": { + "message": "Î‘Î¯Ī„ÎˇÎŧÎą ÎŗÎšÎą Ī…Ī€ĪŒÎ´ÎĩΚΞΡ" + }, + "requestPasswordHint": { + "message": "Î‘Î¯Ī„ÎˇÎŧÎą ÎŗÎšÎą Ī…Ī€ĪŒÎ´ÎĩΚΞΡ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Î•ÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ Ī„Îˇ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ email Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚ ÎēιΚ θι ĪƒÎąĪ‚ ÎąĪ€ÎŋĪƒĪ„ÎąÎģÎĩί Ρ Ī…Ī€ĪŒÎ´ÎĩΚΞΡ ÎŗÎšÎą Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "passwordHint": { - "message": "ÎĨĪ€ĪŒÎ´ÎĩΚΞΡ ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "ÎĨĪ€ĪŒÎ´ÎĩΚΞΡ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "enterEmailToGetHint": { "message": "Î•ÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ Ī„Îˇ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ email Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚, ÎŗÎšÎą ÎŊÎą ÎģÎŦβÎĩĪ„Îĩ Ī„ÎˇÎŊ Ī…Ī€ĪŒÎ´ÎĩΚΞΡ Ī„ÎŋĪ… ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ." @@ -131,23 +259,41 @@ "message": "ÎŖĪ„ÎĩίÎģĪ„Îĩ έÎŊÎąÎŊ ÎēĪ‰Î´ÎšÎēΌ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚ ĪƒĪ„Îŋ email ĪƒÎąĪ‚" }, "sendCode": { - "message": "Î‘Ī€ÎŋĪƒĪ„ÎŋÎģÎŽ ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "Î‘Ī€ÎŋĪƒĪ„ÎŋÎģÎŽ ÎēĪ‰Î´ÎšÎēÎŋĪ" }, "codeSent": { "message": "Ο ÎēĪ‰Î´ÎšÎēĪŒĪ‚ ĪƒĪ„ÎŦÎģθΡÎēÎĩ" }, "verificationCode": { - "message": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Î•Ī€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚" + "message": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚" }, "confirmIdentity": { "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎšĪŽĪƒĪ„Îĩ Ī„ÎˇÎŊ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„Îą ĪƒÎąĪ‚ ÎŗÎšÎą ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎĩĪ„Îĩ." }, - "account": { - "message": "ΛÎŋÎŗÎąĪÎšÎąĪƒÎŧĪŒĪ‚" - }, "changeMasterPassword": { "message": "ΑÎģÎģÎąÎŗÎŽ ÎšĪĪÎšÎŋĪ… ÎšĪ‰Î´ÎšÎēÎŋĪ" }, + "continueToWebApp": { + "message": "ÎŖĪ…ÎŊÎ­Ī‡ÎĩΚι ĪƒĪ„Îˇ δΚιδΚÎēĪ„Ī…ÎąÎēÎŽ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ;" + }, + "continueToWebAppDesc": { + "message": "ΕξÎĩ΁ÎĩĪ…ÎŊÎŽĪƒĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ Î´Ī…ÎŊÎąĪ„ĪŒĪ„ÎˇĪ„ÎĩĪ‚ Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚ Bitwarden ĪƒĪ„Îˇ δΚιδΚÎēĪ„Ī…ÎąÎēÎŽ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ." + }, + "continueToHelpCenter": { + "message": "ÎŖĪ…ÎŊÎĩĪ‡Î¯ĪƒĪ„Îĩ ĪƒĪ„Îŋ ΚέÎŊ΄΁Îŋ ΒÎŋΎθÎĩÎšÎąĪ‚;" + }, + "continueToHelpCenterDesc": { + "message": "ΜÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ÎŗÎšÎą Ī„Îŋ Ī€ĪŽĪ‚ ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„Îŋ Bitwarden ĪƒĪ„Îŋ ΚέÎŊ΄΁Îŋ ΒÎŋΎθÎĩÎšÎąĪ‚." + }, + "continueToBrowserExtensionStore": { + "message": "ÎŖĪ…ÎŊÎĩĪ‡Î¯ĪƒĪ„Îĩ ĪƒĪ„Îŋ ÎēÎąĪ„ÎŦĪƒĪ„ÎˇÎŧÎą ÎĩĪ€ÎĩÎēĪ„ÎŦ΃ÎĩΉÎŊ Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ;" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "ΒÎŋÎˇÎ¸ÎŽĪƒĪ„Îĩ ÎŦÎģÎģÎŋĪ…Ī‚ ÎŊÎą ÎŧÎŦθÎŋĪ…ÎŊ ÎąÎŊ Ī„Îŋ Bitwarden ÎĩίÎŊιΚ ÎēÎąĪ„ÎŦÎģÎģΡÎģÎŋ ÎŗÎšÎą ÎąĪ…Ī„ÎŋĪĪ‚. Î•Ī€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„Îŋ ÎēÎąĪ„ÎŦĪƒĪ„ÎˇÎŧÎą ÎĩĪ€ÎĩÎēĪ„ÎŦ΃ÎĩΉÎŊ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ ĪƒÎąĪ‚ ÎēιΚ ÎąĪ†ÎŽĪƒĪ„Îĩ Ī„ĪŽĪÎą ÎŧΚι βιθÎŧÎŋÎģÎŋÎŗÎ¯Îą." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎģÎģÎŦΞÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎŽĪ‚ ĪƒÎąĪ‚ ĪƒĪ„Îˇ δΚιδΚÎēĪ„Ī…ÎąÎēÎŽ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Ī„ÎŋĪ… Bitwarden." + }, "fingerprintPhrase": { "message": "ÎĻ΁ÎŦĪƒÎˇ ΔαÎē΄΅ÎģΚÎēĪŽÎŊ Î‘Ī€Îŋ΄΅΀ΉÎŧÎŦ΄ΉÎŊ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Î‘Ī€ÎŋĪƒĪÎŊδÎĩĪƒÎˇ" }, + "aboutBitwarden": { + "message": "ÎŖĪ‡ÎĩĪ„ÎšÎēÎŦ ÎŧÎĩ Ī„Îŋ Bitwarden" + }, "about": { "message": "ÎŖĪ‡ÎĩĪ„ÎšÎēÎŦ" }, + "moreFromBitwarden": { + "message": "ΠÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ÎąĪ€ĪŒ Ī„Îŋ Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "ÎŖĪ…ÎŊÎ­Ī‡ÎĩΚι ĪƒĪ„Îŋ bitwarden.com;" + }, + "bitwardenForBusiness": { + "message": "Bitwarden ÎŗÎšÎą Î•Ī€ÎšĪ‡ÎĩÎšĪÎŽĪƒÎĩÎšĪ‚" + }, + "bitwardenAuthenticator": { + "message": "Î‘Ī…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„ÎŽĪ‚ Bitwarden" + }, + "continueToAuthenticatorPageDesc": { + "message": "Ο ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„ÎŽĪ‚ Bitwarden ΃ÎŦĪ‚ ÎĩĪ€ÎšĪ„ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎąĪ€ÎŋθΡÎēÎĩĪÎĩĪ„Îĩ Ī„Îą ÎēÎģÎĩΚδΚÎŦ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ ÎēιΚ ÎŊÎą δΡÎŧΚÎŋĪ…ĪÎŗÎĩÎ¯Ī„Îĩ ÎēĪ‰Î´ÎšÎēÎŋĪĪ‚ TOTP ÎŗÎšÎą ΁ÎŋÎ­Ī‚ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚ Î´ĪÎŋ βΡÎŧÎŦ΄ΉÎŊ. ΜÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ĪƒĪ„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽĪ‚ Bitwarden Secrets" + }, + "continueToSecretsManagerPageDesc": { + "message": "Î‘Ī€ÎŋθΡÎēÎĩĪĪƒĪ„Îĩ ÎēιΚ ÎŧÎŋÎšĪÎąĪƒĪ„ÎĩÎ¯Ī„Îĩ ÎŧĪ…ĪƒĪ„ÎšÎēÎŦ ΀΁ÎŋÎŗĪÎąÎŧÎŧÎąĪ„ÎšĪƒĪ„ĪŽÎŊ ÎŧÎĩ Ī„ÎŋÎŊ Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽ Bitwarden Secrets. ΜÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ĪƒĪ„ÎŋÎŊ ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽĪƒĪ„Îĩ ÎŋÎŧÎąÎģÎ­Ī‚ ÎēιΚ ÎąĪƒĪ†ÎąÎģÎĩÎ¯Ī‚ ÎĩÎŧĪ€ÎĩÎšĪÎ¯ÎĩĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ Î´Ī‰ĪÎĩÎŦÎŊ ÎąĪ€ĪŒ Ī€ÎąĪÎąÎ´ÎŋĪƒÎšÎąÎēÎŋĪĪ‚ ÎēĪ‰Î´ÎšÎēÎŋĪĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŧÎĩ Ī„Îŋ Passwordless.dev. ΜÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ĪƒĪ„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Î”Ī‰ĪÎĩÎŦÎŊ Bitwarden ÎŗÎšÎą ΟιÎēÎŋÎŗÎ­ÎŊÎĩΚÎĩĪ‚" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "ΔιÎēιΚÎŋĪĪƒĪ„Îĩ Ī„Îŋ Î”Ī‰ĪÎĩÎŦÎŊ Bitwarden ÎŗÎšÎą ΟιÎēÎŋÎŗÎ­ÎŊÎĩΚÎĩĪ‚. Î•ÎžÎąĪÎŗĪ…ĪĪŽĪƒĪ„Îĩ ÎąĪ…Ī„ÎŽ Ī„ÎˇÎŊ ΀΁ÎŋĪƒĪ†Îŋ΁ÎŦ ĪƒÎŽÎŧÎĩĪÎą ĪƒĪ„ÎˇÎŊ δΚιδΚÎēĪ„Ī…ÎąÎēÎŽ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ." + }, "version": { "message": "ΈÎēδÎŋĪƒÎˇ" }, @@ -181,10 +363,28 @@ "message": "ΌÎŊÎŋÎŧÎą" }, "editFolder": { - "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą ÎĻÎąÎēέÎģÎŋĪ…" + "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą Ī†ÎąÎēέÎģÎŋĪ…" + }, + "newFolder": { + "message": "ΝέÎŋĪ‚ ΆÎŦÎēÎĩÎģÎŋĪ‚" + }, + "folderName": { + "message": "ΌÎŊÎŋÎŧÎą Ī†ÎąÎēέÎģÎŋĪ…" + }, + "folderHintText": { + "message": "ÎĻΉÎģΚÎŦĪƒĪ„Îĩ έÎŊÎąÎŊ ΆÎŦÎēÎĩÎģÎŋ ΀΁ÎŋĪƒÎ¸Î­Ī„ÎŋÎŊĪ„ÎąĪ‚ Ī„Îŋ ΌÎŊÎŋÎŧÎą Ī„ÎŋĪ… ÎŗÎŋÎŊΚÎēÎŋĪ Ī†ÎąÎēέÎģÎŋĪ… ÎąÎēÎŋÎģÎŋĪ…Î¸ÎŋĪÎŧÎĩÎŊÎŋ ÎąĪ€ĪŒ έÎŊÎą \"/\". Î ÎąĪÎŦδÎĩÎšÎŗÎŧÎą: ΚÎŋΚÎŊΉÎŊΚÎēÎŦ/ÎĻΌ΁ÎŋĪ…Îŧ" + }, + "noFoldersAdded": { + "message": "ΔÎĩÎŊ ΀΁ÎŋĪƒĪ„Î­Î¸ÎˇÎēÎąÎŊ ΆÎŦÎēÎĩÎģÎŋΚ" + }, + "createFoldersToOrganize": { + "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽĪƒĪ„Îĩ Ī†ÎąÎēέÎģÎŋĪ…Ī‚ ÎŗÎšÎą ÎŊÎą ÎŋĪÎŗÎąÎŊĪŽĪƒÎĩĪ„Îĩ Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī„ÎŋĪ… Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ… ĪƒÎąĪ‚" + }, + "deleteFolderPermanently": { + "message": "Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎŧΌÎŊΚÎŧÎą ÎąĪ…Ī„ĪŒÎŊ Ī„Îŋ ΆÎŦÎēÎĩÎģÎŋ;" }, "deleteFolder": { - "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎĻÎąÎēέÎģÎŋĪ…" + "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ Ī†ÎąÎēέÎģÎŋĪ…" }, "folders": { "message": "ÎĻÎŦÎēÎĩÎģÎŋΚ" @@ -196,35 +396,35 @@ "message": "ΒÎŋΎθÎĩΚι & ÎŖĪ‡ĪŒÎģΚι" }, "helpCenter": { - "message": "ΚέÎŊ΄΁Îŋ βÎŋΎθÎĩÎšÎąĪ‚ Bitwarden" + "message": "ΚέÎŊ΄΁Îŋ ΒÎŋΎθÎĩÎšÎąĪ‚ Bitwarden" }, "communityForums": { - "message": "ΕξÎĩ΁ÎĩĪ…ÎŊÎŽĪƒĪ„Îĩ Ī„Îą Ī†ĪŒĪÎŋĪ…Îŧ Ī„ÎˇĪ‚ ÎēÎŋΚÎŊĪŒĪ„ÎˇĪ„ÎąĪ‚ Ī„ÎŋĪ… Bitwarden" + "message": "ΕξÎĩ΁ÎĩĪ…ÎŊÎŽĪƒĪ„Îĩ Ī„Îą Ī†ĪŒĪÎŋĪ…Îŧ ÎēÎŋΚÎŊĪŒĪ„ÎˇĪ„ÎąĪ‚ Bitwarden" }, "contactSupport": { - "message": "Î•Ī€ÎšÎēÎŋΚÎŊΉÎŊÎ¯Îą ÎŧÎĩ Ī„ÎˇÎŊ Ī…Ī€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇ Bitwarden" + "message": "Î•Ī€ÎšÎēÎŋΚÎŊΉÎŊÎ¯Îą ÎŧÎĩ Ī„ÎˇÎŊ Ī…Ī€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇ Ī„ÎŋĪ… Bitwarden" }, "sync": { "message": "ÎŖĪ…ÎŗĪ‡ĪÎŋÎŊÎšĪƒÎŧĪŒĪ‚" }, "syncVaultNow": { - "message": "ÎŖĪ…ÎŗĪ‡ĪÎŋÎŊÎšĪƒÎŧĪŒĪ‚ ÎģÎ¯ĪƒĪ„ÎąĪ‚" + "message": "ÎŖĪ…ÎŗĪ‡ĪÎŋÎŊÎšĪƒÎŧĪŒĪ‚ Î¸ÎˇĪƒÎąĪ…/ÎēΚÎŋĪ… Ī„ĪŽĪÎą" }, "lastSync": { "message": "ΤÎĩÎģÎĩĪ…Ī„ÎąÎ¯ÎŋĪ‚ ĪƒĪ…ÎŗĪ‡ĪÎŋÎŊÎšĪƒÎŧĪŒĪ‚:" }, "passGen": { - "message": "ΓÎĩÎŊÎŊÎŽĪ„ĪÎšÎą ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "ΓÎĩÎŊÎŊÎŽĪ„ĪÎšÎą ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "generator": { "message": "ΓÎĩÎŊÎŊÎŽĪ„ĪÎšÎą", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽĪƒĪ„Îĩ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą ÎšĪƒĪ‡Ī…ĪÎŋĪĪ‚ ÎēιΚ ÎŧÎŋÎŊιδΚÎēÎŋĪĪ‚ ÎēĪ‰Î´ÎšÎēÎŋĪĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą Ī„ÎšĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ ĪƒÎąĪ‚." }, - "bitWebVault": { - "message": "Bitwarden Web Vault" + "bitWebVaultApp": { + "message": "ΔιαδιÎēĪ„Ī…ÎąÎēÎŽ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Bitwarden" }, "importItems": { "message": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ" @@ -233,10 +433,13 @@ "message": "Î•Ī€ÎšÎģÎŋÎŗÎŽ" }, "generatePassword": { - "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "generatePassphrase": { + "message": "Generate passphrase" }, "regeneratePassword": { - "message": "Î•Ī€ÎąÎŊιδΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "Î•Ī€ÎąÎŊιδΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "options": { "message": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚" @@ -244,39 +447,91 @@ "length": { "message": "ΜήÎēÎŋĪ‚" }, + "passwordMinLength": { + "message": "ΕÎģÎŦĪ‡ÎšĪƒĪ„Îŋ ÎŧÎŽÎēÎŋĪ‚ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, "uppercase": { - "message": "ΚÎĩĪ†ÎąÎģÎąÎ¯Îą (A-Z)" + "message": "ΚÎĩĪ†ÎąÎģÎąÎ¯Îą (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "ΠÎĩÎļÎŦ (Îą-Ή)" + "message": "ΠÎĩÎļÎŦ (Îą-Ή)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Î‘ĪÎšÎ¸ÎŧÎŋί (0-9)" + "message": "Î‘ĪÎšÎ¸ÎŧÎŋί (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ΕιδιÎēÎŋί Î§ÎąĪÎąÎēĪ„ÎŽĪÎĩĪ‚ (!@#$%^&*)" + "message": "ΕιδιÎēÎŋί Ī‡ÎąĪÎąÎēĪ„ÎŽĪÎĩĪ‚ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "ÎŖĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "ÎŖĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ ÎēÎĩĪ†ÎąÎģÎąÎ¯Ī‰ÎŊ Ī‡ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "ÎŖĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ Ī€ÎĩÎļĪŽÎŊ Ī‡ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "ÎŖĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ ÎąĪÎšÎ¸ÎŧĪŽÎŊ", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "ÎŖĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ ÎĩΚδΚÎēĪŽÎŊ Ī‡ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { - "message": "Î‘ĪÎšÎ¸ÎŧĪŒĪ‚ ΛέξÎĩΉÎŊ" + "message": "Î‘ĪÎšÎ¸ÎŧĪŒĪ‚ ÎģέΞÎĩΉÎŊ" }, "wordSeparator": { - "message": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒĪ„ÎŽĪ‚ ΛέξÎĩΉÎŊ" + "message": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒĪ„ÎŽĪ‚ ÎģέΞÎĩΉÎŊ" }, "capitalize": { "message": "ΚÎĩĪ†ÎąÎģÎąÎ¯Îą", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "ÎŖĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ Î‘ĪÎšÎ¸ÎŧĪŽÎŊ" + "message": "ÎŖĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ ÎąĪÎšÎ¸ÎŧĪŽÎŊ" }, "minNumbers": { - "message": "ΕÎģÎŦĪ‡ÎšĪƒĪ„Îą Î‘ĪÎšÎ¸ÎŧÎˇĪ„ÎšÎēÎŦ Î¨ÎˇĪ†Î¯Îą" + "message": "ΕÎģÎŦĪ‡ÎšĪƒĪ„Îą ÎąĪÎšÎ¸ÎŧÎˇĪ„ÎšÎēÎŦ ĪˆÎˇĪ†Î¯Îą" }, "minSpecial": { - "message": "ΕÎģÎŦĪ‡ÎšĪƒĪ„Îŋ ΕιδιÎēĪŽÎŊ Î§ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ" + "message": "ΕÎģÎŦĪ‡ÎšĪƒĪ„ÎŋΚ ÎĩΚδΚÎēÎŋί Ī‡ÎąĪÎąÎēĪ„ÎŽĪÎĩĪ‚" }, "avoidAmbChar": { - "message": "Î‘Ī€ÎŋĪ†Ī…ÎŗÎŽ ΑÎŧĪ†ÎšÎģÎĩÎŗĪŒÎŧÎĩÎŊΉÎŊ Î§ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ" + "message": "Î‘Ī€ÎŋĪ†Ī…ÎŗÎŽ ÎąÎŧĪ†ÎšÎģÎĩÎŗĪŒÎŧÎĩÎŊΉÎŊ Ī‡ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Î‘Ī€ÎŋĪ†Ī…ÎŗÎŽ ÎąÎŧĪ†ÎšÎģÎĩÎŗĪŒÎŧÎĩÎŊΉÎŊ Ī‡ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Οι ÎąĪ€ÎąÎšĪ„ÎŽĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎĩĪ„ÎąÎšĪÎšÎēÎŽĪ‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎŽĪ‚ Î­Ī‡ÎŋĪ…ÎŊ ÎĩĪ†ÎąĪÎŧÎŋĪƒĪ„Îĩί ĪƒĪ„ÎšĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ ÎŗÎĩÎŊÎŊÎŽĪ„ĪÎšÎŦĪ‚ ĪƒÎąĪ‚.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ĪƒĪ„Îŋ vault" @@ -291,7 +546,7 @@ "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒĪ„Îˇ ÎģÎ¯ĪƒĪ„Îą." }, "itemInformation": { - "message": "ΠÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ΑÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + "message": "ΠÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" }, "username": { "message": "ΌÎŊÎŋÎŧÎą Î§ĪÎŽĪƒĪ„Îˇ" @@ -299,38 +554,65 @@ "password": { "message": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚" }, + "totp": { + "message": "ÎœĪ…ĪƒĪ„ÎšÎēΌ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚" + }, "passphrase": { "message": "ÎŖĪ…ÎŊθΡÎŧÎąĪ„ÎšÎēΌ" }, "favorite": { "message": "Î‘ÎŗÎąĪ€ÎˇÎŧέÎŊÎŋ" }, + "unfavorite": { + "message": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎąĪ€ĪŒ Ī„Îą ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą" + }, + "itemAddedToFavorites": { + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ΀΁ÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ ĪƒĪ„Îą ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą" + }, + "itemRemovedFromFavorites": { + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎąĪ†ÎąÎšĪÎ­Î¸ÎˇÎēÎĩ ÎąĪ€ĪŒ Ī„Îą ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą" + }, "notes": { "message": "ÎŖÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚" }, + "privateNote": { + "message": "Î™Î´ÎšĪ‰Ī„ÎšÎēÎŽ ĪƒÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇ" + }, "note": { "message": "ÎŖÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇ" }, "editItem": { - "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą ΑÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" }, "folder": { "message": "ÎĻÎŦÎēÎĩÎģÎŋĪ‚" }, "deleteItem": { - "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎŖĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ…" + "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ…" }, "viewItem": { - "message": "Î ĪÎŋβÎŋÎģÎŽ ΑÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + "message": "Î ĪÎŋβÎŋÎģÎŽ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" }, "launch": { "message": "ΕÎēÎēίÎŊÎˇĪƒÎˇ" }, + "launchWebsite": { + "message": "ΕÎēÎēίÎŊÎˇĪƒÎˇ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´ÎąĪ‚" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Î™ĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą" }, "toggleVisibility": { - "message": "ΕÎŊÎąÎģÎģÎąÎŗÎŽ ÎŸĪÎąĪ„ĪŒĪ„ÎˇĪ„ÎąĪ‚" + "message": "ΕÎŊÎąÎģÎģÎąÎŗÎŽ ÎŋĪÎąĪ„ĪŒĪ„ÎˇĪ„ÎąĪ‚" }, "manage": { "message": "Î”ÎšÎąĪ‡ÎĩÎ¯ĪÎšĪƒÎˇ" @@ -338,8 +620,23 @@ "other": { "message": "ΆÎģÎģÎĩĪ‚" }, + "unlockMethods": { + "message": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ΞÎĩÎēÎģÎĩÎšÎ´ĪŽÎŧÎąĪ„ÎŋĪ‚" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒĪ„Îĩ ÎŧΚι ÎŧέθÎŋδÎŋ ΞÎĩÎēÎģÎĩÎšÎ´ĪŽÎŧÎąĪ„ÎŋĪ‚ ÎŗÎšÎą ÎŊÎą ÎąÎģÎģÎŦΞÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎĩÎŊÎ­ĪÎŗÎĩΚι ·΁ÎŋÎŊΚÎēÎŋĪ ÎŋĪÎ¯ÎŋĪ… Î¸ÎˇĪƒÎąĪ…/ÎēΚÎŋĪ…." + "message": "ÎŸĪÎ¯ĪƒĪ„Îĩ ÎŧΚι ÎŧέθÎŋδÎŋ ΞÎĩÎēÎģÎĩÎšÎ´ĪŽÎŧÎąĪ„ÎŋĪ‚ ÎŗÎšÎą ÎŊÎą ÎąÎģÎģÎŦΞÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎĩÎŊÎ­ĪÎŗÎĩΚι ·΁ÎŋÎŊΚÎēÎŋĪ ÎŋĪÎ¯ÎŋĪ… ÎģÎŽÎžÎˇĪ‚ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…." + }, + "unlockMethodNeeded": { + "message": "ÎŸĪÎ¯ĪƒĪ„Îĩ ÎŧÎ¯Îą ÎŧέθÎŋδÎŋ ΞÎĩÎēÎģÎĩÎšÎ´ĪŽÎŧÎąĪ„ÎŋĪ‚ ĪƒĪ„ÎšĪ‚ ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚" + }, + "sessionTimeoutHeader": { + "message": "Î§ĪÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ ÎģÎŽÎžÎˇĪ‚ ĪƒĪ…ÎŊÎĩÎ´ĪÎ¯ÎąĪ‚" + }, + "vaultTimeoutHeader": { + "message": "Î§ĪÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ ÎēĪĪĪ€Ī„ÎˇĪ‚" + }, + "otherOptions": { + "message": "ΆÎģÎģÎĩĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚" }, "rateExtension": { "message": "ΒαθÎŧÎŋÎģÎŋÎŗÎŽĪƒĪ„Îĩ Ī„ÎˇÎŊ ÎĩĪ€Î­ÎēĪ„ÎąĪƒÎˇ" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "ΤÎŋ vault ĪƒÎąĪ‚ ÎĩίÎŊιΚ ÎēÎģÎĩÎšÎ´Ī‰ÎŧέÎŊÎŋ. Î•Ī€ÎąÎģΡθÎĩĪĪƒĪ„Îĩ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎĩĪ„Îĩ." }, + "yourVaultIsLockedV2": { + "message": "Η ÎēĪĪĪ€Ī„Îˇ ĪƒÎąĪ‚ Î­Ī‡ÎĩΚ ÎēÎģÎĩÎšÎ´Ī‰Î¸Îĩί" + }, + "yourAccountIsLocked": { + "message": "Ο ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧĪŒĪ‚ ĪƒÎąĪ‚ Î­Ī‡ÎĩΚ ÎēÎģÎĩÎšÎ´Ī‰Î¸Îĩί" + }, + "or": { + "message": "ÎŽ" + }, "unlock": { "message": "ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Î§ĪĪŒÎŊÎŋĪ‚ Î›ÎŽÎžÎˇĪ‚ Vault" }, + "vaultTimeout1": { + "message": "Λήξη ·΁ÎŋÎŊΚÎēÎŋĪ ÎŋĪÎ¯ÎŋĪ…" + }, "lockNow": { "message": "ΚÎģÎĩÎ¯Î´Ī‰ÎŧÎą Î¤ĪŽĪÎą" }, + "lockAll": { + "message": "ΚÎģÎĩÎ¯Î´Ī‰ÎŧÎą ΌÎģΉÎŊ" + }, "immediately": { "message": "ΆÎŧÎĩĪƒÎą" }, @@ -426,6 +738,18 @@ "security": { "message": "Î‘ĪƒĪ†ÎŦÎģÎĩΚι" }, + "confirmMasterPassword": { + "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "masterPassword": { + "message": "ÎšĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "masterPassImportant": { + "message": "Ο ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎŽĪ‚ ĪƒÎąĪ‚ δÎĩÎŊ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎąÎŊÎąÎēĪ„ÎˇÎ¸Îĩί ÎąÎŊ Ī„ÎŋÎŊ ΞÎĩ·ÎŦ΃ÎĩĪ„Îĩ!" + }, + "masterPassHintLabel": { + "message": "ÎĨĪ€ĪŒÎ´ÎĩΚΞΡ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, "errorOccurred": { "message": "Î ÎąĪÎŋĪ…ĪƒÎšÎŦĪƒĪ„ÎˇÎēÎĩ ĪƒĪ†ÎŦÎģÎŧÎą" }, @@ -442,7 +766,7 @@ "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ΞιÎŊÎŦ Îŋ ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚." }, "masterPasswordMinlength": { - "message": "Ο ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Î­Ī‡ÎĩΚ ÎŧÎŽÎēÎŋĪ‚ Ī„ÎŋĪ…ÎģÎŦĪ‡ÎšĪƒĪ„ÎŋÎŊ $VALUE$ Ī‡ÎąĪÎąÎēĪ„ÎŽĪÎĩĪ‚.", + "message": "Ο ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Î­Ī‡ÎĩΚ Ī„ÎŋĪ…ÎģÎŦĪ‡ÎšĪƒĪ„ÎŋÎŊ $VALUE$ Ī‡ÎąĪÎąÎēĪ„ÎŽĪÎĩĪ‚ ÎŧÎŽÎēÎŋĪ‚.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Ο ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧĪŒĪ‚ ĪƒÎąĪ‚ Î­Ī‡ÎĩΚ δΡÎŧΚÎŋĪ…ĪÎŗÎˇÎ¸Îĩί! Î¤ĪŽĪÎą ÎŧĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ." }, + "newAccountCreated2": { + "message": "Ο ÎŊέÎŋĪ‚ ĪƒÎąĪ‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧĪŒĪ‚ Î­Ī‡ÎĩΚ δΡÎŧΚÎŋĪ…ĪÎŗÎˇÎ¸Îĩί!" + }, + "youHaveBeenLoggedIn": { + "message": "ÎˆĪ‡ÎĩĪ„Îĩ ĪƒĪ…ÎŊδÎĩθÎĩί!" + }, + "youSuccessfullyLoggedIn": { + "message": "ÎˆĪ‡ÎĩĪ„Îĩ ĪƒĪ…ÎŊδÎĩθÎĩί ÎĩĪ€ÎšĪ„Ī…Ī‡ĪŽĪ‚" + }, + "youMayCloseThisWindow": { + "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎēÎģÎĩÎ¯ĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ" + }, "masterPassSent": { "message": "ÎŖÎąĪ‚ ĪƒĪ„ÎĩίÎģÎąÎŧÎĩ έÎŊÎą email ÎŧÎĩ Ī„ÎˇÎŊ Ī…Ī€ĪŒÎ´ÎĩΚΞΡ Ī„ÎŋĪ… ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ." }, "verificationCodeRequired": { "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš Îŋ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚." }, + "webauthnCancelOrTimeout": { + "message": "Η ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎąÎēĪ…ĪĪŽÎ¸ÎˇÎēÎĩ ÎŽ Î´ÎšÎŽĪÎēÎˇĪƒÎĩ Ī€ÎŋÎģĪ ĪŽĪÎą. Î ÎąĪÎąÎēÎąÎģĪŽ ΀΁ÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ΞιÎŊÎŦ." + }, "invalidVerificationCode": { "message": "Μη Î­ÎŗÎē΅΁ÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "ΔÎĩÎŊ ÎĩίÎŊιΚ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Ī„ÎŋĪ… ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋĪ… ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ… ΃Îĩ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ΃ÎĩÎģÎ¯Î´Îą. ΑÎŊĪ„ÎšÎŗĪÎŦĪˆĪ„Îĩ ÎēιΚ ÎĩĪ€ÎšÎēÎŋÎģÎģÎŽĪƒĪ„Îĩ Ī„ÎšĪ‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚." + "message": "ΔÎĩÎŊ ÎĩίÎŊιΚ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Ī„ÎŋĪ… ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋĪ… ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ… ΃' ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ΃ÎĩÎģÎ¯Î´Îą. ΑÎŊĪ„ÎšÎŗĪÎŦĪˆĪ„Îĩ ÎēιΚ ÎĩĪ€ÎšÎēÎŋÎģÎģÎŽĪƒĪ„Îĩ Ī„ÎšĪ‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚." + }, + "totpCaptureError": { + "message": "Î‘Î´Ī…ÎŊÎąÎŧÎ¯Îą ΃ÎŦĪĪ‰ĪƒÎˇĪ‚ Ī„ÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ QR ÎąĪ€ĪŒ Ī„ÎˇÎŊ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą" + }, + "totpCaptureSuccess": { + "message": "ΤÎŋ ÎēÎģÎĩΚδΚ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ ΀΁ÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ" + }, + "totpCapture": { + "message": "ÎŖÎŦĪĪ‰ĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ QR ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„ÎŽ ÎąĪ€ĪŒ Ī„ÎˇÎŊ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą" + }, + "totpHelperTitle": { + "message": "ΚÎŦÎŊĪ„Îĩ Ī„ÎˇÎŊ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇ Î´ĪÎŋ βΡÎŧÎŦ΄ΉÎŊ ÎąĪ€ĪĪŒĪƒÎēÎŋĪ€Ī„Îˇ" + }, + "totpHelper": { + "message": "ΤÎŋ Bitwarden ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎąĪ€ÎŋθΡÎēÎĩĪĪƒÎĩΚ ÎēιΚ ÎŊÎą ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽĪƒÎĩΚ Ī„ÎŋĪ…Ī‚ ÎēĪ‰Î´ÎšÎēÎŋĪĪ‚ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚ 2 βΡÎŧÎŦ΄ΉÎŊ. ΑÎŊĪ„ÎšÎŗĪÎŦĪˆĪ„Îĩ ÎēιΚ ÎĩĪ€ÎšÎēÎŋÎģÎģÎŽĪƒĪ„Îĩ Ī„Îŋ ÎēÎģÎĩΚδί ΃Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Ī€ÎĩδίÎŋ." + }, + "totpHelperWithCapture": { + "message": "ΤÎŋ Bitwarden ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎąĪ€ÎŋθΡÎēÎĩĪĪƒÎĩΚ ÎēιΚ ÎŊÎą ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽĪƒÎĩΚ Ī„ÎŋĪ…Ī‚ ÎēĪ‰Î´ÎšÎēÎŋĪĪ‚ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚ 2 βΡÎŧÎŦ΄ΉÎŊ. Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„Îŋ ÎĩΚÎēÎŋÎŊίδΚÎŋ Ī„ÎˇĪ‚ ÎēÎŦÎŧÎĩĪÎąĪ‚ ÎŗÎšÎą ÎģÎŽĪˆÎˇ ĪƒĪ„ÎšÎŗÎŧÎšĪŒĪ„Ī…Ī€ÎŋĪ… Ī„ÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ QR Ī„ÎŋĪ… ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„ÎŽ ÎąĪ…Ī„ÎŽĪ‚ Ī„ÎˇĪ‚ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´ÎąĪ‚, ÎŽ ÎąÎŊĪ„ÎšÎŗĪÎŦĪˆĪ„Îĩ ÎēιΚ ÎĩĪ€ÎšÎēÎŋÎģÎģÎŽĪƒĪ„Îĩ Ī„Îŋ ÎēÎģÎĩΚδί ΃Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Ī€ÎĩδίÎŋ." + }, + "learnMoreAboutAuthenticators": { + "message": "ΜÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ÎŗÎšÎą Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎ­Ī‚ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚" + }, + "copyTOTP": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎēÎģÎĩΚδΚÎŋĪ Î‘Ī…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎšÎˇĪ„ÎŽ (TOTP)" }, "loggedOut": { "message": "Î‘Ī€ÎŋĪƒĪ…ÎŊδÎĩθΎÎēÎąĪ„Îĩ" }, + "loggedOutDesc": { + "message": "ÎˆĪ‡ÎĩĪ„Îĩ ÎąĪ€ÎŋĪƒĪ…ÎŊδÎĩθÎĩί ÎąĪ€ĪŒ Ī„ÎŋÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚." + }, "loginExpired": { "message": "Η Ī€ÎĩĪÎ¯ÎŋδÎŋĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ĪƒÎąĪ‚ Î­Ī‡ÎĩΚ ÎģΎΞÎĩΚ." }, + "logIn": { + "message": "ÎŖĪÎŊδÎĩĪƒÎˇ" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Î•Ī€ÎąÎŊÎĩÎēÎēίÎŊÎˇĪƒÎˇ ÎĩÎŗÎŗĪÎąĪ†ÎŽĪ‚" + }, + "expiredLink": { + "message": "Ο ĪƒĪÎŊδÎĩ΃ÎŧÎŋĪ‚ έÎģΡΞÎĩ" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Î ÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ÎĩĪ€ÎąÎŊÎąÎēÎēΚÎŊÎŽĪƒĪ„Îĩ Ī„ÎˇÎŊ ÎĩÎŗÎŗĪÎąĪ†ÎŽ ÎŽ δÎŋÎēΚÎŧÎŦĪƒĪ„Îĩ ÎŊÎą ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ." + }, + "youMayAlreadyHaveAnAccount": { + "message": "ÎœĪ€Îŋ΁Îĩί ÎŊÎą Î­Ī‡ÎĩĪ„Îĩ ΎδΡ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ" + }, "logOutConfirmation": { "message": "Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą ÎąĪ€ÎŋĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ;" }, @@ -503,26 +887,26 @@ "addedFolder": { "message": "Î ĪÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ ΆÎŦÎēÎĩÎģÎŋĪ‚" }, - "changeMasterPass": { - "message": "ΑÎģÎģÎąÎŗÎŽ ÎšĪĪÎšÎŋĪ… ÎšĪ‰Î´ÎšÎēÎŋĪ" - }, - "changeMasterPasswordConfirmation": { - "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎģÎģÎŦΞÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ ĪƒĪ„Îŋ bitwarden.com. ΘέÎģÎĩĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą Ī„ĪŽĪÎą;" - }, "twoStepLoginConfirmation": { - "message": "Η ĪƒĪÎŊδÎĩĪƒÎˇ ΃Îĩ Î´ĪÎŋ βΎÎŧÎąĪ„Îą ÎēÎąÎ¸ÎšĪƒĪ„ÎŦ Ī€ÎšÎŋ ÎąĪƒĪ†ÎąÎģÎŽ Ī„ÎŋÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚, ÎąĪ€ÎąÎšĪ„ĪŽÎŊĪ„ÎąĪ‚ ÎŊÎą ÎĩĪ€ÎąÎģΡθÎĩĪĪƒÎĩĪ„Îĩ Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒÎąĪ‚ ÎŧÎĩ ÎŧΚι ÎŦÎģÎģΡ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ, ĪŒĪ€Ī‰Ī‚ ÎēÎģÎĩΚδί ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚, ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚, ÎŧÎŽÎŊĪ…ÎŧÎą SMS, Ī„ÎˇÎģÎĩΆΉÎŊΚÎēÎŽ ÎēÎģÎŽĪƒÎˇ ÎŽ email. ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„Îˇ ĪƒĪÎŊδÎĩĪƒÎˇ ΃Îĩ Î´ĪÎŋ βΎÎŧÎąĪ„Îą ĪƒĪ„Îŋ bitwarden.com. ΘέÎģÎĩĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą Ī„ĪŽĪÎą;" + "message": "Η ĪƒĪÎŊδÎĩĪƒÎˇ Î´ĪÎŋ βΡÎŧÎŦ΄ΉÎŊ ÎēÎąÎ¸ÎšĪƒĪ„ÎŦ Ī€ÎšÎŋ ÎąĪƒĪ†ÎąÎģÎŽ Ī„ÎŋÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚, ÎąĪ€ÎąÎšĪ„ĪŽÎŊĪ„ÎąĪ‚ ÎŊÎą ÎĩĪ€ÎąÎģΡθÎĩĪĪƒÎĩĪ„Îĩ Ī„Îˇ ĪƒĪ…ÎŊδÎĩĪƒÎŽ ĪƒÎąĪ‚ ÎŧÎĩ ÎŧΚι ÎŦÎģÎģΡ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ, ĪŒĪ€Ī‰Ī‚ έÎŊÎą ÎēÎģÎĩΚδί ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚, ÎŧÎ¯Îą ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚, έÎŊÎą ÎŧÎŽÎŊĪ…ÎŧÎą SMS, ÎŧÎ¯Îą Ī„ÎˇÎģÎĩΆΉÎŊΚÎēÎŽ ÎēÎģÎŽĪƒÎˇ ÎŽ έÎŊÎą ÎŧÎŽÎŊĪ…ÎŧÎą ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…. ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„Îˇ ĪƒĪÎŊδÎĩĪƒÎˇ Î´ĪÎŋ βΡÎŧÎŦ΄ΉÎŊ ĪƒĪ„Îŋ δΚιδΚÎēĪ„Ī…ÎąÎēΌ Î¸Ī…ĪƒÎąĪ…/ÎēΚÎŋ bitwarden.com. ΘέÎģÎĩĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą Ī„ĪŽĪÎą;" + }, + "twoStepLoginConfirmationContent": { + "message": "ΚÎŦÎŊĪ„Îĩ Ī„ÎŋÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚ Ī€ÎšÎŋ ÎąĪƒĪ†ÎąÎģÎŽ ÎŧÎĩ Ī„Îˇ ĪĪÎ¸ÎŧÎšĪƒÎˇ Ī„ÎˇĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ Î´ĪÎŋ βΡÎŧÎŦ΄ΉÎŊ ĪƒĪ„Îˇ δΚιδΚÎēĪ„Ī…ÎąÎēÎŽ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Ī„ÎŋĪ… Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "ÎŖĪ…ÎŊÎ­Ī‡ÎĩΚι ĪƒĪ„Îˇ δΚιδΚÎēĪ„Ī…ÎąÎēÎŽ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ;" }, "editedFolder": { - "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎŧέÎŊÎŋĪ‚ ΆÎŦÎēÎĩÎģÎŋĪ‚" + "message": "Ο ΆÎŦÎēÎĩÎģÎŋĪ‚ ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎĩ" }, "deleteFolderConfirmation": { "message": "Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒÎŊ Ī„Îŋ ΆÎŦÎēÎĩÎģÎŋ;" }, "deletedFolder": { - "message": "ΔιÎĩÎŗĪÎąÎŧÎŧέÎŊÎŋĪ‚ ΆÎŦÎēÎĩÎģÎŋĪ‚" + "message": "Ο ΆÎŦÎēÎĩÎģÎŋĪ‚ Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎĩ" }, "gettingStartedTutorial": { - "message": "ÎŸÎ´ÎˇÎŗĪŒĪ‚ ΕÎēÎŧÎŦÎ¸ÎˇĪƒÎˇĪ‚" + "message": "ÎŸÎ´ÎˇÎŗĪŒĪ‚ ÎĩÎēÎŧÎŦÎ¸ÎˇĪƒÎˇĪ‚" }, "gettingStartedTutorialVideo": { "message": "Î ÎąĪÎąÎēÎŋÎģÎŋĪ…Î¸ÎŽĪƒĪ„Îĩ Ī„ÎŋÎŊ ÎŋÎ´ÎˇÎŗĪŒ ÎĩÎēÎŧÎŦÎ¸ÎˇĪƒÎˇĪ‚ ÎŧÎąĪ‚, ÎŗÎšÎą ÎŊÎą ÎŧÎŦθÎĩĪ„Îĩ Ī€ĪŽĪ‚ ÎŧĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ιΞΚÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ ĪƒĪ„Îŋ Î­Ī€ÎąÎē΁Îŋ Ī„ÎˇÎŊ ÎĩĪ€Î­ÎēĪ„ÎąĪƒÎˇ Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚." @@ -552,17 +936,21 @@ "newUri": { "message": "ΝέÎŋ URI" }, + "addDomain": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī„ÎŋÎŧέι", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "ΤÎŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ ΀΁ÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ" }, "editedItem": { - "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎŧέÎŊÎŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ" + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎĩ" }, "deleteItemConfirmation": { "message": "Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ;" }, "deletedItem": { - "message": "Î”ÎšÎąÎŗĪÎąÎŧÎŧέÎŊÎŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ" + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎŧÎĩĪ„ÎąÎēΚÎŊΎθΡÎēÎĩ ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŦ΄ΉÎŊ" }, "overwritePassword": { "message": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" @@ -592,14 +980,26 @@ "enableAddLoginNotification": { "message": "Î–ÎˇĪ„ÎŽĪƒĪ„Îĩ ÎŊÎą ΀΁ÎŋĪƒÎ¸Î­ĪƒÎĩĪ„Îĩ ĪƒĪÎŊδÎĩĪƒÎˇ" }, + "vaultSaveOptionsTitle": { + "message": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ĪƒĪ„ÎšĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" + }, "addLoginNotificationDesc": { "message": "Η \"Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ΕιδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ ÎŖĪÎŊδÎĩĪƒÎˇĪ‚\" ĪƒÎąĪ‚ ΀΁ÎŋĪ„ĪÎ­Ī€ÎĩΚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą ÎŊÎą ÎąĪ€ÎŋθΡÎēÎĩĪĪƒÎĩĪ„Îĩ ÎŊέÎĩĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ ĪƒĪ„Îŋ vault ĪƒÎąĪ‚ ÎēÎŦθÎĩ ΆÎŋ΁ÎŦ Ī€ÎŋĪ… θι ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ÎŗÎšÎą Ī€ĪĪŽĪ„Îˇ ΆÎŋ΁ÎŦ." }, + "addLoginNotificationDescAlt": { + "message": "Î–ÎˇĪ„ÎŽĪƒĪ„Îĩ ÎŊÎą ΀΁ÎŋĪƒÎ¸Î­ĪƒÎĩĪ„Îĩ έÎŊÎą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎąÎŊ δÎĩ Î˛ĪÎĩθÎĩί ĪƒĪ„Îŋ Î¸ÎˇĪƒÎąĪ…/ÎēÎšĪŒ ĪƒÎąĪ‚. Î™ĪƒĪ‡ĪÎĩΚ ÎŗÎšÎą ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋĪ…Ī‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚." + }, + "showCardsInVaultView": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎēÎąĪĪ„ĪŽÎŊ Ή΂ ΀΁ÎŋĪ„ÎŦ΃ÎĩÎšĪ‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ĪƒĪ„ÎˇÎŊ ΀΁ÎŋβÎŋÎģÎŽ Î˜ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" + }, "showCardsCurrentTab": { "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎēÎąĪĪ„ĪŽÎŊ ĪƒĪ„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎšÎąĪĪ„Î­ÎģÎąĪ‚" }, "showCardsCurrentTabDesc": { - "message": "Î›Î¯ĪƒĪ„Îą ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊΉÎŊ ÎēÎąĪĪ„ĪŽÎŊ ĪƒĪ„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎšÎąĪĪ„Î­ÎģÎąĪ‚ ÎŗÎšÎą ÎĩĪÎēÎŋÎģΡ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ." + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎĩ Ī„Îą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ÎēÎŦ΁΄ÎĩĪ‚ ĪƒĪ„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎšÎąĪĪ„Î­ÎģÎą ÎŗÎšÎą ÎĩĪÎēÎŋÎģΡ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ." + }, + "showIdentitiesInVaultView": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ Ī„ÎąĪ…Ī„ÎŋĪ„ÎŽĪ„Ī‰ÎŊ Ή΂ ΀΁ÎŋĪ„ÎŦ΃ÎĩÎšĪ‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ĪƒĪ„ÎˇÎŊ ΀΁ÎŋβÎŋÎģÎŽ Î˜ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" }, "showIdentitiesCurrentTab": { "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ Ī„ÎąĪ…Ī„ÎŋĪ„ÎŽĪ„Ī‰ÎŊ ĪƒĪ„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎēÎąĪĪ„Î­ÎģÎąĪ‚" @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Î–ÎˇĪ„ÎŽĪƒĪ„Îĩ ÎŊÎą ÎĩÎŊΡÎŧÎĩĪĪŽĪƒÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŧÎšÎąĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ĪŒĪ„ÎąÎŊ ÎĩÎŊĪ„ÎŋĪ€ÎšĪƒĪ„Îĩί ÎŧΚι ÎąÎģÎģÎąÎŗÎŽ ΃Îĩ ÎŧΚι ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą." }, + "changedPasswordNotificationDescAlt": { + "message": "ÎĄĪŽĪ„ÎˇĪƒÎĩ ÎŗÎšÎą ÎŊÎą ÎĩÎŊΡÎŧÎĩĪĪŽĪƒÎĩÎšĪ‚ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŧÎšÎąĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ĪŒĪ„ÎąÎŊ ÎĩÎŊĪ„ÎŋĪ€ÎšĪƒĪ„Îĩί ÎŧΚι ÎąÎģÎģÎąÎŗÎŽ ΃Îĩ έÎŊÎąÎŊ ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ. Î™ĪƒĪ‡ĪÎĩΚ ÎŗÎšÎą ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋĪ…Ī‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚." + }, + "enableUsePasskeys": { + "message": "Î•ĪĪŽĪ„ÎˇĪƒÎˇ ÎŗÎšÎą ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ÎēιΚ Ī‡ĪÎŽĪƒÎˇ ÎēÎģÎĩÎšÎ´ÎšĪŽÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "usePasskeysDesc": { + "message": "ÎĄĪŽĪ„ÎˇĪƒÎĩ ÎŧÎĩ ÎŗÎšÎą Ī„ÎˇÎŊ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ÎŊÎ­Ī‰ÎŊ ĪƒĪ…ÎŊθΡÎŧÎąĪ„ÎšÎēĪŽÎŊ ÎŽ ĪƒĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ ÎēÎģÎĩΚδΚÎŦ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪ€ÎŋθΡÎēÎĩĪ…ÎŧέÎŊÎą ĪƒĪ„Îŋ Î¸ÎˇĪƒÎąĪ…/ÎēÎšĪŒ ÎŧÎŋĪ…. Î™ĪƒĪ‡ĪÎĩΚ ÎŗÎšÎą ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋĪ…Ī‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚." + }, "notificationChangeDesc": { "message": "ΘέÎģÎĩĪ„Îĩ ÎŊÎą ÎĩÎŊΡÎŧÎĩĪĪŽĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ ĪƒĪ„Îŋ Bitwarden ;" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą" }, + "additionalOptions": { + "message": "Î ĪĪŒĪƒÎ¸ÎĩĪ„ÎĩĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚" + }, "enableContextMenuItem": { "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎĩĪ€ÎšÎģÎŋÎŗĪŽÎŊ ÎŧÎĩÎŊÎŋĪ Ī€ÎĩĪÎšÎ˛ÎŦÎģÎģÎŋÎŊĪ„ÎŋĪ‚" }, "contextMenuItemDesc": { "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ έÎŊÎą δÎĩĪ…Ī„Îĩ΁ÎĩĪÎŋÎŊ ÎēÎģΚÎē ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎēιΚ ÎŊÎą Ī„ÎąÎšĪÎšÎŦΞÎĩĪ„Îĩ Ī„ÎšĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ ÎŗÎšÎą Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą. " }, + "contextMenuItemDescAlt": { + "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ έÎŊÎą δÎĩĪ…Ī„Îĩ΁ÎĩĪÎŋÎŊ ÎēÎģΚÎē ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎēιΚ ÎŊÎą Ī„ÎąÎšĪÎšÎŦΞÎĩĪ„Îĩ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ ÎŗÎšÎą Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą. Î™ĪƒĪ‡ĪÎĩΚ ÎŗÎšÎą ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋĪ…Ī‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚." + }, "defaultUriMatchDetection": { "message": "Î ĪÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΡ ÎąÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ ÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎšĪ‡Î¯ÎąĪ‚ URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„ÎŋÎŊ ΀΁ÎŋÎēιθÎŋĪÎšĪƒÎŧέÎŊÎŋ Ī„ĪĪŒĪ€Îŋ ÎŧÎĩ Ī„ÎŋÎŊ ÎŋĪ€ÎŋίÎŋ ÎąÎŊĪ„ÎšÎŧÎĩĪ„Ī‰Ī€Î¯ÎļÎĩĪ„ÎąÎš Ρ ÎąÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ ÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎ¯Ī‡ÎšĪƒÎˇĪ‚ URI ÎŗÎšÎą Ī„ÎšĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ÎĩÎēĪ„Î­ÎģÎĩĪƒÎˇ ÎĩÎŊÎĩĪÎŗÎĩÎšĪŽÎŊ ĪŒĪ€Ī‰Ī‚ Ρ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ΑÎģÎģÎąÎŗÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ θέÎŧÎąĪ„ÎŋĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚." }, + "themeDescAlt": { + "message": "ΑÎģÎģÎąÎŗÎŽ Ī„ÎŋĪ… ·΁ΉÎŧÎąĪ„ÎšÎēÎŋĪ θέÎŧÎąĪ„ÎŋĪ‚ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚. Î™ĪƒĪ‡ĪÎĩΚ ÎŗÎšÎą ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋĪ…Ī‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚." + }, "dark": { "message": "ÎŖÎēÎŋĪ„ÎĩΚÎŊΌ", "description": "Dark color" @@ -670,18 +1088,45 @@ "message": "Solarized ÎŖÎēÎŋĪĪÎŋ", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ÎąĪ€ĪŒ" + }, "exportVault": { "message": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ Vault" }, "fileFormat": { - "message": "ΜÎŋĪĪ†ÎŽ ÎąĪĪ‡ÎĩίÎŋĪ…" + "message": "Î¤ĪĪ€ÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…" + }, + "fileEncryptedExportWarningDesc": { + "message": "Î‘Ī…Ī„ÎŽ Ρ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ ÎąĪĪ‡ÎĩίÎŋĪ… θι ΀΁ÎŋĪƒĪ„ÎąĪ„ÎĩĪÎĩĪ„ÎąÎš ÎŧÎĩ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎēιΚ θι ÎąĪ€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš Îŋ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… ÎąĪĪ‡ÎĩίÎŋĪ… ÎŗÎšÎą ÎąĪ€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ." + }, + "filePassword": { + "message": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…" + }, + "exportPasswordDescription": { + "message": "Î‘Ī…Ī„ĪŒĪ‚ Îŋ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ θι Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚΡθÎĩί ÎŗÎšÎą Ī„ÎˇÎŊ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ ÎēιΚ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎąĪĪ‡ÎĩίÎŋĪ…" + }, + "accountRestrictedOptionDescription": { + "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îŋ ÎēÎģÎĩΚδί Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇĪ‚ Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚, Ī€ÎŋĪ… ΀΁ÎŋÎ­ĪĪ‡ÎĩĪ„ÎąÎš ÎąĪ€ĪŒ Ī„Îŋ ΌÎŊÎŋÎŧÎą Ī‡ĪÎŽĪƒĪ„Îˇ ÎēιΚ Ī„ÎŋÎŊ ÎšĪĪÎšÎŋ ÎšĪ‰Î´ÎšÎēΌ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚, ÎŗÎšÎą ÎŊÎą Îē΁΅΀΄ÎŋÎŗĪÎąĪ†ÎŽĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ ÎēιΚ ÎŊÎą Ī€ÎĩĪÎšÎŋĪÎ¯ĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ÎŧΌÎŊÎŋ ĪƒĪ„ÎŋÎŊ Ī„ĪÎ­Ī‡ÎŋÎŊĪ„Îą ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "ÎŸĪÎ¯ĪƒĪ„Îĩ έÎŊÎąÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ… ÎŗÎšÎą ÎŊÎą Îē΁΅΀΄ÎŋÎŗĪÎąĪ†ÎŽĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ, ÎēιΚ ÎŊÎą Ī„ÎˇÎŊ ÎĩÎšĪƒÎŦÎŗÎĩĪ„Îĩ ΃Îĩ ÎŋĪ€ÎŋΚÎŋÎŊÎ´ÎŽĪ€ÎŋĪ„Îĩ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ Bitwarden Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą ÎąĪ€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ." + }, + "exportTypeHeading": { + "message": "Î¤ĪĪ€ÎŋĪ‚ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽĪ‚" + }, + "accountRestricted": { + "message": "ΠÎĩĪÎšÎŋĪÎšĪƒÎŧέÎŊÎŋ ĪƒĪ„Îŋ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "â€œÎšĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…â€ ÎēιΚ â€œÎ•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…â€œ δÎĩÎŊ Ī„ÎąÎšĪÎšÎŦÎļÎŋĪ…ÎŊ." }, "warning": { "message": "Î ÎĄÎŸÎ•Î™Î”ÎŸÎ ÎŸÎ™Î—ÎŖÎ—", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽĪ‚ vault" + "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽĪ‚ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" }, "exportWarningDesc": { "message": "Î‘Ī…Ī„ÎŽ Ρ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ Ī€ÎĩĪÎšÎ­Ī‡ÎĩΚ Ī„Îą δÎĩδÎŋÎŧέÎŊÎą ΃Îĩ ÎŧΡ Îē΁΅΀΄ÎŋÎŗĪÎąĪ†ÎˇÎŧέÎŊΡ ÎŧÎŋĪĪ†ÎŽ. ΔÎĩÎŊ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎąĪ€ÎŋθΡÎēÎĩĪÎĩĪ„Îĩ ÎŽ ÎŊÎą ĪƒĪ„ÎĩίÎģÎĩĪ„Îĩ Ī„Îŋ ÎĩÎžÎąÎŗĪŒÎŧÎĩÎŊÎŋ ÎąĪĪ‡ÎĩίÎŋ ÎŧÎ­ĪƒĪ‰ ÎŧΡ ÎąĪƒĪ†ÎąÎģĪŽÎŊ Ī„ĪĪŒĪ€Ī‰ÎŊ (ĪŒĪ€Ī‰Ī‚ ÎŧÎ­ĪƒĪ‰ email). Î”ÎšÎąÎŗĪÎŦĪˆĪ„Îĩ Ī„Îŋ ÎąÎŧÎ­ĪƒĪ‰Ī‚ ÎŧΌÎģÎšĪ‚ Ī„ÎĩÎģÎĩÎšĪŽĪƒÎĩĪ„Îĩ ÎŧÎĩ Ī„Îˇ Ī‡ĪÎŽĪƒÎˇ Ī„ÎŋĪ…." @@ -698,11 +1143,8 @@ "shared": { "message": "ΚÎŋΚÎŊÎŋĪ€ÎŋΚΎθΡÎēÎĩ" }, - "learnOrg": { - "message": "ΜÎŦθÎĩĪ„Îĩ ÎŗÎšÎą Ī„ÎŋĪ…Ī‚ ÎŸĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪĪ‚" - }, - "learnOrgConfirmation": { - "message": "ΤÎŋ Bitwarden ÎĩĪ€ÎšĪ„ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎŧÎŋÎšĪÎŦÎļÎĩĪƒĪ„Îĩ Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī„ÎŋĪ… vault ĪƒÎąĪ‚ ÎŧÎĩ ÎŦÎģÎģÎŋĪ…Ī‚ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ έÎŊÎą ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ. ΘέÎģÎĩĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą bitwarden.com ÎŗÎšÎą ÎŊÎą ÎŧÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą;" + "bitwardenForBusinessPageDesc": { + "message": "ΤÎŋ Bitwarden ÎŗÎšÎą Î•Ī€ÎšĪ‡ÎĩÎšĪÎŽĪƒÎĩÎšĪ‚ ĪƒÎąĪ‚ ÎĩĪ€ÎšĪ„ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎŧÎŋÎšĪÎąĪƒĪ„ÎĩÎ¯Ī„Îĩ Ī„Îą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą Ī„ÎŋĪ… Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ… ĪƒÎąĪ‚ ÎŧÎĩ ÎŦÎģÎģÎŋĪ…Ī‚ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ έÎŊÎąÎŊ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ. ΜÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ĪƒĪ„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą bitwarden.com." }, "moveToOrganization": { "message": "ΜÎĩĪ„ÎąÎēίÎŊÎˇĪƒÎˇ ΃Îĩ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ" @@ -762,6 +1204,9 @@ "file": { "message": "Î‘ĪĪ‡ÎĩίÎŋ" }, + "fileToShare": { + "message": "Î‘ĪĪ‡ÎĩίÎŋ ΀΁ÎŋĪ‚ ÎēÎŋΚÎŊÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ" + }, "selectFile": { "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎąĪĪ‡ÎĩίÎŋ" }, @@ -769,10 +1214,10 @@ "message": "ΤÎŋ ÎŧÎ­ÎŗÎšĪƒĪ„Îŋ ÎŧÎ­ÎŗÎĩθÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ… ÎĩίÎŊιΚ 500 MB." }, "featureUnavailable": { - "message": "Μη Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ Ī‡ÎąĪÎąÎēĪ„ÎˇĪÎšĪƒĪ„ÎšÎēΌ" + "message": "Μη Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧΡ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎŧÎĩĪ„ÎąĪ†Îŋ΁ÎŦ ÎēÎģÎĩΚδΚÎŋĪ Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇĪ‚. Î ÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ÎŧÎ­ĪƒĪ‰ Ī„ÎŋĪ… δΚιδΚÎēĪ„Ī…ÎąÎēÎŋĪ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ… ÎŗÎšÎą ÎŊÎą ÎĩÎŊΡÎŧÎĩĪĪŽĪƒÎĩĪ„Îĩ Ī„Îŋ ÎēÎģÎĩΚδί Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇĪ‚." }, "premiumMembership": { "message": "ÎŖĪ…ÎŊÎ´ĪÎŋÎŧÎŽ Premium" @@ -787,14 +1232,17 @@ "message": "ΑÎŊÎąÎŊÎ­Ī‰ĪƒÎˇ ĪƒĪ…ÎŊÎ´ĪÎŋÎŧÎŽĪ‚" }, "premiumNotCurrentMember": { - "message": "ΔÎĩÎŊ ÎĩÎ¯ĪƒĪ„Îĩ ÎŧέÎģÎŋĪ‚ Premium." + "message": "ΔÎĩÎŊ ÎĩÎ¯ĪƒĪ„Îĩ Premium ÎŧέÎģÎŋĪ‚ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ĪƒĪ„ÎšÎŗÎŧÎŽ." }, "premiumSignUpAndGet": { - "message": "Î•ÎŗÎŗĪÎąĪ†ÎĩÎ¯Ī„Îĩ ÎŗÎšÎą ĪƒĪ…ÎŊÎ´ĪÎŋÎŧÎŽ Premium ÎēιΚ ÎģÎŦβÎĩĪ„Îĩ:" + "message": "Î•ÎŗÎŗĪÎąĪ†ÎĩÎ¯Ī„Îĩ ÎŗÎšÎą ÎŧÎ¯Îą ĪƒĪ…ÎŊÎ´ĪÎŋÎŧÎŽ Premium ÎēιΚ ÎģÎŦβÎĩĪ„Îĩ:" }, "ppremiumSignUpStorage": { "message": "1 GB Îē΁΅΀΄ÎŋÎŗĪÎąĪ†ÎˇÎŧέÎŊÎŋ ÎąĪ€ÎŋθΡÎēÎĩĪ…Ī„ÎšÎēΌ Ī‡ĪŽĪÎŋ ÎŗÎšÎą ĪƒĪ…ÎŊΡÎŧÎŧέÎŊÎą ÎąĪĪ‡ÎĩÎ¯Îą." }, + "premiumSignUpEmergency": { + "message": "Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇ έÎēĪ„ÎąÎēĪ„ÎˇĪ‚ ÎąÎŊÎŦÎŗÎēÎˇĪ‚." + }, "premiumSignUpTwoStepOptions": { "message": "Î ĪĪŒĪƒÎ¸ÎĩĪ„ÎĩĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ Î´ĪÎŋ βΡÎŧÎŦ΄ΉÎŊ, ĪŒĪ€Ī‰Ī‚ Ī„Îŋ YubiKey ÎēιΚ Ī„Îŋ Duo." }, @@ -808,20 +1256,26 @@ "message": "Î ĪÎŋĪ„ÎĩĪÎąÎšĪŒĪ„ÎˇĪ„Îą Ī…Ī€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇĪ‚ Ī€ÎĩÎģÎąĪ„ĪŽÎŊ." }, "ppremiumSignUpFuture": { - "message": "ΌÎģÎą Ī„Îą ÎŧÎĩÎģÎģÎŋÎŊĪ„ÎšÎēÎŦ Ī‡ÎąĪÎąÎēĪ„ÎˇĪÎšĪƒĪ„ÎšÎēÎŦ Premium. ÎˆĪĪ‡ÎŋÎŊĪ„ÎąÎš Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ĪƒĪÎŊĪ„ÎŋÎŧÎą!" + "message": "ΌÎģÎĩĪ‚ ÎŋΚ ÎŧÎĩÎģÎģÎŋÎŊĪ„ÎšÎēÎ­Ī‚ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯ÎĩĪ‚ Premium. ÎˆĪĪ‡ÎŋÎŊĪ„ÎąÎš Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ĪƒĪÎŊĪ„ÎŋÎŧÎą!" }, "premiumPurchase": { "message": "Î‘ÎŗÎŋ΁ÎŦ Premium έÎēδÎŋĪƒÎˇĪ‚" }, "premiumPurchaseAlert": { - "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎŗÎŋ΁ÎŦ΃ÎĩĪ„Îĩ ĪƒĪ…ÎŊÎ´ĪÎŋÎŧÎŽ Premium ĪƒĪ„Îŋ web vault Ī„ÎŋĪ… bitwarden.com. ΘέÎģÎĩĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą Ī„ĪŽĪÎą;" + "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎŗÎŋ΁ÎŦ΃ÎĩĪ„Îĩ ĪƒĪ…ÎŊÎ´ĪÎŋÎŧÎŽ Premium ĪƒĪ„Îŋ δΚιδΚÎēĪ„Ī…ÎąÎēΌ Î¸ÎˇĪƒÎąĪ…/ÎēΚÎŋ Ī„ÎŋĪ… bitwarden.com. ΘέÎģÎĩĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą Ī„ĪŽĪÎą;" + }, + "premiumPurchaseAlertV2": { + "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎŗÎŋ΁ÎŦ΃ÎĩĪ„Îĩ Ī„Îŋ Premium ÎąĪ€ĪŒ Ī„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚ ĪƒĪ„ÎˇÎŊ δΚιδΚÎēĪ„Ī…ÎąÎēÎŽ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Bitwarden." }, "premiumCurrentMember": { - "message": "Î•Î¯ĪƒĪ„Îĩ ÎŧέÎģÎŋĪ‚ Premium!" + "message": "Î•Î¯ĪƒĪ„Îĩ Premium ÎŧέÎģÎŋĪ‚!" }, "premiumCurrentMemberThanks": { "message": "Î•Ī…Ī‡ÎąĪÎšĪƒĪ„ÎŋĪÎŧÎĩ Ī€ÎŋĪ… Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎĩĪ„Îĩ Ī„Îŋ Bitwarden." }, + "premiumFeatures": { + "message": "ΑÎŊιβιθÎŧÎ¯ĪƒĪ„Îĩ ΃Îĩ Premium ÎēιΚ ÎģÎŦβÎĩĪ„Îĩ:" + }, "premiumPrice": { "message": "ΌÎģÎą ÎŗÎšÎą ÎŧΌÎŊÎŋ $PRICE$ /Î­Ī„ÎŋĪ‚!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "ΌÎģÎą ÎŧΌÎŊÎŋ ÎŗÎšÎą $PRICE$ ÎąÎŊÎŦ Î­Ī„ÎŋĪ‚!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Î•Ī€ÎšĪ„Ī…Ī‡ÎŽĪ‚ ÎąÎŊÎąÎŊÎ­Ī‰ĪƒÎˇ" }, @@ -844,10 +1307,10 @@ "message": "Î–ÎˇĪ„ÎŽĪƒĪ„Îĩ βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ÎĩÎēÎēίÎŊÎˇĪƒÎˇ" }, "premiumRequired": { - "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš έÎēδÎŋĪƒÎˇ Premium" + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš Ī„Îŋ Premium" }, "premiumRequiredDesc": { - "message": "Για ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ÎŽ Ī„Îˇ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą, ÎąĪ€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš έÎēδÎŋĪƒÎˇ Premium." + "message": "Για ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ÎŽ Ī„Îˇ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą, ÎąĪ€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ĪƒĪ…ÎŊÎ´ĪÎŋÎŧÎŽ Premium." }, "enterVerificationCodeApp": { "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī„ÎŋÎŊ 6ĪˆÎŽĪ†ÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚." @@ -913,20 +1376,20 @@ "message": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ ÎąÎŊÎŦÎēĪ„ÎˇĪƒÎˇĪ‚" }, "authenticatorAppTitle": { - "message": "Î•Ī†ÎąĪÎŧÎŋÎŗÎŽ ÎĩÎģÎ­ÎŗĪ‡ÎŋĪ… Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚" + "message": "Î•Ī†ÎąĪÎŧÎŋÎŗÎŽ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚" }, - "authenticatorAppDesc": { - "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ ÎŧΚι ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚ (ĪŒĪ€Ī‰Ī‚ Ī„Îŋ Authy ÎŽ Google Authenticator) ÎŗÎšÎą ÎŊÎą δΡÎŧΚÎŋĪ…ĪÎŗÎŽĪƒÎĩΚ ÎēĪ‰Î´ÎšÎēÎŋĪĪ‚ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚ ÎŧÎĩ Ī‡ĪĪŒÎŊΚÎēÎŋ Ī€ÎĩĪÎšÎŋĪÎšĪƒÎŧΌ.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ έÎŊÎąÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ÎŋĪ… δΡÎŧΚÎŋĪ…ĪÎŗÎŽÎ¸ÎˇÎēÎĩ ÎąĪ€ĪŒ ÎŧΚι ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ ĪŒĪ€Ī‰Ī‚ Ī„Îŋ Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "ΚÎģÎĩΚδί ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ YubiKey OTP" + "yubiKeyTitleV2": { + "message": "ΚÎģÎĩΚδί Î‘ĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ Yubico OTP" }, "yubiKeyDesc": { "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ έÎŊÎą YubiKey ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚. ΛÎĩÎšĪ„ÎŋĪ…ĪÎŗÎĩί ÎŧÎĩ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚ ΃ÎĩÎšĪÎŦĪ‚ YubiKey 4, 4 Nano, 4C ÎēιΚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚ NEO." }, - "duoDesc": { - "message": "Î•Ī€ÎąÎģΡθÎĩĪĪƒĪ„Îĩ ÎŧÎĩ Ī„Îŋ Duo Security Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Duo Mobile, ÎŧΡÎŊĪÎŧÎąĪ„Îą SMS, Ī„ÎˇÎģÎĩΆΉÎŊΚÎēÎŽ ÎēÎģÎŽĪƒÎˇ ÎŽ ÎēÎģÎĩΚδί ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ U2F.", + "duoDescV2": { + "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ έÎŊÎąÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ÎŋĪ… δΡÎŧΚÎŋĪ…ĪÎŗÎŽÎ¸ÎˇÎēÎĩ ÎąĪ€ĪŒ Ī„Îŋ Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -937,13 +1400,13 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ ÎŋĪ€ÎŋΚÎŋÎ´ÎŽĪ€ÎŋĪ„Îĩ ÎēÎģÎĩΚδί ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ…ÎŧÎ˛ÎąĪ„ĪŒ ÎŧÎĩ Ī„Îŋ WebAuthn ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚." + "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ ÎŋĪ€ÎŋΚÎŋÎ´ÎŽĪ€ÎŋĪ„Îĩ ÎēÎģÎĩΚδί ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ…ÎŧÎ˛ÎąĪ„ĪŒ ÎŧÎĩ Ī„Îŋ WebAuthn ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„ÎŋÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚." }, "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Οι ÎēĪ‰Î´ÎšÎēÎŋί ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚ θι ĪƒÎąĪ‚ ÎąĪ€ÎŋĪƒĪ„ÎąÎģÎŋĪÎŊ ÎŧÎ­ĪƒĪ‰ ΡÎģÎĩÎē΄΁ÎŋÎŊΚÎēÎŋĪ Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…." + "emailDescV2": { + "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ÎŋĪ… ĪƒÎąĪ‚ ĪƒĪ„ÎŦÎģθΡÎēÎĩ ĪƒĪ„Îŋ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋ." }, "selfHostedEnvironment": { "message": "Î‘Ī…Ī„Îŋ-Ī†ÎšÎģÎŋΞÎĩÎŊÎŋĪÎŧÎĩÎŊÎŋ Ī€ÎĩĪÎšÎ˛ÎŦÎģÎģÎŋÎŊ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "ΚαθÎŋĪÎ¯ĪƒĪ„Îĩ Ī„Îˇ Î˛ÎąĪƒÎšÎēÎŽ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ URL, Ī„ÎˇĪ‚ ÎĩÎŗÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… Bitwarden Ī€ÎŋĪ… Ī†ÎšÎģÎŋΞÎĩÎŊÎĩÎ¯Ī„ÎąÎš ĪƒĪ„Îŋ Ī‡ĪŽĪÎŋ ĪƒÎąĪ‚." }, + "selfHostedBaseUrlHint": { + "message": "ΚαθÎŋĪÎ¯ĪƒĪ„Îĩ Ī„Îŋ Î˛ÎąĪƒÎšÎēΌ URL Ī„ÎˇĪ‚ ÎĩÎŗÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚ Bitwarden ĪƒĪ„Îŋ Ī‡ĪŽĪÎŋ ĪƒÎąĪ‚. Î ÎąĪÎŦδÎĩÎšÎŗÎŧÎą: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Για ΀΁ÎŋĪ‡Ī‰ĪÎˇÎŧέÎŊΡ Ī€ÎąĪÎąÎŧÎĩ΄΁ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ, ÎŧĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎŋĪÎ¯ĪƒÎĩĪ„Îĩ ÎąÎŊÎĩΞÎŦĪĪ„ÎˇĪ„Îą Ī„Îŋ Î˛ÎąĪƒÎšÎēΌ URL ÎēÎŦθÎĩ Ī…Ī€ÎˇĪÎĩĪƒÎ¯ÎąĪ‚." + }, + "selfHostedEnvFormInvalid": { + "message": "Î ĪÎ­Ī€ÎĩΚ ÎŊÎą ΀΁ÎŋĪƒÎ¸Î­ĪƒÎĩĪ„Îĩ ÎĩÎ¯Ī„Îĩ Ī„Îŋ Î˛ÎąĪƒÎšÎēΌ URL Ī„ÎŋĪ… δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎŽ Ī„ÎŋĪ…ÎģÎŦĪ‡ÎšĪƒĪ„ÎŋÎŊ έÎŊÎą ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ Ī€ÎĩĪÎšÎ˛ÎŦÎģÎģÎŋÎŊ." + }, "customEnvironment": { "message": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ Ī€ÎĩĪÎšÎ˛ÎŦÎģÎģÎŋÎŊ" }, @@ -960,33 +1432,96 @@ "baseUrl": { "message": "URL ΔιαÎēÎŋÎŧÎšĪƒĪ„ÎŽ" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { - "message": "URL ΔιαÎēÎŋÎŧÎšĪƒĪ„ÎŽ API" + "message": "URL δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ API" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "URL δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ δΚιδΚÎēĪ„Ī…ÎąÎēÎŋĪ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" }, "identityUrl": { - "message": "URL Î¤ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚ ΔιαÎēÎŋÎŧÎšĪƒĪ„ÎŽ" + "message": "URL δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚" }, "notificationsUrl": { - "message": "ΕιδÎŋĪ€ÎŋÎšÎŽĪƒÎĩÎšĪ‚ ΔιÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ URL ΔιαÎēÎŋÎŧÎšĪƒĪ„ÎŽ" + "message": "URL δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎĩΚδÎŋĪ€ÎŋÎšÎŽĪƒÎĩΉÎŊ" }, "iconsUrl": { - "message": "ΕιÎēÎŋÎŊÎ¯Î´ÎšÎą δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ URL" + "message": "URL δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎĩΚÎēÎŋÎŊÎšÎ´Î¯Ī‰ÎŊ" }, "environmentSaved": { - "message": "Οι δΚÎĩĪ…Î¸ĪÎŊ΃ÎĩÎšĪ‚ URL Ī€ÎĩĪÎšÎ˛ÎŦÎģÎģÎŋÎŊĪ„ÎŋĪ‚ Î­Ī‡ÎŋĪ…ÎŊ ÎąĪ€ÎŋθΡÎēÎĩĪ…Ī„Îĩί." + "message": "Τι URL Ī€ÎĩĪÎšÎ˛ÎŦÎģÎģÎŋÎŊĪ„ÎŋĪ‚ Î­Ī‡ÎŋĪ…ÎŊ ÎąĪ€ÎŋθΡÎēÎĩĪ…Ī„Îĩί" + }, + "showAutoFillMenuOnFormFields": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎŧÎĩÎŊÎŋĪ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ĪƒĪ„Îą Ī€ÎĩÎ´Î¯Îą Ī„ÎˇĪ‚ Ī†ĪŒĪÎŧÎąĪ‚", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Î ĪĪŒĪ„ÎąĪƒÎˇ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚" + }, + "showInlineMenuLabel": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎŧÎĩÎŊÎŋĪ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ĪƒĪ„Îą Ī€ÎĩÎ´Î¯Îą Ī„ÎˇĪ‚ Ī†ĪŒĪÎŧÎąĪ‚" + }, + "showInlineMenuIdentitiesLabel": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ Ī„ÎąĪ…Ī„ÎŋĪ„ÎŽĪ„Ī‰ÎŊ Ή΂ ΀΁ÎŋĪ„ÎŦ΃ÎĩÎšĪ‚" + }, + "showInlineMenuCardsLabel": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎēÎąĪĪ„ĪŽÎŊ Ή΂ ΀΁ÎŋĪ„ÎŦ΃ÎĩÎšĪ‚" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ΀΁ÎŋĪ„ÎŦ΃ÎĩΉÎŊ ĪŒĪ„ÎąÎŊ Ī„Îŋ ÎĩΚÎēÎŋÎŊίδΚÎŋ ÎĩίÎŊιΚ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋ" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Î™ĪƒĪ‡ĪÎĩΚ ÎŗÎšÎą ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋĪ…Ī‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎˇÎŊ ĪĪÎ¸ÎŧÎšĪƒÎˇ Ī„ÎŋĪ… Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽ ÎēĪ‰Î´ÎšÎēĪŽÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ ĪƒÎąĪ‚ ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋĪ†ĪÎŗÎĩĪ„Îĩ ĪƒĪ…ÎŗÎē΁ÎŋĪĪƒÎĩÎšĪ‚." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒĪ„ÎĩÎ¯Ī„Îĩ Ī„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ." + }, + "autofillOverlayVisibilityOff": { + "message": "ΑÎŊÎĩÎŊÎĩĪÎŗĪŒ", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "ÎŒĪ„ÎąÎŊ Ī„Îŋ Ī€ÎĩδίÎŋ ÎĩίÎŊιΚ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋ (΃Îĩ ÎĩĪƒĪ„Î¯ÎąĪƒÎˇ)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "ÎŒĪ„ÎąÎŊ Ī„Îŋ ÎĩΚÎēÎŋÎŊίδΚÎŋ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ÎĩίÎŊιΚ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋ", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚" }, "enableAutoFillOnPageLoad": { - "message": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚" + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚" }, "enableAutoFillOnPageLoadDesc": { - "message": "ΕÎŦÎŊ ÎĩÎŊĪ„ÎŋĪ€ÎšĪƒĪ„Îĩί ÎŧΚι Ī†ĪŒĪÎŧÎą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚, Ī€ĪÎąÎŗÎŧÎąĪ„ÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą ÎŧΚι ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ĪŒĪ„ÎąÎŊ ΆÎŋĪĪ„ĪŽÎŊÎĩĪ„ÎąÎš Ρ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą." + "message": "ΕÎŦÎŊ ÎĩÎŊĪ„ÎŋĪ€ÎšĪƒĪ„Îĩί Ī†ĪŒĪÎŧÎą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚, θι ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪ‰Î¸Îĩί ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Î ĪÎŋÎĩΚδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ:$CLOSETAG$ Οι Ī€ÎąĪÎąÎ˛ÎšÎąĪƒÎŧέÎŊÎĩĪ‚ ÎŽ ÎŧΡ ÎąÎžÎšĪŒĪ€ÎšĪƒĪ„ÎĩĪ‚ ÎšĪƒĪ„Îŋ΃ÎĩÎģίδÎĩĪ‚ ÎŧĪ€Îŋ΁ÎŋĪÎŊ ÎŊÎą ÎĩÎēÎŧÎĩĪ„ÎąÎģÎģÎĩĪ…Ī„ÎŋĪÎŊ Ī„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { "message": "Î ÎąĪÎąÎ˛ÎšÎąĪƒÎŧέÎŊÎŋΚ ÎŽ ÎŧΡ ÎąÎžÎšĪŒĪ€ÎšĪƒĪ„ÎŋΚ ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€ÎŋΚ ÎŧĪ€Îŋ΁ÎŋĪÎŊ ÎŊÎą ÎĩÎēÎŧÎĩĪ„ÎąÎģÎģÎĩĪ…Ī„ÎŋĪÎŊ Ī„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "ΜÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ĪƒĪ‡ÎĩĪ„ÎšÎēÎŦ ÎŧÎĩ Ī„ÎŋĪ…Ī‚ ÎēΚÎŊÎ´ĪÎŊÎŋĪ…Ī‚" + }, "learnMoreAboutAutofill": { "message": "ΜÎŦθÎĩĪ„Îĩ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą ĪƒĪ‡ÎĩĪ„ÎšÎēÎŦ ÎŧÎĩ Ī„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ" }, @@ -994,19 +1529,19 @@ "message": "Î ĪÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΡ ĪĪÎ¸ÎŧÎšĪƒÎˇ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ÎŗÎšÎą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚" }, "defaultAutoFillOnPageLoadDesc": { - "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ ÎŗÎšÎą ÎŧÎĩÎŧÎŋÎŊΉÎŧέÎŊÎą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ΀΁ÎŋβÎŋÎģÎŽ Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ…." + "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ ÎŗÎšÎą ÎŧÎĩÎŧÎŋÎŊΉÎŧέÎŊÎą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ΀΁ÎŋβÎŋÎģÎŽ Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…." }, "itemAutoFillOnPageLoad": { - "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ (ÎąÎŊ Î­Ī‡ÎĩΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡθÎĩί ĪƒĪ„ÎšĪ‚ ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚)" + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ (ÎąÎŊ Î­Ī‡ÎĩΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡθÎĩί ĪƒĪ„ÎšĪ‚ Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚)" }, "autoFillOnPageLoadUseDefault": { "message": "Î§ĪÎŽĪƒÎˇ ΀΁ÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎˇĪ‚ ĪĪÎ¸ÎŧÎšĪƒÎˇĪ‚" }, "autoFillOnPageLoadYes": { - "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚" + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚" }, "autoFillOnPageLoadNo": { - "message": "Μη ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚" + "message": "Μη ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽÎŊÎĩÎšĪ‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚" }, "commandOpenPopup": { "message": "ΆÎŊÎŋÎšÎŗÎŧÎą ÎąÎŊÎąÎ´Ī…ĪŒÎŧÎĩÎŊÎŋĪ… vault" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "ΆÎŊÎŋÎšÎŗÎŧÎą ÎąÎŊÎąÎ´Ī…ĪŒÎŧÎĩÎŊÎŋĪ… vault ĪƒĪ„ÎˇÎŊ Ī€ÎģÎĩĪ…ĪÎšÎēÎŽ ÎŧĪ€ÎŦĪÎą" }, - "commandAutofillDesc": { - "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Ī„ÎˇĪ‚ Ī„ÎĩÎģÎĩĪ…Ī„ÎąÎ¯ÎąĪ‚ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎŋĪÎŧÎĩÎŊÎˇĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎŗÎšÎą ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ" + "commandAutofillLoginDesc": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Ī„ÎˇĪ‚ Ī„ÎĩÎģÎĩĪ…Ī„ÎąÎ¯ÎąĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚΎθΡÎēÎĩ ÎŗÎšÎą Ī„ÎŋÎŊ Ī„ĪÎ­Ī‡ÎŋÎŊĪ„Îą ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ" + }, + "commandAutofillCardDesc": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Ī„ÎˇĪ‚ Ī„ÎĩÎģÎĩĪ…Ī„ÎąÎ¯ÎąĪ‚ ÎēÎŦĪĪ„ÎąĪ‚ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚΎθΡÎēÎĩ ÎŗÎšÎą Ī„ÎŋÎŊ Ī„ĪÎ­Ī‡ÎŋÎŊĪ„Îą ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ" + }, + "commandAutofillIdentityDesc": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Ī„ÎˇĪ‚ Ī„ÎĩÎģÎĩĪ…Ī„ÎąÎ¯ÎąĪ‚ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚΎθΡÎēÎĩ ÎŗÎšÎą Ī„ÎŋÎŊ Ī„ĪÎ­Ī‡ÎŋÎŊĪ„Îą ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ" }, "commandGeneratePasswordDesc": { "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽĪƒĪ„Îĩ ÎēιΚ ÎąÎŊĪ„ÎšÎŗĪÎŦĪˆĪ„Îĩ έÎŊÎąÎŊ ÎŊέÎŋ Ī„Ī…Ī‡ÎąÎ¯Îŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ĪƒĪ„Îŋ Ī€ĪĪŒĪ‡ÎĩÎšĪÎŋ" @@ -1023,20 +1564,17 @@ "commandLockVaultDesc": { "message": "ΚÎģÎĩÎšÎ´ĪŽĪƒĪ„Îĩ Ī„Îŋ vault" }, - "privateModeWarning": { - "message": "Η Ī…Ī€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇ ÎšÎ´ÎšĪ‰Ī„ÎšÎēÎŽĪ‚ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎĩίÎŊιΚ Ī€ÎĩÎšĪÎąÎŧÎąĪ„ÎšÎēÎŽ ÎēιΚ ÎŋĪÎšĪƒÎŧέÎŊÎĩĪ‚ Î´Ī…ÎŊÎąĪ„ĪŒĪ„ÎˇĪ„ÎĩĪ‚ ÎĩίÎŊιΚ Ī€ÎĩĪÎšÎŋĪÎšĪƒÎŧέÎŊÎĩĪ‚." - }, "customFields": { - "message": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎą ΠÎĩÎ´Î¯Îą" + "message": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎą Ī€ÎĩÎ´Î¯Îą" }, "copyValue": { - "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ΤΚÎŧÎŽĪ‚" + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ Ī„ÎšÎŧÎŽĪ‚" }, "value": { "message": "ΤΚÎŧÎŽ" }, "newCustomField": { - "message": "ΝέÎŋ Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ ΠÎĩδίÎŋ" + "message": "ΝέÎŋ ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ Ī€ÎĩδίÎŋ" }, "dragToSort": { "message": "ÎŖĪĪÎĩĪ„Îĩ ÎŗÎšÎą Ī„ÎąÎžÎšÎŊΌÎŧÎˇĪƒÎˇ" @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Î”Ī…ÎąÎ´ÎšÎēΌ" }, + "cfTypeCheckbox": { + "message": "ΠÎģÎąÎ¯ĪƒÎšÎŋ ÎĩĪ€ÎšÎģÎŋÎŗÎŽĪ‚" + }, "cfTypeLinked": { "message": "ÎŖĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋ", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎŧÎšÎąĪ‚ ÎąÎŊÎąÎŗÎŊĪ‰ĪÎ¯ĪƒÎšÎŧÎˇĪ‚ ÎĩΚÎēΌÎŊÎąĪ‚ Î´Î¯Ī€ÎģÎą ΃Îĩ ÎēÎŦθÎĩ ĪƒĪÎŊδÎĩĪƒÎˇ." }, + "faviconDescAlt": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎŧÎšÎąĪ‚ ÎąÎŊÎąÎŗÎŊĪ‰ĪÎ¯ĪƒÎšÎŧÎˇĪ‚ ÎĩΚÎēΌÎŊÎąĪ‚ Î´Î¯Ī€ÎģÎą ΃Îĩ ÎēÎŦθÎĩ ĪƒĪÎŊδÎĩĪƒÎˇ. Î™ĪƒĪ‡ĪÎĩΚ ÎŗÎšÎą ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋĪ…Ī‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚." + }, "enableBadgeCounter": { "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎŧÎĩĪ„ĪÎˇĪ„ÎŽ ÎĩÎŧβÎģΡÎŧÎŦ΄ΉÎŊ" }, @@ -1077,7 +1621,7 @@ "message": "ÎĨĪ€ÎŋδÎĩÎ¯ÎžĪ„Îĩ Ī€ĪŒĪƒÎĩĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ Î­Ī‡ÎĩĪ„Îĩ ÎŗÎšÎą Ī„ÎˇÎŊ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą." }, "cardholderName": { - "message": "ΌÎŊÎŋÎŧÎą ÎēÎąĪ„ĪŒĪ‡ÎŋĪ… Ī„ÎˇĪ‚ ÎēÎŦĪĪ„ÎąĪ‚" + "message": "ΌÎŊÎŋÎŧÎą ÎēÎąĪ„ĪŒĪ‡ÎŋĪ… ÎēÎŦĪĪ„ÎąĪ‚" }, "number": { "message": "Î‘ĪÎšÎ¸ÎŧĪŒĪ‚" @@ -1086,7 +1630,7 @@ "message": "Î•Ī€Ī‰ÎŊĪ…ÎŧÎ¯Îą" }, "expirationMonth": { - "message": "ΜήÎŊÎąĪ‚ Î›ÎŽÎžÎˇĪ‚" + "message": "ΜήÎŊÎąĪ‚ ÎģÎŽÎžÎˇĪ‚" }, "expirationYear": { "message": "ÎˆĪ„ÎŋĪ‚ ÎģÎŽÎžÎˇĪ‚" @@ -1131,7 +1675,7 @@ "message": "ΔÎĩÎēέÎŧÎ˛ĪÎšÎŋĪ‚" }, "securityCode": { - "message": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Î‘ĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚" + "message": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚" }, "ex": { "message": "΀·." @@ -1152,7 +1696,7 @@ "message": "Dr" }, "mx": { - "message": "Κ@" + "message": "Κ" }, "firstName": { "message": "ΌÎŊÎŋÎŧÎą" @@ -1167,7 +1711,7 @@ "message": "ΟÎŊÎŋÎŧÎąĪ„ÎĩĪ€ĪŽÎŊĪ…ÎŧÎŋ" }, "identityName": { - "message": "ΌÎŊÎŋÎŧÎą Î¤ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚" + "message": "ΌÎŊÎŋÎŧÎą Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚" }, "company": { "message": "Î•Ī„ÎąÎšĪÎĩÎ¯Îą" @@ -1176,10 +1720,10 @@ "message": "ΑΜΚΑ" }, "passportNumber": { - "message": "Î‘ĪÎšÎ¸ÎŧĪŒĪ‚ Î”ÎšÎąÎ˛ÎąĪ„ÎˇĪÎ¯ÎŋĪ…" + "message": "Î‘ĪÎšÎ¸ÎŧĪŒĪ‚ Î´ÎšÎąÎ˛ÎąĪ„ÎˇĪÎ¯ÎŋĪ…" }, "licenseNumber": { - "message": "Î‘ĪÎšÎ¸ÎŧĪŒĪ‚ ΆδÎĩÎšÎąĪ‚" + "message": "Î‘ĪÎšÎ¸ÎŧĪŒĪ‚ ÎŦδÎĩÎšÎąĪ‚" }, "email": { "message": "Email" @@ -1206,7 +1750,7 @@ "message": "ΠÎĩĪÎšÎŋĪ‡ÎŽ / ΝÎŋÎŧĪŒĪ‚" }, "zipPostalCode": { - "message": "Î¤ÎąĪ‡Ī…Î´ĪÎŋÎŧΚÎēĪŒĪ‚ ÎšĪŽÎ´ÎšÎēÎąĪ‚" + "message": "Î¤ÎąĪ‡Ī…Î´ĪÎŋÎŧΚÎēĪŒĪ‚ ÎēĪŽÎ´ÎšÎēÎąĪ‚" }, "country": { "message": "Î§ĪŽĪÎą" @@ -1221,7 +1765,7 @@ "message": "ÎŖĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚" }, "typeSecureNote": { - "message": "Î‘ĪƒĪ†ÎąÎģÎŽĪ‚ ÎŖÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇ" + "message": "Î‘ĪƒĪ†ÎąÎģÎŽĪ‚ ĪƒÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇ" }, "typeCard": { "message": "ΚÎŦĪĪ„Îą" @@ -1229,8 +1773,47 @@ "typeIdentity": { "message": "Î¤ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„Îą" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "Νέα $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { - "message": "Î™ĪƒĪ„ÎŋĪÎšÎēΌ ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "Î™ĪƒĪ„ÎŋĪÎšÎēΌ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" }, "back": { "message": "Î Î¯ĪƒĪ‰" @@ -1238,6 +1821,15 @@ "collections": { "message": "ÎŖĪ…ÎģÎģÎŋÎŗÎ­Ī‚" }, + "nCollections": { + "message": "$COUNT$ ĪƒĪ…ÎģÎģÎŋÎŗÎ­Ī‚", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Î‘ÎŗÎąĪ€ÎˇÎŧέÎŊÎą" }, @@ -1257,7 +1849,7 @@ "message": "ÎŖĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚" }, "secureNotes": { - "message": "Î‘ĪƒĪ†ÎąÎģÎĩÎ¯Ī‚ ÎŖÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚" + "message": "Î‘ĪƒĪ†ÎąÎģÎĩÎ¯Ī‚ ĪƒÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚" }, "clear": { "message": "ΕÎēÎēιθÎŦĪÎšĪƒÎˇ", @@ -1282,6 +1874,10 @@ "message": "Î’ÎąĪƒÎšÎēĪŒĪ‚ Ī„ÎŋÎŧÎ­ÎąĪ‚", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Î’ÎąĪƒÎšÎēĪŒĪ‚ Ī„ÎŋÎŧÎ­ÎąĪ‚ (ĪƒĪ…ÎŊÎšĪƒĪ„ÎŦĪ„ÎąÎš)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ΌÎŊÎŋÎŧÎą Ī„ÎŋÎŧέι", "description": "Domain name. Ex. website.com" @@ -1301,15 +1897,15 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "ΕÎŊĪ„ÎŋĪ€ÎšĪƒÎŧĪŒĪ‚ ΑÎŊĪ„ÎšĪƒĪ„ÎŋÎ¯Ī‡ÎšĪƒÎˇĪ‚", - "description": "URI match detection for auto-fill." + "message": "ΕÎŊĪ„ÎŋĪ€ÎšĪƒÎŧĪŒĪ‚ ÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎ¯Ī‡ÎšĪƒÎˇĪ‚", + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Î ĪÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋĪ‚ ÎĩÎŊĪ„ÎŋĪ€ÎšĪƒÎŧĪŒĪ‚ ÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎ¯Ī‡ÎšĪƒÎˇĪ‚", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { - "message": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ΕÎŊÎąÎģÎģÎąÎŗÎŽĪ‚" + "message": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ÎĩÎŊÎąÎģÎģÎąÎŗÎŽĪ‚" }, "toggleCurrentUris": { "message": "ΕÎŊÎąÎģÎģÎąÎŗÎŽ ΄΁ÎĩĪ‡ĪŒÎŊ΄ΉÎŊ URI", @@ -1327,11 +1923,20 @@ "message": "Î¤ĪĪ€ÎŋΚ" }, "allItems": { - "message": "ΌÎģÎą Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą" + "message": "ΌÎģÎą Ī„Îą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą" }, "noPasswordsInList": { "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ ÎēĪ‰Î´ÎšÎēÎŋί ĪƒĪ„Îˇ ÎģÎ¯ĪƒĪ„Îą." }, + "clearHistory": { + "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎšĪƒĪ„ÎŋĪÎšÎēÎŋĪ" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ" }, @@ -1347,7 +1952,7 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Ο ÎšĪ‰Î´ÎšÎēĪŒĪ‚ ΕÎŊΡÎŧÎĩĪĪŽÎ¸ÎˇÎēÎĩ", + "message": "Ο ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎĩÎŊΡÎŧÎĩĪĪŽÎ¸ÎˇÎēÎĩ", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1390,32 +1995,50 @@ "unlockWithPin": { "message": "ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą ÎŧÎĩ PIN" }, + "setYourPinTitle": { + "message": "ÎŸĪÎšĪƒÎŧĪŒĪ‚ PIN" + }, + "setYourPinButton": { + "message": "ÎŸĪÎšĪƒÎŧĪŒĪ‚ PIN" + }, "setYourPinCode": { "message": "ÎŸĪÎ¯ĪƒĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ PIN ÎŗÎšÎą ÎŊÎą ΞÎĩÎēÎģÎĩÎšÎ´ĪŽĪƒÎĩĪ„Îĩ Ī„Îŋ Bitwarden. Οι ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ PIN θι ÎĩĪ€ÎąÎŊÎąĪĪ…Î¸ÎŧÎšĪƒĪ„ÎŋĪÎŊ ÎąÎŊ ÎąĪ€ÎŋĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ Ī€ÎģÎŽĪĪ‰Ī‚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ." }, + "setYourPinCode1": { + "message": "ΤÎŋ PIN ĪƒÎąĪ‚ θι Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŗÎšÎą Ī„Îŋ ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą Ī„ÎŋĪ… Bitwarden ÎąÎŊĪ„Î¯ Ī„ÎŋĪ… ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚. ΑÎŊ ÎąĪ€ÎŋĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ÎĩÎŊĪ„ÎĩÎģĪŽĪ‚ ÎąĪ€ĪŒ Ī„Îŋ Bitwarden, θι ÎŗÎ¯ÎŊÎĩΚ ÎĩĪ€ÎąÎŊÎąĪ†Îŋ΁ÎŦ Ī„ÎŋĪ… PIN ĪƒÎąĪ‚." + }, "pinRequired": { "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎēĪ‰Î´ÎšÎēĪŒĪ‚ PIN." }, "invalidPin": { "message": "Μη Î­ÎŗÎē΅΁ÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ PIN." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "ΠÎŦĪÎą Ī€ÎŋÎģÎģÎ­Ī‚ ÎŦÎē΅΁ÎĩĪ‚ ÎąĪ€ĪŒĪ€ÎĩÎšĪÎĩĪ‚ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚ PIN. ΓίÎŊÎĩĪ„ÎąÎš ÎąĪ€ÎŋĪƒĪÎŊδÎĩĪƒÎˇ." + }, "unlockWithBiometrics": { "message": "ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą ÎŧÎĩ βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą" }, + "unlockWithMasterPassword": { + "message": "ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą ÎŧÎĩ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, "awaitDesktop": { "message": "ΑÎŊÎąÎŧÎŋÎŊÎŽ ÎĩĪ€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇĪ‚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎĩĪ€ÎšĪ†ÎŦÎŊÎĩΚι ÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚" }, "awaitDesktopDesc": { - "message": "Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩĪ€ÎšÎ˛ÎĩÎ˛ÎąÎšĪŽĪƒĪ„Îĩ Ī„Îˇ Ī‡ĪÎŽĪƒÎˇ βΚÎŋÎŧÎĩĪ„ĪÎšÎēĪŽÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ĪƒĪ„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Bitwarden Desktop ÎŗÎšÎą ÎŊÎą ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„Îą βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎŗÎšÎą Ī„Îŋ Ī€ĪĪŒÎŗĪÎąÎŧÎŧÎą Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚." + "message": "Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩĪ€ÎšÎ˛ÎĩÎ˛ÎąÎšĪŽĪƒĪ„Îĩ Ī„Îˇ Ī‡ĪÎŽĪƒÎˇ βΚÎŋÎŧÎĩĪ„ĪÎšÎēĪŽÎŊ ĪƒĪ„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Bitwarden Ī„ÎˇĪ‚ ÎĩĪ€ÎšĪ†ÎŦÎŊÎĩÎšÎąĪ‚ ÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚ ÎŗÎšÎą ÎŊÎą ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„Îą βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ ÎŗÎšÎą Ī„ÎŋÎŊ Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ." }, "lockWithMasterPassOnRestart": { "message": "ΚÎģÎĩÎ¯Î´Ī‰ÎŧÎą ÎŧÎĩ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ĪƒĪ„ÎˇÎŊ ÎĩĪ€ÎąÎŊÎĩÎēÎēίÎŊÎˇĪƒÎˇ Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚" }, + "lockWithMasterPassOnRestart1": { + "message": "Î‘Ī€ÎąÎ¯Ī„ÎˇĪƒÎˇ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ÎĩĪ€ÎąÎŊÎĩÎēÎēίÎŊÎˇĪƒÎˇ Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚" + }, "selectOneCollection": { "message": "Î ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎĩĪ€ÎšÎģέΞÎĩĪ„Îĩ Ī„ÎŋĪ…ÎģÎŦĪ‡ÎšĪƒĪ„ÎŋÎŊ ÎŧÎ¯Îą ĪƒĪ…ÎģÎģÎŋÎŗÎŽ." }, "cloneItem": { - "message": "ΚÎģĪŽÎŊÎŋĪ‚ ΑÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + "message": "ΚÎģΉÎŊÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" }, "clone": { "message": "ΚÎģĪŽÎŊÎŋĪ‚" @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "ÎœÎ¯Îą ÎŽ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎ­Ī‚ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ÎĩĪ€ÎˇĪÎĩÎŦÎļÎŋĪ…ÎŊ Ī„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎŗÎĩÎŊÎŊÎŽĪ„ĪÎšÎąĪ‚." }, + "passwordGenerator": { + "message": "ΓÎĩÎŊÎŊÎŽĪ„ĪÎšÎą ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "usernameGenerator": { + "message": "ΓÎĩÎŊÎŊÎŽĪ„ĪÎšÎą ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ" + }, + "useThisPassword": { + "message": "Î§ĪÎŽĪƒÎˇ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "useThisUsername": { + "message": "Î§ĪÎŽĪƒÎˇ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ" + }, + "securePasswordGenerated": { + "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽÎ¸ÎˇÎēÎĩ ÎąĪƒĪ†ÎąÎģÎŽĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚! ΜηÎŊ ΞÎĩ·ÎŦ΃ÎĩĪ„Îĩ ÎŊÎą ÎĩÎŊΡÎŧÎĩĪĪŽĪƒÎĩĪ„Îĩ ÎĩĪ€Î¯ĪƒÎˇĪ‚ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎŽĪ‚ ĪƒÎąĪ‚ ĪƒĪ„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą." + }, + "useGeneratorHelpTextPartOne": { + "message": "Î§ĪÎŽĪƒÎˇ Ī„ÎˇĪ‚ ÎŗÎĩÎŊÎŊÎŽĪ„ĪÎšÎąĪ‚", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "ÎŗÎšÎą ÎŊÎą δΡÎŧΚÎŋĪ…ĪÎŗÎŽĪƒÎĩĪ„Îĩ έÎŊÎąÎŊ ÎšĪƒĪ‡Ī…ĪĪŒ ÎŧÎŋÎŊιδΚÎēΌ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ΕÎŊÎ­ĪÎŗÎĩΚι Î§ĪĪŒÎŊÎŋĪ… Î›ÎŽÎžÎˇĪ‚ Vault" }, + "vaultTimeoutAction1": { + "message": "ΕÎŊÎ­ĪÎŗÎĩΚι ÎēÎąĪ„ÎŦ Ī„Îˇ ÎģΎΞΡ ·΁ÎŋÎŊΚÎēÎŋĪ ÎŋĪÎ¯ÎŋĪ…" + }, "lock": { "message": "ΚÎģÎĩÎ¯Î´Ī‰ÎŧÎą", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ΚÎŦδÎŋĪ‚ Î‘Ī€ÎŋĪĪÎšÎŧÎŦ΄ΉÎŊ", @@ -1444,28 +2093,34 @@ "message": "Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎŧΌÎŊΚÎŧÎą ÎąĪ…Ī„ĪŒ Ī„Îŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ;" }, "permanentlyDeletedItem": { - "message": "ÎœĪŒÎŊΚÎŧÎą ΔιÎĩÎŗĪÎąÎŧÎŧέÎŊÎŋ ÎŖĪ„ÎŋÎšĪ‡ÎĩίÎŋ" + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎĩ ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ" }, "restoreItem": { - "message": "ΑÎŊÎŦÎēĪ„ÎˇĪƒÎˇ ÎŖĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ…" + "message": "Î•Ī€ÎąÎŊÎąĪ†Îŋ΁ÎŦ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" }, "restoredItem": { - "message": "ÎŖĪ„ÎŋÎšĪ‡ÎĩίÎŋ Ī€ÎŋĪ… Î­Ī‡ÎĩΚ ΑÎŊÎąÎēĪ„ÎˇÎ¸Îĩί" + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎĩĪ€ÎąÎŊÎąĪ†Î­ĪÎ¸ÎˇÎēÎĩ" + }, + "alreadyHaveAccount": { + "message": "ÎˆĪ‡ÎĩĪ„Îĩ ΎδΡ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ;" }, "vaultTimeoutLogOutConfirmation": { "message": "Η ÎąĪ€ÎŋĪƒĪÎŊδÎĩĪƒÎˇ θι ÎēÎąĪ„ÎąĪÎŗÎŽĪƒÎĩΚ ΌÎģΡ Ī„ÎˇÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ vault ĪƒÎąĪ‚ ÎēιΚ ÎąĪ€ÎąÎšĪ„Îĩί online έÎģÎĩÎŗĪ‡Îŋ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎŧÎĩĪ„ÎŦ Ī„Îŋ ·΁ÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ ÎģÎŽÎžÎˇĪ‚. Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ĪĪÎ¸ÎŧÎšĪƒÎˇ;" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ΕÎŊÎ­ĪÎŗÎĩÎšÎąĪ‚ Î§ĪÎŋÎŊΚÎēÎŋĪ ÎŸĪÎ¯ÎŋĪ…" + "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎĩÎŊÎ­ĪÎŗÎĩÎšÎąĪ‚ ·΁ÎŋÎŊΚÎēÎŋĪ ÎŋĪÎ¯ÎŋĪ… ÎģÎŽÎžÎˇĪ‚" }, "autoFillAndSave": { "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēιΚ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ" }, + "fillAndSave": { + "message": "ÎŖĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēιΚ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ" + }, "autoFillSuccessAndSavedUri": { - "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ… ÎēιΚ ÎąĪ€ÎŋθΡÎēÎĩĪ…ÎŧέÎŊÎŋ URI" + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽÎ¸ÎˇÎēÎĩ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą ÎēιΚ Ī„Îŋ URI ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎĩ" }, "autoFillSuccess": { - "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽÎ¸ÎˇÎēÎĩ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą " }, "insecurePageWarning": { "message": "Î ĪÎŋÎĩΚδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ: Î‘Ī…Ī„ÎŽ ÎĩίÎŊιΚ ÎŧΚι ÎŧΡ ÎąĪƒĪ†ÎąÎģÎŽ ΃ÎĩÎģÎ¯Î´Îą HTTP ÎēιΚ ÎŋĪ€ÎŋÎšÎąÎ´ÎŽĪ€ÎŋĪ„Îĩ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯Îą Ī…Ī€ÎŋβÎŦÎģÎģÎĩĪ„Îĩ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎŗÎ¯ÎŊÎĩΚ ÎŋĪÎąĪ„ÎŽ ÎēιΚ ÎĩĪ€ÎĩÎŧβÎŦĪƒÎšÎŧΡ ÎąĪ€ĪŒ ÎŦÎģÎģÎŋĪ…Ī‚. Î‘Ī…Ī„ÎŽ Ρ ĪƒĪÎŊδÎĩĪƒÎˇ ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎĩ ÎąĪĪ‡ÎšÎēÎŦ ΃Îĩ ÎŧΚι ÎąĪƒĪ†ÎąÎģÎŽ (HTTPS) ΃ÎĩÎģÎ¯Î´Îą." @@ -1486,16 +2141,16 @@ } }, "setMasterPassword": { - "message": "ΚαθÎŋĪÎšĪƒÎŧĪŒĪ‚ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ" + "message": "ÎŸĪÎšĪƒÎŧĪŒĪ‚ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "currentMasterPass": { - "message": "Î¤ĪÎ­Ī‡Ī‰ÎŊ ÎšĪĪÎšÎŋĪ‚ ÎšĪ‰Î´ÎšÎēĪŒĪ‚" + "message": "Î¤ĪÎ­Ī‡Ī‰ÎŊ ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "newMasterPass": { - "message": "ΝέÎŋĪ‚ ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚" + "message": "ΝέÎŋĪ‚ ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "confirmNewMasterPass": { - "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ΝέÎŋĪ… ÎšĪĪÎšÎŋĪ… ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎŊέÎŋĪ… ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "masterPasswordPolicyInEffect": { "message": "ÎŖÎĩ ÎŧÎ¯Îą ÎŽ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎ­Ī‚ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ÎąĪ€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš Îŋ ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ ÎŊÎą Ī€ÎģÎˇĪÎĩί Ī„ÎšĪ‚ ÎąÎēΌÎģÎŋĪ…Î¸ÎĩĪ‚ ÎąĪ€ÎąÎšĪ„ÎŽĪƒÎĩÎšĪ‚:" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Ο ÎŊέÎŋĪ‚ ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ δÎĩÎŊ Ī€ÎģÎˇĪÎŋί Ī„ÎšĪ‚ ÎąĪ€ÎąÎšĪ„ÎŽĪƒÎĩÎšĪ‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎŽĪ‚." }, + "receiveMarketingEmailsV2": { + "message": "ΛÎŦβÎĩĪ„Îĩ ĪƒĪ…ÎŧβÎŋĪ…ÎģÎ­Ī‚, ÎąÎŊÎąÎēÎŋΚÎŊĪŽĪƒÎĩÎšĪ‚ ÎēιΚ ÎĩĪ…ÎēÎąÎšĪÎ¯ÎĩĪ‚ Î­ĪÎĩĪ…ÎŊÎąĪ‚ ÎąĪ€ĪŒ Ī„Îŋ Bitwarden ĪƒĪ„Îą ÎĩÎšĪƒÎĩĪĪ‡ĪŒÎŧÎĩÎŊÎŦ ĪƒÎąĪ‚." + }, + "unsubscribe": { + "message": "ΑÎēĪĪĪ‰ĪƒÎˇ ĪƒĪ…ÎŊÎ´ĪÎŋÎŧÎŽĪ‚" + }, + "atAnyTime": { + "message": "ÎŋĪ€ÎŋÎšÎąÎ´ÎŽĪ€ÎŋĪ„Îĩ ĪƒĪ„ÎšÎŗÎŧÎŽ." + }, + "byContinuingYouAgreeToThe": { + "message": "ÎŖĪ…ÎŊÎĩĪ‡Î¯ÎļÎŋÎŊĪ„ÎąĪ‚, ĪƒĪ…ÎŧΆΉÎŊÎĩÎ¯Ī„Îĩ ÎŧÎĩ" + }, + "and": { + "message": "ÎēιΚ" + }, "acceptPolicies": { "message": "Î•Ī€ÎšÎģÎ­ÎŗÎŋÎŊĪ„ÎąĪ‚ ÎąĪ…Ī„ĪŒ Ī„Îŋ Ī€ÎģÎąÎ¯ĪƒÎšÎŋ, ĪƒĪ…ÎŧΆΉÎŊÎĩÎ¯Ī„Îĩ ÎŧÎĩ Ī„Îą ÎĩÎžÎŽĪ‚:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "ΟÎē" }, + "errorRefreshingAccessToken": { + "message": "ÎŖĪ†ÎŦÎģÎŧÎą ΑÎŊÎąÎŊÎ­Ī‰ĪƒÎˇĪ‚ ΔιαÎēĪÎšĪ„ÎšÎēÎŋĪ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "errorRefreshingAccessTokenDesc": { + "message": "ΔÎĩ Î˛ĪÎ­Î¸ÎˇÎēÎĩ ÎēÎąÎŊέÎŊÎą δΚιÎēĪÎšĪ„ÎšÎēΌ ÎąÎŊÎąÎŊÎ­Ī‰ĪƒÎˇĪ‚ ÎŽ ÎēÎģÎĩΚδΚÎŦ API. Î ÎąĪÎąÎēÎąÎģĪŽ δÎŋÎēΚÎŧÎŦĪƒĪ„Îĩ ÎŊÎą ÎąĪ€ÎŋĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ÎēιΚ ÎŊÎą ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ΞιÎŊÎŦ." + }, "desktopSyncVerificationTitle": { "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ĪƒĪ…ÎŗĪ‡ĪÎŋÎŊÎšĪƒÎŧÎŋĪ ÎĩĪ€ÎšĪ†ÎŦÎŊÎĩÎšÎąĪ‚ ÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚" }, @@ -1564,10 +2240,10 @@ "message": "Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩĪ€ÎšÎ˛ÎĩÎ˛ÎąÎšĪŽĪƒĪ„Îĩ ĪŒĪ„Îš Ρ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎĩĪ€ÎšĪ†ÎŦÎŊÎĩÎšÎąĪ‚ ÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚ ÎĩÎŧĪ†ÎąÎŊίÎļÎĩΚ ÎąĪ…Ī„ĪŒ Ī„Îŋ ÎąĪ€ÎŋĪ„ĪĪ€Ī‰ÎŧÎą: " }, "desktopIntegrationDisabledTitle": { - "message": "Η ÎĩÎŊĪƒĪ‰ÎŧÎŦĪ„Ī‰ĪƒÎˇ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ δÎĩÎŊ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ" + "message": "Η ÎĩÎŊĪƒĪ‰ÎŧÎŦĪ„Ī‰ĪƒÎˇ Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ δÎĩÎŊ Î­Ī‡ÎĩΚ ÎŋĪÎšĪƒĪ„Îĩί" }, "desktopIntegrationDisabledDesc": { - "message": "Η ÎĩÎŊĪƒĪ‰ÎŧÎŦĪ„Ī‰ĪƒÎˇ Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚ δÎĩÎŊ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ ĪƒĪ„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Bitwarden Desktop. Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎˇÎŊ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚ desktop." + "message": "Η ÎĩÎŊĪƒĪ‰ÎŧÎŦĪ„Ī‰ĪƒÎˇ Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ δÎĩÎŊ Î­Ī‡ÎĩΚ ÎŋĪÎšĪƒĪ„Îĩί ĪƒĪ„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Bitwarden Desktop. Î ÎąĪÎąÎēÎąÎģĪŽ ÎŋĪÎ¯ĪƒĪ„Îĩ Ī„ÎˇÎŊ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚ desktop." }, "startDesktopTitle": { "message": "ΞÎĩÎēΚÎŊÎŽĪƒĪ„Îĩ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ Bitwarden Î•Ī€ÎšĪ†ÎŦÎŊÎĩΚι ÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚" @@ -1593,8 +2269,14 @@ "nativeMessagingWrongUserTitle": { "message": "Î‘Ī€ĪŒĪĪÎšĪˆÎˇ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "ΑÎŊÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎšĪ‡Î¯Îą βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŋĪ ÎēÎģÎĩΚδΚÎŋĪ" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "ΤÎŋ βΚÎŋÎŧÎĩĪ„ĪÎšÎēΌ ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą ÎąĪ€Î­Ī„Ī…Ī‡Îĩ. ΤÎŋ βΚÎŋÎŧÎĩĪ„ĪÎšÎēΌ ÎŧĪ…ĪƒĪ„ÎšÎēΌ ÎēÎģÎĩΚδί ÎąĪ€Î­Ī„Ī…Ī‡Îĩ ÎŊÎą ΞÎĩÎēÎģÎĩÎšÎ´ĪŽĪƒÎĩΚ Ī„Îŋ Î¸ÎˇĪƒÎąĪ…/ÎēΚÎŋ. Î ĪÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ÎŊÎą ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩĪ„Îĩ ΞιÎŊÎŦ Ī„Îą βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ." + }, "biometricsNotEnabledTitle": { - "message": "Η βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŽ δÎĩÎŊ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ" + "message": "ΔÎĩÎŊ Î­Ī‡ÎŋĪ…ÎŊ ÎŋĪÎšĪƒĪ„Îĩί βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ" }, "biometricsNotEnabledDesc": { "message": "Τι βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚ ÎąĪ€ÎąÎšĪ„ÎŋĪÎŊ Ī„ÎˇÎŊ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ Ī„ÎˇĪ‚ βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŽĪ‚ ÎĩĪ€ÎšĪ†ÎŦÎŊÎĩÎšÎąĪ‚ ÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī€ĪĪŽĪ„Îą." @@ -1605,8 +2287,20 @@ "biometricsNotSupportedDesc": { "message": "Τι βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚ δÎĩÎŊ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎŋÎŊĪ„ÎąÎš ΃Îĩ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ." }, + "biometricsNotUnlockedTitle": { + "message": "Ο Ī‡ĪÎŽĪƒĪ„ÎˇĪ‚ ÎēÎģÎĩÎšÎ´ĪŽÎ¸ÎˇÎēÎĩ ÎŽ ÎąĪ€ÎŋĪƒĪ…ÎŊδέθΡÎēÎĩ" + }, + "biometricsNotUnlockedDesc": { + "message": "Î ÎąĪÎąÎēÎąÎģĪŽ ΞÎĩÎēÎģÎĩÎšÎ´ĪŽĪƒĪ„Îĩ ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ Ī‡ĪÎŽĪƒĪ„Îˇ ĪƒĪ„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎĩĪ€ÎšĪ†ÎŦÎŊÎĩÎšÎąĪ‚ ÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚ ÎēιΚ ΀΁ÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ΞιÎŊÎŦ." + }, + "biometricsNotAvailableTitle": { + "message": "Μη Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ βΚÎŋÎŧÎĩĪ„ĪÎšÎēΌ ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą" + }, + "biometricsNotAvailableDesc": { + "message": "ΤÎŋ βΚÎŋÎŧÎĩĪ„ĪÎšÎēΌ ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą δÎĩÎŊ ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ΀΁ÎŋĪ‚ Ī„Îŋ Ī€ÎąĪĪŒÎŊ. Î ÎąĪÎąÎēÎąÎģĪŽ ΀΁ÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ΞιÎŊÎŦ ÎąĪÎŗĪŒĪ„ÎĩĪÎą." + }, "biometricsFailedTitle": { - "message": "Ο βΚÎŋÎŧÎĩĪ„ĪÎšÎēĪŒĪ‚ έÎģÎĩÎŗĪ‡ÎŋĪ‚ ÎąĪ€Î­Ī„Ī…Ī‡Îĩ" + "message": "Τι βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ ÎąĪ€Î­Ī„Ī…Ī‡ÎąÎŊ" }, "biometricsFailedDesc": { "message": "Τι βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ δÎĩÎŊ ÎŧĪ€ĪŒĪÎĩĪƒÎąÎŊ ÎŊÎą ÎŋÎģÎŋÎēÎģÎˇĪĪ‰Î¸ÎŋĪÎŊ, ΃ÎēÎĩΆ΄ÎĩÎ¯Ī„Îĩ ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ έÎŊÎąÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŽ ÎŊÎą ÎąĪ€ÎŋĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ. ΑÎŊ ÎąĪ…Ī„ĪŒ ÎĩΞιÎēÎŋÎģÎŋĪ…Î¸Îĩί ÎŊÎą ĪƒĪ…ÎŧÎ˛ÎąÎ¯ÎŊÎĩΚ, Ī€ÎąĪÎąÎēÎąÎģĪŽ ÎĩĪ€ÎšÎēÎŋΚÎŊΉÎŊÎŽĪƒĪ„Îĩ ÎŧÎĩ Ī„ÎˇÎŊ Ī…Ī€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇ Ī„ÎˇĪ‚ Bitwarden." @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Μια Ī€ÎŋÎģÎšĪ„ÎšÎēÎŽ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ, ÎĩĪ€ÎˇĪÎĩÎŦÎļÎĩΚ Ī„ÎšĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ ΚδΚÎŋÎēĪ„ÎˇĪƒÎ¯ÎąĪ‚ ĪƒÎąĪ‚." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Μια ÎŋĪÎŗÎąÎŊĪ‰Ī„ÎšÎēÎŽ Ī€ÎŋÎģÎšĪ„ÎšÎēÎŽ Î­Ī‡ÎĩΚ ÎąĪ€ÎŋĪ„ĪÎ­ĪˆÎĩΚ Ī„ÎˇÎŊ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ĪƒĪ„Îŋ ΀΁ÎŋĪƒĪ‰Ī€ÎšÎēΌ Î¸ÎˇĪƒÎąĪ…/ÎēΚÎŋ ĪƒÎąĪ‚." + }, + "domainsTitle": { + "message": "ΤÎŋÎŧÎĩÎ¯Ī‚", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Î•ÎžÎąÎšĪÎŋĪÎŧÎĩÎŊÎŋΚ ΤÎŋÎŧÎĩÎ¯Ī‚" }, "excludedDomainsDesc": { "message": "ΤÎŋ Bitwarden δÎĩÎŊ θι ÎļÎˇĪ„ÎŽĪƒÎĩΚ ÎŊÎą ÎąĪ€ÎŋθΡÎēÎĩĪĪƒÎĩĪ„Îĩ Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎŗÎšÎą ÎąĪ…Ī„ÎŋĪĪ‚ Ī„ÎŋĪ…Ī‚ Ī„ÎŋÎŧÎĩÎ¯Ī‚. Î ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎąÎŊÎąÎŊÎĩĪŽĪƒÎĩĪ„Îĩ Ī„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎŗÎšÎą ÎŊÎą Ī„ÎĩθÎŋĪÎŊ ΃Îĩ ÎšĪƒĪ‡Ī ÎŋΚ ÎąÎģÎģÎąÎŗÎ­Ī‚." }, + "excludedDomainsDescAlt": { + "message": "ΤÎŋ Bitwarden δÎĩ θι ĪĪ‰Ī„ÎŽĪƒÎĩΚ ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋθΡÎēÎĩĪĪƒÎĩĪ„Îĩ Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎŗÎšÎą ÎąĪ…Ī„ÎŋĪĪ‚ Ī„ÎŋĪ…Ī‚ Ī„ÎŋÎŧÎĩÎ¯Ī‚, ÎŗÎšÎą ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋĪ…Ī‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚. Î ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎąÎŊÎąÎŊÎĩĪŽĪƒÎĩĪ„Îĩ Ī„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎŗÎšÎą ÎŊÎą Ī„ÎĩθÎŋĪÎŊ ΃Îĩ ÎšĪƒĪ‡Ī ÎŋΚ ÎąÎģÎģÎąÎŗÎ­Ī‚." + }, + "websiteItemLabel": { + "message": "Î™ĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "ΤÎŋ $DOMAIN$ δÎĩÎŊ ÎĩίÎŊιΚ Î­ÎŗÎē΅΁ÎŋĪ‚ Ī„ÎŋÎŧÎ­ÎąĪ‚", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Οι ÎąÎģÎģÎąÎŗÎ­Ī‚ ÎąĪ€ÎŋÎēÎģÎĩÎšĪƒÎŧέÎŊΉÎŊ Ī„ÎŋÎŧÎ­Ī‰ÎŊ ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎąÎŊ" + }, + "limitSendViews": { + "message": "ΠÎĩĪÎšÎŋĪÎšĪƒÎŧĪŒĪ‚ ΀΁ÎŋβÎŋÎģĪŽÎŊ" + }, + "limitSendViewsHint": { + "message": "ΚαÎŊέÎŊÎąĪ‚ δÎĩÎŊ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ΀΁ÎŋβÎŦÎģÎĩΚ ÎąĪ…Ī„ĪŒ Ī„Îŋ Send ÎŧÎĩĪ„ÎŦ Ī„Îŋ Ī€Î­ĪÎąĪ‚ Ī„ÎŋĪ… ÎŋĪÎ¯ÎŋĪ….", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Î‘Ī€ÎŋÎŧέÎŊÎŋĪ…ÎŊ $ACCESSCOUNT$ ΀΁ÎŋβÎŋÎģÎ­Ī‚", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "ÎŖĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ΚÎĩίÎŧÎĩÎŊÎŋ" }, + "sendTypeTextToShare": { + "message": "ΚÎĩίÎŧÎĩÎŊÎŋ ΀΁ÎŋĪ‚ ÎēÎŋΚÎŊÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ" + }, "sendTypeFile": { "message": "Î‘ĪĪ‡ÎĩίÎŋ" }, @@ -1666,6 +2406,9 @@ "message": "ΌÎģÎą Ī„Îą Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ ÎēÎĩΚÎŧέÎŊÎŋĪ… ÎąĪ€ĪŒ ΀΁ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ" + }, "maxAccessCountReached": { "message": "ÎĻĪ„ÎŦĪƒÎąĪ„Îĩ ĪƒĪ„ÎŋÎŊ ÎŧÎ­ÎŗÎšĪƒĪ„Îŋ ÎąĪÎšÎ¸ÎŧΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Î ĪÎŋĪƒĪ„ÎąĪ„ÎĩĪ…ÎŧέÎŊÎŋ ÎŧÎĩ ÎēĪ‰Î´ÎšÎēΌ" }, + "copyLink": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ĪƒĪ…ÎŊÎ´Î­ĪƒÎŧÎŋĪ…" + }, "copySendLink": { "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ĪƒĪ…ÎŊÎ´Î­ĪƒÎŧÎŋĪ… Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1690,10 +2436,10 @@ "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ" }, "removedPassword": { - "message": "ÎšÎąĪ„ÎąĪÎŗÎŽÎ¸ÎˇÎēÎĩ Îŋ ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + "message": "Ο ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪ†ÎąÎšĪÎ­Î¸ÎˇÎēÎĩ" }, "deletedSend": { - "message": "ΤÎŋ Send Î”ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎĩ", + "message": "ΤÎŋ Send Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1714,6 +2460,10 @@ "message": "Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Send;", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "ΘέÎģÎĩĪ„Îĩ ĪƒÎ¯ÎŗÎŋĪ…ĪÎą ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ ÎąĪ…Ī„ĪŒ Ī„Îŋ Send;", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1730,14 +2480,18 @@ "message": "ΤÎŋ ÎąĪĪ‡ÎĩίÎŋ Ī€ÎŋĪ… θέÎģÎĩĪ„Îĩ ÎŊÎą ĪƒĪ„ÎĩίÎģÎĩĪ„Îĩ." }, "deletionDate": { - "message": "ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą Î”ÎšÎąÎŗĪÎąĪ†ÎŽĪ‚" + "message": "ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą Î´ÎšÎąÎŗĪÎąĪ†ÎŽĪ‚" }, "deletionDateDesc": { "message": "ΤÎŋ Send θι Î´ÎšÎąÎŗĪÎąĪ†Îĩί ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ Ī„ÎˇÎŊ ÎēιθÎŋĪÎšĪƒÎŧέÎŊΡ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą ÎēιΚ ĪŽĪÎą.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "ΤÎŋ Send θι Î´ÎšÎąÎŗĪÎąĪ†Îĩί ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ ΃Îĩ ÎąĪ…Ī„ÎŽÎŊ Ī„ÎˇÎŊ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { - "message": "ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą Î›ÎŽÎžÎˇĪ‚" + "message": "ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą ÎģÎŽÎžÎˇĪ‚" }, "expirationDateDesc": { "message": "ΕÎŦÎŊ ÎŋĪÎšĪƒĪ„Îĩί, Ρ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ΃Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Send θι ÎģΎΞÎĩΚ Ī„ÎˇÎŊ ÎēιθÎŋĪÎšĪƒÎŧέÎŊΡ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą ÎēιΚ ĪŽĪÎą.", @@ -1769,6 +2523,10 @@ "message": "Î ĪÎŋÎąÎšĪÎĩĪ„ÎšÎēÎŦ ÎąĪ€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą Ī„ÎŋĪ…Ī‚ Ī‡ĪÎŽĪƒĪ„ÎĩĪ‚ ÎŗÎšÎą ÎŊÎą Î­Ī‡ÎŋĪ…ÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ΃Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Î™Î´ÎšĪ‰Ī„ÎšÎēÎ­Ī‚ ĪƒÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚ ĪƒĪ‡ÎĩĪ„ÎšÎēÎŦ ÎŧÎĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1789,17 +2547,17 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Î¤ĪÎ­Ī‡Ī‰ÎŊ Î‘ĪÎšÎ¸ÎŧĪŒĪ‚ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + "message": "Î¤ĪÎ­Ī‡Ī‰ÎŊ ÎąĪÎšÎ¸ÎŧĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "createSend": { - "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ΝέÎŋĪ… Send", + "message": "ΝέÎŋ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "ΝέÎŋĪ‚ ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + "message": "ΝέÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "sendDisabled": { - "message": "ΤÎŋ Send Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΎθΡÎēÎĩ", + "message": "ΤÎŋ Send ÎąĪ†ÎąÎšĪÎ­Î¸ÎˇÎēÎĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1807,11 +2565,55 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "ΤÎŋ Send ΔηÎŧΚÎŋĪ…ĪÎŗÎŽÎ¸ÎˇÎēÎĩ", + "message": "ΤÎŋ Send δΡÎŧΚÎŋĪ…ĪÎŗÎŽÎ¸ÎˇÎēÎĩ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "createdSendSuccessfully": { + "message": "ΤÎŋ Send δΡÎŧΚÎŋĪ…ĪÎŗÎŽÎ¸ÎˇÎēÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡ĪŽĪ‚!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "ΤÎŋ Send θι ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ΃Îĩ ĪŒĪ€ÎŋΚÎŋÎŊ Î­Ī‡ÎĩΚ Ī„ÎŋÎŊ ĪƒĪÎŊδÎĩ΃ÎŧÎŋ ÎŗÎšÎą Ī„ÎˇÎŊ ÎĩĪ€ĪŒÎŧÎĩÎŊΡ 1 ĪŽĪÎą.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "ΤÎŋ Send θι ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ΃Îĩ ĪŒĪ€ÎŋΚÎŋÎŊ Î­Ī‡ÎĩΚ Ī„ÎŋÎŊ ĪƒĪÎŊδÎĩ΃ÎŧÎŋ ÎŗÎšÎą Ī„ÎšĪ‚ ÎĩĪ€ĪŒÎŧÎĩÎŊÎĩĪ‚ $HOURS$ ĪŽĪÎĩĪ‚.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "ΤÎŋ Send θι ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ΃Îĩ ĪŒĪ€ÎŋΚÎŋÎŊ Î­Ī‡ÎĩΚ Ī„ÎŋÎŊ ĪƒĪÎŊδÎĩ΃ÎŧÎŋ ÎŗÎšÎą Ī„ÎˇÎŊ ÎĩĪ€ĪŒÎŧÎĩÎŊΡ 1 ΡÎŧÎ­ĪÎą.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "ΤÎŋ Send θι ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ΃Îĩ ĪŒĪ€ÎŋΚÎŋÎŊ Î­Ī‡ÎĩΚ Ī„ÎŋÎŊ ĪƒĪÎŊδÎĩ΃ÎŧÎŋ ÎŗÎšÎą Ī„ÎšĪ‚ ÎĩĪ€ĪŒÎŧÎĩÎŊÎĩĪ‚ $DAYS$ ΡÎŧÎ­ĪÎĩĪ‚.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Ο ĪƒĪÎŊδÎĩ΃ÎŧÎŋĪ‚ Send ÎąÎŊĪ„ÎšÎŗĪÎŦĪ†ÎˇÎēÎĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "ΤÎŋ Send Î•Ī€ÎĩΞÎĩĪÎŗÎŦĪƒĪ„ÎˇÎēÎĩ", + "message": "ΤÎŋ Send ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎĩ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogText": { + "message": "ΆÎŊÎŋÎšÎŗÎŧÎą ÎĩĪ€Î­ÎēĪ„ÎąĪƒÎˇĪ‚ ΃Îĩ ÎąÎŊÎąÎ´Ī…ĪŒÎŧÎĩÎŊÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ;", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Για ÎŊÎą δΡÎŧΚÎŋĪ…ĪÎŗÎŽĪƒÎĩĪ„Îĩ έÎŊÎą Send ÎąĪĪ‡ÎĩίÎŋĪ…, θι Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎąÎŊÎŋίΞÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎĩĪ€Î­ÎēĪ„ÎąĪƒÎˇ ΃Îĩ ÎŊέÎŋ ÎąÎŊÎąÎ´Ī…ĪŒÎŧÎĩÎŊÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Για ÎŊÎą ÎĩĪ€ÎšÎģέΞÎĩĪ„Îĩ έÎŊÎą ÎąĪĪ‡ÎĩίÎŋ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ Ī„Îŋ Safari, Î˛ÎŗÎąÎ¯ÎŊÎĩĪ„Îĩ ΃Îĩ έÎŊÎą ÎŊέÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ ÎēÎŦÎŊÎŋÎŊĪ„ÎąĪ‚ ÎēÎģΚÎē ΃Îĩ ÎąĪ…Ī„ÎŽ Ī„Îˇ Î´ÎšÎąĪ†ÎŽÎŧÎšĪƒÎˇ." }, + "popOut": { + "message": "ΆÎŊÎŋÎšÎŗÎŧÎą ΃Îĩ ÎąÎŊÎąÎ´Ī…ĪŒÎŧÎĩÎŊÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ" + }, "sendFileCalloutHeader": { "message": "Î ĪÎšÎŊ ΞÎĩÎēΚÎŊÎŽĪƒÎĩĪ„Îĩ" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ Ī„ÎˇĪ‚ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ email ÎŧÎŋĪ… ÎąĪ€ĪŒ Ī„ÎŋĪ…Ī‚ Ī€ÎąĪÎąÎģÎŽĪ€Ī„ÎĩĪ‚." }, + "hideYourEmail": { + "message": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ Ī„ÎˇĪ‚ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ email ĪƒÎąĪ‚ ÎąĪ€ĪŒ Ī„ÎŋĪ…Ī‚ θÎĩÎąĪ„Î­Ī‚." + }, "sendOptionsPolicyInEffect": { "message": "ÎœÎ¯Îą ÎŽ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ ÎŋĪÎŗÎąÎŊĪ‰Ī„ÎšÎēÎ­Ī‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎ­Ī‚ ÎĩĪ€ÎˇĪÎĩÎŦÎļÎŋĪ…ÎŊ Ī„ÎšĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ send ĪƒÎąĪ‚." }, @@ -1869,7 +2677,10 @@ "message": "Î‘Ī…Ī„ÎŽ Ρ ÎĩÎŊÎ­ĪÎŗÎĩΚι ΀΁ÎŋĪƒĪ„ÎąĪ„ÎĩĪÎĩĪ„ÎąÎš. Για ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎĩĪ„Îĩ, Ī€ÎģΡÎē΄΁ÎŋÎģÎŋÎŗÎŽĪƒĪ„Îĩ ΞιÎŊÎŦ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą ÎŊÎą ÎĩĪ€ÎąÎģΡθÎĩĪĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎŦ ĪƒÎąĪ‚." }, "emailVerificationRequired": { - "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš Î•Ī€ÎąÎģΎθÎĩĪ…ĪƒÎˇ Email" + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…" + }, + "emailVerifiedV2": { + "message": "Η δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ… ÎĩĪ€ÎšÎ˛ÎĩÎ˛ÎąÎšĪŽÎ¸ÎˇÎēÎĩ" }, "emailVerificationRequiredDesc": { "message": "Î ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎĩĪ€ÎąÎģΡθÎĩĪĪƒÎĩĪ„Îĩ Ī„Îŋ email ĪƒÎąĪ‚ ÎŗÎšÎą ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ÎŽ Ī„Îˇ Î´Ī…ÎŊÎąĪ„ĪŒĪ„ÎˇĪ„Îą. ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎĩĪ€ÎąÎģΡθÎĩĪĪƒÎĩĪ„Îĩ Ī„Îŋ email ĪƒÎąĪ‚ ĪƒĪ„Îŋ web vault." @@ -1878,7 +2689,7 @@ "message": "ΕÎŊΡÎŧÎĩĪĪŽÎ¸ÎˇÎēÎĩ Îŋ ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "updateMasterPassword": { - "message": "ΕÎŊΡÎŧÎĩĪĪŽĪƒĪ„Îĩ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + "message": "ΕÎŊΡÎŧÎ­ĪĪ‰ĪƒÎˇ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "updateMasterPasswordWarning": { "message": "Ο ÎšĪĪÎšÎŋĪ‚ ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Î ĪĪŒĪƒÎ˛ÎąĪƒÎŽĪ‚ ĪƒÎąĪ‚ ÎŦÎģÎģιΞÎĩ Ī€ĪĪŒĪƒĪ†ÎąĪ„Îą ÎąĪ€ĪŒ Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽ ĪƒĪ„ÎŋÎŊ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ ĪƒÎąĪ‚. Για ÎŊÎą ÎąĪ€ÎŋÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ vault, Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Ī„ÎŋÎŊ ÎĩÎŊΡÎŧÎĩĪĪŽĪƒÎĩĪ„Îĩ Ī„ĪŽĪÎą. Η δΚιδΚÎēÎąĪƒÎ¯Îą θι ĪƒÎąĪ‚ ÎąĪ€ÎŋĪƒĪ…ÎŊÎ´Î­ĪƒÎĩΚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ĪƒĪ…ÎŊÎĩÎ´ĪÎ¯Îą ĪƒÎąĪ‚, ÎąĪ€ÎąÎšĪ„ĪŽÎŊĪ„ÎąĪ‚ ÎąĪ€ĪŒ Îĩ΃ÎŦĪ‚ ÎŊÎą ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ΞιÎŊÎŦ. Οι ÎĩÎŊÎĩĪÎŗÎ­Ī‚ ĪƒĪ…ÎŊÎĩÎ´ĪÎ¯ÎĩĪ‚ ΃Îĩ ÎŦÎģÎģÎĩĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚ ÎĩÎŊÎ´Î­Ī‡ÎĩĪ„ÎąÎš ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎŋĪ…ÎŊ ÎŊÎą ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎ­Ī‚ ÎŗÎšÎą ÎŧÎ¯Îą ĪŽĪÎą." @@ -1886,8 +2697,11 @@ "updateWeakMasterPasswordWarning": { "message": "Ο ÎšĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ δÎĩÎŊ Ī€ÎģÎˇĪÎŋί Ī„ÎšĪ‚ ÎąĪ€ÎąÎšĪ„ÎŽĪƒÎĩÎšĪ‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎŽĪ‚ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ. Για ÎŊÎą Î­Ī‡ÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ vault, Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎĩÎŊΡÎŧÎĩĪĪŽĪƒÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎšĪĪÎšÎŋ ĪƒÎąĪ‚ ÎēĪ‰Î´ÎšÎēΌ ÎŦÎŧÎĩĪƒÎą. Η δΚιδΚÎēÎąĪƒÎ¯Îą θι ĪƒÎąĪ‚ ÎąĪ€ÎŋĪƒĪ…ÎŊÎ´Î­ĪƒÎĩΚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ĪƒĪ…ÎŊÎĩÎ´ĪÎ¯Îą ĪƒÎąĪ‚, ÎąĪ€ÎąÎšĪ„ĪŽÎŊĪ„ÎąĪ‚ ÎąĪ€ĪŒ Îĩ΃ÎŦĪ‚ ÎŊÎą ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ΞιÎŊÎŦ. Οι ÎĩÎŊÎĩĪÎŗÎ­Ī‚ ĪƒĪ…ÎŊÎĩÎ´ĪÎ¯ÎĩĪ‚ ΃Îĩ ÎŦÎģÎģÎĩĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚ ÎĩÎŊÎ´Î­Ī‡ÎĩĪ„ÎąÎš ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎŋĪ…ÎŊ ÎŊÎą ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎ­Ī‚ ÎŗÎšÎą ÎŧÎ¯Îą ĪŽĪÎą." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Ο ÎŋĪÎŗÎąÎŊÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪ‚ Î­Ī‡ÎĩΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩΚ Ī„ÎˇÎŊ Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ ÎąÎžÎšĪŒĪ€ÎšĪƒĪ„ÎˇĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚. Î ÎąĪÎąÎēÎąÎģĪŽ ÎŋĪÎ¯ĪƒĪ„Îĩ έÎŊÎąÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą ÎŊÎą ÎąĪ€ÎŋÎēĪ„ÎŽĪƒÎĩĪ„Îĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ Î¸ÎˇĪƒÎąĪ…ĪÎŋΆ΅ÎģÎŦÎēΚÎŋ ĪƒÎąĪ‚." + }, "resetPasswordPolicyAutoEnroll": { - "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ Î•ÎŗÎŗĪÎąĪ†ÎŽ" + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎĩÎŗÎŗĪÎąĪ†ÎŽ" }, "resetPasswordAutoEnrollInviteWarning": { "message": "Î‘Ī…Ī„ĪŒĪ‚ Îŋ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧĪŒĪ‚ Î­Ī‡ÎĩΚ ÎŧΚι ÎĩĪ€ÎšĪ‡ÎĩÎšĪÎˇÎŧÎąĪ„ÎšÎēÎŽ Ī€ÎŋÎģÎšĪ„ÎšÎēÎŽ Ī€ÎŋĪ… θι ĪƒÎąĪ‚ ÎĩÎŗÎŗĪÎŦΈÎĩΚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą ĪƒĪ„ÎˇÎŊ ÎĩĪ€ÎąÎŊÎąĪ†Îŋ΁ÎŦ ÎēĪ‰Î´ÎšÎēÎŋĪ. Η ÎĩÎŗÎŗĪÎąĪ†ÎŽ θι ÎĩĪ€ÎšĪ„ĪÎ­ĪˆÎĩΚ ĪƒĪ„ÎŋĪ…Ī‚ Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„Î­Ī‚ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ÎŊÎą ÎąÎģÎģÎŦΞÎŋĪ…ÎŊ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ĪƒÎąĪ‚." @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ΆÎŦÎēÎĩÎģÎŋ..." }, - "ssoCompleteRegistration": { - "message": "Για ÎŊÎą ÎŋÎģÎŋÎēÎģÎˇĪĪŽĪƒÎĩĪ„Îĩ Ī„Îˇ ĪƒĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ SSO, ÎŋĪÎ¯ĪƒĪ„Îĩ έÎŊÎąÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ÎēιΚ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯Îą Ī„ÎŋĪ… vault ĪƒÎąĪ‚." + "noFoldersFound": { + "message": "ΔÎĩ Î˛ĪÎ­Î¸ÎˇÎēÎąÎŊ ΆÎŦÎēÎĩÎģÎŋΚ", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Τι δΚÎēÎąÎšĪŽÎŧÎąĪ„Îą Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ĪƒÎąĪ‚ ÎĩÎŊΡÎŧÎĩĪĪŽÎ¸ÎˇÎēÎąÎŊ, ÎąĪ€ÎąÎšĪ„ĪŽÎŊĪ„ÎąĪ‚ ÎąĪ€ĪŒ Îĩ΃ÎŦĪ‚ ÎŊÎą ÎŋĪÎ¯ĪƒÎĩĪ„Îĩ έÎŊÎąÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Ο ÎŋĪÎŗÎąÎŊÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪ‚ ÎąĪ€ÎąÎšĪ„Îĩί ÎŊÎą ÎŋĪÎ¯ĪƒÎĩĪ„Îĩ έÎŊÎąÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "ÎąĪ€ĪŒ $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇ", + "description": "Default title for the user verification dialog." }, "hours": { "message": "ÎĪÎĩĪ‚" @@ -1904,6 +2740,9 @@ "minutes": { "message": "ΛÎĩ΀΄ÎŦ" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Οι ÎąĪ€ÎąÎšĪ„ÎŽĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎĩĪ„ÎąÎšĪÎšÎēÎŽĪ‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎŽĪ‚ Î­Ī‡ÎŋĪ…ÎŊ ÎĩĪ†ÎąĪÎŧÎŋĪƒĪ„Îĩί ĪƒĪ„ÎšĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ ·΁ÎŋÎŊΚÎēÎŋĪ ÎŋĪÎ¯ÎŋĪ… ĪƒÎąĪ‚" + }, "vaultTimeoutPolicyInEffect": { "message": "Οι Ī€ÎŋÎģÎšĪ„ÎšÎēÎ­Ī‚ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ĪƒÎąĪ‚ ÎĩĪ€ÎˇĪÎĩÎŦÎļÎŋĪ…ÎŊ Ī„Îŋ ·΁ÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ vault ĪƒÎąĪ‚. ΤÎŋ ÎŧÎ­ÎŗÎšĪƒĪ„Îŋ ÎĩĪ€ÎšĪ„ĪÎĩĪ€ĪŒÎŧÎĩÎŊÎŋ Î§ĪÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ Vault ÎĩίÎŊιΚ $HOURS$ ĪŽĪÎą(ÎĩĪ‚) ÎēιΚ $MINUTES$ ÎģÎĩĪ€Ī„ĪŒ(ÎŦ)", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ ĪŽĪÎą(ÎĩĪ‚) ÎēιΚ $MINUTES$ ÎģÎĩĪ€Ī„ĪŒ(ÎŦ) Ī„Îŋ Ī€ÎŋÎģĪ.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "ΤÎŋ ·΁ÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ Ī…Ī€ÎĩĪÎ˛ÎąÎ¯ÎŊÎĩΚ Ī„ÎŋÎŊ Ī€ÎĩĪÎšÎŋĪÎšĪƒÎŧΌ Ī€ÎŋĪ… Î­Ī‡ÎĩΚ ÎēιθÎŋĪÎšĪƒĪ„Îĩί ÎąĪ€ĪŒ Ī„ÎŋÎŊ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ ĪƒÎąĪ‚: $HOURS$ ĪŽĪÎą(ÎĩĪ‚) ÎēιΚ $MINUTES$ ÎģÎĩĪ€Ī„ĪŒ(ÎŦ) Ī„Îŋ Ī€ÎŋÎģĪ", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Οι Ī€ÎŋÎģÎšĪ„ÎšÎēÎ­Ī‚ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ĪƒÎąĪ‚ ÎĩĪ€ÎˇĪÎĩÎŦÎļÎŋĪ…ÎŊ Ī„Îŋ ·΁ÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ ÎģÎŽÎžÎˇĪ‚ Ī„ÎŋĪ… vault ĪƒÎąĪ‚. ΤÎŋ ÎŧÎ­ÎŗÎšĪƒĪ„Îŋ ÎĩĪ€ÎšĪ„ĪÎĩĪ€ĪŒÎŧÎĩÎŊÎŋ ·΁ÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ ÎģÎŽÎžÎˇĪ‚ vault ÎĩίÎŊιΚ $HOURS$ ĪŽĪÎą(ÎĩĪ‚) ÎēιΚ $MINUTES$ ÎģÎĩĪ€Ī„ĪŒ(ÎŦ). H ÎĩÎŊÎ­ĪÎŗÎĩΚι ·΁ÎŋÎŊΚÎēÎŋĪ ÎŋĪÎ¯ÎŋĪ… ÎģÎŽÎžÎˇĪ‚ ÎĩίÎŊιΚ ÎŋĪÎšĪƒÎŧέÎŊΡ Ή΂ $ACTION$.", "placeholders": { @@ -1947,10 +2812,10 @@ "message": "ΤÎŋ ·΁ÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ Ī„ÎŋĪ… vault ĪƒÎąĪ‚ Ī…Ī€ÎĩĪÎ˛ÎąÎ¯ÎŊÎĩΚ Ī„ÎŋĪ…Ī‚ Ī€ÎĩĪÎšÎŋĪÎšĪƒÎŧÎŋĪĪ‚ Ī€ÎŋĪ… Î­Ī‡ÎĩΚ ÎŋĪÎ¯ĪƒÎĩΚ Îŋ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪ‚." }, "vaultExportDisabled": { - "message": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ vault Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ" + "message": "Μη Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧΡ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" }, "personalVaultExportPolicyInEffect": { - "message": "ÎœÎ¯Îą ÎŽ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ ÎŋĪÎŗÎąÎŊĪ‰Ī„ÎšÎēÎ­Ī‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎ­Ī‚ ĪƒÎąĪ‚ ÎąĪ€ÎŋĪ„ĪÎ­Ī€ÎĩΚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ Ī„ÎŋĪ… ΀΁ÎŋĪƒĪ‰Ī€ÎšÎēÎŋĪ vault." + "message": "ÎœÎ¯Îą ÎŽ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎ­Ī‚ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ĪƒÎąĪ‚ ÎąĪ€ÎŋĪ„ĪÎ­Ī€ÎĩΚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ Ī„ÎŋĪ… ΀΁ÎŋĪƒĪ‰Ī€ÎšÎēÎŋĪ ĪƒÎąĪ‚ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…." }, "copyCustomFieldNameInvalidElement": { "message": "ΔÎĩÎŊ ÎĩίÎŊιΚ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ ÎąÎŊÎąÎŗÎŊĪŽĪÎšĪƒÎˇ ÎĩÎŊĪŒĪ‚ Î­ÎŗÎē΅΁ÎŋĪ… ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ… Ī†ĪŒĪÎŧÎąĪ‚. ΔÎŋÎēΚÎŧÎŦĪƒĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšÎ¸ÎĩĪ‰ĪÎŽĪƒÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪŽÎ´ÎšÎēÎą HTML." @@ -1971,10 +2836,10 @@ "message": "Î‘Ī€ÎŋĪ‡ĪŽĪÎˇĪƒÎˇ ÎąĪ€ĪŒ Ī„ÎŋÎŊ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ" }, "removeMasterPassword": { - "message": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎšĪĪÎšÎŋĪ… ÎšĪ‰Î´ÎšÎēÎŋĪ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + "message": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "removedMasterPassword": { - "message": "Ο ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ ÎąĪ†ÎąÎšĪÎ­Î¸ÎˇÎēÎĩ." + "message": "Ο ÎēĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪ†ÎąÎšĪÎ­Î¸ÎˇÎēÎĩ" }, "leaveOrganizationConfirmation": { "message": "Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Ī†ĪÎŗÎĩĪ„Îĩ ÎąĪ€ĪŒ ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ;" @@ -1989,10 +2854,10 @@ "message": "ÎˆĪ‡ÎĩΚ ÎģΎΞÎĩΚ Ī„Îŋ ·΁ÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ. Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩĪ€ÎšĪƒĪ„ĪÎ­ĪˆĪ„Îĩ ÎēιΚ ΀΁ÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ÎŊÎą ĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ΞιÎŊÎŦ." }, "exportingPersonalVaultTitle": { - "message": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ Î ĪÎŋĪƒĪ‰Ī€ÎšÎēÎŋĪ Vault" + "message": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ÎąĪ„ÎŋÎŧΚÎēÎŋĪ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "ÎœĪŒÎŊÎŋ Ī„Îą ÎąĪ„ÎŋÎŧΚÎēÎŦ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ… Ī€ÎŋĪ… ĪƒĪ‡ÎĩĪ„Î¯ÎļÎŋÎŊĪ„ÎąÎš ÎŧÎĩ Ī„Îŋ $EMAIL$ θι ÎĩÎžÎąĪ‡Î¸ÎŋĪÎŊ. Τι ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ… Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ δÎĩ θι ĪƒĪ…ÎŧĪ€ÎĩĪÎšÎģÎˇĪ†Î¸ÎŋĪÎŊ. ÎœĪŒÎŊÎŋ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊΉÎŊ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ… θι ÎĩÎžÎąĪ‡Î¸ÎŋĪÎŊ ÎēιΚ δÎĩ θι Ī€ÎĩĪÎšÎģÎąÎŧβÎŦÎŊÎŋĪ…ÎŊ ĪƒĪ…ĪƒĪ‡ÎĩĪ„ÎšÎļΌÎŧÎĩÎŊÎą ĪƒĪ…ÎŊΡÎŧÎŧέÎŊÎą.", "placeholders": { "email": { "content": "$1", @@ -2000,27 +2865,56 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ" + }, + "exportingOrganizationVaultDesc": { + "message": "ÎœĪŒÎŊÎŋ Ī„Îŋ Î¸ÎˇĪƒÎąĪ…/ÎēΚÎŋ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ Ī€ÎŋĪ… ĪƒĪ‡ÎĩĪ„Î¯ÎļÎĩĪ„ÎąÎš ÎŧÎĩ Ī„Îŋ $ORGANIZATION$ θι ÎĩÎžÎąĪ‡Î¸Îĩί. ΑÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ΃Îĩ ÎąĪ„ÎŋÎŧΚÎēÎŦ Î¸ÎˇĪƒÎąĪ…/ÎēΚι ÎŽ ÎŦÎģÎģÎŋĪ…Ī‚ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪĪ‚ δÎĩ θι ĪƒĪ…ÎŧĪ€ÎĩĪÎšÎģÎˇĪ†Î¸ÎŋĪÎŊ.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "ÎŖĪ†ÎŦÎģÎŧÎą" }, "regenerateUsername": { - "message": "Î•Ī€ÎąÎŊιδΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ΟÎŊΌÎŧÎąĪ„ÎŋĪ‚ Î§ĪÎŽĪƒĪ„Îˇ" + "message": "Î•Ī€ÎąÎŊιδΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ" }, "generateUsername": { - "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ΌÎŊÎŋÎŧÎą Î§ĪÎŽĪƒĪ„Îˇ" + "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ" + }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } }, "usernameType": { - "message": "Î¤ĪĪ€ÎŋĪ‚ ΟÎŊΌÎŧÎąĪ„ÎŋĪ‚ Î§ĪÎŽĪƒĪ„Îˇ" + "message": "Î¤ĪĪ€ÎŋĪ‚ ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ" }, "plusAddressedEmail": { - "message": "ÎŖĪ…ÎŊ ΔιÎĩĪÎ¸Ī…ÎŊĪƒÎˇ Email", + "message": "ÎŖĪ…ÎŊ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎšĪ‚ Î´Ī…ÎŊÎąĪ„ĪŒĪ„ÎˇĪ„ÎĩĪ‚ δÎĩĪ…Ī„Îĩ΁ÎĩĪÎŋĪ…ĪƒÎąĪ‚ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ Ī„ÎŋĪ… Ī€ÎąĪĪŒĪ‡ÎŋĪ… email ĪƒÎąĪ‚." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "ΔιÎĩĪÎ¸Ī…ÎŊĪƒÎˇ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ… ÎēÎŦθÎĩ ΃ÎēÎŋĪ€ÎŋĪ" }, "catchallEmailDesc": { "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îą δΚιÎŧÎŋ΁ΆΉÎŧέÎŊÎą ÎĩÎšĪƒÎĩĪĪ‡ĪŒÎŧÎĩÎŊÎą catch-all Ī„ÎŋĪ… domain ĪƒÎąĪ‚." @@ -2029,26 +2923,136 @@ "message": "Î¤Ī…Ī‡ÎąÎ¯Îŋ" }, "randomWord": { - "message": "Î¤Ī…Ī‡ÎąÎ¯Îą Λέξη" + "message": "Î¤Ī…Ī‡ÎąÎ¯Îą ÎģέΞΡ" }, "websiteName": { - "message": "ΌÎŊÎŋÎŧÎą Î™ĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´ÎąĪ‚" + "message": "ΌÎŊÎŋÎŧÎą ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´ÎąĪ‚" }, "whatWouldYouLikeToGenerate": { "message": "ΤΚ θι θέÎģÎąĪ„Îĩ ÎŊÎą δΡÎŧΚÎŋĪ…ĪÎŗÎŽĪƒÎĩĪ„Îĩ?" }, "passwordType": { - "message": "Î¤ĪĪ€ÎŋĪ‚ ÎšĪ‰Î´ÎšÎēÎŋĪ" + "message": "Î¤ĪĪ€ÎŋĪ‚ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "service": { "message": "ÎĨĪ€ÎˇĪÎĩĪƒÎ¯Îą" }, "forwardedEmail": { - "message": "Î ĪÎŋĪ‰Î¸ÎˇÎŧέÎŊÎŋ Email Alias" + "message": "Î ĪÎŋĪ‰Î¸ÎˇÎŧέÎŊÎŋ ΈÎĩĪ…Î´ĪŽÎŊĪ…ÎŧÎŋ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…" }, "forwardedEmailDesc": { "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽĪƒĪ„Îĩ έÎŊÎą alias email ÎŧÎĩ ÎŧΚι ÎĩÎžĪ‰Ī„ÎĩĪÎšÎēÎŽ Ī…Ī€ÎˇĪÎĩĪƒÎ¯Îą ΀΁ÎŋĪŽÎ¸ÎˇĪƒÎˇĪ‚." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ ĪƒĪ†ÎŦÎģÎŧÎą: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽÎ¸ÎˇÎēÎĩ ÎąĪ€ĪŒ Ī„Îŋ Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Î™ĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą: $WEBSITE$. ΔηÎŧΚÎŋĪ…ĪÎŗÎŽÎ¸ÎˇÎēÎĩ ÎąĪ€ĪŒ Ī„Îŋ Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Μη Î­ÎŗÎē΅΁Îŋ $SERVICENAME$ δΚιÎēĪÎšĪ„ÎšÎēΌ API", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Μη Î­ÎŗÎē΅΁Îŋ $SERVICENAME$ API δΚιÎēĪÎšĪ„ÎšÎēΌ: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Î‘Î´ĪÎŊÎąĪ„Îˇ Ρ ÎąĪ€ĪŒÎēĪ„ÎˇĪƒÎˇ Ī„ÎŋĪ… $SERVICENAME$ ÎēÎąÎŧÎŋ΅ΆÎģÎąĪÎšĪƒÎŧέÎŊÎŋĪ… ID δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ….", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Μη Î­ÎŗÎē΅΁ÎŋĪ‚ $SERVICENAME$ Ī„ÎŋÎŧÎ­ÎąĪ‚.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Μη Î­ÎŗÎē΅΁Îŋ $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Î ÎąĪÎŋĪ…ĪƒÎšÎŦĪƒĪ„ÎˇÎēÎĩ ÎŦÎŗÎŊĪ‰ĪƒĪ„Îŋ $SERVICENAME$ ĪƒĪ†ÎŦÎģÎŧÎą.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Î†ÎŗÎŊĪ‰ĪƒĪ„ÎŋĪ‚ Î´ÎšÎąÎ˛ÎšÎ˛ÎąĪƒĪ„ÎŽĪ‚: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2060,13 +3064,13 @@ "message": "KÎģÎĩΚδί API" }, "ssoKeyConnectorError": { - "message": "ÎŖĪ†ÎŦÎģÎŧÎą Key Connector: βÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Ī„Îŋ Key Connector ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ÎēιΚ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎĩί ĪƒĪ‰ĪƒĪ„ÎŦ." + "message": "ÎŖĪ†ÎŦÎģÎŧÎą Key connector: βÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Ī„Îŋ Key connector ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ÎēιΚ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎĩί ĪƒĪ‰ĪƒĪ„ÎŦ." }, "premiumSubcriptionRequired": { "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ĪƒĪ…ÎŊÎ´ĪÎŋÎŧÎŽ Premium" }, "organizationIsDisabled": { - "message": "Ο ÎŋĪÎŗÎąÎŊÎšĪƒÎŧĪŒĪ‚ ÎĩίÎŊιΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋĪ‚." + "message": "Ο ÎŋĪÎŗÎąÎŊÎšĪƒÎŧĪŒĪ‚ ÎąÎŊÎąĪƒĪ„ÎŦÎģθΡÎēÎĩ." }, "disabledOrganizationFilterError": { "message": "ΔÎĩÎŊ ÎĩίÎŊιΚ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ΃Îĩ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ΃Îĩ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋĪ…Ī‚ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪĪ‚. Î•Ī€ÎšÎēÎŋΚÎŊΉÎŊÎŽĪƒĪ„Îĩ ÎŧÎĩ Ī„ÎŋÎŊ ΚδΚÎŋÎēĪ„ÎŽĪ„Îˇ Ī„ÎŋĪ… ÎŸĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ÎŗÎšÎą βÎŋΎθÎĩΚι." @@ -2126,19 +3130,19 @@ "message": "ΔÎĩÎŊ ÎĩÎ¯ĪƒĪ„Îĩ Îĩ΃ÎĩÎ¯Ī‚;" }, "newAroundHere": { - "message": "ΝέÎŋĪ‚/Îą ĪƒĪ„Îą ÎŧÎ­ĪÎˇ ÎŧÎąĪ‚;" + "message": "Î•Î¯ĪƒĪ„Îĩ ÎŊέÎŋĪ‚/Îą ÎĩÎ´ĪŽ;" }, "rememberEmail": { - "message": "Î‘Ī€ÎŋÎŧÎŊΡÎŧΌÎŊÎĩĪ…ĪƒÎˇ email" + "message": "Î‘Ī€ÎŋÎŧÎŊΡÎŧΌÎŊÎĩĪ…ĪƒÎˇ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…" }, "loginWithDevice": { "message": "ÎŖĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ Ī„Îˇ Ī‡ĪÎŽĪƒÎˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚" }, "loginWithDeviceEnabledInfo": { - "message": "Η ĪƒĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ Ī„Îˇ Ī‡ĪÎŽĪƒÎˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Î­Ī‡ÎĩΚ ĪĪ…Î¸ÎŧÎšĪƒĪ„Îĩί ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚ Bitwarden. Î§ĪÎĩΚÎŦÎļÎĩĪƒĪ„Îĩ ÎēÎŦĪ€ÎŋΚι ÎŦÎģÎģΡ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ;" + "message": "Η ĪƒĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ Ī„Îˇ Ī‡ĪÎŽĪƒÎˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎŋĪÎšĪƒĪ„Îĩί ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚ Bitwarden. Î§ĪÎĩΚÎŦÎļÎĩĪƒĪ„Îĩ ÎēÎŦĪ€ÎŋΚι ÎŦÎģÎģΡ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ;" }, "fingerprintPhraseHeader": { - "message": "ÎĻ΁ÎŦĪƒÎˇ διÎē΄΅ÎģΚÎēĪŽÎŊ ÎąĪ€Îŋ΄΅΀ΉÎŧÎŦ΄ΉÎŊ" + "message": "ÎĻ΁ÎŦĪƒÎˇ διÎē΄΅ÎģΚÎēÎŋĪ ÎąĪ€ÎŋĪ„Ī…Ī€ĪŽÎŧÎąĪ„ÎŋĪ‚" }, "fingerprintMatchInfo": { "message": "ΒÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Ī„Îŋ vault ĪƒÎąĪ‚ ÎĩίÎŊιΚ ΞÎĩÎēÎģÎĩÎšÎ´Ī‰ÎŧέÎŊÎŋ ÎēιΚ Ρ ÎĻ΁ÎŦĪƒÎˇ διÎē΄΅ÎģΚÎēĪŽÎŊ ÎąĪ€Îŋ΄΅΀ΉÎŧÎŦ΄ΉÎŊ Ī„ÎąÎšĪÎšÎŦÎļÎĩΚ ĪƒĪ„ÎˇÎŊ ÎŦÎģÎģΡ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ." @@ -2162,13 +3166,13 @@ "message": "Ο ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Î­Ī‡ÎĩΚ Î˛ĪÎĩθÎĩί ΃Îĩ Ī€ÎąĪÎąÎ˛Î¯ÎąĪƒÎˇ δÎĩδÎŋÎŧέÎŊΉÎŊ. Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ έÎŊÎąÎŊ ÎŧÎŋÎŊιδΚÎēΌ ÎēĪ‰Î´ÎšÎēΌ ÎŗÎšÎą Ī„ÎˇÎŊ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯Îą Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚. Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ έÎŊÎąÎŊ ÎĩÎēĪ„ÎĩθÎĩΚÎŧέÎŊÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚;" }, "weakAndExposedMasterPassword": { - "message": "Î‘Î´ĪÎŊÎąÎŧÎŋĪ‚ ÎēιΚ ÎĩÎēĪ„ÎĩθÎĩΚÎŧέÎŊÎŋĪ‚ ÎšĪĪÎšÎŋĪ‚ ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + "message": "Î‘Î´ĪÎŊÎąÎŧÎŋĪ‚ ÎēιΚ ΕÎēĪ„ÎĩθÎĩΚÎŧέÎŊÎŋĪ‚ ÎšĪĪÎšÎŋĪ‚ ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "weakAndBreachedMasterPasswordDesc": { "message": "Î‘Î´ĪÎŊÎąÎŧÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ÎŋĪ… Î­Ī‡ÎĩΚ ÎĩÎŊĪ„ÎŋĪ€ÎšĪƒĪ„Îĩί ΃Îĩ Ī€ÎąĪÎąÎ˛Î¯ÎąĪƒÎˇ δÎĩδÎŋÎŧέÎŊΉÎŊ. Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ έÎŊÎąÎŊ ÎšĪƒĪ‡Ī…ĪĪŒ ÎēιΚ ÎŧÎŋÎŊιδΚÎēΌ ÎēĪ‰Î´ÎšÎēΌ ÎŗÎšÎą Ī„ÎˇÎŊ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯Îą Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚. Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ;" }, "checkForBreaches": { - "message": "ΕÎģÎ­ÎŗÎžĪ„Îĩ ÎŗÎŊĪ‰ĪƒĪ„Î­Ī‚ Ī€ÎąĪÎąÎ˛ÎšÎŦ΃ÎĩÎšĪ‚ δÎĩδÎŋÎŧέÎŊΉÎŊ ÎŗÎšÎą ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + "message": "ΕÎģÎ­ÎŗÎžĪ„Îĩ ÎŗÎŊĪ‰ĪƒĪ„Î­Ī‚ Î´ÎšÎąĪĪÎŋÎ­Ī‚ δÎĩδÎŋÎŧέÎŊΉÎŊ ÎŗÎšÎą ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "important": { "message": "ÎŖÎˇÎŧÎąÎŊĪ„ÎšÎēΌ:" @@ -2192,7 +3196,7 @@ "message": "Î ĪŽĪ‚ ÎŊÎą ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą" }, "autofillSelectInfoWithCommand": { - "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ έÎŊÎą ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ ÎąĪ€ĪŒ ÎąĪ…Ī„ÎŽ Ī„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎŽ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îˇ ĪƒĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ: $COMMAND$", + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ έÎŊÎą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎąĪ€ĪŒ ÎąĪ…Ī„ÎŽÎŊ Ī„ÎˇÎŊ ÎŋÎ¸ĪŒÎŊΡ, Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îˇ ĪƒĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ $COMMAND$, ÎŽ ÎĩΞÎĩ΁ÎĩĪ…ÎŊÎŽĪƒĪ„Îĩ ÎŦÎģÎģÎĩĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ έÎŊÎą ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ ÎąĪ€ĪŒ ÎąĪ…Ī„ÎŽ Ī„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎŽ ÎŋĪÎ¯ĪƒĪ„Îĩ ÎŧΚι ĪƒĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚." + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ έÎŊÎą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎąĪ€ĪŒ ÎąĪ…Ī„ÎŽÎŊ Ī„ÎˇÎŊ ÎŋÎ¸ĪŒÎŊΡ ÎŽ ÎĩΞÎĩ΁ÎĩĪ…ÎŊÎŽĪƒĪ„Îĩ ÎŦÎģÎģÎĩĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚." }, "gotIt": { "message": "ΤÎŋ ÎēÎąĪ„ÎŦÎģιβι" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "ÎŖĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "ΑÎģÎģÎąÎŗÎŽ ĪƒĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇĪ‚" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Î”ÎšÎąĪ‡ÎĩÎ¯ĪÎšĪƒÎˇ ĪƒĪ…ÎŊĪ„ÎŋÎŧÎĩĪĪƒÎĩΉÎŊ" + }, "autofillShortcut": { "message": "ÎŖĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ Ī€ÎģΡÎē΄΁ÎŋÎģÎŋÎŗÎ¯ÎŋĪ… ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚" }, - "autofillShortcutNotSet": { - "message": "Η ĪƒĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ δÎĩÎŊ Î­Ī‡ÎĩΚ ÎŋĪÎšĪƒĪ„Îĩί. ΑÎģÎģÎŦÎžĪ„Îĩ Ī„Îˇ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ." + "autofillLoginShortcutNotSet": { + "message": "Η ĪƒĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ δÎĩÎŊ Î­Ī‡ÎĩΚ ÎŋĪÎšĪƒĪ„Îĩί. ΑÎģÎģÎŦÎžĪ„Îĩ Ī„Îŋ ÎąĪ…Ī„ĪŒ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ." }, - "autofillShortcutText": { - "message": "Η ĪƒĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ÎĩίÎŊιΚ: $COMMAND$. ΑÎģÎģÎŦÎžĪ„Îĩ Ī„Îˇ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎŋĪ… ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚ Ī€ÎĩĪÎšÎŽÎŗÎˇĪƒÎˇĪ‚.", + "autofillLoginShortcutText": { + "message": "Η ĪƒĪ…ÎŊĪ„ĪŒÎŧÎĩĪ…ĪƒÎˇ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎĩίÎŊιΚ $COMMAND$. Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎĩÎ¯Ī„Îĩ ΌÎģÎĩĪ‚ Ī„ÎšĪ‚ ĪƒĪ…ÎŊĪ„ÎŋÎŧÎĩĪĪƒÎĩÎšĪ‚ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "ÎŖĪÎŊδÎĩĪƒÎˇ Ή΂" - }, "opensInANewWindow": { "message": "ΑÎŊÎŋÎ¯ÎŗÎĩΚ ΃Îĩ ÎŊέÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ" }, @@ -2255,21 +3265,36 @@ "message": "Î‘Î¯Ī„ÎˇĪƒÎˇ Î­ÎŗÎēĪÎšĪƒÎˇĪ‚ Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽ" }, "approveWithMasterPassword": { - "message": "ÎˆÎŗÎēĪÎšĪƒÎˇ ÎŧÎĩ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ" + "message": "ÎˆÎŗÎēĪÎšĪƒÎˇ ÎŧÎĩ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" }, "ssoIdentifierRequired": { "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎąÎŊÎąÎŗÎŊĪ‰ĪÎšĪƒĪ„ÎšÎēΌ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ SSO." }, + "creatingAccountOn": { + "message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒĪ„Îŋ" + }, + "checkYourEmail": { + "message": "ΕÎģÎ­ÎŗÎžĪ„Îĩ Ī„Îŋ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋ ĪƒÎąĪ‚" + }, + "followTheLinkInTheEmailSentTo": { + "message": "ΑÎēÎŋÎģÎŋĪ…Î¸ÎŽĪƒĪ„Îĩ Ī„Îŋ ĪƒĪÎŊδÎĩ΃ÎŧÎŋ ĪƒĪ„Îŋ ÎŧÎŽÎŊĪ…ÎŧÎą ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ… Ī€ÎŋĪ… ĪƒĪ„ÎŦÎģθΡÎēÎĩ ĪƒĪ„Îŋ" + }, + "andContinueCreatingYourAccount": { + "message": "ÎēιΚ ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒĪ„Îĩ ĪƒĪ„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚." + }, + "noEmail": { + "message": "ΚαÎŊέÎŊÎą ÎŧÎŽÎŊĪ…ÎŧÎą ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…;" + }, + "goBack": { + "message": "Î•Ī€ÎšĪƒĪ„ĪÎŋĪ†ÎŽ" + }, + "toEditYourEmailAddress": { + "message": "ÎŗÎšÎą ÎŊÎą ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒĪ„ÎĩÎ¯Ī„Îĩ Ī„Îˇ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ… ĪƒÎąĪ‚." + }, "eu": { "message": "ΕΕ", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "ΔÎĩÎŊ ÎĩĪ€ÎšĪ„ĪÎ­Ī€ÎĩĪ„ÎąÎš Ρ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ. ΔÎĩÎŊ Î­Ī‡ÎĩĪ„Îĩ ÎŦδÎĩΚι ÎŗÎšÎą ÎŊÎą δÎĩÎ¯Ī„Îĩ ÎąĪ…Ī„ÎŽ Ī„Îˇ ΃ÎĩÎģÎ¯Î´Îą." }, @@ -2298,11 +3323,19 @@ "message": "Η ĪƒĪÎŊδÎĩĪƒÎˇ ÎĩÎŗÎēĪÎ¯Î¸ÎˇÎēÎĩ" }, "userEmailMissing": { - "message": "ΤÎŋ email Ī„ÎŋĪ… Ī‡ĪÎŽĪƒĪ„Îˇ ÎąĪ€ÎŋĪ…ĪƒÎšÎŦÎļÎĩΚ" + "message": "Η δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ… Ī„ÎŋĪ… Ī‡ĪÎŽĪƒĪ„Îˇ ÎģÎĩÎ¯Ī€ÎĩΚ" }, "deviceTrusted": { "message": "Î‘ÎžÎšĪŒĪ€ÎšĪƒĪ„Îˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ" }, + "sendsNoItemsTitle": { + "message": "ΚαÎŊέÎŊÎą ÎĩÎŊÎĩĪÎŗĪŒ Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Î§ĪÎŽĪƒÎˇ Send ÎŗÎšÎą ÎąĪƒĪ†ÎąÎģÎŽ ÎēÎŋΚÎŊÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ Îē΁΅΀΄ÎŋÎŗĪÎąĪ†ÎˇÎŧέÎŊΉÎŊ Ī€ÎģÎˇĪÎŋΆÎŋĪÎšĪŽÎŊ ÎŧÎĩ ÎŋĪ€ÎŋΚÎŋÎŊÎ´ÎŽĪ€ÎŋĪ„Îĩ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽ." }, @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Η Ī„ÎšÎŧÎŽ ÎēÎąĪ„ÎąĪ‡ĪŽĪÎˇĪƒÎˇĪ‚ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎĩίÎŊιΚ Ī„ÎŋĪ…ÎģÎŦĪ‡ÎšĪƒĪ„ÎŋÎŊ $MIN$", + "message": "Η Ī„ÎšÎŧÎŽ ÎēÎąĪ„ÎąĪ‡ĪŽĪÎˇĪƒÎˇĪ‚ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎĩίÎŊιΚ Ī„ÎŋĪ…ÎģÎŦĪ‡ÎšĪƒĪ„ÎŋÎŊ $MIN$.", "placeholders": { "min": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "1 ÎŽ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„ÎĩĪÎą email δÎĩÎŊ ÎĩίÎŊιΚ Î­ÎŗÎēĪ…ĪÎą" + "message": "1 ÎŽ Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ δΚÎĩĪ…Î¸ĪÎŊ΃ÎĩÎšĪ‚ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ… δÎĩÎŊ ÎĩίÎŊιΚ Î­ÎŗÎē΅΁ÎĩĪ‚" }, "inputTrimValidator": { "message": "Η ÎēÎąĪ„ÎąĪ‡ĪŽĪÎˇĪƒÎˇ δÎĩÎŊ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Ī€ÎĩĪÎšÎ­Ī‡ÎĩΚ ÎŧΌÎŊÎŋ ÎēÎĩÎŊÎŦ.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Η ÎēÎąĪ„ÎąĪ‡ĪŽĪÎˇĪƒÎˇ δÎĩÎŊ ÎĩίÎŊιΚ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ email." + "message": "Η ÎēÎąĪ„ÎąĪ‡ĪŽĪÎˇĪƒÎˇ δÎĩÎŊ ÎĩίÎŊιΚ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…." }, "fieldsNeedAttention": { - "message": "$COUNT$ ΤÎŋ/Îą Ī€ÎąĪÎąĪ€ÎŦÎŊΉ Ī€Îĩδίo/Îą ·΁ÎĩΚÎŦÎļÎŋÎŊĪ„ÎąÎš Ī„ÎˇÎŊ ΀΁Îŋ΃ÎŋĪ‡ÎŽ ĪƒÎąĪ‚.", + "message": "ΤÎŋ/Îą $COUNT$ Ī€ÎąĪÎąĪ€ÎŦÎŊΉ Ī€Îĩδίo/Îą ·΁ÎĩΚÎŦÎļÎŋÎŊĪ„ÎąÎš Ī„ÎˇÎŊ ΀΁Îŋ΃ÎŋĪ‡ÎŽ ĪƒÎąĪ‚.", "placeholders": { "count": { "content": "$1", @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 Ī€ÎĩδίÎŋ ·΁ÎĩΚÎŦÎļÎĩĪ„ÎąÎš Ī„ÎˇÎŊ ΀΁Îŋ΃ÎŋĪ‡ÎŽ ĪƒÎąĪ‚." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ Ī€ÎĩÎ´Î¯Îą ·΁ÎĩΚÎŦÎļÎŋÎŊĪ„ÎąÎš Ī„ÎˇÎŊ ΀΁Îŋ΃ÎŋĪ‡ÎŽ ĪƒÎąĪ‚.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Î•Ī€ÎšÎģÎŋÎŗÎŽ --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "ΕÎŊÎąÎģÎģÎąÎŗÎŽ ĪƒĪÎŧĪ€Ī„Ī…ÎžÎˇĪ‚", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ΄ΉÎŊ δÎĩδÎŋÎŧέÎŊΉÎŊ ĪƒÎąĪ‚ ĪƒĪ„Îŋ Bitwarden;", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Î ĪÎŋĪƒĪ„ÎąĪ„Î­ĪˆĪ„Îĩ Ī„Îą δÎĩδÎŋÎŧέÎŊÎą LastPass ÎēιΚ ÎĩÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ ĪƒĪ„Îŋ Bitwarden;", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ Ή΂ ÎŧΡ Îē΁΅΀΄ÎŋÎŗĪÎąĪ†ÎˇÎŧέÎŊÎŋ ÎąĪĪ‡ÎĩίÎŋ", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ĪƒĪ„Îŋ Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Î•Ī€ÎšĪ„Ī…Ī‡ÎŽĪ‚ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽ δÎĩδÎŋÎŧέÎŊΉÎŊ!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "ÎŖĪ†ÎŦÎģÎŧÎą ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚. ΕÎģÎ­ÎŗÎžĪ„Îĩ Ī„ÎˇÎŊ ÎēÎŋÎŊ΃ΌÎģÎą ÎŗÎšÎą ÎģÎĩ΀΄ÎŋÎŧÎ­ĪÎĩΚÎĩĪ‚.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "ΕÎŧĪ†ÎąÎŊÎ¯ĪƒĪ„ÎˇÎēÎĩ ĪƒĪ†ÎŦÎģÎŧÎą δΚÎēĪ„ĪÎŋĪ… ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽ.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "ΨÎĩĪ…Î´ĪŽÎŊĪ…ÎŧÎŋ Ī„ÎŋÎŧέι" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Τι ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ÎŧÎĩ Ī…Ī€ĪŒÎ´ÎĩΚΞΡ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ δÎĩÎŊ ÎŧĪ€Îŋ΁ÎŋĪÎŊ ÎŊÎą ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪ‰Î¸ÎŋĪÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚. Η ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ Î­Ī‡ÎĩΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡθÎĩί ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Η ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ ÎŋĪÎ¯ĪƒĪ„ÎˇÎēÎĩ ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩί Ī„ÎšĪ‚ ΀΁ÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎĩĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎˇÎŊ Ī…Ī€ĪŒÎ´ÎĩΚΞΡ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą ÎŊÎą ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒĪ„ÎĩÎ¯Ī„Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ Ī€ÎĩδίÎŋ", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "ΕÎŊÎąÎģÎģÎąÎŗÎŽ Ī€ÎģÎĩĪ…ĪÎšÎēÎŽĪ‚ Ī€ÎģÎŋÎŽÎŗÎˇĪƒÎˇĪ‚" + }, + "skipToContent": { + "message": "ΜÎĩĪ„ÎŦÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ Ī€ÎĩĪÎšÎĩĪ‡ĪŒÎŧÎĩÎŊÎŋ" + }, + "bitwardenOverlayButton": { + "message": "ΠÎģÎŽÎē΄΁Îŋ ÎŧÎĩÎŊÎŋĪ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "ΕÎŊÎąÎģÎģÎąÎŗÎŽ ÎŋĪÎąĪ„ĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎŧÎĩÎŊÎŋĪ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "ΜÎĩÎŊÎŋĪ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "ΞÎĩÎēÎģÎĩÎšÎ´ĪŽĪƒĪ„Îĩ Ī„ÎŋÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚ ÎŗÎšÎą ÎŊÎą δÎĩÎ¯Ī„Îĩ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ Ī€ÎŋĪ… Ī„ÎąÎšĪÎšÎŦÎļÎŋĪ…ÎŊ", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "ΞÎĩÎēÎģÎĩÎšÎ´ĪŽĪƒĪ„Îĩ Ī„ÎŋÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚ ÎŗÎšÎą ÎŊÎą δÎĩÎ¯Ī„Îĩ ΀΁ÎŋĪ„ÎŦ΃ÎĩÎšĪ‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰ÎŧÎą Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚, ÎąÎŊÎŋÎ¯ÎŗÎĩΚ ΃Îĩ ÎŊέÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "ÎŖĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ÎŗÎšÎą", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "ΜÎĩĪÎšÎēΌ ΌÎŊÎŋÎŧÎą Ī‡ĪÎŽĪƒĪ„Îˇ", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ÎŗÎšÎą ΀΁ÎŋβÎŋÎģÎŽ", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "ΝέÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŊέÎŋĪ… ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ… Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Νέα ĪƒĪÎŊδÎĩĪƒÎˇ", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŊέÎŋĪ… ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ… ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…, ÎąÎŊÎŋÎ¯ÎŗÎĩΚ ΃Îĩ ÎŊέÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Νέα ÎēÎŦĪĪ„Îą", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŊέÎŋĪ… ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ… ÎēÎŦĪĪ„ÎąĪ‚ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…, ÎąÎŊÎŋÎ¯ÎŗÎĩΚ ΃Îĩ ÎŊέÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Νέα Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„Îą", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŊέÎŋĪ… ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ… Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…, ÎąÎŊÎŋÎ¯ÎŗÎĩΚ ΃Îĩ ÎŊέÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "ΕίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ Ī„Îŋ Bitwarden ÎŧÎĩÎŊÎŋĪ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚. Î ÎąĪ„ÎŽĪƒĪ„Îĩ Ī„Îŋ Ī€ÎģÎŽÎē΄΁Îŋ ÎēÎŦ΄Ή βέÎģÎŋĪ‚ ÎŗÎšÎą ÎŊÎą ÎĩĪ€ÎšÎģέΞÎĩĪ„Îĩ.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ" + }, + "ignore": { + "message": "Î ÎąĪÎŦβÎģÎĩĪˆÎˇ" + }, + "importData": { + "message": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ δÎĩδÎŋÎŧέÎŊΉÎŊ", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "ÎŖĪ†ÎŦÎģÎŧÎą ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚" + }, + "importErrorDesc": { + "message": "Î ÎąĪÎŋĪ…ĪƒÎšÎŦĪƒĪ„ÎˇÎēÎĩ Ī€ĪĪŒÎ˛ÎģΡÎŧÎą ÎŧÎĩ Ī„Îą δÎĩδÎŋÎŧέÎŊÎą Ī€ÎŋĪ… ÎĩĪ€ÎšĪ‡ÎĩÎšĪÎŽĪƒÎąĪ„Îĩ ÎŊÎą ÎĩÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ. Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩĪ€ÎšÎģĪĪƒĪ„Îĩ Ī„Îą ĪƒĪ†ÎŦÎģÎŧÎąĪ„Îą Ī€ÎŋĪ… ÎąÎŊÎąĪ†Î­ĪÎŋÎŊĪ„ÎąÎš Ī€ÎąĪÎąÎēÎŦ΄Ή ĪƒĪ„Îŋ ÎąĪĪ‡ÎĩίÎŋ ΀΁ÎŋέÎģÎĩĪ…ĪƒÎˇĪ‚ ÎēιΚ ΀΁ÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ΞιÎŊÎŦ." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Î•Ī€ÎšÎģĪĪƒĪ„Îĩ Ī„Îą Ī€ÎąĪÎąÎēÎŦ΄Ή ĪƒĪ†ÎŦÎģÎŧÎąĪ„Îą ÎēιΚ ΀΁ÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ΞιÎŊÎŦ." + }, + "description": { + "message": "ΠÎĩĪÎšÎŗĪÎąĪ†ÎŽ" + }, + "importSuccess": { + "message": "Τι δÎĩδÎŋÎŧέÎŊÎą ÎĩÎšĪƒÎŽĪ‡Î¸ÎˇĪƒÎąÎŊ ÎĩĪ€ÎšĪ„Ī…Ī‡ĪŽĪ‚" + }, + "importSuccessNumberOfItems": { + "message": "ΈÎŊÎą ĪƒĪÎŊÎŋÎģÎŋ $AMOUNT$ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊΉÎŊ ÎĩÎšĪƒÎŽĪ‡Î¸ÎˇĪƒÎąÎŊ.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Î ĪÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ΞιÎŊÎŦ" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇ ÎŗÎšÎą ÎąĪ…Ī„ÎŽÎŊ Ī„ÎˇÎŊ ÎĩÎŊÎ­ĪÎŗÎĩΚι. ÎŸĪÎ¯ĪƒĪ„Îĩ έÎŊÎą PIN ÎŗÎšÎą ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎĩĪ„Îĩ." + }, + "setPin": { + "message": "ÎŸĪÎšĪƒÎŧĪŒĪ‚ PIN" + }, + "verifyWithBiometrics": { + "message": "Î•Ī€ÎąÎģΎθÎĩĪ…ĪƒÎˇ ÎŧÎĩ βΚÎŋÎŧÎĩĪ„ĪÎšÎēÎŦ" + }, + "awaitingConfirmation": { + "message": "ÎŖÎĩ ÎąÎŊÎąÎŧÎŋÎŊÎŽ ÎĩĪ€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇĪ‚" + }, + "couldNotCompleteBiometrics": { + "message": "Î‘Î´ĪÎŊÎąĪ„Îˇ Ρ ÎŋÎģÎŋÎēÎģÎŽĪĪ‰ĪƒÎˇ ΄ΉÎŊ βΚÎŋÎŧÎĩĪ„ĪÎšÎēĪŽÎŊ." + }, + "needADifferentMethod": { + "message": "Î§ĪÎĩΚÎŦÎļÎĩĪƒĪ„Îĩ ÎŧΚι Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎŽ ÎŧέθÎŋδÎŋ;" + }, + "useMasterPassword": { + "message": "Î§ĪÎŽĪƒÎˇ ÎēĪĪÎšÎŋĪ… ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "usePin": { + "message": "Î§ĪÎŽĪƒÎˇ PIN" + }, + "useBiometrics": { + "message": "Î§ĪÎŽĪƒÎˇ βΚÎŋÎŧÎĩĪ„ĪÎšÎēĪŽÎŊ" + }, + "enterVerificationCodeSentToEmail": { + "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇĪ‚ Ī€ÎŋĪ… Î­Ī‡ÎĩΚ ĪƒĪ„ÎąÎģÎĩί ĪƒĪ„Îŋ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋ ĪƒÎąĪ‚." + }, + "resendCode": { + "message": "Î•Ī€ÎąÎŊÎąĪ€ÎŋĪƒĪ„ÎŋÎģÎŽ ÎēĪ‰Î´ÎšÎēÎŋĪ" + }, + "total": { + "message": "ÎŖĪÎŊÎŋÎģÎŋ" + }, + "importWarning": { + "message": "Î•ÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ δÎĩδÎŋÎŧέÎŊÎą ĪƒĪ„Îŋ $ORGANIZATION$. Τι δÎĩδÎŋÎŧέÎŊÎą ĪƒÎąĪ‚ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎŧÎŋÎšĪÎąĪƒĪ„ÎŋĪÎŊ ÎŧÎĩ ÎŧέÎģΡ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ. ΘέÎģÎĩĪ„Îĩ ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎĩĪ„Îĩ;", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "ÎŖĪ†ÎŦÎģÎŧÎą ÎēÎąĪ„ÎŦ Ī„Îˇ ĪƒĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ Ī„ÎˇÎŊ Ī…Ī€ÎˇĪÎĩĪƒÎ¯Îą Duo. Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ ÎŧΚι Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎŽ ÎŧέθÎŋδÎŋ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ Î´ĪÎŋ βΡÎŧÎŦ΄ΉÎŊ ÎŽ ÎĩĪ€ÎšÎēÎŋΚÎŊΉÎŊÎŽĪƒĪ„Îĩ ÎŧÎĩ Ī„ÎˇÎŊ Duo ÎŗÎšÎą βÎŋΎθÎĩΚι." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "ΕÎēÎēΚÎŊÎŽĪƒĪ„Îĩ Ī„Îŋ Duo ÎēιΚ ÎąÎēÎŋÎģÎŋĪ…Î¸ÎŽĪƒĪ„Îĩ Ī„Îą βΎÎŧÎąĪ„Îą ÎŗÎšÎą ÎŊÎą ÎŋÎģÎŋÎēÎģÎˇĪĪŽĪƒÎĩĪ„Îĩ Ī„Îˇ ĪƒĪÎŊδÎĩĪƒÎˇ." + }, + "duoRequiredForAccount": { + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ĪƒĪÎŊδÎĩĪƒÎˇ Î´ĪÎŋ βΡÎŧÎŦ΄ΉÎŊ Duo ÎŗÎšÎą Ī„Îŋ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ĪƒÎąĪ‚." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "ΑÎŊÎŋÎ¯ÎžĪ„Îĩ Ī„ÎˇÎŊ ÎĩĪ€Î­ÎēĪ„ÎąĪƒÎˇ ΃Îĩ ÎŊέÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ ÎŗÎšÎą ÎŊÎą ÎŋÎģÎŋÎēÎģÎˇĪĪŽĪƒÎĩĪ„Îĩ Ī„Îˇ ĪƒĪÎŊδÎĩĪƒÎˇ." + }, + "popoutExtension": { + "message": "ΆÎŊÎŋÎšÎŗÎŧÎą ÎĩĪ€Î­ÎēĪ„ÎąĪƒÎˇĪ‚ ΃Îĩ ÎŊέÎŋ Ī€ÎąĪÎŦÎ¸Ī…ĪÎŋ" + }, + "launchDuo": { + "message": "ΕÎēÎēίÎŊÎˇĪƒÎˇ Duo" + }, + "importFormatError": { + "message": "Τι δÎĩδÎŋÎŧέÎŊÎą δÎĩÎŊ Î­Ī‡ÎŋĪ…ÎŊ δΚιÎŧÎŋĪĪ†Ī‰Î¸Îĩί ĪƒĪ‰ĪƒĪ„ÎŦ. ΕÎģÎ­ÎŗÎžĪ„Îĩ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚ ÎēιΚ δÎŋÎēΚÎŧÎŦĪƒĪ„Îĩ ΞιÎŊÎŦ." + }, + "importNothingError": { + "message": "Î¤Î¯Ī€ÎŋĪ„Îą δÎĩÎŊ ÎĩÎšĪƒÎŽĪ‡Î¸Îˇ." + }, + "importEncKeyError": { + "message": "ÎŖĪ†ÎŦÎģÎŧÎą ÎąĪ€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇĪ‚ Ī„ÎŋĪ… ÎĩÎžÎąÎŗĪŒÎŧÎĩÎŊÎŋĪ… ÎąĪĪ‡ÎĩίÎŋĪ…. ΤÎŋ ÎēÎģÎĩΚδί Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇĪ‚ δÎĩÎŊ Ī„ÎąÎšĪÎšÎŦÎļÎĩΚ ÎŧÎĩ Ī„Îŋ ÎēÎģÎĩΚδί Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇĪ‚ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚΎθΡÎēÎĩ ÎŗÎšÎą Ī„ÎˇÎŊ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ ΄ΉÎŊ δÎĩδÎŋÎŧέÎŊΉÎŊ." + }, + "invalidFilePassword": { + "message": "Μη Î­ÎŗÎē΅΁ÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚, Ī€ÎąĪÎąÎēÎąÎģĪŽ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī€ÎŋĪ… ÎĩÎšĪƒÎąÎŗÎŦÎŗÎąĪ„Îĩ ĪŒĪ„ÎąÎŊ δΡÎŧΚÎŋĪ…ĪÎŗÎŽĪƒÎąĪ„Îĩ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽĪ‚." + }, + "destination": { + "message": "Î ĪÎŋÎŋĪÎšĪƒÎŧĪŒĪ‚" + }, + "learnAboutImportOptions": { + "message": "ΜÎŦθÎĩĪ„Îĩ ÎŗÎšÎą Ī„ÎšĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚ ĪƒÎąĪ‚" + }, + "selectImportFolder": { + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ έÎŊÎą ΆÎŦÎēÎĩÎģÎŋ" + }, + "selectImportCollection": { + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎŧΚι ĪƒĪ…ÎģÎģÎŋÎŗÎŽ" + }, + "importTargetHint": { + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎąĪ…Ī„ÎŽ Ī„ÎˇÎŊ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ ÎĩÎŦÎŊ θέÎģÎĩĪ„Îĩ Ī„Îą Ī€ÎĩĪÎšÎĩĪ‡ĪŒÎŧÎĩÎŊÎą Ī„ÎŋĪ… ÎĩÎšĪƒÎąÎŗĪŒÎŧÎĩÎŊÎŋĪ… ÎąĪĪ‡ÎĩίÎŋĪ… ÎŊÎą ÎŧÎĩĪ„ÎąÎēΚÎŊΡθÎŋĪÎŊ ĪƒĪ„Îŋ $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "ΤÎŋ ÎąĪĪ‡ÎĩίÎŋ Ī€ÎĩĪÎšÎ­Ī‡ÎĩΚ ÎŧΡ ĪƒĪ…ĪƒĪ‡ÎĩĪ„ÎšĪƒÎŧέÎŊÎą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą." + }, + "selectFormat": { + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„ÎŋÎŊ Ī„ĪĪ€Îŋ Ī„ÎŋĪ… ÎąĪĪ‡ÎĩίÎŋĪ… ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚" + }, + "selectImportFile": { + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚" + }, + "chooseFile": { + "message": "Î•Ī€ÎšÎģÎŋÎŗÎŽ Î‘ĪĪ‡ÎĩίÎŋĪ…" + }, + "noFileChosen": { + "message": "ΔÎĩÎŊ ÎĩĪ€ÎšÎģÎ­Ī‡Î¸ÎˇÎēÎĩ ÎēÎąÎŊέÎŊÎą ÎąĪĪ‡ÎĩίÎŋ" + }, + "orCopyPasteFileContents": { + "message": "ÎŽ ÎąÎŊĪ„ÎšÎŗĪÎŦĪˆĪ„Îĩ/ÎĩĪ€ÎšÎēÎŋÎģÎģÎŽĪƒĪ„Îĩ Ī„Îą Ī€ÎĩĪÎšÎĩĪ‡ĪŒÎŧÎĩÎŊÎą Ī„ÎŋĪ… ÎąĪĪ‡ÎĩίÎŋĪ… ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚" + }, + "instructionsFor": { + "message": "$NAME$ ÎŸÎ´ÎˇÎŗÎ¯ÎĩĪ‚", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚ Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" + }, + "confirmVaultImportDesc": { + "message": "Î‘Ī…Ī„ĪŒ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ ΀΁ÎŋĪƒĪ„ÎąĪ„ÎĩĪÎĩĪ„ÎąÎš ÎŧÎĩ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚. Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą Ī„ÎˇÎŊ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽ δÎĩδÎŋÎŧέÎŊΉÎŊ." + }, + "confirmFilePassword": { + "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…" + }, + "exportSuccess": { + "message": "Î•ÎžÎŽĪ‡Î¸ÎˇĪƒÎąÎŊ Ī„Îą δÎĩδÎŋÎŧέÎŊÎą Î¸ÎˇĪƒÎąĪ…/ÎēίÎŋĪ…" + }, + "typePasskey": { + "message": "ΚÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "accessing": { + "message": "Î ĪĪŒĪƒÎ˛ÎąĪƒÎˇ" + }, + "passkeyNotCopied": { + "message": "ΤÎŋ ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ δÎĩ θι ÎąÎŊĪ„ÎšÎŗĪÎąĪ†Îĩί" + }, + "passkeyNotCopiedAlert": { + "message": "ΤÎŋ ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ δÎĩ θι ÎąÎŊĪ„ÎšÎŗĪÎąĪ†Îĩί ĪƒĪ„Îŋ ÎēÎģΉÎŊÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ. ΘέÎģÎĩĪ„Îĩ ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ ÎēÎģΉÎŊÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…;" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎĩĪ€ÎąÎģΎθÎĩĪ…ĪƒÎˇ ÎąĪ€ĪŒ Ī„ÎŋÎŊ ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ ÎĩÎēÎēίÎŊÎˇĪƒÎˇĪ‚. Î‘Ī…Ī„ÎŽ Ρ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą δÎĩÎŊ Î­Ī‡ÎĩΚ ÎąÎēΌÎŧÎą Ī…ÎģÎŋĪ€ÎŋΚΡθÎĩί ÎŗÎšÎą ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪĪ‚ Ī‡Ī‰ĪÎ¯Ī‚ Ī„ÎŋÎŊ ÎēĪĪÎšÎŋ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚." + }, + "logInWithPasskeyQuestion": { + "message": "ÎŖĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚;" + }, + "passkeyAlreadyExists": { + "message": "ÎĨĪ€ÎŦ΁·ÎĩΚ ΎδΡ έÎŊÎą ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą ÎąĪ…Ī„ÎŽÎŊ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ." + }, + "noPasskeysFoundForThisApplication": { + "message": "ΔÎĩ Î˛ĪÎ­Î¸ÎˇÎēÎąÎŊ ÎēÎģÎĩΚδΚÎŦ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą ÎąĪ…Ī„ÎŽÎŊ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ." + }, + "noMatchingPasskeyLogin": { + "message": "ΔÎĩÎŊ Î­Ī‡ÎĩĪ„Îĩ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ Ī€ÎŋĪ… ÎŊÎą ĪƒĪ…ÎŊÎ´Ī…ÎŦÎļÎŋÎŊĪ„ÎąÎš ÎŧÎĩ ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ." + }, + "noMatchingLoginsForSite": { + "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ ÎąÎŊĪ„Î¯ĪƒĪ„ÎŋÎšĪ‡ÎĩĪ‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩÎšĪ‚ ÎŗÎšÎą ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ ÎšĪƒĪ„ĪŒĪ„ÎŋĪ€Îŋ" + }, + "searchSavePasskeyNewLogin": { + "message": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŽ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ή΂ ÎŊέι ĪƒĪÎŊδÎĩĪƒÎˇ" + }, + "confirm": { + "message": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ" + }, + "savePasskey": { + "message": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ÎēÎģÎĩΚδΚÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "savePasskeyNewLogin": { + "message": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ÎēÎģÎĩΚδΚÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ή΂ ÎŊέι ĪƒĪÎŊδÎĩĪƒÎˇ" + }, + "chooseCipherForPasskeySave": { + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎŧΚι ĪƒĪÎŊδÎĩĪƒÎˇ ÎŗÎšÎą Ī„ÎˇÎŊ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎēÎģÎĩΚδΚÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "chooseCipherForPasskeyAuth": { + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ έÎŊÎą ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŗÎšÎą ĪƒĪÎŊδÎĩĪƒÎˇ" + }, + "passkeyItem": { + "message": "ΑÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎēÎģÎĩΚδΚÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "overwritePasskey": { + "message": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ ÎēÎģÎĩΚδΚÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚;" + }, + "overwritePasskeyAlert": { + "message": "Î‘Ī…Ī„ĪŒ Ī„Îŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ Ī€ÎĩĪÎšÎ­Ī‡ÎĩΚ ΎδΡ έÎŊÎą ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚. Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą ÎąÎŊĪ„ÎšÎēÎąĪ„ÎąĪƒĪ„ÎŽĪƒÎĩĪ„Îĩ Ī„Îŋ Ī„ĪÎ­Ī‡ÎŋÎŊ ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚;" + }, + "featureNotSupported": { + "message": "Η ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą δÎĩÎŊ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎĩĪ„ÎąÎš ÎąÎēΌÎŧΡ" + }, + "yourPasskeyIsLocked": { + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎŗÎšÎą Ī‡ĪÎŽĪƒÎˇ ÎēÎģÎĩΚδΚÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚. Î•Ī€ÎąÎģΡθÎĩĪĪƒĪ„Îĩ Ī„ÎˇÎŊ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎŦ ĪƒÎąĪ‚ ÎŗÎšÎą ÎŊÎą ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒÎĩĪ„Îĩ." + }, + "multifactorAuthenticationCancelled": { + "message": "Ο Ī€ÎŋÎģĪ…ÎŧÎĩĪÎŽĪ‚ έÎģÎĩÎŗĪ‡ÎŋĪ‚ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎąÎēĪ…ĪĪŽÎ¸ÎˇÎēÎĩ" + }, + "noLastPassDataFound": { + "message": "ΔÎĩÎŊ Î˛ĪÎ­Î¸ÎˇÎēÎąÎŊ δÎĩδÎŋÎŧέÎŊÎą LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "ΛÎŦθÎŋĪ‚ ΌÎŊÎŋÎŧÎą Ī‡ĪÎŽĪƒĪ„Îˇ ÎŽ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "incorrectPassword": { + "message": "Î•ĪƒĪ†ÎąÎģÎŧέÎŊÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "incorrectCode": { + "message": "Î•ĪƒĪ†ÎąÎģÎŧέÎŊÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚" + }, + "incorrectPin": { + "message": "Î•ĪƒĪ†ÎąÎģÎŧέÎŊÎŋ PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Ο Ī€ÎŋÎģĪ…ÎŧÎĩĪÎŽĪ‚ έÎģÎĩÎŗĪ‡ÎŋĪ‚ Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎąĪ€Î­Ī„Ī…Ī‡Îĩ" + }, + "includeSharedFolders": { + "message": "ÎŖĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ ÎēÎŋΚÎŊĪŒĪ‡ĪÎˇĪƒĪ„Ī‰ÎŊ Ī†ÎąÎēέÎģΉÎŊ" + }, + "lastPassEmail": { + "message": "ΔιÎĩĪÎ¸Ī…ÎŊĪƒÎˇ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ… LastPass" + }, + "importingYourAccount": { + "message": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ Ī„ÎŋĪ… ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ ĪƒÎąĪ‚..." + }, + "lastPassMFARequired": { + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš Ī€ÎŋÎģĪ…ÎŧÎĩĪÎŽĪ‚ Ī„ÎąĪ…Ī„ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ LastPass" + }, + "lastPassMFADesc": { + "message": "Î•ÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ ÎŧÎšÎąĪ‚ Ī‡ĪÎŽĪƒÎˇĪ‚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎĩÎģÎ­ÎŗĪ‡ÎŋĪ… Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚" + }, + "lastPassOOBDesc": { + "message": "Î•ÎŗÎēĪÎ¯ÎŊÎĩĪ„Îĩ Ī„Îŋ ÎąÎ¯Ī„ÎˇÎŧÎą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ĪƒĪ„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎĩÎģÎ­ÎŗĪ‡ÎŋĪ… Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎŽ ÎĩÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ έÎŊÎąÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎŧÎšÎąĪ‚ Ī‡ĪÎŽĪƒÎˇĪ‚." + }, + "passcode": { + "message": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚" + }, + "lastPassMasterPassword": { + "message": "ÎšĪĪÎšÎŋĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ LastPass" + }, + "lastPassAuthRequired": { + "message": "Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš Ī„ÎąĪ…Ī„ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ LastPass" + }, + "awaitingSSO": { + "message": "ΑÎŊÎąÎŧÎŋÎŊÎŽ ÎĩÎģÎ­ÎŗĪ‡ÎŋĪ… Ī„ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„ÎąĪ‚ SSO" + }, + "awaitingSSODesc": { + "message": "Î ÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ĪƒĪ…ÎŊÎĩĪ‡Î¯ĪƒĪ„Îĩ Ī„Îˇ ĪƒĪÎŊδÎĩĪƒÎˇ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī„ÎˇĪ‚ ÎĩĪ„ÎąÎšĪÎĩÎ¯ÎąĪ‚ ĪƒÎąĪ‚." + }, + "seeDetailedInstructions": { + "message": "ΔÎĩÎ¯Ī„Îĩ ÎģÎĩ΀΄ÎŋÎŧÎĩ΁ÎĩÎ¯Ī‚ ÎŋÎ´ÎˇÎŗÎ¯ÎĩĪ‚ ĪƒĪ„Îˇ βÎŋÎˇÎ¸ÎˇĪ„ÎšÎēÎŽ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą ÎŧÎąĪ‚ ĪƒĪ„Îŋ", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ÎąĪ€ÎĩĪ…Î¸ÎĩÎ¯ÎąĪ‚ ÎąĪ€ĪŒ Ī„Îŋ LastPass" + }, + "importFromCSV": { + "message": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ÎąĪ€ĪŒ CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "ΔÎŋÎēΚÎŧÎŦĪƒĪ„Îĩ ΞιÎŊÎŦ ÎŽ ΈÎŦÎžĪ„Îĩ ÎŗÎšÎą έÎŊÎą ÎŧÎŽÎŊĪ…ÎŧÎą ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ… ÎąĪ€ĪŒ Ī„Îŋ LastPass ÎŗÎšÎą ÎŊÎą ÎĩĪ€ÎšÎ˛ÎĩÎ˛ÎąÎšĪŽĪƒÎĩĪ„Îĩ ĪŒĪ„Îš ÎĩÎ¯ĪƒĪ„Îĩ Îĩ΃ÎĩÎ¯Ī‚." + }, + "collection": { + "message": "ÎŖĪ…ÎģÎģÎŋÎŗÎŽ" + }, + "lastPassYubikeyDesc": { + "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī„Îŋ YubiKey Ī€ÎŋĪ… ĪƒĪ‡ÎĩĪ„Î¯ÎļÎĩĪ„ÎąÎš ÎŧÎĩ Ī„ÎŋÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ LastPass ĪƒĪ„Îˇ Î¸ĪĪÎą USB Ī„ÎŋĪ… Ī…Ī€ÎŋÎģÎŋÎŗÎšĪƒĪ„ÎŽ ĪƒÎąĪ‚, ÎēιΚ ĪƒĪ„Îˇ ĪƒĪ…ÎŊÎ­Ī‡ÎĩΚι ÎąÎŗÎŗÎ¯ÎžĪ„Îĩ Ī„Îŋ ÎēÎŋĪ…ÎŧĪ€Î¯ Ī„ÎŋĪ…." + }, + "switchAccount": { + "message": "ΑÎģÎģÎąÎŗÎŽ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ" + }, + "switchAccounts": { + "message": "ΑÎģÎģÎąÎŗÎŽ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧĪŽÎŊ" + }, + "switchToAccount": { + "message": "ΑÎģÎģÎąÎŗÎŽ ΃Îĩ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ" + }, + "activeAccount": { + "message": "ΕÎŊÎĩĪÎŗĪŒĪ‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧĪŒĪ‚" + }, + "availableAccounts": { + "message": "Î”ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋΚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋί" + }, + "accountLimitReached": { + "message": "ÎŖĪ…ÎŧĪ€ÎģÎˇĪĪŽÎ¸ÎˇÎēÎĩ Ī„Îŋ ĪŒĪÎšÎŋ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ. Î‘Ī€ÎŋĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ÎąĪ€ĪŒ έÎŊÎąÎŊ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧΌ ÎŗÎšÎą ÎŊÎą ΀΁ÎŋĪƒÎ¸Î­ĪƒÎĩĪ„Îĩ έÎŊÎąÎŊ ÎŦÎģÎģÎŋ." + }, + "active": { + "message": "ÎĩÎŊÎĩĪÎŗĪŒ" + }, + "locked": { + "message": "ÎēÎģÎĩÎšÎ´Ī‰ÎŧέÎŊÎŋ" + }, + "unlocked": { + "message": "ΞÎĩÎēÎģÎĩÎ¯Î´Ī‰Ī„Îŋ" + }, + "server": { + "message": "δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽĪ‚" + }, + "hostedAt": { + "message": "Ī†ÎšÎģÎŋΞÎĩÎŊÎŋĪÎŧÎĩÎŊÎŋ ΃Îĩ" + }, + "useDeviceOrHardwareKey": { + "message": "Î§ĪÎŽĪƒÎˇ Ī„ÎˇĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚ ÎŽ Ī„ÎŋĪ… Ī†Ī…ĪƒÎšÎēÎŋĪ ÎēÎģÎĩΚδΚÎŋĪ ĪƒÎąĪ‚" + }, + "justOnce": { + "message": "ÎœĪŒÎŊÎŋ ÎŧÎ¯Îą ΆÎŋ΁ÎŦ" + }, + "alwaysForThisSite": { + "message": "ΠÎŦÎŊĪ„Îą ÎŗÎšÎą ÎąĪ…Ī„ÎŽÎŊ Ī„ÎˇÎŊ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą" + }, + "domainAddedToExcludedDomains": { + "message": "ΤÎŋ $DOMAIN$ ΀΁ÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ ĪƒĪ„ÎŋĪ…Ī‚ ÎĩÎžÎąÎšĪÎŋĪÎŧÎĩÎŊÎŋĪ…Ī‚ Ī„ÎŋÎŧÎĩÎ¯Ī‚.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "ΚÎŋΚÎŊÎŋί Ī„ĪĪ€ÎŋΚ", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "ÎŖĪ…ÎŊÎĩĪ‡Î¯ĪƒĪ„Îĩ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ;", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "ÎŖĪ…ÎŊÎ­Ī‡ÎĩΚι ĪƒĪ„Îŋ ΚέÎŊ΄΁Îŋ ΒÎŋΎθÎĩÎšÎąĪ‚;", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "ΑÎģÎģÎŦÎžĪ„Îĩ Ī„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ÎēιΚ Î´ÎšÎąĪ‡ÎĩÎ¯ĪÎšĪƒÎˇĪ‚ ÎēĪ‰Î´ÎšÎēĪŽÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ ĪƒÎąĪ‚.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą δÎĩÎ¯Ī„Îĩ ÎēιΚ ÎŊÎą ÎŋĪÎ¯ĪƒÎĩĪ„Îĩ ĪƒĪ…ÎŊĪ„ÎŋÎŧÎĩĪĪƒÎĩÎšĪ‚ ÎĩĪ€ÎĩÎēĪ„ÎŦ΃ÎĩΉÎŊ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ ĪƒÎąĪ‚.", + "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": "ΑÎģÎģÎŦÎžĪ„Îĩ Ī„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ÎēιΚ Î´ÎšÎąĪ‡ÎĩÎ¯ĪÎšĪƒÎˇĪ‚ ÎēĪ‰Î´ÎšÎēĪŽÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ ĪƒÎąĪ‚.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą δÎĩÎ¯Ī„Îĩ ÎēιΚ ÎŊÎą ÎŋĪÎ¯ĪƒÎĩĪ„Îĩ ĪƒĪ…ÎŊĪ„ÎŋÎŧÎĩĪĪƒÎĩÎšĪ‚ ÎĩĪ€ÎĩÎēĪ„ÎŦ΃ÎĩΉÎŊ ĪƒĪ„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ ĪƒÎąĪ‚.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Να ÎŗÎ¯ÎŊÎĩΚ Ī„Îŋ Bitwarden Îŋ ΀΁ÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋĪ‚ Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽĪ‚ ÎēĪ‰Î´ÎšÎēĪŽÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ĪƒÎąĪ‚;", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Η ÎąÎŗÎŊĪŒÎˇĪƒÎˇ ÎąĪ…Ī„ÎŽĪ‚ Ī„ÎˇĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎŽĪ‚ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ΀΁ÎŋÎēÎąÎģÎ­ĪƒÎĩΚ ĪƒĪ…ÎŗÎē΁ÎŋĪĪƒÎĩÎšĪ‚ ÎŧÎĩĪ„ÎąÎžĪ Ī„ÎŋĪ… ÎŧÎĩÎŊÎŋĪ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ Bitwarden ÎēιΚ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ ĪƒÎąĪ‚.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Να ÎŗÎ¯ÎŊÎĩΚ Ī„Îŋ Bitwarden Îŋ ΀΁ÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋĪ‚ Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽĪ‚ ÎēĪ‰Î´ÎšÎēĪŽÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ĪƒÎąĪ‚", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Î‘Î´Ī…ÎŊÎąÎŧÎ¯Îą ÎŋĪÎšĪƒÎŧÎŋĪ Ī„ÎŋĪ… Bitwarden Ή΂ ΀΁ÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋĪ… Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽ ÎēĪ‰Î´ÎšÎēĪŽÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Î ĪÎ­Ī€ÎĩΚ ÎŊÎą Ī€ÎąĪÎąĪ‡Ī‰ĪÎŽĪƒÎĩĪ„Îĩ δΚÎēÎąÎšĪŽÎŧÎąĪ„Îą ÎąĪ€ÎŋĪĪÎŽĪ„ÎŋĪ… Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ ĪƒĪ„Îŋ Bitwarden ÎŗÎšÎą ÎŊÎą Ī„Îŋ ÎŋĪÎ¯ĪƒÎĩĪ„Îĩ Ή΂ ΀΁ÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋ Î´ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽ ÎēĪ‰Î´ÎšÎēĪŽÎŊ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "ÎŸĪÎšĪƒÎŧĪŒĪ‚ Ή΂ ΀΁ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Τι ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎąÎŊ ÎĩĪ€ÎšĪ„Ī…Ī‡ĪŽĪ‚!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Ο ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎĩ!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Τι ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎĩÎŊΡÎŧÎĩĪĪŽÎ¸ÎˇÎēÎąÎŊ ÎĩĪ€ÎšĪ„Ī…Ī‡ĪŽĪ‚!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Ο ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎĩÎŊΡÎŧÎĩĪĪŽÎ¸ÎˇÎēÎĩ!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "ÎŖĪ†ÎŦÎģÎŧÎą ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇĪ‚ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ. ΕÎģÎ­ÎŗÎžĪ„Îĩ Ī„ÎˇÎŊ ÎēÎŋÎŊ΃ΌÎģÎą ÎŗÎšÎą ÎģÎĩ΀΄ÎŋÎŧÎ­ĪÎĩΚÎĩĪ‚.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Î•Ī€ÎšĪ„Ī…Ī‡Î¯Îą" + }, + "removePasskey": { + "message": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎģÎĩΚδΚÎŋĪ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "passkeyRemoved": { + "message": "ΤÎŋ ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ ÎąĪ†ÎąÎšĪÎ­Î¸ÎˇÎēÎĩ" + }, + "autofillSuggestions": { + "message": "Î ĪÎŋĪ„ÎŦ΃ÎĩÎšĪ‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚" + }, + "autofillSuggestionsTip": { + "message": "Î‘Ī€ÎŋθΡÎēÎĩĪĪƒĪ„Îĩ έÎŊÎą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎŗÎšÎą Ī„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎšĪƒĪ„ÎŋĪ„ĪŒĪ€ÎŋĪ…" + }, + "yourVaultIsEmpty": { + "message": "ΤÎŋ Î¸ÎˇĪƒÎąĪ…/ÎēÎšĪŒ ĪƒÎąĪ‚ ÎĩίÎŊιΚ ÎŦδÎĩΚÎŋ" + }, + "noItemsMatchSearch": { + "message": "ΚαÎŊέÎŊÎą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ δÎĩÎŊ Ī„ÎąÎšĪÎšÎŦÎļÎĩΚ ÎŧÎĩ Ī„ÎˇÎŊ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎŽ ĪƒÎąĪ‚" + }, + "clearFiltersOrTryAnother": { + "message": "ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ Ī†Î¯Îģ΄΁ΉÎŊ ÎŽ δÎŋÎēΚÎŧÎŽ ÎŦÎģÎģÎŋĪ… Ό΁ÎŋĪ… ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚" + }, + "copyInfoTitle": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ Ī€ÎģÎˇĪÎŋΆÎŋĪÎšĪŽÎŊ - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎŖÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇĪ‚ - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "ΠÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "ΠÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎ­Ī‚ - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Î ĪÎŋβÎŋÎģÎŽ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ… - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ Ī„ÎšÎŧÎ­Ī‚ ÎŗÎšÎą ÎąÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ" + }, + "assignToCollections": { + "message": "ΑÎŊÎŦθÎĩĪƒÎˇ ΃Îĩ ĪƒĪ…ÎģÎģÎŋÎŗÎ­Ī‚" + }, + "copyEmail": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…" + }, + "copyPhone": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ Ī„ÎˇÎģÎĩĪ†ĪŽÎŊÎŋĪ…" + }, + "copyAddress": { + "message": "ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚" + }, + "adminConsole": { + "message": "ΚÎŋÎŊ΃ΌÎģÎą Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽ" + }, + "accountSecurity": { + "message": "Î‘ĪƒĪ†ÎŦÎģÎĩΚι ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ" + }, + "notifications": { + "message": "ΕιδÎŋĪ€ÎŋÎšÎŽĪƒÎĩÎšĪ‚" + }, + "appearance": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ" + }, + "errorAssigningTargetCollection": { + "message": "ÎŖĪ†ÎŦÎģÎŧÎą ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ÎąÎŊÎŦθÎĩĪƒÎˇ ĪƒĪ…ÎģÎģÎŋÎŗÎŽĪ‚ ΀΁ÎŋÎŋĪÎšĪƒÎŧÎŋĪ." + }, + "errorAssigningTargetFolder": { + "message": "ÎŖĪ†ÎŦÎģÎŧÎą ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ÎąÎŊÎŦθÎĩĪƒÎˇ Ī†ÎąÎēέÎģÎŋĪ… ΀΁ÎŋÎŋĪÎšĪƒÎŧÎŋĪ." + }, + "viewItemsIn": { + "message": "Î ĪÎŋβÎŋÎģÎŽ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊΉÎŊ ĪƒĪ„Îŋ $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Î•Ī€ÎšĪƒĪ„ĪÎŋĪ†ÎŽ ĪƒĪ„Îŋ $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "ΝέÎŋ" + }, + "removeItem": { + "message": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "ΑÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą Ī‡Ī‰ĪÎ¯Ī‚ ΆÎŦÎēÎĩÎģÎŋ" + }, + "itemDetails": { + "message": "ΛÎĩ΀΄ÎŋÎŧÎ­ĪÎĩΚÎĩĪ‚ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + }, + "itemName": { + "message": "ΌÎŊÎŋÎŧÎą ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + }, + "cannotRemoveViewOnlyCollections": { + "message": "ΔÎĩÎŊ ÎŧĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąĪ†ÎąÎšĪÎ­ĪƒÎĩĪ„Îĩ ĪƒĪ…ÎģÎģÎŋÎŗÎ­Ī‚ Ī€ÎŋĪ… Î­Ī‡ÎŋĪ…ÎŊ ÎŧΌÎŊÎŋ δΚÎēÎąÎšĪŽÎŧÎąĪ„Îą Î ĪÎŋβÎŋÎģÎŽĪ‚: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Ο ÎŋĪÎŗÎąÎŊÎšĪƒÎŧĪŒĪ‚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΎθΡÎēÎĩ" + }, + "owner": { + "message": "ΙδιÎŋÎēĪ„ÎŽĪ„ÎˇĪ‚" + }, + "selfOwnershipLabel": { + "message": "Î•ĪƒÎĩÎ¯Ī‚", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "ΔÎĩÎŊ ÎĩίÎŊιΚ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊΉÎŊ ΃Îĩ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋĪ…Ī‚ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪĪ‚. Î•Ī€ÎšÎēÎŋΚÎŊΉÎŊÎŽĪƒĪ„Îĩ ÎŧÎĩ Ī„ÎŋÎŊ ΚδΚÎŋÎēĪ„ÎŽĪ„Îˇ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ĪƒÎąĪ‚ ÎŗÎšÎą βÎŋΎθÎĩΚι." + }, + "additionalInformation": { + "message": "Î•Ī€ÎšĪ€ĪĪŒĪƒÎ¸ÎĩĪ„ÎĩĪ‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚" + }, + "itemHistory": { + "message": "Î™ĪƒĪ„ÎŋĪÎšÎēΌ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊΉÎŊ" + }, + "lastEdited": { + "message": "ΤÎĩÎģÎĩĪ…Ī„ÎąÎ¯Îą ΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ" + }, + "ownerYou": { + "message": "ΙδιÎŋÎēĪ„ÎŽĪ„ÎˇĪ‚: Î•ĪƒÎĩÎ¯Ī‚" + }, + "linked": { + "message": "ÎŖĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋ" + }, + "copySuccessful": { + "message": "Î•Ī€ÎšĪ„Ī…Ī‡ÎŽĪ‚ ΑÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ" + }, + "upload": { + "message": "ΜÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇ" + }, + "addAttachment": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ĪƒĪ…ÎŊΡÎŧÎŧέÎŊÎŋĪ…" + }, + "maxFileSizeSansPunctuation": { + "message": "ΤÎŋ ÎŧÎ­ÎŗÎšĪƒĪ„Îŋ ÎŧÎ­ÎŗÎĩθÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ… ÎĩίÎŊιΚ 500 MB" + }, + "deleteAttachmentName": { + "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ĪƒĪ…ÎŊΡÎŧÎŧέÎŊÎŋĪ… $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Î›ÎŽĪˆÎˇ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ ÎąĪ…Ī„ĪŒ Ī„Îŋ ĪƒĪ…ÎŊΡÎŧÎŧέÎŊÎŋ;" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Οι Î´Ī‰ĪÎĩÎŦÎŊ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋί δÎĩÎŊ ÎŧĪ€Îŋ΁ÎŋĪÎŊ ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎŋĪ…ÎŊ ĪƒĪ…ÎŊΡÎŧÎŧέÎŊÎą" + }, + "filters": { + "message": "ÎĻίÎģĪ„ĪÎą" + }, + "personalDetails": { + "message": "Î ĪÎŋĪƒĪ‰Ī€ÎšÎēÎ­Ī‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚" + }, + "identification": { + "message": "Î¤ÎąĪ…Ī„ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ" + }, + "contactInfo": { + "message": "ÎŖĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎĩĪ€ÎšÎēÎŋΚÎŊΉÎŊÎ¯ÎąĪ‚" + }, + "downloadAttachment": { + "message": "Î›ÎŽĪˆÎˇ - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "Îŋ ÎąĪÎšÎ¸ÎŧĪŒĪ‚ ÎēÎŦĪĪ„ÎąĪ‚ Ī„ÎĩÎģÎĩÎšĪŽÎŊÎĩΚ ΃Îĩ", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "ÎŖĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚" + }, + "authenticatorKey": { + "message": "ΚÎģÎĩΚδί ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚" + }, + "autofillOptions": { + "message": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚" + }, + "websiteUri": { + "message": "Î™ĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą (URI)" + }, + "websiteUriCount": { + "message": "Î™ĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Η ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą ΀΁ÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ" + }, + "addWebsite": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´ÎąĪ‚" + }, + "deleteWebsite": { + "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´ÎąĪ‚" + }, + "defaultLabel": { + "message": "Î ĪÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎąÎŊÎšĪ‡ÎŊÎĩĪĪƒÎĩΉÎŊ ÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎ¯Ī‡ÎšĪƒÎˇĪ‚ $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ ÎąÎŊÎšĪ‡ÎŊÎĩĪĪƒÎĩΉÎŊ ÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎ¯Ī‡ÎšĪƒÎˇĪ‚ $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚;" + }, + "cardExpiredTitle": { + "message": "Î›ÎˇÎŗÎŧέÎŊΡ ÎēÎŦĪĪ„Îą" + }, + "cardExpiredMessage": { + "message": "ΕÎŦÎŊ Ī„ÎˇÎŊ ÎąÎŊÎąÎŊÎĩĪŽĪƒÎąĪ„Îĩ, ÎĩÎŊΡÎŧÎĩĪĪŽĪƒĪ„Îĩ Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī„ÎˇĪ‚ ÎēÎŦĪĪ„ÎąĪ‚" + }, + "cardDetails": { + "message": "ÎŖĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎēÎŦĪĪ„ÎąĪ‚" + }, + "cardBrandDetails": { + "message": "$BRAND$ ÎģÎĩ΀΄ÎŋÎŧÎ­ĪÎĩΚÎĩĪ‚", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎēΚÎŊÎŋĪÎŧÎĩÎŊΉÎŊ ÎĩΚÎēΌÎŊΉÎŊ" + }, + "showAnimations": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎĩĪ†Î­ ÎēίÎŊÎˇĪƒÎˇĪ‚" + }, + "addAccount": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ" + }, + "loading": { + "message": "ÎĻĪŒĪĪ„Ī‰ĪƒÎˇ" + }, + "data": { + "message": "ΔÎĩδÎŋÎŧέÎŊÎą" + }, + "passkeys": { + "message": "ΚÎģÎĩΚδΚÎŦ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "ÎšĪ‰Î´ÎšÎēÎŋί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "ÎŖĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ ÎēÎģÎĩΚδί Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "ΑÎŊÎŦθÎĩĪƒÎˇ" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "ÎœĪŒÎŊÎŋ ÎŧέÎģΡ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ÎŧÎĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ΃Îĩ ÎąĪ…Ī„Î­Ī‚ Ī„ÎšĪ‚ ĪƒĪ…ÎģÎģÎŋÎŗÎ­Ī‚ θι ÎĩίÎŊιΚ ΃Îĩ Î¸Î­ĪƒÎˇ ÎŊÎą δÎŋĪ…ÎŊ Ī„Îą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "ÎœĪŒÎŊÎŋ ÎŧέÎģΡ Ī„ÎŋĪ… ÎŋĪÎŗÎąÎŊÎšĪƒÎŧÎŋĪ ÎŧÎĩ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ΃Îĩ ÎąĪ…Ī„Î­Ī‚ Ī„ÎšĪ‚ ĪƒĪ…ÎģÎģÎŋÎŗÎ­Ī‚ θι ÎĩίÎŊιΚ ΃Îĩ Î¸Î­ĪƒÎˇ ÎŊÎą δÎŋĪ…ÎŊ Ī„Îą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą." + }, + "bulkCollectionAssignmentWarning": { + "message": "ÎˆĪ‡ÎĩĪ„Îĩ ÎĩĪ€ÎšÎģέΞÎĩΚ $TOTAL_COUNT$ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą. ΔÎĩÎŊ ÎŧĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎĩÎŊΡÎŧÎĩĪĪŽĪƒÎĩĪ„Îĩ Ī„Îą $READONLY_COUNT$ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ÎĩĪ€ÎĩΚδΎ δÎĩÎŊ Î­Ī‡ÎĩĪ„Îĩ δΚÎēÎąÎšĪŽÎŧÎąĪ„Îą ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī€ÎĩδίÎŋĪ…" + }, + "add": { + "message": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ" + }, + "fieldType": { + "message": "Î¤ĪĪ€ÎŋĪ‚ Ī€ÎĩδίÎŋĪ…" + }, + "fieldLabel": { + "message": "Î•Ī„ÎšÎēÎ­Ī„Îą Ī€ÎĩδίÎŋĪ…" + }, + "textHelpText": { + "message": "Î§ĪÎŽĪƒÎˇ Ī€ÎĩÎ´Î¯Ī‰ÎŊ ÎēÎĩΚÎŧέÎŊÎŋĪ… ÎŗÎšÎą δÎĩδÎŋÎŧέÎŊÎą ĪŒĪ€Ī‰Ī‚ ÎĩĪĪ‰Ī„ÎŽĪƒÎĩÎšĪ‚ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚" + }, + "hiddenHelpText": { + "message": "Î§ĪÎŽĪƒÎˇ ÎēĪĪ…Ī†ĪŽÎŊ Ī€ÎĩÎ´Î¯Ī‰ÎŊ ÎŗÎšÎą ÎĩĪ…ÎąÎ¯ĪƒÎ¸ÎˇĪ„Îą δÎĩδÎŋÎŧέÎŊÎą ĪŒĪ€Ī‰Ī‚ έÎŊÎąĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚" + }, + "checkBoxHelpText": { + "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îą Ī€ÎģÎąÎ¯ĪƒÎšÎą ÎĩĪ€ÎšÎģÎŋÎŗÎŽĪ‚ ÎąÎŊ θέÎģÎĩĪ„Îĩ ÎŊÎą ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽÎŊÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą Ī„Îŋ Ī€ÎģÎąÎ¯ĪƒÎšÎŋ ÎĩĪ€ÎšÎģÎŋÎŗÎŽĪ‚ ÎŧÎšÎąĪ‚ Ī†ĪŒĪÎŧÎąĪ‚, ĪŒĪ€Ī‰Ī‚ ÎąĪ…Ī„ĪŒ Ī„ÎˇĪ‚ ÎąĪ€ÎŋÎŧÎŊΡÎŧΌÎŊÎĩĪ…ĪƒÎˇĪ‚ δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ΡÎģ. Ī„ÎąĪ‡Ī…Î´ĪÎŋÎŧÎĩίÎŋĪ…" + }, + "linkedHelpText": { + "message": "Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ έÎŊÎą ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋ Ī€ÎĩδίÎŋ ĪŒĪ„ÎąÎŊ ÎąÎŊĪ„ÎšÎŧÎĩĪ„Ī‰Ī€Î¯ÎļÎĩĪ„Îĩ ΀΁ÎŋβÎģÎŽÎŧÎąĪ„Îą ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ÎŗÎšÎą ÎŧΚι ĪƒĪ…ÎŗÎēÎĩÎēĪÎšÎŧέÎŊΡ ÎšĪƒĪ„Îŋ΃ÎĩÎģÎ¯Î´Îą." + }, + "linkedLabelHelpText": { + "message": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī„Îŋ html id, name, aria-label, ÎŽ placeholder Ī„ÎŋĪ… Ī€ÎĩδίÎŋĪ…." + }, + "editField": { + "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą Ī€ÎĩδίÎŋĪ…" + }, + "editFieldLabel": { + "message": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ ΀΁ÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "ΑÎŊιδΚÎŋĪÎŗÎŦÎŊĪ‰ĪƒÎˇ $LABEL$. Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îą βÎĩÎģÎŦÎēΚι ÎŗÎšÎą Ī„Îˇ ÎŧÎĩĪ„ÎąÎēίÎŊÎˇĪƒÎˇ Ī„ÎŋĪ… ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ… ΀΁ÎŋĪ‚ Ī„Îą Ī€ÎŦÎŊΉ ÎŽ ÎēÎŦ΄Ή.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ ÎŧÎĩĪ„ÎąÎēΚÎŊΎθΡÎēÎĩ Ī€ÎŦÎŊΉ, Î¸Î­ĪƒÎˇ $INDEX$ ÎąĪ€ĪŒ $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ĪƒĪ…ÎģÎģÎŋÎŗÎ­Ī‚ ÎŗÎšÎą ÎąÎŊÎŦθÎĩĪƒÎˇ" + }, + "personalItemTransferWarningSingular": { + "message": "1 ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ θι ÎŧÎĩĪ„ÎąĪ†ÎĩĪÎ¸Îĩί ÎŧΌÎŊΚÎŧÎą ĪƒĪ„ÎŋÎŊ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ. ΔÎĩ θι ÎēÎąĪ„Î­Ī‡ÎĩĪ„Îĩ Ī€ÎģέÎŋÎŊ ÎąĪ…Ī„ĪŒ Ī„Îŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą θι ÎŧÎĩĪ„ÎąĪ†ÎĩĪÎ¸ÎŋĪÎŊ ÎŧΌÎŊΚÎŧÎą ĪƒĪ„ÎŋÎŊ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋ ÎŋĪÎŗÎąÎŊÎšĪƒÎŧΌ. ΔÎĩ θι ÎēÎąĪ„Î­Ī‡ÎĩĪ„Îĩ Ī€ÎģέÎŋÎŊ ÎąĪ…Ī„ÎŦ Ī„Îą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ θι ÎŧÎĩĪ„ÎąĪ†ÎĩĪÎ¸Îĩί ÎŧΌÎŊΚÎŧÎą ĪƒĪ„Îŋ $ORG$. ΔÎĩ θι ÎēÎąĪ„Î­Ī‡ÎĩĪ„Îĩ Ī€ÎģέÎŋÎŊ ÎąĪ…Ī„ĪŒ Ī„Îŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą θι ÎŧÎĩĪ„ÎąĪ†ÎĩĪÎ¸ÎŋĪÎŊ ÎŧΌÎŊΚÎŧÎą ĪƒĪ„Îŋ $ORG$. ΔÎĩ θι ÎēÎąĪ„Î­Ī‡ÎĩĪ„Îĩ Ī€ÎģέÎŋÎŊ ÎąĪ…Ī„ÎŦ Ī„Îą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Î•Ī€ÎšĪ„Ī…Ī‡ÎŽĪ‚ ÎąÎŊÎŦθÎĩĪƒÎˇ ĪƒĪ…ÎģÎģÎŋÎŗĪŽÎŊ" + }, + "nothingSelected": { + "message": "ΔÎĩÎŊ Î­Ī‡ÎĩĪ„Îĩ ÎĩĪ€ÎšÎģέΞÎĩΚ Ī„Î¯Ī€ÎŋĪ„Îą." + }, + "movedItemsToOrg": { + "message": "Τι ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ÎŧÎĩĪ„ÎąÎēΚÎŊΎθΡÎēÎąÎŊ ĪƒĪ„Îŋ $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Τι ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ÎŧÎĩĪ„ÎąĪ†Î­ĪÎ¸ÎˇÎēÎąÎŊ ĪƒĪ„Îŋ $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "ΤÎŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ÎŧÎĩĪ„ÎąĪ†Î­ĪÎ¸ÎˇÎēÎĩ ĪƒĪ„Îŋ $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ ÎŧÎĩĪ„ÎąÎēΚÎŊΎθΡÎēÎĩ ÎēÎŦÎŊΉ, Î¸Î­ĪƒÎˇ $INDEX$ ÎąĪ€ĪŒ $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "ΤÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą ΑÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊÎŋĪ…" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "Send ÎąĪĪ‡ÎĩÎ¯Ī‰ÎŊ" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Send ÎēÎĩΚÎŧέÎŊΉÎŊ" + }, + "bitwardenNewLook": { + "message": "ΤÎŋ Bitwarden Î­Ī‡ÎĩΚ ÎŧΚι ÎŊέι ÎĩÎŧΆÎŦÎŊÎšĪƒÎˇ!" + }, + "bitwardenNewLookDesc": { + "message": "ΕίÎŊιΚ Ī€ÎšÎŋ ÎĩĪ…ÎēÎŋÎģĪŒĪ„Îĩ΁Îŋ ÎēιΚ Ī€ÎšÎŋ Î´ÎšÎąÎšĪƒÎ¸ÎˇĪ„ÎšÎēΌ ÎąĪ€ĪŒ Ī€ÎŋĪ„Î­ ĪƒĪ„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇ ÎēιΚ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎēÎąĪĪ„Î­ÎģÎą Î˜ÎˇĪƒÎąĪ…/ÎēΚÎŋ. ÎĄÎ¯ÎžĪ„Îĩ ÎŧΚι ÎŧÎąĪ„ÎšÎŦ Ī„ĪÎšÎŗĪĪĪ‰!" + }, + "accountActions": { + "message": "ΕÎŊÎ­ĪÎŗÎĩΚÎĩĪ‚ ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧÎŋĪ" + }, + "showNumberOfAutofillSuggestions": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎąĪÎšÎ¸ÎŧÎŋĪ ΀΁ÎŋĪ„ÎŦ΃ÎĩΉÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ĪƒĪ„Îŋ ÎĩΚÎēÎŋÎŊίδΚÎŋ ÎĩĪ€Î­ÎēĪ„ÎąĪƒÎˇĪ‚" + }, + "systemDefault": { + "message": "Î ĪÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ ĪƒĪ…ĪƒĪ„ÎŽÎŧÎąĪ„ÎŋĪ‚" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Οι ÎąĪ€ÎąÎšĪ„ÎŽĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ Ī€ÎŋÎģÎšĪ„ÎšÎēÎŽĪ‚ ÎŗÎšÎą ÎĩĪ€ÎšĪ‡ÎĩÎšĪÎŽĪƒÎĩÎšĪ‚ Î­Ī‡ÎŋĪ…ÎŊ ÎĩĪ†ÎąĪÎŧÎŋĪƒĪ„Îĩί ΃Îĩ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ĪĪÎ¸ÎŧÎšĪƒÎˇ" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Î•Ī€ÎąÎŊÎŦÎģÎˇĪˆÎˇ" + }, + "vaultCustomTimeoutMinimum": { + "message": "ΤÎŋ ÎĩÎģÎŦĪ‡ÎšĪƒĪ„Îŋ ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ ·΁ÎŋÎŊΚÎēΌ ĪŒĪÎšÎŋ ÎģÎŽÎžÎˇĪ‚ ÎĩίÎŊιΚ 1 ÎģÎĩĪ€Ī„ĪŒ." + }, + "additionalContentAvailable": { + "message": "Î”ÎšÎąĪ„Î¯Î¸ÎĩĪ„ÎąÎš Ī€ĪĪŒĪƒÎ¸ÎĩĪ„Îŋ Ī€ÎĩĪÎšÎĩĪ‡ĪŒÎŧÎĩÎŊÎŋ" + }, + "fileSavedToDevice": { + "message": "ΤÎŋ ÎąĪĪ‡ÎĩίÎŋ ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎĩ ĪƒĪ„Îˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ. Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎĩÎ¯Ī„Îĩ Ī„Îŋ ÎąĪ€ĪŒ Ī„ÎšĪ‚ ÎģÎŽĪˆÎĩÎšĪ‚ Ī„ÎˇĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚ ĪƒÎąĪ‚." + }, + "showCharacterCount": { + "message": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎąĪÎšÎ¸ÎŧÎŋĪ Ī‡ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ" + }, + "hideCharacterCount": { + "message": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ ÎąĪÎšÎ¸ÎŧÎŋĪ Ī‡ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ" + }, + "itemsInTrash": { + "message": "ΑÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ" + }, + "noItemsInTrash": { + "message": "ΚαÎŊέÎŊÎą ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ" + }, + "noItemsInTrashDesc": { + "message": "Τι ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą Ī€ÎŋĪ… Î´ÎšÎąÎŗĪÎŦΆÎĩĪ„Îĩ θι ÎĩÎŧĪ†ÎąÎŊÎšĪƒĪ„ÎŋĪÎŊ ÎĩÎ´ĪŽ ÎēιΚ θι Î´ÎšÎąÎŗĪÎąĪ†ÎŋĪÎŊ ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ ÎŧÎĩĪ„ÎŦ ÎąĪ€ĪŒ 30 ΡÎŧÎ­ĪÎĩĪ‚" + }, + "trashWarning": { + "message": "ΑÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą Ī€ÎŋĪ… Î˛ĪÎ¯ĪƒÎēÎŋÎŊĪ„ÎąÎš ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎŗÎšÎą Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁Îŋ ÎąĪ€ĪŒ 30 ΡÎŧÎ­ĪÎĩĪ‚ θι Î´ÎšÎąÎŗĪÎŦΆÎŋÎŊĪ„ÎąÎš ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą" + }, + "restore": { + "message": "Î•Ī€ÎąÎŊÎąĪ†Îŋ΁ÎŦ" + }, + "deleteForever": { + "message": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎŗÎšÎą Ī€ÎŦÎŊĪ„Îą" + }, + "noEditPermissions": { + "message": "ΔÎĩÎŊ Î­Ī‡ÎĩĪ„Îĩ δΚÎēÎąÎ¯Ī‰ÎŧÎą ÎŊÎą ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒĪ„ÎĩÎ¯Ī„Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ" + }, + "authenticating": { + "message": "Î¤ÎąĪ…Ī„ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index fe5400c6a90..0dc93dd0b32 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill":{ + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-fill" + "message": "Autofill" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,7 +223,7 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Add a login" @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1259,6 +1851,9 @@ "secureNotes": { "message": "Secure notes" }, + "sshKeys": { + "message": "SSH Keys" + }, "clear": { "message": "Clear", "description": "To clear something out. example: To clear browser history." @@ -1282,6 +1877,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1901,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1931,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1998,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2034,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2049,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -1452,6 +2104,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2114,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2132,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2197,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2230,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2272,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2290,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2326,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2384,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2399,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2409,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2425,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2463,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2489,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2526,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2571,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2628,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2664,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2682,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2700,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2712,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2743,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2759,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2868,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2889,43 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "spinboxBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$.", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, + "passwordLengthRecommendationHint": { + "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", + "placeholders": { + "recommended": { + "content": "$1", + "example": "14" + } + } + }, + "passphraseNumWordsRecommendationHint": { + "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", + "placeholders": { + "recommended": { + "content": "$1", + "example": "6" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2966,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2146,12 +3173,27 @@ "resendNotification": { "message": "Resend notification" }, + "viewAllLogInOptions": { + "message": "View all log in options" + }, "viewAllLoginOptions": { "message": "View all log in options" }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, + "aNotificationWasSentToYourDevice": { + "message": "A notification was sent to your device" + }, + "makeSureYourAccountIsUnlockedAndTheFingerprintEtc": { + "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device" + }, + "youWillBeNotifiedOnceTheRequestIsApproved": { + "message": "You will be notified once the request is approved" + }, + "needAnotherOptionV1": { + "message": "Need another option?" + }, "loginInitiated": { "message": "Login initiated" }, @@ -2186,13 +3228,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3243,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3276,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3284,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3308,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3366,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3447,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2407,16 +3490,1397 @@ "message": "Toggle collapse", "description": "Toggling an expand/collapse state." }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Items with master password re-prompt cannot be auto-filled on page load. Auto-fill on page load turned off.", - "description": "Toast message for describing that master password re-prompt cannot be auto-filled on page load." + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { - "message": "Auto-fill on page load set to use default setting.", - "description": "Toast message for informing the user that auto-fill on page load has been set to the default setting." + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { "message": "Turn off master password re-prompt to edit this field", "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "filterVault": { + "message": "Filter vault" + }, + "filterApplied": { + "message": "One filter applied" + }, + "filterAppliedPlural": { + "message": "$COUNT$ filters applied", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" + }, + "compactMode": { + "message": "Compact mode" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 6307472164d..43b5eba1702 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organisation" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organisation by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-fill" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Generate password (copied)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Centre?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Centre." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organise your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favourite" }, + "unfavorite": { + "message": "Unfavourite" + }, + "itemAddedToFavorites": { + "message": "Item added to favourites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favourites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { "message": "List card items on the Tab page for easy auto-fill." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { "message": "Use a secondary click to access password generation and matching logins for the website. " }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's colour theme." }, + "themeDescAlt": { + "message": "Change the application's colour theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organisations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organisation. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organisation. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organisation" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP security key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premise hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,14 +1454,73 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When auto-fill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Enable Auto-fill on Page Load" }, "enableAutoFillOnPageLoadDesc": { "message": "If a login form is detected, auto-fill when the web page loads." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit autofill on page load." + "message": "Compromised or untrusted websites can exploit auto-fill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { "message": "Learn more about auto-fill" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognisable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognisable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favourites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organisation policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Bin", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Auto-fill and save" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Item auto-filled and URI saved" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "OK" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account mismatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key mismatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organisation policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organisation policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organisation policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organisation policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organisation has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrolment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organisation permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organisation requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organisation policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organisation: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organisation vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organisation vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organisations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organisation policies have turned on auto-fill on page load." }, "howToAutofill": { "message": "How to auto-fill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Auto-fill settings" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "Auto-fill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organisation SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be auto-filled on page load. Auto-fill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Auto-fill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden auto-fill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden auto-fill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden auto-fill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden auto-fill menu available. Press the down arrow key to select.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organisation. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used to export the data." + }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Centre?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between the Bitwarden auto-fill menu and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Auto-fill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organisation is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organisations cannot be accessed. Contact your organisation owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organisations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Auto-fill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organisation members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organisation members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to auto-fill a form's checkbox, like a reminder email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing auto-fill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organisation. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organisation. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in the bin" + }, + "noItemsInTrash": { + "message": "No items in the bin" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in the bin more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 8bdedacc45c..c515dae542f 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organisation" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organisation by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Aadhaar number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy licence number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-fill" }, + "autoFillLogin": { + "message": "Auto-fill login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Auto-fill identity" + }, "generatePasswordCopied": { "message": "Generate password (copied)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins." }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Centre?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Centre." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organise your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -196,7 +396,7 @@ "message": "Help & feedback" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "Bitwarden Help centre" }, "communityForums": { "message": "Explore Bitwarden community forums" @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special Characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favourite" }, + "unfavorite": { + "message": "Unfavourite" + }, + "itemAddedToFavorites": { + "message": "Item added to favourites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favourites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Added folder" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Edited folder" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Added item" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "The \"add login notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { "message": "List card items on the Tab page for easy auto-fill." }, + "showIdentitiesInVaultView": { + "message": "Show identifies as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { "message": "Use a secondary click to access password generation and matching logins for the website. " }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's colour theme." }, + "themeDescAlt": { + "message": "Change the application's colour theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarised Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about Organisations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organisation. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organisation. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organisation" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access" + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP security key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premise hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "The environment URLs have been saved." }, + "showAutoFillMenuOnFormFields": { + "message": "Show auto-fill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser’s built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When auto-fill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Enable auto-fill on page load" }, "enableAutoFillOnPageLoadDesc": { "message": "If a login form is detected, automatically perform an auto-fill when the web page loads." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Compromised or untrusted websites can exploit auto-fill on page load." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "Learn more about auto-fill" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognisable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favourites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organisation policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Bin", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Restored item" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Auto-fill and save" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Auto-filled item and saved URI" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "OK" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key mismatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not enabled" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organisation policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded Domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration Date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Created Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Edited Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out te extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organisation policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email Verification Required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1884,7 +2695,10 @@ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Your master password does not meet one or more of your organisation policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organisation has disabled trusted device encryption. Please set a master password to access your vault." }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic Enrollment" @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organisation permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organisation requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", "placeholders": { @@ -1917,8 +2756,34 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organisation: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1935,7 +2800,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "Your organisation policies have set your vault timeout action to $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -1992,7 +2857,7 @@ "message": "Exporting Personal Vault" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organisation vault items will not be included. Only vault item information will be exported and will not include associated attachments.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organisation vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organisation vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organisations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate Username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username Type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organisation policies have turned on auto-fill on page load." }, "howToAutofill": { "message": "How to auto-fill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Auto-fill settings" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "Auto-fill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2258,18 +3268,33 @@ "message": "Approve with master password" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "Organisation SSO identifier is required." + }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be auto-filled on page load. Auto-fill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Auto-fill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden auto-fill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden auto-fill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden auto-fill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden auto-fill menu available. Press the down arrow key to select.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organisation. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Centre?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between the Bitwarden auto-fill menu and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Auto-fill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to auto-fill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Auto-fill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organisation is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organisations cannot be accessed. Contact your organisation owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organisations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Auto-fill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organisation members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organisation members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to auto-fill a form's checkbox, like a reminder email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing auto-fill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organisation. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organisation. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in bin" + }, + "noItemsInTrash": { + "message": "No items in bin" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in the bin more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 5890a499518..bd1e097baa9 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden - Administrador de contraseÃąas", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden es un gestor de contraseÃąas seguro y gratuito para todos tus dispositivos.", - "description": "Extension description" + "message": "En casa, el trabajo o el viaje, Bitwarden asegura todas sus contraseÃąas, claves e informaciÃŗn confidencial", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Identifícate o crea una nueva cuenta para acceder a tu caja fuerte." }, + "inviteAccepted": { + "message": "InvitaciÃŗn aceptada" + }, "createAccount": { "message": "Crear cuenta" }, - "login": { - "message": "Identificarse" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Establece una contraseÃąa fuerte" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Termina de crear tu cuenta estableciendo una contraseÃąa" }, "enterpriseSingleSignOn": { "message": "Inicio de sesiÃŗn Ãēnico empresarial" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Una pista de tu contraseÃąa maestra puede ayudarte a recordarla en caso de que la olvides." }, + "masterPassHintText": { + "message": "Si olvidas tu contraseÃąa, puedes enviar la pista de contraseÃąa a tu correo electrÃŗnico. $CURRENT$/$MAXIMUM$ mÃĄximo de caracteres.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Vuelve a escribir tu contraseÃąa maestra" }, "masterPassHint": { "message": "Pista de contraseÃąa maestra (opcional)" }, + "joinOrganization": { + "message": "Incorporarse a la organizaciÃŗn" + }, + "joinOrganizationName": { + "message": "Unirse a $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Termine de unirse a esta organizaciÃŗn estableciendo una contraseÃąa maestra." + }, "tab": { "message": "PestaÃąa" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copiar contraseÃąa" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copiar nota" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copiar cÃŗdigo de seguridad" }, + "copyName": { + "message": "Copiar nombre" + }, + "copyCompany": { + "message": "Copiar empresa" + }, + "copySSN": { + "message": "Copiar nÃēmero de seguro social" + }, + "copyPassportNumber": { + "message": "Copiar nÃēmero de pasaporte" + }, + "copyLicenseNumber": { + "message": "Copiar nÃēmero de licencia" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copiar $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copiar sitio web" + }, + "copyNotes": { + "message": "Copiar notas" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Autorellenar" + "message": "Autorrellenar" + }, + "autoFillLogin": { + "message": "Autocompletar inicio de sesiÃŗn" + }, + "autoFillCard": { + "message": "Autocompletar tarjeta" + }, + "autoFillIdentity": { + "message": "Autocompletar identidad" }, "generatePasswordCopied": { "message": "Generar contraseÃąa (copiada)" @@ -98,16 +199,31 @@ "message": "Copiar Nombre del campo personalizado" }, "noMatchingLogins": { - "message": "Sin entradas coincidentes." + "message": "Sin entradas coincidentes" + }, + "noCards": { + "message": "No hay tarjetas" + }, + "noIdentities": { + "message": "No hay identidades" + }, + "addLoginMenu": { + "message": "Agregar inicio de sesiÃŗn" + }, + "addCardMenu": { + "message": "Agregar tarjeta" + }, + "addIdentityMenu": { + "message": "Agregar identidad" }, "unlockVaultMenu": { - "message": "Desbloquea la caja fuerte" + "message": "Desbloquea tu caja fuerte" }, "loginToVaultMenu": { "message": "Inicia sesiÃŗn en tu caja fuerte" }, "autoFillInfo": { - "message": "No hay entradas disponibles para autorellenar en la pestaÃąa actual del navegador." + "message": "No hay entradas disponibles para autorrellenar en la pestaÃąa actual del navegador." }, "addLogin": { "message": "AÃąadir entrada" @@ -115,6 +231,18 @@ "addItem": { "message": "AÃąadir elemento" }, + "accountEmail": { + "message": "Correo electrÃŗnico de la cuenta" + }, + "requestHint": { + "message": "Solicitar pista" + }, + "requestPasswordHint": { + "message": "Solicitar pista de la contraseÃąa" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pista de contraseÃąa" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirme su identidad para continuar." }, - "account": { - "message": "Cuenta" - }, "changeMasterPassword": { "message": "Cambiar contraseÃąa maestra" }, + "continueToWebApp": { + "message": "ÂŋContinuar a la aplicaciÃŗn web?" + }, + "continueToWebAppDesc": { + "message": "Explora mÃĄs funcionalidades de tu cuenta de Bitwarden en la aplicaciÃŗn web." + }, + "continueToHelpCenter": { + "message": "ÂŋContinuar al Centro de Ayuda?" + }, + "continueToHelpCenterDesc": { + "message": "ObtÊn mÃĄs sobre cÃŗmo utilizar Bitwarden en el Centro de Ayuda." + }, + "continueToBrowserExtensionStore": { + "message": "ÂŋContinuar a la tienda de extensiones del navegador?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Ayuda a otros a averiguar si Bitwarden es correcto para ellos. Visita la tienda de extensiones de tu navegador y deja una calificaciÃŗn ahora." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Puedes cambiar la contraseÃąa maestra en la aplicaciÃŗn web de Bitwarden." + }, "fingerprintPhrase": { "message": "Frase de huella digital", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Cerrar sesiÃŗn" }, + "aboutBitwarden": { + "message": "Acerca de Bitwarden" + }, "about": { "message": "Acerca de" }, + "moreFromBitwarden": { + "message": "MÃĄs de Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "ÂŋContinuar a bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden para Empresas" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator te permite almacenar claves de autenticaciÃŗn y generar cÃŗdigos TOTP para flujos de verificaciÃŗn de 2 pasos. MÃĄs informaciÃŗn en el sitio web de bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Almacena, administra y comparte de forma segura secretos de desarrollador con Bitwarden Secrets Manager. ObtÊn mÃĄs informaciÃŗn en el sitio web de bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Crea experiencias de inicio de sesiÃŗn fluidas y seguras, libres de contraseÃąas tradicionales, con Passwordless.dev. ObtÊn mÃĄs informaciÃŗn en el sitio web de bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Familias gratis" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Eres elegible para Bitwarden Familias Gratis. Canjea esta oferta hoy mismo en la aplicaciÃŗn web." + }, "version": { "message": "VersiÃŗn" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Editar carpeta" }, + "newFolder": { + "message": "Carpeta nueva" + }, + "folderName": { + "message": "Nombre de carpeta" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "Ninguna carpeta aÃąadida" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "ÂŋConfirma que quiere eliminar permanentemente esta carpeta?" + }, "deleteFolder": { "message": "Eliminar carpeta" }, @@ -199,7 +399,7 @@ "message": "Centro de ayuda de Bitwarden" }, "communityForums": { - "message": "Explorar los foros de la comunidad Bitwarden" + "message": "Explora los foros de la comunidad Bitwarden" }, "contactSupport": { "message": "Contactar al soporte de Bitwarden" @@ -218,13 +418,13 @@ }, "generator": { "message": "Generador", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Genera automÃĄticamente contraseÃąas fuertes y Ãēnicas para tus accesos." }, - "bitWebVault": { - "message": "Caja fuerte web de Bitwarden" + "bitWebVaultApp": { + "message": "AplicaciÃŗn web de Bitwarden" }, "importItems": { "message": "Importar elementos" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generar contraseÃąa" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerar contraseÃąa" }, @@ -244,17 +447,60 @@ "length": { "message": "Longitud" }, + "passwordMinLength": { + "message": "Longitud mínima de contraseÃąa" + }, "uppercase": { - "message": "MayÃēsculas (A-Z)" + "message": "MayÃēsculas (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "MinÃēsculas (a-z)" + "message": "MinÃēsculas (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "NÃēmeros (0-9)" + "message": "NÃēmeros (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caracteres especiales (!@#$%^&*)" + "message": "Caracteres especiales (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Incluir", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Incluir letras mayÃēsculas", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Incluir letras minÃēsculas", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Incluir nÃēmeros", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Incluir caracteres especiales", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "NÃēmero de palabras" @@ -276,7 +522,16 @@ "message": "Mínimo de caracteres especiales" }, "avoidAmbChar": { - "message": "Evitar caracteres ambiguos" + "message": "Evitar caracteres ambiguos", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Evitar caracteres ambiguos", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Buscar en caja fuerte" @@ -299,15 +554,30 @@ "password": { "message": "ContraseÃąa" }, + "totp": { + "message": "Secreto de autenticador" + }, "passphrase": { "message": "Frase de contraseÃąa" }, "favorite": { "message": "Favorito" }, + "unfavorite": { + "message": "Eliminar favorito" + }, + "itemAddedToFavorites": { + "message": "Elemento aÃąadido a favoritos" + }, + "itemRemovedFromFavorites": { + "message": "Elemento eliminado de favoritos" + }, "notes": { "message": "Notas" }, + "privateNote": { + "message": "Nota privada" + }, "note": { "message": "Nota" }, @@ -326,6 +596,18 @@ "launch": { "message": "Iniciar" }, + "launchWebsite": { + "message": "Iniciar pÃĄgina web" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Web" }, @@ -338,8 +620,23 @@ "other": { "message": "Otros" }, + "unlockMethods": { + "message": "Opciones de desbloqueo" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Configura un mÊtodo de desbloqueo para cambiar tu acciÃŗn de cierre de la bÃŗveda." + }, + "unlockMethodNeeded": { + "message": "Configure un mÊtodo de desbloqueo en ConfiguraciÃŗn" + }, + "sessionTimeoutHeader": { + "message": "Tiempo de sesiÃŗn agotado" + }, + "vaultTimeoutHeader": { + "message": "Tiempo de espera de la caja fuerte" + }, + "otherOptions": { + "message": "Otras opciones" }, "rateExtension": { "message": "Valora la extensiÃŗn" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Tu caja fuerte estÃĄ bloqueada. Verifica tu identidad para continuar." }, + "yourVaultIsLockedV2": { + "message": "Tu caja fuerte estÃĄ bloqueada" + }, + "yourAccountIsLocked": { + "message": "Tu cuenta estÃĄ bloqueada" + }, + "or": { + "message": "o" + }, "unlock": { "message": "Desbloquear" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Tiempo de espera de la caja fuerte" }, + "vaultTimeout1": { + "message": "Tiempo de espera" + }, "lockNow": { "message": "Bloquear" }, + "lockAll": { + "message": "Bloquear todo" + }, "immediately": { "message": "Inmediatamente" }, @@ -426,6 +738,18 @@ "security": { "message": "Seguridad" }, + "confirmMasterPassword": { + "message": "Confirmar contraseÃąa maestra" + }, + "masterPassword": { + "message": "ContraseÃąa maestra" + }, + "masterPassImportant": { + "message": "ÂĄTu contraseÃąa maestra no se puede recuperar si la olvidas!" + }, + "masterPassHintLabel": { + "message": "Pista de la contraseÃąa maestra" + }, "errorOccurred": { "message": "Ha ocurrido un error" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "ÂĄTu nueva cuenta ha sido creada! Ahora puedes acceder." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "AccediÃŗ correctamente a su cuenta" + }, + "youMayCloseThisWindow": { + "message": "Puede cerrar esta ventana" + }, "masterPassSent": { "message": "Te hemos enviado un correo electrÃŗnico con la pista de tu contraseÃąa maestra." }, "verificationCodeRequired": { "message": "CÃŗdigo de verificaciÃŗn requerido." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "CÃŗdigo de verificaciÃŗn no vÃĄlido" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "No se ha podido autorellenar la entrada seleccionada en esta pÃĄgina. Copia/pega tu usuario y/o contraseÃąa." + "message": "No se ha podido autorrellenar la entrada seleccionada en esta pÃĄgina. Copia/pega tu usuario y/o contraseÃąa." + }, + "totpCaptureError": { + "message": "No se puede escanear el cÃŗdigo QR desde la pÃĄgina web actual" + }, + "totpCaptureSuccess": { + "message": "Clave de autenticador aÃąadida" + }, + "totpCapture": { + "message": "Escanee el cÃŗdigo QR del autenticador desde la pÃĄgina web actual" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copiar clave de autenticador (TOTP)" }, "loggedOut": { "message": "SesiÃŗn terminada" }, + "loggedOutDesc": { + "message": "Has cerrado sesiÃŗn de tu cuenta." + }, "loginExpired": { "message": "Tu sesiÃŗn ha expirado." }, + "logIn": { + "message": "Acceder" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Reiniciar registro" + }, + "expiredLink": { + "message": "Enlace caducado" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Reinicie el registro o pruebe a acceder a su cuenta." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Puede que ya tenga una cuenta" + }, "logOutConfirmation": { "message": "ÂŋEstÃĄs seguro de querer cerrar la sesiÃŗn?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Carpeta aÃąadida" }, - "changeMasterPass": { - "message": "Cambiar contraseÃąa maestra" - }, - "changeMasterPasswordConfirmation": { - "message": "Puedes cambiar tu contraseÃąa maestra en la caja fuerte web de bitwarden.com. ÂŋQuieres visitar ahora el sitio web?" - }, "twoStepLoginConfirmation": { "message": "La autenticaciÃŗn en dos pasos hace que tu cuenta sea mucho mÃĄs segura, requiriendo que introduzcas un cÃŗdigo de seguridad de una aplicaciÃŗn de autenticaciÃŗn cada vez que accedes. La autenticaciÃŗn en dos pasos puede ser habilitada en la caja fuerte web de bitwarden.com. ÂŋQuieres visitar ahora el sitio web?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Carpeta editada" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Nueva URI" }, + "addDomain": { + "message": "AÃąadir dominio", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Elemento aÃąadido" }, @@ -559,7 +947,7 @@ "message": "Elemento editado" }, "deleteItemConfirmation": { - "message": "ÂŋEstÃĄs seguro de que quieres eliminar este elemento?" + "message": "ÂŋSeguro que quieres enviarlo a la papelera?" }, "deletedItem": { "message": "Elemento enviado a la papelera" @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Pedir que se aÃąada el inicio de sesiÃŗn" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "La opciÃŗn \"NotificaciÃŗn para aÃąadir entradas\" pregunta automÃĄticamente si quieres guardar nuevas entradas en tu caja fuerte cuando te identificas en un sitio web por primera vez." }, + "addLoginNotificationDescAlt": { + "message": "Pide que se agregue un elemento si no se encuentra uno en su caja fuerte. Se aplica a todas las cuentas que hayan iniciado sesiÃŗn." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Mostrar las tarjetas en la pestaÃąa" }, "showCardsCurrentTabDesc": { "message": "Listar los elementos de tarjetas en la pÃĄgina para facilitar el auto-rellenado." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Mostrar las identidades en la pÃĄgina" }, @@ -619,7 +1019,7 @@ "message": "ÂŋDebería Bitwarden recordar esta contraseÃąa por ti?" }, "notificationAddSave": { - "message": "Sí, guardar ahora" + "message": "Guardar" }, "enableChangedPasswordNotification": { "message": "Solicitar la actualizaciÃŗn de los datos de inicio de sesiÃŗn existentes" @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Solicitar la actualizaciÃŗn de los datos de inicio de sesiÃŗn existentes cuando se detecte un cambio en un sitio web." }, + "changedPasswordNotificationDescAlt": { + "message": "Solicitar actualizar la contraseÃąa de una cuenta cuando se detecta un cambio en un sitio web. Se aplica a todas las cuentas accedidas." + }, + "enableUsePasskeys": { + "message": "Solicitar guardar y usar claves de acceso" + }, + "usePasskeysDesc": { + "message": "Solicita guardar nuevas claves de acceso o inicia sesiÃŗn con claves de acceso almacenadas en tu caja fuerte. Se aplica a todas las cuentas que hayan iniciado sesiÃŗn." + }, "notificationChangeDesc": { "message": "ÂŋDesea actualizar esta contraseÃąa en Bitwarden?" }, @@ -634,10 +1043,13 @@ "message": "Actualizar" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Desbloquea tu caja fuerte de Bitwarden para completar la solicitud de autocompletado." }, "notificationUnlock": { - "message": "Unlock" + "message": "Desbloquear" + }, + "additionalOptions": { + "message": "Opciones adicionales" }, "enableContextMenuItem": { "message": "Mostrar las opciones de menÃē contextuales" @@ -645,9 +1057,12 @@ "contextMenuItemDesc": { "message": "Haga clic con el botÃŗn secundario para acceder a la generaciÃŗn de contraseÃąas y a los inicios de sesiÃŗn correspondientes al sitio web. " }, + "contextMenuItemDescAlt": { + "message": "Usar pulsaciÃŗn secundaria para acceder a la generaciÃŗn de contraseÃąas y cuentas coincidentes a los sitios web. Se aplica a todas las cuentas accedidas." + }, "defaultUriMatchDetection": { "message": "DetecciÃŗn por defecto de coincidencia de URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Elija el mÊtodo de detecciÃŗn por defecto de coincidencia de URI que se utilizarÃĄ para acciones de inicio de sesiÃŗn como autorrellenado." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Cambiar el tema de la aplicaciÃŗn." }, + "themeDescAlt": { + "message": "Cambiar el tema de colores de la aplicaciÃŗn. Se aplica a todas las cuentas accedidas." + }, "dark": { "message": "Oscuro", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Exportar desde" + }, "exportVault": { "message": "Exportar caja fuerte" }, "fileFormat": { "message": "Formato de archivo" }, + "fileEncryptedExportWarningDesc": { + "message": "Esta exportaciÃŗn de archivo estarÃĄ protegida por contraseÃąa y requerirÃĄ la contraseÃąa del archivo para descifrarla." + }, + "filePassword": { + "message": "ContraseÃąa del archivo" + }, + "exportPasswordDescription": { + "message": "Esta contraseÃąa se utilizarÃĄ para exportar e importar este archivo" + }, + "accountRestrictedOptionDescription": { + "message": "Utiliza la clave de cifrado de tu cuenta, derivada del nombre de usuario y la contraseÃąa maestra de tu cuenta, para cifrar la exportaciÃŗn y restringir la importaciÃŗn solo a la cuenta actual de Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "Establece una contraseÃąa de archivo para cifrar la exportaciÃŗn e importarlo a cualquier cuenta de Bitwarden utilizando la contraseÃąa para el descifrado." + }, + "exportTypeHeading": { + "message": "Tipo de exportaciÃŗn" + }, + "accountRestricted": { + "message": "Cuenta restringida" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"ContraseÃąa de archivo\" y \"Confirmar contraseÃąa de archivo\" no coinciden." + }, "warning": { "message": "ADVERTENCIA", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Compartido" }, - "learnOrg": { - "message": "Aprende sobre Organizaciones" - }, - "learnOrgConfirmation": { - "message": "Bitwarden te permite compartir objetos de tu caja fuerte con otros usando una organizaciÃŗn. ÂŋQuieres visitar el sitio web de bitwarden.com para saber mÃĄs?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden para Empresas te permite compartir los elementos de tu caja fuerte con otras personas mediante una organizaciÃŗn. ObtÊn mÃĄs informaciÃŗn en el sitio web de bitwarden.com." }, "moveToOrganization": { "message": "Mover a la OrganizaciÃŗn" @@ -762,6 +1204,9 @@ "file": { "message": "Archivo" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Selecciona un archivo." }, @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "1 GB de espacio cifrado en disco para adjuntos." }, + "premiumSignUpEmergency": { + "message": "Acceso de emergencia." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "Opciones de inicio de sesiÃŗn con autenticaciÃŗn de dos pasos propietarios como YubiKey y Duo." }, "ppremiumSignUpReports": { "message": "Higiene de contraseÃąa, salud de la cuenta e informes de violaciones de datos para mantener su caja fuerte segura." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Puedes comprar la membresía Premium en la caja fuerte web de bitwarden.com. ÂŋQuieres visitar el sitio web ahora?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "ÂĄEres un miembro Premium!" }, "premiumCurrentMemberThanks": { "message": "Gracias por apoyar el desarrollo de Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "ÂĄTodo por solo %price% /aÃąo!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ActualizaciÃŗn completada" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "AplicaciÃŗn de autenticaciÃŗn" }, - "authenticatorAppDesc": { - "message": "Utiliza una aplicaciÃŗn de autenticaciÃŗn (como Authy o Google Authenticator) para generar cÃŗdigo de verificaciÃŗn basados en tiempo.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Introduce un cÃŗdigo generado por una aplicaciÃŗn de autenticaciÃŗn como Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "Llave de seguridad YubiKey OTP" + "yubiKeyTitleV2": { + "message": "Llave de seguridad Yubico OTP" }, "yubiKeyDesc": { "message": "Usa un Yubikey para acceder a tu cuenta. Funciona con YubiKey 4, 4 Nano, 4C y dispositivos NEO." }, - "duoDesc": { - "message": "Verificar con Duo Security usando la aplicaciÃŗn Duo Mobile, SMS, llamada telefÃŗnica o llave de seguridad U2F.", + "duoDescV2": { + "message": "Introduce un cÃŗdigo generado por Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Correo electrÃŗnico" }, - "emailDesc": { - "message": "Los cÃŗdigos de verificaciÃŗn te serÃĄn enviados por correo electrÃŗnico." + "emailDescV2": { + "message": "Introduce un cÃŗdigo enviado a tu correo electrÃŗnico." }, "selfHostedEnvironment": { "message": "Entorno de alojamiento propio" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Especifica la URL base de tu instalaciÃŗn de Bitwarden de alojamiento propio." }, + "selfHostedBaseUrlHint": { + "message": "Especifica la direcciÃŗn URL base de la instalaciÃŗn de Bitwarden alojada localmente. Ejemplo: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Para una configuraciÃŗn avanzada, puedes especificar la direcciÃŗn URL base de cada servicio de forma independiente." + }, + "selfHostedEnvFormInvalid": { + "message": "Debes aÃąadir la direcciÃŗn URL del servidor base o al menos un entorno personalizado." + }, "customEnvironment": { "message": "Entorno personalizado" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL del servidor" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL del servidor de la API" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "Las URLs del entorno han sido guardadas." }, + "showAutoFillMenuOnFormFields": { + "message": "Mostrar menÃē de autocompletar en los campos del formulario", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Desactive la configuraciÃŗn del gestor de contraseÃąas del navegador para evitar conflictos." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Editar ajustes del navegador." + }, + "autofillOverlayVisibilityOff": { + "message": "Desactivado", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Cuando el campo estÊ seleccionado (en foco)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Cuando se seleccione el icono de relleno automÃĄtico", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Habilitar autorrellenar al cargar la pÃĄgina" }, "enableAutoFillOnPageLoadDesc": { "message": "Si se detecta un formulario, realizar automÃĄticamente un autorellenado cuando la web cargue." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Los sitios web vulnerados o no confiables pueden explotar el autorelleno al cargar la pÃĄgina." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "MÃĄs informaciÃŗn sobre el relleno automÃĄtico" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Abrir caja fuerte en la barra lateral" }, - "commandAutofillDesc": { - "message": "Autorrellenar la Ãēltima entrada utilizada para la pÃĄgina actual." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generar y copiar una nueva contraseÃąa aleatoria al portapapeles." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Bloquear la caja fuerte" }, - "privateModeWarning": { - "message": "El soporte en modo privado es experimental y algunas características son limitadas." - }, "customFields": { "message": "Campos personalizados" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Vinculado", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Mostrar una imagen reconocible junto a cada inicio de sesiÃŗn." }, + "faviconDescAlt": { + "message": "Mostrar una imagen reconocible junto a cada inicio de sesiÃŗn. Se aplica a todas las cuentas conectadas." + }, "enableBadgeCounter": { "message": "Mostrar el contador numÊrico" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identidad" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "Nuevo $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Editar $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Ver $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Historial de contraseÃąas" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "AtrÃĄs" }, "collections": { "message": "Colecciones" }, + "nCollections": { + "message": "$COUNT$ colecciones", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoritos" }, @@ -1282,6 +1874,10 @@ "message": "Dominio base", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Nombre de dominio", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Tipo de detecciÃŗn", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "DetecciÃŗn por defecto", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Alternar opciones" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "No hay contraseÃąas que listar." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Eliminar" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Desbloquear con PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Establece tu cÃŗdigo PIN para desbloquear Bitwarden. Tus ajustes de PIN se reiniciarÃĄn si alguna vez cierras tu sesiÃŗn completamente de la aplicaciÃŗn." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "CÃŗdigo PIN requerido." }, "invalidPin": { "message": "CÃŗdigo PIN invÃĄlido." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Demasiados intentos de entrada de PIN no vÃĄlidos. Cerrando sesiÃŗn." + }, "unlockWithBiometrics": { "message": "Desbloquear con biomÊtricos" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Esperando la confirmaciÃŗn por parte del escritorio" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Bloquear con contraseÃąa maestra al reiniciar el navegador" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Debes seleccionar al menos una colecciÃŗn." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Una o mÃĄs políticas de la organizaciÃŗn estÃĄn afectando la configuraciÃŗn del generador" }, + "passwordGenerator": { + "message": "Generador de contraseÃąas" + }, + "usernameGenerator": { + "message": "Generador de nombres de usuario" + }, + "useThisPassword": { + "message": "Usar esta contraseÃąa" + }, + "useThisUsername": { + "message": "Usar este nombre de usuario" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "AcciÃŗn de tiempo de espera de la caja fuerte" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papelera", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Elemento restaurado" }, + "alreadyHaveAccount": { + "message": "ÂŋYa tienes una cuenta?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Cerrar sesiÃŗn eliminarÃĄ todo el acceso a tu caja fuerte y requerirÃĄ autenticaciÃŗn en línea despuÊs del tiempo de espera. ÂŋEstÃĄs seguro de que quieres usar esta configuraciÃŗn?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Autorellenar y guardar" }, + "fillAndSave": { + "message": "Rellenar y guardar" + }, "autoFillSuccessAndSavedUri": { "message": "Objeto autorellenado y URI guardada" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Su nueva contraseÃąa maestra no cumple con los requisitos de la política." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Cancelar suscripciÃŗn" + }, + "atAnyTime": { + "message": "en cualquier momento." + }, + "byContinuingYouAgreeToThe": { + "message": "Continuando, aceptas los" + }, + "and": { + "message": "y" + }, "acceptPolicies": { "message": "Al seleccionar esta casilla, acepta lo siguiente:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Error de actualizaciÃŗn del token de acceso" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No se encontrÃŗ ningÃēn token de actualizaciÃŗn ni clave de API. Intenta cerrar sesiÃŗn y volver a iniciarla." + }, "desktopSyncVerificationTitle": { "message": "VerificaciÃŗn de sincronizaciÃŗn del escritorio" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Las cuentas son distintas" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometría deshabilitada" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "La biometría del navegador no es compatible con este dispositivo." }, + "biometricsNotUnlockedTitle": { + "message": "Usuario bloqueado o desconectado" + }, + "biometricsNotUnlockedDesc": { + "message": "Por favor, desbloquea a este usuario en la aplicaciÃŗn de escritorio e intÊntalo de nuevo." + }, + "biometricsNotAvailableTitle": { + "message": "Desbloqueo biomÊtrico no disponible" + }, + "biometricsNotAvailableDesc": { + "message": "El desbloqueo biomÊtrico no estÃĄ disponible actualmente. IntÊntelo de nuevo mÃĄs tarde." + }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "Fallo de biomÊtrica" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "No se pueden completar la biomÊtrica, considere usar una contraseÃąa maestra o cerrar la sesiÃŗn. Si esto persiste, pÃŗngase en contacto con el soporte de Bitwarden." }, "nativeMessaginPermissionErrorTitle": { "message": "Permiso no proporcionado" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Una política de organizaciÃŗn estÃĄ afectando a sus opciones de propiedad." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Una política organizacional ha bloqueado la importaciÃŗn de elementos a su caja fuerte personal." + }, + "domainsTitle": { + "message": "Dominios", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Dominios excluidos" }, "excludedDomainsDesc": { "message": "Bitwarden no pedirÃĄ que se guarden los datos de acceso para estos dominios. Debe actualizar la pÃĄgina para que los cambios surtan efecto." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden no pedirÃĄ que se guarden los datos de acceso para estos dominios en todas las sesiones iniciadas. Debe actualizar la pÃĄgina para que los cambios surtan efecto." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ no es un dominio vÃĄlido", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Buscar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Texto" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Archivo" }, @@ -1666,6 +2406,9 @@ "message": "Todos los Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "NÃēmero mÃĄximo de accesos alcanzado", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Protegido por contraseÃąa" }, + "copyLink": { + "message": "Copiar enlace" + }, "copySendLink": { "message": "Copiar enlace Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "ÂŋEstÃĄ seguro de que desea eliminar este Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Editar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "El Send se eliminarÃĄ permanentemente en la fecha y hora especificadas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Fecha de caducidad" }, @@ -1769,6 +2523,10 @@ "message": "Opcionalmente se requiere una contraseÃąa para que los usuarios accedan a este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notas privadas sobre este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Envío creado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Envío editado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Para elegir un archivo, abra la extensiÃŗn en la barra lateral (si es posible) o salga a una nueva ventana haciendo clic en este anouncio." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Para elegir un archivo usando Safari, salga a una nueva ventana haciendo clic en este anouncio." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Antes de empezar" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Ocultar mi direcciÃŗn de correo electrÃŗnico a los destinatarios." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Una o mÃĄs políticas de organizaciÃŗn estÃĄn afectando sus opciones del Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "VerificaciÃŗn de correo electrÃŗnico requerida" }, + "emailVerifiedV2": { + "message": "Correo electrÃŗnico verificado" + }, "emailVerificationRequiredDesc": { "message": "Debes verificar tu correo electrÃŗnico para usar esta funciÃŗn. Puedes verificar tu correo electrÃŗnico en la caja fuerte web." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Su contraseÃąa maestra no cumple con una o mÃĄs de las políticas de su organizaciÃŗn. Para acceder a la caja fuerte, debe actualizar su contraseÃąa maestra ahora. Proceder le desconectarÃĄ de su sesiÃŗn actual, requiriendo que vuelva a iniciar sesiÃŗn. Las sesiones activas en otros dispositivos pueden seguir estando activas durante hasta una hora." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "InscripciÃŗn automÃĄtica" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Seleccione carpeta..." }, - "ssoCompleteRegistration": { - "message": "Para completar el inicio de sesiÃŗn con SSO, por favor establezca una contraseÃąa maestra para acceder y proteger su caja fuerte." + "noFoldersFound": { + "message": "Ninguna carpeta encontrada", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Los permisos de la organizaciÃŗn se han actualizado y se requiere el establecimiento de una contraseÃąa maestra.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Su organizaciÃŗn requiere que establezca una contraseÃąa maestra.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Se requiere verificaciÃŗn", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Horas" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutos" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Las políticas de tu organizaciÃŗn estÃĄn afectando al tiempo de espera de tu caja fuerte. El tiempo mÃĄximo de espera de la caja fuerte es de $HOURS$ hora(s) y $MINUTES$ minuto(s)", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Las políticas de su organizaciÃŗn estÃĄn afectando al tiempo de espera de tu caja fuerte. El tiempo de espera de tu caja fuerte mÃĄximo permitido es de $HOURS$ hora(s) y $MINUTES$ minuto(s). La acciÃŗn de tiempo de espera de tu caja fuerte estÃĄ establecida en $ACTION$.", "placeholders": { @@ -1992,7 +2857,7 @@ "message": "Exportando caja fuerte personal" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Solo se exportarÃĄn los elementos individuales de la caja fuerte asociados con $EMAIL$. Los elementos de la bÃŗveda de la organizaciÃŗn no se incluirÃĄn. Solo se exportarÃĄ la informaciÃŗn de los elementos individuales y no incluirÃĄ adjuntos asociados.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exportando caja fuerte de la organizaciÃŗn" + }, + "exportingOrganizationVaultDesc": { + "message": "Solo se exportarÃĄ la caja fuerte de la organizaciÃŗn asociada a $ORGANIZATION$. Los elementos en las cajas fuertes individuales o de otras organizaciones no serÃĄn incluidos.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generar nombre de usuario" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Tipo de nombre de usuario" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Genera un alias de correo electrÃŗnico con un servicio de reenvío externo." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generado por Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Sitio web: $WEBSITE$. Generado por Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token de API $SERVICENAME$ no vÃĄlido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token de API $SERVICENAME$ no vÃĄlido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "No se puede obtener el ID de la cuenta de correo electrÃŗnico enmascarado de $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Dominio $SERVICENAME$ no vÃĄlido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ no vÃĄlida.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Se ha producido un error $SERVICENAME$ desconocido.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Redirigidor desconocido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nombre del servidor", "description": "Part of a URL." @@ -2093,7 +3097,7 @@ "message": "VersiÃŗn del servidor" }, "selfHostedServer": { - "message": "self-hosted" + "message": "autoalojado" }, "thirdParty": { "message": "Aplicaciones de terceros" @@ -2153,7 +3157,7 @@ "message": "Se ha enviado una notificaciÃŗn a tu dispositivo." }, "loginInitiated": { - "message": "Login initiated" + "message": "Inicio de sesiÃŗn en proceso" }, "exposedMasterPassword": { "message": "ContraseÃąa maestra comprometida" @@ -2192,7 +3196,7 @@ "message": "CÃŗmo autorellenar" }, "autofillSelectInfoWithCommand": { - "message": "Seleccione un elemento de esta pÃĄgina o utilice el acceso directo: $COMMAND$", + "message": "Selecciona un elemento de esta pantalla, usa el acceso directo $COMMAND$ o explora otras opciones en ajustes.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Seleccione un elemento de esta pÃĄgina o establezca un acceso directo en los ajustes." + "message": "Seleccione un elemento de esta pantalla, o explore otras opciones en ajustes." }, "gotIt": { "message": "Entendido" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Ajustes de autocompletar" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Cambiar atajo" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Gestionar atajos" + }, "autofillShortcut": { "message": "Atajo de teclado para autocompletar" }, - "autofillShortcutNotSet": { - "message": "El atajo de autocompletar no estÃĄ establecido. Cambie esto en los ajustes del navegador." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "El atajo de autocompletar es $COMMAND$. Cambie esto en los ajustes del navegador.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,43 +3246,55 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Abre en una nueva ventana" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "Se requiere aprobaciÃŗn del dispositivo. Seleccione una opciÃŗn de aprobaciÃŗn a continuaciÃŗn:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Recordar este dispositivo" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "Desmarcar si se utiliza un dispositivo pÃēblico" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Apruebe desde otro dispositivo" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Solicitar aprobaciÃŗn del administrador" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Aprobar con contraseÃąa maestra" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "Se requiere un identificador Ãēnico de inicio de sesiÃŗn de la organizaciÃŗn." + }, + "creatingAccountOn": { + "message": "Crea una cuenta en" + }, + "checkYourEmail": { + "message": "Comprueba tu correo electrÃŗnico" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Sigue el enlace en el correo electrÃŗnico enviado a" + }, + "andContinueCreatingYourAccount": { + "message": "y continÃēa creando tu cuenta." + }, + "noEmail": { + "message": "ÂŋSin correo electrÃŗnico?" + }, + "goBack": { + "message": "Volver" + }, + "toEditYourEmailAddress": { + "message": "para editar la direcciÃŗn de correo electrÃŗnico." }, "eu": { - "message": "EU", + "message": "UniÃŗn Europea", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Acceso denegado. No tiene permiso para ver esta pÃĄgina." }, @@ -2277,43 +3302,51 @@ "message": "General" }, "display": { - "message": "Display" + "message": "VisualizaciÃŗn" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "ÂĄCuenta creada con Êxito!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "AprobaciÃŗn del administrador solicitada" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Su solicitud ha sido enviada a su administrador." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "Se le notificarÃĄ una vez aprobado." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "ÂŋProblemas para iniciar sesiÃŗn?" }, "loginApproved": { - "message": "Login approved" + "message": "Inicio de sesiÃŗn aprobado" }, "userEmailMissing": { - "message": "User email missing" + "message": "Falta el correo electrÃŗnico del usuario" }, "deviceTrusted": { - "message": "Device trusted" + "message": "Dispositivo de confianza" + }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "Entrada requerida." }, "required": { - "message": "required" + "message": "requerido" }, "search": { - "message": "Search" + "message": "Buscar" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "La entrada debe tener al menos $COUNT$ caracteres.", "placeholders": { "count": { "content": "$1", @@ -2322,7 +3355,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "La entrada no debe exceder los $COUNT$ caracteres de longitud.", "placeholders": { "count": { "content": "$1", @@ -2331,7 +3364,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "Los siguientes caracteres no estÃĄn permitidos: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "El valor de entrada debe ser por lo menos de $MIN$.", "placeholders": { "min": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "El valor de entrada no debe exceder $MAX$.", "placeholders": { "max": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "Una o mÃĄs direcciones de correo electrÃŗnico no son vÃĄlidas" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "La entrada no debe contener Ãēnicamente espacios en blanco.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "La entrada no es una direcciÃŗn de correo electrÃŗnico." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "$COUNT$ campo(s) anteriores necesitan su atenciÃŗn.", "placeholders": { "count": { "content": "$1", @@ -2376,23 +3409,35 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Seleccione --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- Escriba para filtrar --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "Recuperando opciones..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "No hay elementos" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "Borrar todo" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ mÃĄs", "placeholders": { "quantity": { "content": "$1", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "SubmenÃē" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Colapsar/Expandir", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "ÂŋQuiere importar sus datos a Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "ÂŋQuiere proteger sus datos de LastPass e importarlos a Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Guardar como archivo no cifrado", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importar a Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importando...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Se importaron los datos correctamente.", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Se produjo un error al importar. Revise la consola para obtener detalles.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Se produjo un error de red durante la importaciÃŗn.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "SeudÃŗnimo del dominio" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Los elementos que requieren la contraseÃąa maestra no se pueden rellenar automÃĄticamente al cargar la pÃĄgina. Se desactivÃŗ el autorrellenado de la pÃĄgina.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "El autorrellenado de la pÃĄgina estÃĄ usando la configuraciÃŗn predeterminada.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Desactiva la solicitud de contraseÃąa maestra para editar este campo", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Activar/desactivar navegaciÃŗn lateral" + }, + "skipToContent": { + "message": "Ir al contenido" + }, + "bitwardenOverlayButton": { + "message": "BotÃŗn de menÃē de autocompletar de Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Alternar menÃē de autocompletar de bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "MenÃē de autocompletar de Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Desbloquea tu cuenta para ver las entradas coincidentes", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Desbloquear la cuenta", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Rellenar credenciales para", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Nombre de usuario parcial", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No hay ningÃēn elemento que mostrar", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nuevo elemento", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "AÃąadir elemento de caja fuerte nuevo", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Identidad nueva", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "MenÃē de relleno automÃĄtico de Bitwarden disponible. Presione ↓ para seleccionar.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Activar" + }, + "ignore": { + "message": "Ignorar" + }, + "importData": { + "message": "Importar datos", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Error al importar" + }, + "importErrorDesc": { + "message": "Hubo un problema con los datos que intentaste importar. Por favor, resuelve los errores listados a continuaciÃŗn en tu archivo de origen e intÊntalo de nuevo." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Corrige los siguientes errores e intÊntalo de nuevo." + }, + "description": { + "message": "DescripciÃŗn" + }, + "importSuccess": { + "message": "Datos importados correctamente" + }, + "importSuccessNumberOfItems": { + "message": "Un total de $AMOUNT$ elementos fueron importados.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Intentar de nuevo" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Se requiere verificaciÃŗn para efectuar esta acciÃŗn. Establezca un NIP para continuar." + }, + "setPin": { + "message": "Establecer NIP" + }, + "verifyWithBiometrics": { + "message": "Verificar biomÊtricamente" + }, + "awaitingConfirmation": { + "message": "Esperando confirmaciÃŗn" + }, + "couldNotCompleteBiometrics": { + "message": "No se pudo completar la biomÊtrica." + }, + "needADifferentMethod": { + "message": "ÂŋNecesita un mÊtodo distinto?" + }, + "useMasterPassword": { + "message": "Usar contraseÃąa maestra" + }, + "usePin": { + "message": "Usar NIP" + }, + "useBiometrics": { + "message": "Usar biomÊtrica" + }, + "enterVerificationCodeSentToEmail": { + "message": "Introduzca el cÃŗdigo de verificaciÃŗn que se ha enviado a su correo electrÃŗnico." + }, + "resendCode": { + "message": "Volver a enviar cÃŗdigo" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "EstÃĄs importando datos a $ORGANIZATION$. Tus datos pueden ser compartidos con miembros de esta organizaciÃŗn. ÂŋQuieres continuar?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error al conectarse con el servicio Duo. Utiliza un mÊtodo de inicio de sesiÃŗn en dos pasos diferente o ponte en contacto con Duo para obtener ayuda." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Abra Duo y siga los pasos para terminar de iniciar sesiÃŗn." + }, + "duoRequiredForAccount": { + "message": "Se requiere el inicio de sesiÃŗn en dos pasos Duo para su cuenta." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Abra la extensiÃŗn para completar el inicio de sesiÃŗn." + }, + "popoutExtension": { + "message": "Abrir extensiÃŗn" + }, + "launchDuo": { + "message": "Iniciar Duo" + }, + "importFormatError": { + "message": "Los datos no estÃĄn formateados correctamente. Por favor, comprueba tu archivo de importaciÃŗn e intÊntalo de nuevo." + }, + "importNothingError": { + "message": "No se ha importado nada." + }, + "importEncKeyError": { + "message": "Error al descifrar el archivo exportado. Su clave de cifrado no coincide con la clave de cifrado utilizada para exportar los datos." + }, + "invalidFilePassword": { + "message": "ContraseÃąa de archivo no vÃĄlida. Por favor utilice la contraseÃąa que introdujo cuando creÃŗ el archivo de exportaciÃŗn." + }, + "destination": { + "message": "Destino" + }, + "learnAboutImportOptions": { + "message": "Aprende sobre tus opciones de importaciÃŗn" + }, + "selectImportFolder": { + "message": "Seleccione una carpeta" + }, + "selectImportCollection": { + "message": "Selecciona una colecciÃŗn" + }, + "importTargetHint": { + "message": "Selecciona esta opciÃŗn si deseas que el contenido del archivo importado se mueva a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "El archivo contiene elementos no asignados." + }, + "selectFormat": { + "message": "Selecciona el formato del archivo a importar" + }, + "selectImportFile": { + "message": "Seleccionar el archivo a importar" + }, + "chooseFile": { + "message": "Seleccionar archivo" + }, + "noFileChosen": { + "message": "No se ha seleccionado ningÃēn archivo" + }, + "orCopyPasteFileContents": { + "message": "o copia/pega el contenido del archivo a importar" + }, + "instructionsFor": { + "message": "Instrucciones para $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirmar la importaciÃŗn de la caja fuerte" + }, + "confirmVaultImportDesc": { + "message": "Este archivo estÃĄ protegido por contraseÃąa. Introduzca la contraseÃąa del archivo para importar datos." + }, + "confirmFilePassword": { + "message": "Confirmar contraseÃąa del archivo" + }, + "exportSuccess": { + "message": "Datos de la caja fuerte exportados" + }, + "typePasskey": { + "message": "Clave de acceso" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "La clave de acceso no se copiarÃĄ" + }, + "passkeyNotCopiedAlert": { + "message": "La clave de acceso no se copiarÃĄ al elemento clonado. ÂŋDesea continuar clonando este elemento?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "VerificaciÃŗn requerida por el sitio inicial. Esta característica aÃēn no estÃĄ implementada para cuentas sin contraseÃąa maestra." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "Ya existe una clave de acceso para esta aplicaciÃŗn." + }, + "noPasskeysFoundForThisApplication": { + "message": "No se encontraron claves de acceso para esta aplicaciÃŗn." + }, + "noMatchingPasskeyLogin": { + "message": "No tiene un inicio de sesiÃŗn que coincida para este sitio." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirmar" + }, + "savePasskey": { + "message": "Guardar clave de acceso" + }, + "savePasskeyNewLogin": { + "message": "Guardar clave de acceso como nuevo inicio de sesiÃŗn" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Elemento de clave de acceso" + }, + "overwritePasskey": { + "message": "ÂŋSobrescribir clave de acceso?" + }, + "overwritePasskeyAlert": { + "message": "Este elemento ya contiene una clave de acceso. ÂŋEstÃĄ seguro de que desea sobrescribir la contraseÃąa actual?" + }, + "featureNotSupported": { + "message": "FunciÃŗn aÃēn no implementada" + }, + "yourPasskeyIsLocked": { + "message": "AutenticaciÃŗn requerida para usar la clave de acceso. Verifique su identidad para continuar." + }, + "multifactorAuthenticationCancelled": { + "message": "Se cancelÃŗ la autenticaciÃŗn multifactor" + }, + "noLastPassDataFound": { + "message": "No se encontrÃŗ ningÃēn dato de LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "El nombre de usuario o la contraseÃąa no son correctos" + }, + "incorrectPassword": { + "message": "ContraseÃąa incorrecta" + }, + "incorrectCode": { + "message": "CÃŗdigo incorrecto" + }, + "incorrectPin": { + "message": "NIP incorrecto" + }, + "multifactorAuthenticationFailed": { + "message": "FallÃŗ la autenticaciÃŗn multifactor" + }, + "includeSharedFolders": { + "message": "Incluir carpetas compartidas" + }, + "lastPassEmail": { + "message": "Correo de LastPass" + }, + "importingYourAccount": { + "message": "Importando su cuenta..." + }, + "lastPassMFARequired": { + "message": "Se requiere autenticaciÃŗn multifactor LastPass" + }, + "lastPassMFADesc": { + "message": "Introduzca el cÃŗdigo de un solo uso de la aplicaciÃŗn para autenticar" + }, + "lastPassOOBDesc": { + "message": "Apruebe la solicitud de acceso de la aplicaciÃŗn para autenticar o introduzca un cÃŗdigo de un solo uso." + }, + "passcode": { + "message": "Clave" + }, + "lastPassMasterPassword": { + "message": "ContraseÃąa maestra de LastPass" + }, + "lastPassAuthRequired": { + "message": "Se requiere autenticaciÃŗn LastPass" + }, + "awaitingSSO": { + "message": "Esperando autenticaciÃŗn SSO" + }, + "awaitingSSODesc": { + "message": "Por favor, continÃēe iniciando sesiÃŗn usando las credenciales de su empresa." + }, + "seeDetailedInstructions": { + "message": "Vea instrucciones detalladas en nuestro sitio de ayuda en", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importar directamente de LastPass" + }, + "importFromCSV": { + "message": "Importar desde CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Intente nuevamente o busque un correo de LastPass para verificar su identidad." + }, + "collection": { + "message": "ColecciÃŗn" + }, + "lastPassYubikeyDesc": { + "message": "Inserte la YubiKey asociada con su cuenta de LastPass en el puerto USB del equipo y, a continuaciÃŗn, pulse su botÃŗn." + }, + "switchAccount": { + "message": "Cambiar de cuenta" + }, + "switchAccounts": { + "message": "Cambiar de cuenta" + }, + "switchToAccount": { + "message": "Cambiar a cuenta" + }, + "activeAccount": { + "message": "Cuenta activa" + }, + "availableAccounts": { + "message": "Cuentas disponibles" + }, + "accountLimitReached": { + "message": "Se alcanzÃŗ el límite de cuentas. Salga de una cuenta para aÃąadir otra." + }, + "active": { + "message": "activa" + }, + "locked": { + "message": "bloqueada" + }, + "unlocked": { + "message": "desbloqueada" + }, + "server": { + "message": "servidor" + }, + "hostedAt": { + "message": "alojado en" + }, + "useDeviceOrHardwareKey": { + "message": "Utilice su dispositivo o su llave de hardware" + }, + "justOnce": { + "message": "SÃŗlo una vez" + }, + "alwaysForThisSite": { + "message": "Siempre para este sitio" + }, + "domainAddedToExcludedDomains": { + "message": "Se aÃąadiÃŗ $DOMAIN$ a los dominios excluidos.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Formatos comunes", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "ÂŋHacer de Bitwarden su administrador de contraseÃąas predeterminado?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Pasar por alto esta opciÃŗn puede causar conflictos entre el menÃē de autocompletar de Bitwarden y el de tu navegador.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Hacer de Bitwarden tu administrador de contraseÃąas predeterminado", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "No se puede establecer Bitwarden como el administrador de contraseÃąas predeterminado", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Debes otorgar permisos de privacidad del navegador a Bitwarden para establecerlo como administrador de contraseÃąas predeterminado.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Establecer como predeterminado", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "ÂĄCredenciales guardadas con Êxito!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "ÂĄCredenciales actualizadas con Êxito!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Se produjo un error al guardar las credenciales. Revise la consola para obtener detalles.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Éxito" + }, + "removePasskey": { + "message": "Eliminar clave de acceso" + }, + "passkeyRemoved": { + "message": "Clave de acceso eliminada" + }, + "autofillSuggestions": { + "message": "Autocompletar sugerencias" + }, + "autofillSuggestionsTip": { + "message": "Guarda un elemento de inicio de sesiÃŗn para este sitio para autocompletar" + }, + "yourVaultIsEmpty": { + "message": "Tu caja fuerte estÃĄ vacía" + }, + "noItemsMatchSearch": { + "message": "No hay elementos que coincidan con tu bÃēsqueda" + }, + "clearFiltersOrTryAnother": { + "message": "Limpia los filtros o prueba otro tÊrmino de bÃēsqueda" + }, + "copyInfoTitle": { + "message": "Copiar informaciÃŗn - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copiar nota - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "MÃĄs opciones, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "MÃĄs opciones - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Ver elemento - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autocompletar - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No hay valores para copiar" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copiar correo electrÃŗnico" + }, + "copyPhone": { + "message": "Copiar telÊfono" + }, + "copyAddress": { + "message": "Copiar direcciÃŗn" + }, + "adminConsole": { + "message": "Consola de administrador" + }, + "accountSecurity": { + "message": "Seguridad de la cuenta" + }, + "notifications": { + "message": "Notificaciones" + }, + "appearance": { + "message": "Apariencia" + }, + "errorAssigningTargetCollection": { + "message": "Error al asignar la colecciÃŗn de destino." + }, + "errorAssigningTargetFolder": { + "message": "Error al asignar la carpeta de destino." + }, + "viewItemsIn": { + "message": "Ver elementos en $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Volver a $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nuevo" + }, + "removeItem": { + "message": "Eliminar $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Elementos sin carpeta" + }, + "itemDetails": { + "message": "Detalles del elemento" + }, + "itemName": { + "message": "Nombre del elemento" + }, + "cannotRemoveViewOnlyCollections": { + "message": "No puedes eliminar colecciones con permisos de solo visualizaciÃŗn: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "La organizaciÃŗn estÃĄ desactivada" + }, + "owner": { + "message": "Propietario" + }, + "selfOwnershipLabel": { + "message": "TÃē", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "No se puede acceder a los elementos de las organizaciones desactivadas. Ponte en contacto con el propietario de tu organizaciÃŗn para obtener ayuda." + }, + "additionalInformation": { + "message": "InformaciÃŗn adicional" + }, + "itemHistory": { + "message": "Historial del elemento" + }, + "lastEdited": { + "message": "Última ediciÃŗn" + }, + "ownerYou": { + "message": "Propietario: TÃē" + }, + "linked": { + "message": "Vinculado" + }, + "copySuccessful": { + "message": "Copiado exitosamente" + }, + "upload": { + "message": "Subir" + }, + "addAttachment": { + "message": "AÃąadir adjunto" + }, + "maxFileSizeSansPunctuation": { + "message": "El tamaÃąo mÃĄximo del fichero es de 500 MB" + }, + "deleteAttachmentName": { + "message": "Elimina el adjunto $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Descargar $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "ÂŋEstÃĄs seguro de que deseas eliminar permanentemente este adjunto?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Las organizaciones gratis no pueden usar archivos adjuntos" + }, + "filters": { + "message": "Filtros" + }, + "personalDetails": { + "message": "Datos personales" + }, + "identification": { + "message": "IdentificaciÃŗn" + }, + "contactInfo": { + "message": "InformaciÃŗn de contacto" + }, + "downloadAttachment": { + "message": "Descargar - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Datos de la tarjeta" + }, + "cardBrandDetails": { + "message": "Detalles de $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Activar animaciones" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "AÃąadir cuenta" + }, + "loading": { + "message": "Cargando" + }, + "data": { + "message": "Datos" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "ContraseÃąas", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "AÃąadir campo" + }, + "add": { + "message": "AÃąadir" + }, + "fieldType": { + "message": "Tipo de campo" + }, + "fieldLabel": { + "message": "Etiqueta de campo" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "UbicaciÃŗn del elemento" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden tiene un aspecto nuevo." + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Acciones de cuenta" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Elementos en la papelera" + }, + "noItemsInTrash": { + "message": "NingÃēn elemento en la papelera" + }, + "noItemsInTrashDesc": { + "message": "Los elementos que elimine aparecerÃĄn aquí y se eliminarÃĄn permanentemente al cabo de 30 días" + }, + "trashWarning": { + "message": "Los elementos que permanezcan mÃĄs de 30 días en la papelera se eliminarÃĄn de forma automÃĄtica" + }, + "restore": { + "message": "Restaurar" + }, + "deleteForever": { + "message": "Eliminar para siempre" + }, + "noEditPermissions": { + "message": "No tiene permiso de editar este elemento" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index c3d12a9b120..f3bd66224f1 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -3,24 +3,42 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Tasuta paroolihaldur", + "message": "Bitwardeni paroolihaldur", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Turvaline ja tasuta paroolihaldur kÃĩikidele sinu seadmetele.", - "description": "Extension description" + "message": "Kodus, tÃļÃļl ja teel - Bitwarden hoiustab imelihtsalt kÃĩik su paroolid, pääsuvÃĩtmed ja tundliku info", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Logi oma olemasolevasse kontosse sisse vÃĩi loo uus konto." }, - "createAccount": { - "message": "Loo konto" + "inviteAccepted": { + "message": "Kutse vastu vÃĩetud" }, - "login": { - "message": "Logi sisse" + "createAccount": { + "message": "Konto loomine" + }, + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Määra tugev parool" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "LÃĩpeta konto loomine parooli luues" }, "enterpriseSingleSignOn": { - "message": "EttevÃĩtte Single Sign-On" + "message": "EttevÃĩtte Ãŧhekordne sisselogimine" }, "cancel": { "message": "TÃŧhista" @@ -43,23 +61,51 @@ "masterPassHintDesc": { "message": "Vihje vÃĩib abiks olla olukorras, kui oled Ãŧlemparooli unustanud." }, + "masterPassHintText": { + "message": "Kui sa unustad oma parooli, saad saata parooli vihje e-mailile.\n$CURRENT$/$MAXIMUM$ tähepiirang.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Sisesta Ãŧlemparool uuesti" }, "masterPassHint": { "message": "Ülemparooli vihje (ei ole kohustuslik)" }, + "joinOrganization": { + "message": "Liitu organisatsiooniga" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "LÃĩpeta organisatsiooniga liitumine määrates Ãŧlemparool." + }, "tab": { "message": "Kaart" }, "vault": { - "message": "Hoidla" + "message": "Seif" }, "myVault": { - "message": "Minu hoidla" + "message": "Minu seif" }, "allVaults": { - "message": "KÃĩik hoidlad" + "message": "KÃĩik seifid" }, "tools": { "message": "TÃļÃļriistad" @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopeeri parool" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Kopeeri märkus" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopeeri turvakood" }, + "copyName": { + "message": "Kopeeri nimi" + }, + "copyCompany": { + "message": "Kopeeri firma nimi" + }, + "copySSN": { + "message": "Kopeeri isikukood" + }, + "copyPassportNumber": { + "message": "Kopeeri passi number" + }, + "copyLicenseNumber": { + "message": "Kopeeri litsentsi number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Automaatne täitmine" }, + "autoFillLogin": { + "message": "Täida andmed automaatselt" + }, + "autoFillCard": { + "message": "Täida automaatselt kaardi andmed" + }, + "autoFillIdentity": { + "message": "Täida identiteet" + }, "generatePasswordCopied": { "message": "Genereeri parool (kopeeritakse)" }, @@ -98,10 +199,25 @@ "message": "Kopeeri kohandatud välja nimi" }, "noMatchingLogins": { - "message": "Sobivaid kontoandmeid ei leitud." + "message": "Sobivaid kontoandmeid ei leitud" + }, + "noCards": { + "message": "Kaardid puuduvad" + }, + "noIdentities": { + "message": "Identiteedid puuduvad" + }, + "addLoginMenu": { + "message": "Lisa konto andmed" + }, + "addCardMenu": { + "message": "Lisa kaart" + }, + "addIdentityMenu": { + "message": "Lisa identiteet" }, "unlockVaultMenu": { - "message": "Lukusta hoidla lahti" + "message": "Ava hoidla" }, "loginToVaultMenu": { "message": "Logi hoidlasse sisse" @@ -113,7 +229,19 @@ "message": "Lisa konto andmed" }, "addItem": { - "message": "Lisa kirje" + "message": "Lisa ese" + }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" }, "passwordHint": { "message": "Parooli vihje" @@ -142,14 +270,32 @@ "confirmIdentity": { "message": "Jätkamiseks kinnita oma identiteet." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Muuda Ãŧlemparooli" }, + "continueToWebApp": { + "message": "Jätka veebibrauseris?" + }, + "continueToWebAppDesc": { + "message": "Uuri teisi Bitwardeni konto funktsioone veebirakenduses." + }, + "continueToHelpCenter": { + "message": "Kas soovid minna Abikeskusesse?" + }, + "continueToHelpCenterDesc": { + "message": "Uuri teisigi Bitwardeni kasutusvÃĩimalusi Abikeskuses." + }, + "continueToBrowserExtensionStore": { + "message": "Mine edasi veebilaienduste poodi?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Aita meil jÃĩuda rohkemate inimesteni. KÃŧlasta enda laienduste veebipoodi ja jäta sinna positiivne hinnang." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Ülemparooli saab muuta Bitwardeni veebirakenduses." + }, "fingerprintPhrase": { - "message": "SÃĩrmejälje fraas", + "message": "Unikaalne sÃĩnajada", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { @@ -162,9 +308,45 @@ "logOut": { "message": "Logi välja" }, + "aboutBitwarden": { + "message": "Meist" + }, "about": { "message": "Rakenduse info" }, + "moreFromBitwarden": { + "message": "Rohkem Bitwardeni kohta" + }, + "continueToBitwardenDotCom": { + "message": "Mine edasi bitwarden.com-i?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden Ärikliendile" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwardeni Autentiteerijaga saad sa hoiustada autentiteerimise vÃĩtmeid ja luua TOTP koode kaheastmeliseks kinnitamiseks. Uuri lähemalt veebilehelt bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Hoiusta, halda ja jaga turvaliselt arendajate saladusi läbi Bitwarden Secrets Manageri. Uuri lähemalt veebilehelt bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Loo sujuv ja turvaline kogemus sisselogimisel Passwordless.dev-iga ja ilma traditsiooniliste paroolideta. Uuri lähemalt veebilehelt bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Tasuta Bitwarden Peredele" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Sul on vÃĩimalik saada endale tasuta Bitwarden Families plaan. Lunasta see pakkumine meie veebirakenduses." + }, "version": { "message": "Versioon" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Muuda kausta" }, + "newFolder": { + "message": "Uus kaust" + }, + "folderName": { + "message": "Kausta nimi" + }, + "folderHintText": { + "message": "Kausta teise kasuta panemiseks lisa sihtkausta nimi, millele järgneb \"/\". Näiteks: Sotsiaalmeedia/Foorumid" + }, + "noFoldersAdded": { + "message": "Ei lisanud Ãŧhtegi kausta" + }, + "createFoldersToOrganize": { + "message": "Loo kaustasid, et oma hoidla kirjeid organiseerida" + }, + "deleteFolderPermanently": { + "message": "Kas sa oled kindel, et soovid selle kausta jäädavalt kustutada?" + }, "deleteFolder": { "message": "Kustuta Kaust" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Genereerija", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Loo oma kontodele tugevaid ja unikaalseid paroole." }, - "bitWebVault": { - "message": "Bitwardeni Veebihoidla" + "bitWebVaultApp": { + "message": "Bitwardeni veebirakendus" }, "importItems": { "message": "Impordi andmed" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Loo parool" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Genereeri parool uuesti" }, @@ -244,17 +447,60 @@ "length": { "message": "Pikkus" }, + "passwordMinLength": { + "message": "LÃŧhim lubatud parooli pikkus" + }, "uppercase": { - "message": "Suurtäht (A-Z) " + "message": "Suurtäht (A-Z) ", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Väiketäht (a-z) " + "message": "Väiketäht (a-z) ", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbrid (0-9)" + "message": "Numbrid (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Erimärgid (!@#$%^&*)" + "message": "Erimärgid (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Kasuta", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Kasuta trÃŧkitähti", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Kasuta kirjatähti", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Kasuta numbreid", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Kasuta sÃŧmboleid", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "SÃĩnade arv" @@ -276,7 +522,16 @@ "message": "Vähim arv spetsiaalmärke" }, "avoidAmbChar": { - "message": "Väldi ebamääraseid kirjamärke" + "message": "Väldi ebamääraseid kirjamärke", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Väldi raskesti eristatavaid tähti ja sÃŧmboleid", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Otsi hoidlast" @@ -299,15 +554,30 @@ "password": { "message": "Parool" }, + "totp": { + "message": "Salajane autentikaatori vÃĩti" + }, "passphrase": { "message": "Paroolifraas" }, "favorite": { "message": "Lemmik" }, + "unfavorite": { + "message": "Eemalda lemmikutest" + }, + "itemAddedToFavorites": { + "message": "Ese lisatud lemmikutesse" + }, + "itemRemovedFromFavorites": { + "message": "Ese eemaldatud lemmikutest" + }, "notes": { "message": "Märkmed" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Märkus" }, @@ -326,6 +596,18 @@ "launch": { "message": "Käivita" }, + "launchWebsite": { + "message": "Ava Veebileht" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Veebileht" }, @@ -338,9 +620,24 @@ "other": { "message": "Muu" }, + "unlockMethods": { + "message": "Avamise valikud" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Hoidla ajalÃĩpu tegevuse muutmiseks vali esmalt lahtilukustamise meetod." }, + "unlockMethodNeeded": { + "message": "Määra avamise meetod seadetes" + }, + "sessionTimeoutHeader": { + "message": "Sessiooni ajalÃĩpp" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Muud valikud" + }, "rateExtension": { "message": "Hinda seda laiendust" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Hoidla on lukus. Jätkamiseks sisesta Ãŧlemparool." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Lukusta lahti" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Hoidla ajalÃĩpp" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lukusta paroolihoidla" }, + "lockAll": { + "message": "Lukusta kÃĩik" + }, "immediately": { "message": "Koheselt" }, @@ -426,6 +738,18 @@ "security": { "message": "Turvalisus" }, + "confirmMasterPassword": { + "message": "Kinnita Ãŧlemparool" + }, + "masterPassword": { + "message": "Ülemparool" + }, + "masterPassImportant": { + "message": "Ülemparooli ei saa taastada, kui sa selle unustama peaksid!" + }, + "masterPassHintLabel": { + "message": "Vihje Ãŧlemparoolile" + }, "errorOccurred": { "message": "Ilmnes viga" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Konto on loodud! VÃĩid nÃŧÃŧd sisse logida." }, + "newAccountCreated2": { + "message": "Uus konto loodud!" + }, + "youHaveBeenLoggedIn": { + "message": "Olete sisse logitud!" + }, + "youSuccessfullyLoggedIn": { + "message": "Sisselogimine Ãĩnnestus" + }, + "youMayCloseThisWindow": { + "message": "VÃĩid selle akna sulgeda" + }, "masterPassSent": { "message": "Ülemparooli vihje saadeti sinu e-postile." }, "verificationCodeRequired": { "message": "NÃĩutav on kinnituskood." }, + "webauthnCancelOrTimeout": { + "message": "Autentimine tÃŧhistati vÃĩi kestis liiga kaua aega. Palun proovi uuesti." + }, "invalidVerificationCode": { "message": "Vale kinnituskood" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Automaatne täitmine ebaÃĩnnestus. Palun kopeeri informatsioon käsitsi." }, + "totpCaptureError": { + "message": "Ei Ãĩnnestunud skännida sellelt lehelt QR-kood" + }, + "totpCaptureSuccess": { + "message": "Autentimise vÃĩti on lisatud" + }, + "totpCapture": { + "message": "Skänneeri see QR-kood läbi autentikaatori" + }, + "totpHelperTitle": { + "message": "Muuda 2-astmeline kinnitamine sujuvaks" + }, + "totpHelper": { + "message": "Bitwarden saab hoiustada ja täita 2-astmelise kinnitamise koode. Kopeeri ja kleebi vÃĩti siia." + }, + "totpHelperWithCapture": { + "message": "Bitwarden saab hoiustada ja täita 2-astmelise kinnitamise koode. Vajuta kaamera ikoonile, et teha ekraanipilt autentiteerimise QR koodist vÃĩi kopeeri ja kleebi vÃĩti siia." + }, + "learnMoreAboutAuthenticators": { + "message": "Uuri lähemalt autentikaatorite kohta" + }, + "copyTOTP": { + "message": "Kopeeri autentiteerimise vÃĩti (TOTP)" + }, "loggedOut": { "message": "Välja logitud" }, + "loggedOutDesc": { + "message": "Sa logisid oma kontolt välja." + }, "loginExpired": { "message": "Sessioon on aegunud." }, + "logIn": { + "message": "Logi sisse" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Alusta registreerimist uuesti" + }, + "expiredLink": { + "message": "Aegunud link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Palun alusta registreerimist uuesti vÃĩi proovi sisse logida." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Oled kindel, et soovid välja logida?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Kaust on lisatud" }, - "changeMasterPass": { - "message": "Muuda Ãŧlemparooli" - }, - "changeMasterPasswordConfirmation": { - "message": "Saad oma Ãŧlemparooli muuta bitwarden.com veebihoidlas. Soovid seda kohe teha?" - }, "twoStepLoginConfirmation": { "message": "Kaheastmeline kinnitamine aitab konto turvalisust tÃĩsta. Lisaks paroolile pead kontole ligipääsemiseks kinnitama sisselogimise päringu SMS-ga, telefonikÃĩnega, autentimise rakendusega vÃĩi e-postiga. Kaheastmelist kinnitust saab sisse lÃŧlitada bitwarden.com veebihoidlas. Soovid seda kohe avada?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Kaust on muudetud" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Uus URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Kirje on lisatud" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "KÃŧsi \"Lisa konto andmed\"" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "\"Lisa konto andmed\" teavitus ilmub pärast esimest sisselogimist ning vÃĩimaldab kontoandmeid automaatselt Bitwardenisse lisada." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Kuva \"Kaart\" vaates kaardiandmed" }, "showCardsCurrentTabDesc": { "message": "Kuvab \"Kaart\" vaates kaardiandmeid, et neid saaks kiiresti sisestada" }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Kuva \"Kaart\" vaates identiteete" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Kui veebilehel tuvastatakse olemasolevate andmete muutmine, siis pakutakse nende andmete uuendamist Bitwardenis." }, + "changedPasswordNotificationDescAlt": { + "message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts." + }, + "enableUsePasskeys": { + "message": "KÃŧsi luba pääsuvÃĩtmete salvestamiseks ja kasutamiseks" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Soovid seda parooli ka Bitwardenis uuendada?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Lukusta lahti" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Kuva parema kliki menÃŧÃŧ valikud" }, "contextMenuItemDesc": { "message": "VÃĩimaldab parema kliki menÃŧÃŧs kaustada Bitwardeni valikuid, nt kontoandmete täitmist vÃĩi parooli genereerimist. " }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Vaike URI sobivuse tuvastamine", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Vali vaikeviis, kuidas kirje ja URI sobivus tuvastatakse. Seda kasutatakse näiteks siis, kui lehele Ãŧritatakse automaatselt andmeid sisestada." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Muuda rakenduse värvikujundust." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Tume", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized tume", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Ekspordi hoidla" }, "fileFormat": { "message": "Failivorming" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "HOIATUS", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Jagatud" }, - "learnOrg": { - "message": "Info organisatsioonide kohta" - }, - "learnOrgConfirmation": { - "message": "Bitwarden vÃĩimaldab sul hoidla sisu teiste kasutajatega jagada, kasutades selleks organisatsiooni kontot. Soovid kÃŧlastada lehekÃŧlge bitwarden.com ja selle kohta rohkem lugeda?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Teisalda organisatsiooni" @@ -762,6 +1204,9 @@ "file": { "message": "Fail" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Vali fail." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB ulatuses krÃŧpteeritud salvestusruum." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Bitwardeni premium versiooni saab osta bitwarden.com veebihoidlas. Avan veebihoidla?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Oled premium kasutaja!" }, "premiumCurrentMemberThanks": { "message": "Täname, et toetad Bitwardenit." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "KÃĩik see ainult $PRICE$ / aastas!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Uuendamine lÃĩpetatud" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Autentimise rakendus" }, - "authenticatorAppDesc": { - "message": "Kausta autentimise rakendust (näiteks Authy vÃĩi Google Authenticator), et luua ajal baseeruvaid kinnituskoode.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Turvaline vÃĩti" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Kasuta kontole ligipääsemiseks YubiKey-d. See tÃļÃļtab YubiKey 4, 4 Nano, 4C ja NEO seadmetega." }, - "duoDesc": { - "message": "Kinnita Duo Security abil, kasutades selleks Duo Mobile rakendust, SMS-i, telefonikÃĩnet vÃĩi U2F turvavÃĩtit.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-post" }, - "emailDesc": { - "message": "Kinnituskoodid saadetakse e-postiga." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted Environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premise hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Kohandatud keskkond" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Serveri URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API serveri URL" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "The environment URLs have been saved." }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Luba kontoandmete täitmine" }, "enableAutoFillOnPageLoadDesc": { "message": "Sisselogimise vormi tuvastamisel sisestatakse sinna kontoandmed automaatselt." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Häkitud vÃĩi ebausaldusväärsed veebilehed vÃĩivad lehe laadimisel automaatset sisestamist kuritarvitada." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "Rohkem infot automaattäite kohta" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Ava hoidla kÃŧljeribal" }, - "commandAutofillDesc": { - "message": "Sisesta lehele viimati kasutatud kontoandmed." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Loo ja kopeeri uus juhuslikult koostatud parool lÃĩikelauale." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lukusta hoidla" }, - "privateModeWarning": { - "message": "PrivaatreÅžiimi toetus on katsejärgus, mistÃĩttu mÃĩned funktsioonid on piiratud." - }, "customFields": { "message": "Kohandatud väljad" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Märkeruut" + }, "cfTypeLinked": { "message": "Ühenduses", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Kuvab iga kirje kÃĩrval lehekÃŧlje ikooni." }, + "faviconDescAlt": { + "message": "Näita väikest tuttavat ikooni iga kirje kÃĩrval. Kehtib ka sisselogitud kontodele." + }, "enableBadgeCounter": { "message": "Kuva kirjete arvu" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identiteet" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "Uus $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Paroolide ajalugu" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Tagasi" }, "collections": { "message": "Kogumikud" }, + "nCollections": { + "message": "$COUNT$ kogumikku", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Lemmikud" }, @@ -1282,6 +1874,10 @@ "message": "Baasdomeen", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Serveri nimi [base domain] (soovitatav)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domeeni nimi", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Sobivuse tuvastamine", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Vaike sobivuse tuvastamine", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Valik sisse" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Puuduvad paroolid, mida kuvada." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Eemalda" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Ava PIN-iga" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Määra Bitwardeni lahtilukustamiseks PIN kood. Rakendusest täielikult välja logides nullitakse ka PIN koodi seaded." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "NÃĩutakse PIN koodi." }, "invalidPin": { "message": "Vale PIN kood." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Liiga palju ebaÃĩnnestunud katseid. Login välja." + }, "unlockWithBiometrics": { "message": "Ava biomeetriaga" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Kinnituse ootamine tÃļÃļlaua rakenduselt" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "NÃĩua Ãŧlemparooli, kui brauser taaskäivitatakse" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Pead valima vähemalt Ãŧhe kogumiku." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Organisatsiooni seaded mÃĩjutavad parooli genereerija sätteid." }, + "passwordGenerator": { + "message": "Parooli genereerija" + }, + "usernameGenerator": { + "message": "Kasutajanime genereerija" + }, + "useThisPassword": { + "message": "Kasuta seda parooli" + }, + "useThisUsername": { + "message": "Kasuta seda kasutajanime" + }, + "securePasswordGenerated": { + "message": "Turvaline parool loodud! Ära unusta uuendata seda ka veebisaidil." + }, + "useGeneratorHelpTextPartOne": { + "message": "Kasuta generaatorit", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "et luua tugev ja ainulaadne parool", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Hoidla ajalÃĩpu tegevus" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lukusta", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "PrÃŧgikast", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Kirje on taastatud" }, + "alreadyHaveAccount": { + "message": "On juba konto?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Väljalogimine eemaldab hoidlale ligipääsu ning nÃĩuab pärast ajalÃĩpu perioodi uuesti autentimist. Oled kindel, et soovid seda valikut kasutada?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Täida ja salvesta" }, + "fillAndSave": { + "message": "Täida ja salvesta" + }, "autoFillSuccessAndSavedUri": { "message": "Kirje täideti ja URI salvestati" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Uus Ãŧlemparool ei vasta eeskirjades väljatoodud tingimustele." }, + "receiveMarketingEmailsV2": { + "message": "Soovin saada nÃĩuandeid, uudiseid ja pakkumisi Bitwardenilt oma postkasti." + }, + "unsubscribe": { + "message": "LÃĩpeta tellimus" + }, + "atAnyTime": { + "message": "iga hetk." + }, + "byContinuingYouAgreeToThe": { + "message": "Jätkates nÃĩustud sa" + }, + "and": { + "message": "ja" + }, "acceptPolicies": { "message": "Märkeruudu markeerimisel nÃĩustud järgnevaga:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Juurdepääsukoodi Värskendamine EbaÃĩnnestus" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Ei leidnud värskendamise koodi vÃĩi API vÃĩtit. Palun proovi logida välja ja uuesti sisse." + }, "desktopSyncVerificationTitle": { "message": "TÃļÃļlaua sÃŧnkroonimise kinnitamine" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Kontod ei Ãŧhti" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biomeetria ei ole sisse lÃŧlitatud" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Brauseri biomeetria ei ole selles seadmes toetatud" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biomeetria nurjus" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Organisatsiooni poliitika on seadnud omaniku valikutele piirangu." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Väljajäetud domeenid" }, "excludedDomainsDesc": { "message": "Nendel domeenidel Bitwarden paroolide salvestamise valikut ei paku. Muudatuste jÃĩustamiseks pead lehekÃŧlge värskendama." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ei ole Ãĩige domeen.", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Otsi Sende", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fail" }, @@ -1666,6 +2406,9 @@ "message": "KÃĩik Sendid", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Maksimaalne ligipääsude arv on saavutatud", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Parooliga kaitstud" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Kopeeri Sendi link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Soovid tÃĩesti selle Sendi kustutada?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Muuda Sendi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send kustutatakse määratud kuupäeval ja kellaajal jäädavalt.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Aegumiskuupäev" }, @@ -1769,6 +2523,10 @@ "message": "Soovi korral nÃĩua parooli, millega Sendile ligi pääseb.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Privaatne märkus selle Sendi kohta.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send on loodud", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Muudetud", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Faili valimiseks ava rakendus kÃŧlgribal (kui see on vÃĩimalik) vÃĩi kasuta hÃŧpikakent, klikkides sellel bänneril." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Faili valimiseks läbi Safari kasuta Bitwardeni hÃŧpikakent (klikkides sellel bänneril)." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Enne alustamist" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Ära näita saajatele minu e-posti aadressi." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Organisatsiooni seaded mÃĩjutavad sinu Sendi sätteid." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Vajalik on e-posti kinnitamine" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "Selle funktsiooni kasutamiseks pead kinnitama oma e-posti aadressi. Saad seda teha veebihoidlas." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Sinu Ãŧlemparool ei vasta Ãŧhele vÃĩi rohkemale organisatsiooni poolt seatud poliitikale. Hoidlale ligipääsemiseks pead oma Ãŧlemaprooli uuendama. Jätkamisel logitakse sind praegusest sessioonist välja, mistÃĩttu pead uuesti sisse logima. Teistes seadmetes olevad aktiivsed sessioonid aeguvad umbes Ãŧhe tunni jooksul." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automaatne liitumine" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Vali kaust..." }, - "ssoCompleteRegistration": { - "message": "SSO-ga sisselogimise kinnitamiseks tuleb määrata Ãŧlemparool. See kaitseb sinu hoidlat ning vÃĩimaldab sellele ligi pääseda." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Tundi" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutit" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Organisatsiooni poliitikad mÃĩjutavad sinu hoidla ajalÃĩppu. Maksimaalne lubatud hoidla ajalÃĩpp on $HOURS$ tund(i) ja $MINUTES$ minut(it)", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Organisatsiooni poliitikad mÃĩjutavad sinu hoidla ajalÃĩppu. Maksimaalne lubatud hoidla ajalÃĩpp on $HOURS$ tund(i) ja $MINUTES$ minut(it). Sinu hoidla ajalÃĩpu tegevus on $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Viga" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Genereeri kasutajanimi" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Kasutajanime tÃŧÃŧp" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Genereeri e-posti alias, kasutades selleks välist teenuspakkujat." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hosti nimi", "description": "Part of a URL." @@ -2138,10 +3142,10 @@ "message": "Bitwardeni rakenduse seadistuses peab olema konfigureeritud sisselogimine läbi seadme. Vajad teist valikut?" }, "fingerprintPhraseHeader": { - "message": "SÃĩrmejälje fraas" + "message": "Unikaalne sÃĩnajada" }, "fingerprintMatchInfo": { - "message": "Veendu, et hoidla on lahti lukustatud ja sÃĩrmejälje fraasid seadmete vahel Ãŧhtivad." + "message": "Veendu, et hoidla on lahti lukustatud ja unikaalne sÃĩnajada Ãŧhtib teiste seadmetega." }, "resendNotification": { "message": "Saada märguanne uuesti" @@ -2192,7 +3196,7 @@ "message": "Kuidas automaatselt täita" }, "autofillSelectInfoWithCommand": { - "message": "Vali sellele lehelt kirje vÃĩi kasuta otseteed: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Vali sellelt lehelt kirje vÃĩi määra seadetes otsetee." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Selge" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Automaattäite seaded" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "Automaattäite klaviatuuri otseteed" }, - "autofillShortcutNotSet": { - "message": "Automaattäite otsetee pole määratud. Muuda seda brauseri seadetes." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "Automaattäite otsetee on: $COMMAND$. Saad seda brauseri seadetes muuta.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Sisselogimas kui" - }, "opensInANewWindow": { "message": "Avaneb uues aknas" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "NÃĩutav on organisatsiooni SSO identifikaator." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EL", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Ligipääs keelatud. Sul pole lubatud seda lehekÃŧlge vaadata." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Seade on usaldusväärne" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Sisestus on nÃĩutav." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Vali --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Peida", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Impordin andmed Bitwardenisse?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Kaitse oma LastPassi andmeid ja impordi need Bitwardenisse?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Salvesta ilma krÃŧpteeringuta failina", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Impordi Bitwardenisse", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importimine...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Andmed on edukalt imporditud!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Ilmnes viga. Vaata täpsemaid andmeid konsoolist.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Importimisel ilmnes vÃĩrgu viga.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domeen" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Pääsukoodi ei kopeerita" + }, + "passkeyNotCopiedAlert": { + "message": "Pääsukoodi ei kopeerita kloonitud kirjele. Oled kindel, et soovid jätkata?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Eemalda pääsuvÃĩti" + }, + "passkeyRemoved": { + "message": "PääsuvÃĩti on eemaldatud" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index a57b243a923..60525eb50f3 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Pasahitz kudeatzailea", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden, zure gailu guztietarako pasahitzen kudeatzaile seguru eta doakoa da.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Saioa hasi edo sortu kontu berri bat zure kutxa gotorrera sartzeko." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Sortu kontua" }, - "login": { - "message": "Hasi saioa" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enpresentzako saio hasiera bakarra" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Pasahitz nagusia ahazten baduzu, pista batek pasahitza gogoratzen lagunduko dizu." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Idatzi berriro pasahitz nagusia" }, "masterPassHint": { "message": "Pasahitz nagusirako pista (aukerakoa)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Fitxak" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopiatu pasahitza" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Kopiatu oharra" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopiatu segurtasun-kodea" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-betetzea" }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Auto-bete txartela" + }, + "autoFillIdentity": { + "message": "Auto-bete nortasuna" + }, "generatePasswordCopied": { "message": "Sortu pasahitza (kopiatuta)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Bat datozen saio-hasierarik gabe" }, + "noCards": { + "message": "Txartelik ez" + }, + "noIdentities": { + "message": "Nortasunik ez" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Gehitu txartela" + }, + "addIdentityMenu": { + "message": "Gehitu nortasuna" + }, "unlockVaultMenu": { "message": "Desblokeatu kutxa gotorra" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Gehitu elementua" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pasahitza gogoratzeko pista" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Jarraitzeko, berretsi zure identitatea." }, - "account": { - "message": "Kontua" - }, "changeMasterPassword": { "message": "Aldatu pasahitz nagusia" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Hatz-marka digitalaren esaldia", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Itxi saioa" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Honi buruz" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "\nBertsioa" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Editatu Karpeta" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Ezabatu karpeta" }, @@ -199,10 +399,10 @@ "message": "Bitwarden Laguntza zentroa" }, "communityForums": { - "message": "Explore Bitwarden community forums" + "message": "Esploratu Bitwarden komunitatearen foroak" }, "contactSupport": { - "message": "Contact Bitwarden support" + "message": "Jarri harremanetan Bitwardeneko laguntza taldearekin" }, "sync": { "message": "Sinkronizatu" @@ -218,13 +418,13 @@ }, "generator": { "message": "Sortzailea", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatikoki pasahitz sendo eta bakarrak sortzen ditu zure saio-hasieratarako." }, - "bitWebVault": { - "message": "Bitwarden kutxa gotorra" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Inportatu elementuak" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Sortu pasahitza" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Berrezarri pasahitza" }, @@ -244,17 +447,60 @@ "length": { "message": "Luzera" }, + "passwordMinLength": { + "message": "Pasahitzaren gutxieneko luzera" + }, "uppercase": { - "message": "Letra larria (A-Z)" + "message": "Letra larria (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Letra txikia (a-z)" + "message": "Letra txikia (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Zenbakiak (0-9)" + "message": "Zenbakiak (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Karaktere bereziak (!@#$%^&*)" + "message": "Karaktere bereziak (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Hitz kopurua" @@ -276,7 +522,16 @@ "message": "Gutxieneko karaktere bereziak" }, "avoidAmbChar": { - "message": "Saihestu karaktere anbiguoak" + "message": "Saihestu karaktere anbiguoak", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Bilatu kutxa gotorrean" @@ -299,15 +554,30 @@ "password": { "message": "Pasahitza" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Pasaesaldia" }, "favorite": { "message": "Gogokoa" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Oharrak" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Oharra" }, @@ -326,6 +596,18 @@ "launch": { "message": "Abiarazi" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Webgunea" }, @@ -338,9 +620,24 @@ "other": { "message": "Bestelakoak" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Baloratu gehigarria" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Zure kutxa gotorra blokeatuta dago. Egiaztatu zure identitatea jarraitzeko." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Desblokeatu" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Kutxa gotorraren itxaronaldia" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Blokeatu orain" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Berehala" }, @@ -426,6 +738,18 @@ "security": { "message": "Segurtasuna" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "Akats bat gertatu da" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Zure kontua egina dago. Orain saioa has dezakezu." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "Mezu elektroniko bat bidali dizugu zure pasahitz nagusiaren pistarekin." }, "verificationCodeRequired": { "message": "Egiaztatze-kodea behar da." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Egiaztatze-kodea ez da baliozkoa" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Ezin izan da orri honetan hautatutako elementua auto-bete. Kopiatu eta itsatsi informazioa dagokion tokian." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "Saioa itxita" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Saioa amaitu da." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Ziur zaude saioa itxi nahi duzula?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Karpeta gehituta" }, - "changeMasterPass": { - "message": "Aldatu pasahitz nagusia" - }, - "changeMasterPasswordConfirmation": { - "message": "Zure pasahitz nagusia alda dezakezu bitwarden.com webgunean. Orain joan nahi duzu webgunera?" - }, "twoStepLoginConfirmation": { "message": "Bi urratseko saio hasiera dela eta, zure kontua seguruagoa da, beste aplikazio/gailu batekin saioa hastea eskatzen baitizu; adibidez, segurtasun-gako, autentifikazio-aplikazio, SMS, telefono dei edo email bidez. Bi urratseko saio hasiera bitwarden.com webgunean aktibatu daiteke. Orain joan nahi duzu webgunera?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Karpeta editatuta" }, @@ -552,6 +936,10 @@ "newUri": { "message": "URI berria" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Elementua gehituta" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Galdetu saio-hasiera gehitzeko" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Elementu bat gehitu nahi duzun galdetu, elementu hau zure kutxa gotorrean ez badago." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Erakutsi txartelak fitxa orrian" }, "showCardsCurrentTabDesc": { "message": "Erakutsi elementuen txartelak fitxa orrian, erraz auto-betetzeko." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Erakutsi identitateak fitxa orrian" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Galdetu saio-hasiera baten pasahitza eguneratzeko, webgune batean aldaketaren bat atzematen denean." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Bitwardenen pasahitz hau eguneratu nahi duzu?" }, @@ -634,20 +1043,26 @@ "message": "Eguneratu" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Erakutsi laster-menuko aukerak" }, "contextMenuItemDesc": { "message": "Erabili bigarren mailako klika webgunerako pasahitzak eta saio-hasierak sortzeko." }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Lehenetsitako detekzioa URI kointzidentziarako", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Hautatu auto-betetzea bezalako saio-hasierako ekintzetarako erabiliko den URI kointzidentzia detektatzeko modu lehenetsia." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Aldatu aplikaziorako kolore gaia." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Iluna", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized iluna", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Esportatu kutxa gotorra" }, "fileFormat": { "message": "Fitxategiaren formatua" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "KONTUZ", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Partekatua" }, - "learnOrg": { - "message": "Erakundeak ezagutu" - }, - "learnOrgConfirmation": { - "message": "Bitwardek kutxa gotorreko elementuak beste batzuekin partekatzeko aukera ematen dizu erakunde bat erabiliz. Gehiago jakiteko, bitwarden.com webgunea bisitatu nahi duzu?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Mugitu erakundera" @@ -762,6 +1204,9 @@ "file": { "message": "Fitxategia" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Hautatu fitxategia." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "Eranskinentzako 1GB-eko zifratutako biltegia." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Zure premium bazkidetza bitwarden.com webguneko kutxa gotorrean ordaindu dezakezu. Orain bisitatu nahi duzu webgunea?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Premium bazkide zara!" }, "premiumCurrentMemberThanks": { "message": "Eskerrik asko Bitwarden babesteagatik." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "Dena, urtean $PRICE$gatik!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Eguneratzea eginda" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Autentifikazio aplikazioa" }, - "authenticatorAppDesc": { - "message": "Erabili autentifikazio aplikazio bat (adibidez, Authy edo Google Authenticator) denboran oinarritutako egiaztatze-kodeak sortzeko.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP segurtasun-gakoa" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Erabili YubiKey zure kontuan sartzeko. YubiKey 4, 4 Nano, 4C eta NEO gailuekin dabil." }, - "duoDesc": { - "message": "Egiaztatu Duo Securityrekin Duo Mobile aplikazioa, SMS, telefono deia edo U2F segurtasun-gakoa erabiliz.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Emaila" }, - "emailDesc": { - "message": "Egiaztatze-kodeak email bidez bidaliko dira." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Ostatze ingurune propioa" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Bitwarden instalatzeko, zehaztu ostatatze propioaren oinarrizko URL-a." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Ingurune pertsonalizatua" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Zerbitzariaren URL-a" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API zerbitzariaren URL-a" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "Inguruneko URL-ak gorde dira." }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Itzalita", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Auto-bete orrialdea kargatzean" }, "enableAutoFillOnPageLoadDesc": { "message": "Saio-hasierako formulario bat detektatzen bada, auto-bete webgunea kargatzen denean." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Saio-hasierako elementuetarako lehenetsitako auto-betetzearen konfigurazioa" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Alboko barran ireki kutxa gotorra" }, - "commandAutofillDesc": { - "message": "Uneko webgunerako erabilitako azken saio-hastea auto-bete" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Zorizko pasahitz berria sortu eta kopiatu arbelean" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Blokeatu kutxa gotorra" }, - "privateModeWarning": { - "message": "Modu pribatuko euskarria esperimentala da eta ezaugarri batzuk mugatuak dira." - }, "customFields": { "message": "Eremu pertsonalizatuak" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolearra" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Lotuta", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Erakutsi irudi bat saio-hasiera bakoitzaren ondoan." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Erakutsi txartelen kontagailua" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitatea" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Pasahitz historia" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Itzuli" }, "collections": { "message": "Bildumak" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Gogokoak" }, @@ -1282,6 +1874,10 @@ "message": "Oinarrizko domeinua", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domeinu izena", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Detekzio modua", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Lehenetsitako detekzio modua", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Txandaketa aukerak" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Ez dago erakusteko pasahitzik." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Ezabatu" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "PIN-arekin desblokeatu" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Ezarri zure PIN kodea Bitwarden desblokeatzeko. Zure PIN-aren konfigurazioa berrezarriko da, noizbait aplikaziotik erabat saioa ixten baduzu." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN-a beharrezkoa da." }, "invalidPin": { "message": "PIN baliogabea." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Desblokeatu biometria erabiliz" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Mahaigainaren aldetiko berrespenaren zain" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Nabigatzailea berrabiaraztean pasahitz nagusiarekin blokeatu" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Gutxienez bilduma bat aukeratu behar duzu." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Erakundeko politika batek edo gehiagok sortzailearen konfigurazioari eragiten diote." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Kutxa gotorraren itxaronaldiaren ekintza" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Blokeatu", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Zakarrontzia", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Elementua berreskuratua" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Saioa ixteak kutxa gotorreko sarrera guztia kenduko du eta itxaronaldiaren ondoren lineako autentifikazioa eskatuko du. Ziur zaude hau egin nahi duzula?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Auto-bete eta gorde" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Elementua auto-betea eta URIa gordeta" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1489,10 +2144,10 @@ "message": "Ezarri pasahitz nagusia" }, "currentMasterPass": { - "message": "Current master password" + "message": "Oraingo pasahitz nagusia" }, "newMasterPass": { - "message": "New master password" + "message": "Pasahitz nagusi berria" }, "confirmNewMasterPass": { "message": "Confirm new master password" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Zure pasahitz nagusi berriak ez ditu baldintzak betetzen." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "Laukitxo hau markatzean, honakoa onartzen duzu:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ados" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Mahaigaineko sinkronizazioaren egiaztatzea" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Kontu ezberdinak dira" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometria desgaitua" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Nabigatzailearen biometria ezin da gailu honetan erabili." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Erakunde politika batek, jabetza aukerei eragiten die." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Kanporatutako domeinuak" }, "excludedDomainsDesc": { "message": "Bitwardenek ez du eskatuko domeinu horietarako saio-hasierako xehetasunak gordetzea. Orrialdea eguneratu behar duzu aldaketek eragina izan dezaten." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ez da onartutako domeinu bat", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send-ak bilatu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Testua" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fitxategia" }, @@ -1666,6 +2406,9 @@ "message": "Send guztiak", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Sarbide kopuru maximoa gaindituta", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Pasahitz babestua" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Send esteka kopiatu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Ziur al zaude Send hau ezabatu nahi duzula?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Editatu Send-a", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send-a betiko ezabatuko da zehaztutako datan eta orduan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Iraungitze data" }, @@ -1769,6 +2523,10 @@ "message": "Nahi izanez gero, pasahitza eskatu erabiltzaileak Send honetara sar daitezen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Send honi buruzko ohar pribatuak.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send-a sortua", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send-a editatua", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Fitxategi bat aukeratzeko, ireki gehigarria alboko barran (ahal bada) edo atera leiho berri batera banner honetan klik eginez." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Safari erabiliz fitxategi bat aukeratzeko, ireki beste leiho bat banner hau sakatuz." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Hasi aurretik" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Ezkutatu nire emaila hartzaileei." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Erakundeko politika batek edo gehiagok Send-eko aukerei eragiten diote." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Egiaztapen emaila beharrezkoa da" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "Emaila egiaztatu behar duzu funtzio hau erabiltzeko. Emaila web-eko kutxa gotorrean egiazta dezakezu." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Izen-emate automatikoa" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Hautatu karpeta..." }, - "ssoCompleteRegistration": { - "message": "SSO-rekin saioa hasteko, mesedez, ezarri pasahitz nagusi bat kutxa gotorrera sartu eta babesteko." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Ordu" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutu" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Zure erakundearen politikek zure itxaronaldiari eragiten diote. Itxaronaldiak gehienez ere $HOURS$ ordu eta $MINUTES$ minutu izango ditu", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Akatsa" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Sortu erabiltzaile izena" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Erabiltzaile izen mota" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Emaileko ezizen bat sortu kanpoko bidalketa zerbitzu batekin." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Ostalariaren izena", "description": "Part of a URL." @@ -2144,10 +3148,10 @@ "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." }, "resendNotification": { - "message": "Resend notification" + "message": "Berbidali jakinarazpena" }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "Ikusi erregistro guztiak ezarpenetan" }, "notificationSentDevice": { "message": "A notification has been sent to your device." @@ -2171,13 +3175,13 @@ "message": "Check known data breaches for this password" }, "important": { - "message": "Important:" + "message": "Garrantzitsua:" }, "masterPasswordHint": { "message": "Your master password cannot be recovered if you forget it!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ karaktere gutxienez", "placeholders": { "length": { "content": "$1", @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { - "message": "Got it" + "message": "Ulertuta" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,76 +3246,96 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "Leiho berri batean irekitzen da" }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Gogoratu gailu hau" }, "uncheckIfPublicDevice": { "message": "Uncheck if using a public device" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Onartu zure beste gailutik" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Eskatu administratzailearen onarpena" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Onartu pasahitz nagusiarekin" }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, "general": { - "message": "General" + "message": "Orokorra" }, "display": { - "message": "Display" + "message": "Bistaratzea" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "Kontua zuzen sortu da!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "Administratzailearen onarpena eskatuta" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Zure eskaera zure administratzaileari bidali zaio." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "Jakinaraziko zaizu onartzen denean." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "Arazoak saioa hasterakoan?" }, "loginApproved": { "message": "Login approved" }, "userEmailMissing": { - "message": "User email missing" + "message": "Erabiltzailearen emaila falta da" }, "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Inportatzen...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Datuak zuzen inportatu dira!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Errorea gertatu da inportatzean. Begiratu xehetasunak kontsolan.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Sareko errorea gertatu da inportatzerakoan.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Ez dago elementurik erakusteko", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Elementu berria", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Piztu" + }, + "ignore": { + "message": "Ezikusi" + }, + "importData": { + "message": "Inportatu datuak", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Errorea inportatzerakoan" + }, + "importErrorDesc": { + "message": "Inportatzen saiatu zaren datuekin arazo bat egon da. Mesedez, konpondu ondoren adierazten diren akatsak eta saiatu berriro." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Konpondu beheko akatsak eta saiatu berriro." + }, + "description": { + "message": "Deskribapena" + }, + "importSuccess": { + "message": "Datuak zuzen inportatu dira" + }, + "importSuccessNumberOfItems": { + "message": "Guztira $AMOUNT$ elementu inportatu dira.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Saiatu berriro" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Egiaztatu biometria erabiliz" + }, + "awaitingConfirmation": { + "message": "Baieztapenaren zain" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Erabili pasahitz nagusia" + }, + "usePin": { + "message": "Erabili PIN kodea" + }, + "useBiometrics": { + "message": "Erabili biometria" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Guztira" + }, + "importWarning": { + "message": "$ORGANIZATION$(e)ra datuak inportatzen ari zara. Zure datuak erakunde horretako kideekin parteka daitezke. Jarraitu nahi duzu?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Berretsi" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index a6c4f2652c0..1f050f7e0ce 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Ų…Ø¯ÛŒØąÛŒØĒ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą ØąØ§ÛŒÚ¯Ø§Ų†", + "message": "Ų…Ø¯ÛŒØąÛŒØĒ ØąŲ…Ø˛ ØšØ¨ŲˆØą Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "یڊ Ų…Ø¯ÛŒØąÛŒØĒ ÚŠŲ†Ų†Ø¯Ų‡ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą ØąØ§ÛŒÚ¯Ø§Ų† Ø¨ØąØ§ÛŒ ØĒŲ…Ø§Ų…ÛŒ Ø¯ØŗØĒÚ¯Ø§Ų‡â€ŒŲ‡Ø§ÛŒØĒØ§Ų†.", - "description": "Extension description" + "message": "Ø¯Øą ØŽØ§Ų†Ų‡ØŒ Ų…Ø­Ų„ ÚŠØ§Øą ؈ Ų‡Øą ÚŠØŦای Ø¯ÛŒÚ¯ØąØŒ Bitwarden Ø¨Ų‡ ØąØ§Ø­ØĒی Ų‡Ų…Ų‡â€Œ ØąŲ…Ø˛Ų‡Ø§ ؈ ÚŠŲ„ÛŒØ¯Ų‡Ø§ÛŒ ØšØ¨ŲˆØąØŒ ؈ Ø§ØˇŲ„Ø§ØšØ§ØĒ Ø­ØŗØ§Øŗ Ø´Ų…Ø§ ØąØ§ Ø§ÛŒŲ…Ų† Ų…ÛŒâ€ŒÚŠŲ†Ø¯", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "ŲˆØ§ØąØ¯ Ø´ŲˆÛŒØ¯ یا یڊ Ø­ØŗØ§Ø¨ ÚŠØ§ØąØ¨ØąÛŒ Ø¨ØŗØ§Ø˛ÛŒØ¯ ØĒا Ø¨Ų‡ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø§Ų…Ų†ØĒØ§Ų† Ø¯ØŗØĒØąØŗÛŒ یابید." + "message": "ŲˆØ§ØąØ¯ Ø´ŲˆÛŒØ¯ یا یڊ Ø­ØŗØ§Ø¨ ÚŠØ§ØąØ¨ØąÛŒ Ø¨ØŗØ§Ø˛ÛŒØ¯ ØĒا Ø¨Ų‡ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø§Ų…Ų†â€ŒØĒØ§Ų† Ø¯ØŗØĒØąØŗÛŒ یابید." + }, + "inviteAccepted": { + "message": "Invitation accepted" }, "createAccount": { "message": "ایØŦاد Ø­ØŗØ§Ø¨ ÚŠØ§ØąØ¨ØąÛŒ" }, - "login": { - "message": "ŲˆØąŲˆØ¯" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "ØĒŲ†Ø¸ÛŒŲ… ØąŲ…Ø˛ ØšØ¨ŲˆØą Ų‚ŲˆÛŒ" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "ایØŦاد Ø­ØŗØ§Ø¨ ØŽŲˆØ¯ ØąØ§ با ØĒŲ†Ø¸ÛŒŲ… ØąŲ…Ø˛ ØšØ¨ŲˆØą ØĒÚŠŲ…ÛŒŲ„ ÚŠŲ†ÛŒØ¯" }, "enterpriseSingleSignOn": { "message": "ŲˆØąŲˆØ¯ Ø¨Ų‡ ØŗÛŒØŗØĒŲ… ŲžØąŲˆÚ˜Ų‡" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "یادØĸŲˆØą ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ ÚŠŲ…ÚŠ Ų…ÛŒâ€ŒÚŠŲ†Ø¯ Ø¯Øą ØĩŲˆØąØĒ ŲØąØ§Ų…ŲˆØ´ÛŒ ØĸŲ† ØąØ§ Ø¨Ų‡ یاد Ø¨ÛŒØ§ØąÛŒØ¯." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Ų†ŲˆØ´ØĒŲ† Ø¯ŲˆØ¨Ø§ØąŲ‡ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ" }, "masterPassHint": { "message": "یادØĸŲˆØą ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ (ا؎ØĒÛŒØ§ØąÛŒ)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Ø˛Ø¨Ø§Ų†Ų‡" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "ÚŠŲžÛŒ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "ÚŠŲžÛŒ یادداشØĒ" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "ÚŠŲžÛŒ ڊد Ø§Ų…Ų†ÛŒØĒی" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą" }, + "autoFillLogin": { + "message": "ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą ŲˆØąŲˆØ¯" + }, + "autoFillCard": { + "message": "ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą ÚŠØ§ØąØĒ" + }, + "autoFillIdentity": { + "message": "ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą Ų‡ŲˆÛŒØĒ" + }, "generatePasswordCopied": { "message": "ØŗØ§ØŽØĒ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą (ÚŠŲžÛŒ شد)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "ŲˆØąŲˆØ¯ÛŒâ€ŒŲ‡Ø§ Ų…Ų†ØĒØˇØ¨Ų‚ Ų†ÛŒØŗØĒ" }, + "noCards": { + "message": "ÚŠØ§ØąØĒی ؈ØŦŲˆØ¯ Ų†Ø¯Ø§ØąØ¯" + }, + "noIdentities": { + "message": "Ų‡ŲˆÛŒØĒی ؈ØŦŲˆØ¯ Ų†Ø¯Ø§ØąØ¯" + }, + "addLoginMenu": { + "message": "Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØąŲˆØ¯" + }, + "addCardMenu": { + "message": "Ø§ŲØ˛ŲˆØ¯Ų† ÚŠØ§ØąØĒ" + }, + "addIdentityMenu": { + "message": "Ø§ŲØ˛ŲˆØ¯Ų† Ų‡ŲˆÛŒØĒ" + }, "unlockVaultMenu": { "message": "؂؁؄ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ ØŽŲˆØ¯ ØąØ§ Ø¨Ø§Ø˛ ÚŠŲ†ÛŒØ¯" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Ø§ŲØ˛ŲˆØ¯Ų† Ų…ŲˆØąØ¯" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "یادØĸŲˆØą ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Ø¨ØąØ§ÛŒ Ø§Ø¯Ø§Ų…Ų‡ØŒ Ų‡ŲˆÛŒØĒ ØŽŲˆØ¯ ØąØ§ ØĒØŖÛŒÛŒØ¯ ÚŠŲ†ÛŒØ¯." }, - "account": { - "message": "Ø­ØŗØ§Ø¨" - }, "changeMasterPassword": { "message": "ØĒØēÛŒÛŒØą ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "ŲˆÛŒÚ˜Ú¯ÛŒâ€ŒŲ‡Ø§ÛŒ بیشØĒØą Ø­ØŗØ§Ø¨ Bitwarden ØŽŲˆØ¯ ØąØ§ Ø¯Øą Ø¨ØąŲ†Ø§Ų…Ų‡ ŲˆØ¨ ÚŠØ§ŲˆØ´ ÚŠŲ†ÛŒØ¯." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Ø¯ØąØ¨Ø§ØąŲ‡ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Bitwarden Ø¯Øą Ų…ØąÚŠØ˛ ØąØ§Ų‡Ų†Ų…Ø§ بیشØĒØą Ø¨ÛŒØ§Ų…ŲˆØ˛ÛŒØ¯." + }, + "continueToBrowserExtensionStore": { + "message": "Øĸیا Ų…ÛŒØŽŲˆØ§Ų‡ÛŒØ¯ Ø¨Ų‡ ŲØąŲˆØ´Ú¯Ø§Ų‡ Ø§ŲØ˛ŲˆŲ†Ų‡ Ų…ØąŲˆØąÚ¯Øą Ø§Ø¯Ø§Ų…Ų‡ Ø¯Ų‡ÛŒØ¯?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Ø¨Ų‡ Ø¯ÛŒÚ¯ØąØ§Ų† ÚŠŲ…ÚŠ ÚŠŲ†ÛŒØ¯ ØĒا Ø¨ŲŲ‡Ų…Ų†Ø¯ Øĸیا Bitwarden Ø¨ØąØ§ÛŒØ´Ø§Ų† Ų…Ų†Ø§ØŗØ¨ Ø§ØŗØĒ یا Ų†Ų‡. Ø¨Ų‡ ŲØąŲˆØ´Ú¯Ø§Ų‡ Ø§ŲØ˛ŲˆŲ†Ų‡ Ų…ØąŲˆØąÚ¯Øą ØŽŲˆØ¯ Ø¨ØąŲˆÛŒØ¯ ؈ Ų†Ø¸Øą ØŽŲˆØ¯ ØąØ§ Ø¨Ų‡ اشØĒØąØ§ÚŠ Ø¨Ú¯Ø°Ø§ØąÛŒØ¯." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "ØšØ¨Ø§ØąØĒ اØĢØą Ø§Ų†Ú¯Ø´ØĒ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ØŽØąŲˆØŦ" }, + "aboutBitwarden": { + "message": "Ø¯ØąØ¨Ø§ØąŲ‡ Bitwarden" + }, "about": { "message": "Ø¯ØąØ¨Ø§ØąŲ‡" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden Ø¨ØąØ§ÛŒ ÚŠØŗØ¨ ؈ ÚŠØ§ØąŲ‡Ø§" + }, + "bitwardenAuthenticator": { + "message": "ØĒØ§ÛŒÛŒØ¯ÚŠŲ†Ų†Ø¯Ų‡ Ų‡ŲˆÛŒØĒ Bitwarden" + }, + "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" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "ØŽØ§Ų†ŲˆØ§Ø¯Ų‡â€ŒŲ‡Ø§ÛŒ ØąØ§ÛŒÚ¯Ø§Ų† Bitwarden" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Ų†ØŗØŽŲ‡" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "ŲˆŲŠØąØ§ŲŠØ´ ŲžŲˆØ´Ų‡" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Ø­Ø°Ų ŲžŲˆØ´Ų‡" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ØĒŲˆŲ„ÛŒØ¯ ÚŠŲ†Ų†Ø¯Ų‡", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Ø¨Ų‡ ØˇŲˆØą ØŽŲˆØ¯ÚŠØ§Øą ÚŠŲ„Ų…Ų‡â€ŒŲ‡Ø§ÛŒ ØšØ¨ŲˆØą Ų‚ŲˆÛŒ ؈ Ų…Ų†Ø­ØĩØą Ø¨Ų‡ ŲØąØ¯ Ø¨ØąØ§ÛŒ ŲˆØąŲˆØ¯ Ø¨Ų‡ ØŗÛŒØŗØĒŲ… ØŽŲˆØ¯ ایØŦاد ÚŠŲ†ÛŒØ¯." }, - "bitWebVault": { - "message": "Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ ŲˆØ¨ Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Ø¯ØąŲˆŲ† ØąÛŒØ˛ÛŒ Ų…ŲˆØ§ØąØ¯" @@ -235,6 +435,9 @@ "generatePassword": { "message": "ØĒŲˆŲ„ÛŒØ¯ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "ØĒŲˆŲ„ÛŒØ¯ Ų…ØŦدد ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą" }, @@ -244,17 +447,60 @@ "length": { "message": "ØˇŲˆŲ„" }, + "passwordMinLength": { + "message": "Ø­Ø¯Ø§Ų‚Ų„ ØˇŲˆŲ„ Ú¯Ø°ØąŲˆØ§Ú˜Ų‡" + }, "uppercase": { - "message": "Ø­ØąŲˆŲ Ø¨Ø˛ØąÚ¯ (A-Z)" + "message": "Ø­ØąŲˆŲ Ø¨Ø˛ØąÚ¯ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Ø­ØąŲˆŲ ÚŠŲˆÚ†ÚŠ (a-z)" + "message": "Ø­ØąŲˆŲ ÚŠŲˆÚ†ÚŠ (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "اؚداد (â€Ē0-9â€Ŧ)" + "message": "اؚداد (â€Ē0-9â€Ŧ)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Ų†ŲˆÛŒØŗŲ‡â€ŒŲ‡Ø§ÛŒ ŲˆÛŒÚ˜Ų‡ (!@#$%^&*)" + "message": "Ų†ŲˆÛŒØŗŲ‡â€ŒŲ‡Ø§ÛŒ ŲˆÛŒÚ˜Ų‡ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ØĒؚداد ÚŠŲ„Ų…Ø§ØĒ" @@ -276,7 +522,16 @@ "message": "Ø­Ø¯Ø§Ų‚Ų„ Ø­ØąŲ ؎اØĩ" }, "avoidAmbChar": { - "message": "Ø§Ø˛ ÚŠØ§ØąØ§ÚŠØĒØąŲ‡Ø§ÛŒ Ų…Ø¨Ų‡Ų… اØŦØĒŲ†Ø§Ø¨ ÚŠŲ†" + "message": "Ø§Ø˛ ÚŠØ§ØąØ§ÚŠØĒØąŲ‡Ø§ÛŒ Ų…Ø¨Ų‡Ų… اØŦØĒŲ†Ø§Ø¨ ÚŠŲ†", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ØŦØŗØĒØŦŲˆÛŒ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚" @@ -299,15 +554,30 @@ "password": { "message": "ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "ØšØ¨Ø§ØąØĒ ØšØ¨ŲˆØą" }, "favorite": { "message": "Ų…ŲˆØąØ¯ ØšŲ„Ø§Ų‚Ų‡" }, + "unfavorite": { + "message": "Ø­Ø°Ų Ø§Ø˛ ØšŲ„Ø§ÛŒŲ‚" + }, + "itemAddedToFavorites": { + "message": "Ø¨Ų‡ Ų…ŲˆØ§ØąØ¯ Ų…ŲˆØąØ¯ ØšŲ„Ø§Ų‚Ų‡ Ø§ŲØ˛ŲˆØ¯Ų‡ شد" + }, + "itemRemovedFromFavorites": { + "message": "Ø§Ø˛ ØšŲ„Ø§ÛŒŲ‚ Ø­Ø°Ų شد" + }, "notes": { "message": "یادداشØĒâ€ŒŲ‡Ø§" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "یادداشØĒ" }, @@ -326,6 +596,18 @@ "launch": { "message": "ØąØ§Ų‡ Ø§Ų†Ø¯Ø§Ø˛ÛŒ" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ŲˆØ¨â€ŒØŗØ§ÛŒØĒ" }, @@ -338,9 +620,24 @@ "other": { "message": "ØŗØ§ŲŠØą" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "یڊ ØąŲˆØ´ Ø¨Ø§Ø˛Ú¯Ø´Ø§ÛŒÛŒ Ø¨ØąØ§ÛŒ ŲžØ§ÛŒØ§Ų† Ø˛Ų…Ø§Ų† Ų…ØŦØ§Ø˛ ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ÛŒØ¯." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "ØŗØ§ÛŒØą Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§" + }, "rateExtension": { "message": "Ø¨Ų‡ Ø§ÛŒŲ† Ø§ŲØ˛ŲˆŲ†Ų‡ Ø§Ų…ØĒÛŒØ§Ø˛ Ø¯Ų‡ÛŒØ¯" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø´Ų…Ø§ ؂؁؄ Ø´Ø¯Ų‡ Ø§ØŗØĒ. Ø¨ØąØ§ÛŒ Ø§Ø¯Ø§Ų…Ų‡ Ų‡ŲˆÛŒØĒ ØŽŲˆØ¯ ØąØ§ ØĒØŖÛŒÛŒØ¯ ÚŠŲ†ÛŒØ¯." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Ø¨Ø§Ø˛ ÚŠØąØ¯Ų† ؂؁؄" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Ų…ØĒŲˆŲ‚Ų Ø´Ø¯Ų† Ú¯Ø§Ųˆâ€ŒØĩŲ†Ø¯ŲˆŲ‚" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Ø§Ų„Ø§Ų† ؂؁؄ Ø´ŲˆØ¯" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Ø¨Ų„Ø§ŲØ§ØĩŲ„Ų‡" }, @@ -426,6 +738,18 @@ "security": { "message": "Ø§Ų…Ų†ÛŒØĒ" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "ØŽØˇØ§ÛŒÛŒ ØąØŽ Ø¯Ø§Ø¯Ų‡ Ø§ØŗØĒ" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Ø­ØŗØ§Ø¨ ÚŠØ§ØąØ¨ØąÛŒ ØŦدید Ø´Ų…Ø§ ØŗØ§ØŽØĒŲ‡ شد! Ø­Ø§Ų„Ø§ Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ ŲˆØ§ØąØ¯ Ø´ŲˆÛŒØ¯." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "Ø´Ų…Ø§ با Ų…ŲˆŲŲ‚ÛŒØĒ ŲˆØ§ØąØ¯ شدید" + }, + "youMayCloseThisWindow": { + "message": "Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ Ø§ÛŒŲ† ŲžŲ†ØŦØąŲ‡ ØąØ§ Ø¨Ø¨Ų†Ø¯ÛŒØ¯" + }, "masterPassSent": { "message": "Ų…Ø§ یڊ Ø§ÛŒŲ…ÛŒŲ„ Ų‡Ų…ØąØ§Ų‡ با ØąØ§Ų‡Ų†Ų…Ø§ÛŒ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ Ø¨ØąØ§ÛŒØĒØ§Ų† Ø§ØąØŗØ§Ų„ ÚŠØąØ¯ÛŒŲ…." }, "verificationCodeRequired": { "message": "ڊد ØĒØŖÛŒÛŒØ¯ Ų…ŲˆØąØ¯ Ų†ÛŒØ§Ø˛ Ø§ØŗØĒ." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "ڊد ØĒØŖÛŒÛŒØ¯ Ų†Ø§Ų…ØšØĒØ¨Øą Ø§ØŗØĒ" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Ų†Ø§ØĒŲˆØ§Ų† Ø¯Øą ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą Ų…ŲˆØąØ¯ Ø§Ų†ØĒ؎اب Ø´Ø¯Ų‡ Ø¯Øą Ø§ÛŒŲ† ØĩŲØ­Ų‡. Ø§ØˇŲ„Ø§ØšØ§ØĒ ØąØ§ ÚŠŲžÛŒ ؈ ØŦØ§ÛŒâ€ŒÚ¯Ø°Ø§ØąÛŒ ÚŠŲ†ÛŒØ¯." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "ÚŠŲ„ÛŒØ¯ Ø§Ø­ØąØ§Ø˛ Ų‡ŲˆÛŒØĒ اØļØ§ŲŲ‡ شد" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "ØŽØ§ØąØŦ شد" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Ų†Ø´ØŗØĒ ŲˆØąŲˆØ¯ Ø´Ų…Ø§ Ų…Ų†Ų‚Øļی Ø´Ø¯Ų‡ Ø§ØŗØĒ." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Øĸیا Ų…ØˇŲ…ØĻŲ†ÛŒØ¯ ÚŠŲ‡ Ų…ÛŒâ€ŒØŽŲˆØ§Ų‡ÛŒØ¯ ØŽØ§ØąØŦ Ø´ŲˆÛŒØ¯ØŸ" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "ŲžŲˆØ´Ų‡ اØļØ§ŲŲ‡ شد" }, - "changeMasterPass": { - "message": "ØĒØēÛŒÛŒØą ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ" - }, - "changeMasterPasswordConfirmation": { - "message": "Ø´Ų…Ø§ Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ ØŽŲˆØ¯ ØąØ§ Ø¯Øą bitwarden.com ØĒØēÛŒÛŒØą Ø¯Ų‡ÛŒØ¯. Øĸیا Ų…ÛŒâ€ŒØŽŲˆØ§Ų‡ÛŒØ¯ Ø§Ø˛ ØŗØ§ÛŒØĒ Ø¨Ø§Ø˛Ø¯ÛŒØ¯ ÚŠŲ†ÛŒØ¯ØŸ" - }, "twoStepLoginConfirmation": { "message": "ŲˆØąŲˆØ¯ Ø¯Ųˆ Ų…ØąØ­Ų„Ų‡ ای باؚØĢ Ų…ÛŒâ€ŒØ´ŲˆØ¯ ÚŠŲ‡ Ø­ØŗØ§Ø¨ ÚŠØ§ØąØ¨ØąÛŒ Ø´Ų…Ø§ با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ یڊ Ø¯ØŗØĒÚ¯Ø§Ų‡ Ø¯ÛŒÚ¯Øą Ų…Ø§Ų†Ų†Ø¯ ÚŠŲ„ÛŒØ¯ Ø§Ų…Ų†ÛŒØĒی، Ø¨ØąŲ†Ø§Ų…Ų‡ Ø§Ø­ØąØ§Ø˛ Ų‡ŲˆÛŒØĒ، ŲžÛŒØ§Ų…ÚŠØŒ ØĒŲ…Ø§Øŗ ØĒŲ„ŲŲ†ÛŒ ؈ یا Ø§ÛŒŲ…ÛŒŲ„ØŒ اؚØĒØ¨Ø§Øą ØŽŲˆØ¯ ØąØ§ با Ø§ÛŒŲ…Ų†ÛŒ بیشØĒØą اØĢباØĒ ÚŠŲ†Ø¯. ŲˆØąŲˆØ¯ Ø¯Ųˆ Ų…ØąØ­Ų„Ų‡ ای Ų…ÛŒ ØĒŲˆØ§Ų†Ø¯ Ø¯Øą bitwarden.com ŲØšØ§Ų„ Ø´ŲˆØ¯. Øĸیا Ų…ÛŒâ€ŒØŽŲˆØ§Ų‡ÛŒØ¯ Ø§Ø˛ ØŗØ§ÛŒØĒ Ø¨Ø§Ø˛Ø¯ÛŒØ¯ ÚŠŲ†ÛŒØ¯ØŸ" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "ŲžŲˆØ´Ų‡ Ø°ØŽÛŒØąŲ‡ شد" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Ų†Ø´Ø§Ų†ÛŒ Ø§ÛŒŲ†ØĒØąŲ†ØĒی ØŦدید" }, + "addDomain": { + "message": "Ø§ŲØ˛ŲˆØ¯Ų† Ø¯Ø§Ų…Ų†Ų‡", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Ų…ŲˆØąØ¯ اØļØ§ŲŲ‡ شد" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Ø¯ØąØŽŲˆØ§ØŗØĒ Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØąŲˆØ¯ Ø¨Ų‡ ØŗÛŒØŗØĒŲ…" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ø¯Øą ØĩŲˆØąØĒی ÚŠŲ‡ Ų…ŲˆØąØ¯ÛŒ Ø¯Øą Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø´Ų…Ø§ ÛŒØ§ŲØĒ Ų†Ø´Ø¯ØŒ Ø¯ØąØŽŲˆØ§ØŗØĒ Ø§ŲØ˛ŲˆØ¯Ų† ÚŠŲ†ÛŒØ¯." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Ų†Ų…Ø§ÛŒØ´ ÚŠØ§ØąØĒâ€ŒŲ‡Ø§ Ø¯Øą ØĩŲØ­Ų‡ Ø¨ØąÚ¯Ų‡" }, "showCardsCurrentTabDesc": { "message": "Ø¨ØąØ§ÛŒ ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą ØĸØŗØ§Ų†ØŒ Ų…ŲˆØ§ØąØ¯ ÚŠØ§ØąØĒ ØąØ§ Ø¯Øą ØĩŲØ­Ų‡ Ø¨ØąÚ¯Ų‡ ŲŲ‡ØąØŗØĒ ÚŠŲ†." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Ų†Ø´Ø§Ų† Ø¯Ø§Ø¯Ų† Ų‡ŲˆÛŒØĒ Ø¯Øą ØĩŲØ­Ų‡ Ø¨ØąÚ¯Ų‡" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ų‡Ų†Ú¯Ø§Ų…ÛŒ ÚŠŲ‡ ØĒØēÛŒÛŒØąÛŒ Ø¯Øą یڊ ŲˆØ¨â€ŒØŗØ§ÛŒØĒ Ø´Ų†Ø§ØŗØ§ÛŒÛŒ شد، Ø¯ØąØŽŲˆØ§ØŗØĒ Ø¨Ų‡â€ŒØąŲˆØ˛ØąØŗØ§Ų†ÛŒ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą ŲˆØąŲˆØ¯ ÚŠŲ†." }, + "changedPasswordNotificationDescAlt": { + "message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts." + }, + "enableUsePasskeys": { + "message": "Ø¨ØąØ§ÛŒ Ø°ØŽÛŒØąŲ‡ ؈ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ passkey اØŦØ§Ø˛Ų‡ Ø¨Ú¯ÛŒØą" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Øĸیا Ų…Ø§ÛŒŲ„ Ø¨Ų‡ Ø¨Ų‡â€ŒØąŲˆØ˛ØąØŗØ§Ų†ÛŒ Ø§ÛŒŲ† ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą Ø¯Øą Bitwarden Ų‡ØŗØĒید؟" }, @@ -637,7 +1046,10 @@ "message": "Ø¨ØąØ§ÛŒ ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Bitwarden ØŽŲˆØ¯ ØąØ§ Ø¨Ø§Ø˛ ÚŠŲ†ÛŒØ¯." }, "notificationUnlock": { - "message": "Ø¨Ø§Ø˛Ú¯Ø´Ø§ÛŒÛŒ" + "message": "Ø¨Ø§Ø˛ ÚŠØąØ¯Ų† ؂؁؄" + }, + "additionalOptions": { + "message": "Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§ÛŒ اØļØ§ŲÛŒ" }, "enableContextMenuItem": { "message": "Ų†Ų…Ø§ÛŒØ´ Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§ÛŒ Ų…Ų†ŲˆÛŒ Ø˛Ų…ÛŒŲ†Ų‡" @@ -645,9 +1057,12 @@ "contextMenuItemDesc": { "message": "Ø§Ø˛ یڊ ÚŠŲ„ÛŒÚŠ ØĢØ§Ų†ŲˆÛŒŲ‡ Ø¨ØąØ§ÛŒ Ø¯ØŗØĒØąØŗÛŒ Ø¨Ų‡ ØĒŲˆŲ„ÛŒØ¯ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą ؈ ŲˆØąŲˆØ¯Ų‡Ø§ÛŒ Ų…Ų†ØˇØ¨Ų‚ Ø¨ØąØ§ÛŒ ŲˆØ¨ ØŗØ§ÛŒØĒ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†." }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Ø¨ØąØąØŗÛŒ Ų…ØˇØ§Ø¨Ų‚ØĒ Ų†Ø´Ø§Ų†ÛŒ Ø§ÛŒŲ†ØĒØąŲ†ØĒی ŲžÛŒØ´â€ŒŲØąØļ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Ų‡Ų†Ú¯Ø§Ų… Ø§Ų†ØŦØ§Ų… Ø¯Ø§Ø¯Ų† ÚŠØ§ØąŲ‡Ø§ÛŒÛŒ Ų…Ø§Ų†Ų†Ø¯ ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§ØąØŒ ØąŲˆØ´ ŲžÛŒØ´â€ŒŲØąØļی ØąØ§ ÚŠŲ‡ Ø¨ØąØ§ÛŒ Ø´Ų†Ø§ØŗØ§ÛŒÛŒ ŲˆØąŲˆØ¯ Ų†Ø´Ø§Ų†ÛŒ Ø§ÛŒŲ†ØĒØąŲ†ØĒی Ø§Ų†ØŦØ§Ų… Ų…ÛŒâ€ŒØ´ŲˆØ¯ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ØĒØēÛŒÛŒØą ØąŲ†Ú¯ ŲžŲˆØŗØĒŲ‡ Ø¨ØąŲ†Ø§Ų…Ų‡." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "ØĒØ§ØąÛŒÚŠ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "ØĒØ§ØąÛŒÚŠ ØŽŲˆØąØ´ÛŒØ¯ÛŒ", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "ØĩØ§Ø¯ØąØ§ØĒ Ø§Ø˛" + }, "exportVault": { "message": "Ø¨ØąŲˆŲ† ØąÛŒØ˛ÛŒ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚" }, "fileFormat": { "message": "ŲØąŲ…ØĒ ŲžØąŲˆŲ†Ø¯Ų‡" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "ØąŲ…Ø˛ ŲØ§ÛŒŲ„" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Ų†ŲˆØš ØĩØ§Ø¯ØąØ§ØĒ" + }, + "accountRestricted": { + "message": "Ø­ØŗØ§Ø¨ ÚŠØ§ØąØ¨ØąÛŒ Ų…Ø­Ø¯ŲˆØ¯ Ø´Ø¯Ų‡ Ø§ØŗØĒ" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "ØšØ¯Ų… ØĒØˇØ§Ø¨Ų‚ \"ØąŲ…Ø˛ ŲØ§ÛŒŲ„\" ؈ \"ØĒایید ØąŲ…Ø˛ ŲØ§ÛŒŲ„\" با ÛŒÚŠØ¯ÛŒÚ¯Øą." + }, "warning": { "message": "Ø§ØŽØˇØ§Øą", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "اشØĒØąØ§ÚŠ Ú¯Ø°Ø§ØąÛŒ شد" }, - "learnOrg": { - "message": "Ø¯ØąØ¨Ø§ØąŲ‡ ØŗØ§Ø˛Ų…Ø§Ų†â€ŒŲ‡Ø§ Ø§ØˇŲ„Ø§ØšØ§ØĒ ÚŠØŗØ¨ ÚŠŲ†ÛŒØ¯" - }, - "learnOrgConfirmation": { - "message": "Bitwarden Ø¨Ų‡ Ø´Ų…Ø§ اØŦØ§Ø˛Ų‡ Ų…ÛŒâ€ŒØ¯Ų‡Ø¯ با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒØŒ Ų…ŲˆØ§ØąØ¯ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ ØŽŲˆØ¯ ØąØ§ با Ø¯ÛŒÚ¯ØąØ§Ų† Ø¨Ų‡ اشØĒØąØ§ÚŠ Ø¨Ú¯Ø°Ø§ØąÛŒØ¯. Øĸیا Ų…Ø§ÛŒŲ„ Ø¨Ų‡ Ø¨Ø§Ø˛Ø¯ÛŒØ¯ Ø§Ø˛ ŲˆØ¨ ØŗØ§ÛŒØĒ bitwarden.com Ø¨ØąØ§ÛŒ ÚŠØŗØ¨ Ø§ØˇŲ„Ø§ØšØ§ØĒ بیشØĒØą Ų‡ØŗØĒید؟" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Ø§Ų†ØĒŲ‚Ø§Ų„ Ø¨Ų‡ ØŗØ§Ø˛Ų…Ø§Ų†" @@ -762,6 +1204,9 @@ "file": { "message": "ŲžØąŲˆŲ†Ø¯Ų‡" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "īēīģ§īē˜īē¨īēŽīē ÛŒÚŠ īēŽīģ­īģ§īēĒīģŠ" }, @@ -772,7 +1217,7 @@ "message": "ŲˆÛŒÚ˜Ú¯ÛŒ Ų…ŲˆØŦŲˆØ¯ Ų†ÛŒØŗØĒ" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Ø§Ų†ØĒŲ‚Ø§Ų„ ÚŠŲ„ÛŒØ¯ ØąŲ…Ø˛Ú¯Ø°Ø§ØąÛŒ Ų…ŲˆØąØ¯ Ų†ÛŒØ§Ø˛ Ø§ØŗØĒ. Ų„ØˇŲØ§Ų‹ Ø§Ø˛ ØˇØąÛŒŲ‚ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ ŲˆØ¨ ŲˆØ§ØąØ¯ Ø´ŲˆÛŒØ¯ ØĒا ÚŠŲ„ÛŒØ¯ ØąŲ…Ø˛Ú¯Ø°Ø§ØąÛŒ ØŽŲˆØ¯ ØąØ§ Ø¨Ų‡ ØąŲˆØ˛ ÚŠŲ†ÛŒØ¯." }, "premiumMembership": { "message": "ØšØļŲˆÛŒØĒ ŲžØąŲ…ÛŒŲˆŲ…" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "Ûą گیگابایØĒ ؁Øļای Ø°ØŽÛŒØąŲ‡ ØŗØ§Ø˛ÛŒ ØąŲ…Ø˛Ú¯Ø°Ø§ØąÛŒ Ø´Ø¯Ų‡ Ø¨ØąØ§ÛŒ ŲžÛŒŲˆØŗØĒ Ų‡Ø§ÛŒ ŲžØąŲˆŲ†Ø¯Ų‡." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Ú¯Ø˛ÛŒŲ†Ų‡ Ų‡Ø§ÛŒ ŲˆØąŲˆØ¯ اØļØ§ŲÛŒ Ø¯Ųˆ Ų…ØąØ­Ų„Ų‡ ای Ų…Ø§Ų†Ų†Ø¯ YubiKey ؈ Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Ø´Ų…Ø§ Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ ØšØļŲˆÛŒØĒ ŲžØąŲ…ÛŒŲˆŲ… ØąØ§ Ø§Ø˛ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ ŲˆØ¨ bitwarden.com ØŽØąÛŒØ¯Ø§ØąÛŒ ÚŠŲ†ÛŒØ¯. Ų…Ø§ÛŒŲ„ÛŒØ¯ Ø§ÚŠŲ†ŲˆŲ† Ø§Ø˛ ŲˆØ¨â€ŒØŗØ§ÛŒØĒ Ø¨Ø§Ø˛ÛŒØ¯ ÚŠŲ†ÛŒØ¯ØŸ" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Ø´Ų…Ø§ یڊ ØšØļ؈ ŲžØąŲ…ÛŒŲˆŲ… Ų‡ØŗØĒید!" }, "premiumCurrentMemberThanks": { "message": "Ø¨ØąØ§ÛŒ Ø­Ų…Ø§ÛŒØĒØĒØ§Ų† Ø§Ø˛ Bitwarden ØŗŲžØ§ØŗÚ¯Ø˛Ø§ØąÛŒŲ…." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "ØĒŲ…Ø§Ų…Ø´ ŲŲ‚Øˇ $PRICE$ Ø¯Øą ØŗØ§Ų„!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Ų†ŲˆØŗØ§Ø˛ÛŒ ÚŠØ§Ų…Ų„ شد" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Ø¨ØąŲ†Ø§Ų…Ų‡ Ø§Ø­ØąØ§Ø˛ Ų‡ŲˆÛŒØĒ" }, - "authenticatorAppDesc": { - "message": "Ø§Ø˛ یڊ Ø¨ØąŲ†Ø§Ų…Ų‡ Ø§Ø­ØąØ§Ø˛ Ų‡ŲˆÛŒØĒ (Ų…Ø§Ų†Ų†Ø¯ Authy یا Google Authenticator) Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØ¯ ØĒا ÚŠØ¯Ų‡Ø§ÛŒ ØĒØŖÛŒÛŒØ¯ Ø¨Øą ŲžØ§ÛŒŲ‡ Ø˛Ų…Ø§Ų† ØĒŲˆŲ„ÛŒØ¯ ÚŠŲ†ÛŒØ¯.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "ÚŠŲ„ÛŒØ¯ Ø§Ų…Ų†ÛŒØĒی YubiKey OTP" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Ø§Ø˛ یڊ YubiKey Ø¨ØąØ§ÛŒ Ø¯ØŗØĒØąØŗÛŒ Ø¨Ų‡ Ø­ØŗØ§Ø¨ØĒØ§Ų† Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØ¯. Ų‡Ų…ØąØ§Ų‡ با Ø¯ØŗØĒÚ¯Ø§Ų‡â€ŒŲ‡Ø§ÛŒ YubiKey 4 ،4 Nano ،NEO ÚŠØ§Øą Ų…ÛŒâ€ŒÚŠŲ†Ø¯." }, - "duoDesc": { - "message": "با Duo Security با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ø¨ØąŲ†Ø§Ų…Ų‡ ØĒ؄؁؆ Ų‡Ų…ØąØ§Ų‡ØŒ ŲžÛŒØ§Ų…ÚŠØŒ ØĒŲ…Ø§Øŗ ØĒŲ„ŲŲ†ÛŒØŒ یا ÚŠŲ„ÛŒØ¯ Ø§Ų…Ų†ÛŒØĒی U2F ØĒØŖÛŒÛŒØ¯ ÚŠŲ†ÛŒØ¯.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Ø§ÛŒŲ…ÛŒŲ„" }, - "emailDesc": { - "message": "ڊد ØĒØŖÛŒÛŒØ¯ Ø¨ØąØ§ÛŒØĒØ§Ų† Ø§ØąØŗØ§Ų„ Ų…ÛŒâ€ŒØ´ŲˆØ¯." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Ų…Ø­ÛŒØˇ ØŽŲˆØ¯ Ų…ÛŒØ˛Ø¨Ø§Ų†" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Ų†Ø´Ø§Ų†ÛŒ Ø§ÛŒŲ†ØĒØąŲ†ØĒی ŲžØ§ÛŒŲ‡ ŲØąØļی Ų†Øĩب Bitwarden Ų…ÛŒØ˛Ø¨Ø§Ų†ÛŒ Ø´Ø¯Ų‡ ØąØ§ Ų…Ø´ØŽØĩ ÚŠŲ†ÛŒØ¯." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Ų…Ø­ÛŒØˇ ØŗŲØ§ØąØ´ÛŒ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Ų†Ø´Ø§Ų†ÛŒ Ø§ÛŒŲ†ØĒØąŲ†ØĒی ØŗØąŲˆØą" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "Ų†Ø´Ø§Ų†ÛŒ API ØŗØąŲˆØą" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "Ų†Ø´Ø§Ų†ÛŒâ€ŒŲ‡Ø§ÛŒ Ø§ÛŒŲ†ØĒØąŲ†ØĒی Ų…Ø­ÛŒØˇ Ø°ØŽÛŒØąŲ‡ شد" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "ŲˆÛŒØąØ§ÛŒØ´ ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ Ų…ØąŲˆØąÚ¯Øą." + }, + "autofillOverlayVisibilityOff": { + "message": "ØŽØ§Ų…ŲˆØ´", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą Ų‡Ų†Ú¯Ø§Ų… Ø¨Ø§ØąÚ¯Ø°Ø§ØąÛŒ ØĩŲØ­Ų‡" }, "enableAutoFillOnPageLoadDesc": { "message": "Ø§Ú¯Øą یڊ ŲØąŲ… ŲˆØąŲˆØ¯ÛŒ Ø´Ų†Ø§ØŗØ§ÛŒÛŒ شد، ŲˆŲ‚ØĒی ØĩŲØ­Ų‡ ŲˆØ¨ Ø¨Ø§ØąÚ¯Ø°Ø§ØąÛŒ شد، Ø¨Ų‡ ØĩŲˆØąØĒ ØŽŲˆØ¯ÚŠØ§Øą ŲžØą Ø´ŲˆØ¯." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "ŲˆØ¨â€ŒØŗØ§ÛŒØĒâ€ŒŲ‡Ø§ÛŒ Ø¯Øą Ų…ØšØąØļ ØŽØˇØą یا Ų†Ø§Ų…ØšØĒØ¨Øą Ų…ÛŒâ€ŒØĒŲˆØ§Ų†Ų†Ø¯ Ø§Ø˛ ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą Ø¯Øą Ø¨Ø§ØąÚ¯Ø°Ø§ØąÛŒ ØĩŲØ­Ų‡ ØŗŲˆØĄ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†Ų†Ø¯." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "Ø¯ØąØ¨Ø§ØąŲ‡ ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą بیشØĒØą Ø¨Ø¯Ø§Ų†ÛŒØ¯" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Ø¨Ø§Ø˛ ÚŠØąØ¯Ų† Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø¯Øą Ų†ŲˆØ§Øą ÚŠŲ†Ø§ØąÛŒ" }, - "commandAutofillDesc": { - "message": "ØĸØŽØąÛŒŲ† ŲˆØąŲˆØ¯ÛŒ Ų…ŲˆØąØ¯ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø¨ØąØ§ÛŒ ŲˆØ¨ ØŗØ§ÛŒØĒ ŲØšŲ„ÛŒ ØąØ§ Ø¨Ų‡ ØĩŲˆØąØĒ ØŽŲˆØ¯ÚŠØ§Øą ŲžØą ÚŠŲ†ÛŒØ¯" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "یڊ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą ØĒØĩØ§Ø¯ŲÛŒ ØŦدید ایØŦاد ÚŠŲ†ÛŒØ¯ ؈ ØĸŲ† ØąØ§ Ø¯Øą ÚŠŲ„ÛŒŲž Ø¨ŲˆØąØ¯ ÚŠŲžÛŒ ÚŠŲ†ÛŒØ¯" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "؂؁؄ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚" }, - "privateModeWarning": { - "message": "ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ø­Ø§Ų„ØĒ ØŽØĩ؈Øĩی ØĸØ˛Ų…Ø§ÛŒØ´ÛŒ Ø§ØŗØĒ ؈ Ø¨ØąØŽÛŒ Ø§Ø˛ ŲˆÛŒÚ˜Ú¯ÛŒâ€ŒŲ‡Ø§ Ų…Ø­Ø¯ŲˆØ¯ Ų‡ØŗØĒŲ†Ø¯." - }, "customFields": { "message": "ŲÛŒŲ„Ø¯Ų‡Ø§ÛŒ ØŗŲØ§ØąØ´ÛŒ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Ų…Ų†ØˇŲ‚ÛŒ" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "ŲžÛŒŲˆŲ†Ø¯ Ø´Ø¯Ų‡", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "یڊ ØĒØĩŲˆÛŒØą Ų‚Ø§Ø¨Ų„ ØĒØ´ØŽÛŒØĩ Ø¯Øą ÚŠŲ†Ø§Øą Ų‡Øą ŲˆØąŲˆØ¯ Ų†Ø´Ø§Ų† Ø¯Ų‡ÛŒØ¯." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Ų†Ų…Ø§ÛŒØ´ Ø´Ų…Ø§ØąŲ†Ø¯Ų‡ Ų†Ø´Ø§Ų†" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Ų‡ŲˆÛŒØĒ" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "$TYPE$ ØŦدید", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "ŲˆÛŒØąØ§ÛŒØ´ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "ØĒØ§ØąÛŒØŽÚ†Ų‡ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Ø¨Ø§Ø˛Ú¯Ø´ØĒ" }, "collections": { "message": "Ų…ØŦŲ…ŲˆØšŲ‡â€ŒŲ‡Ø§" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Ų…ŲˆØąØ¯ ØšŲ„Ø§Ų‚Ų‡â€ŒŲ‡Ø§" }, @@ -1282,6 +1874,10 @@ "message": "Ø¯Ø§Ų…Ų†Ų‡ ŲžØ§ÛŒŲ‡", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Ų†Ø§Ų… Ø¯Ø§Ų…Ų†Ų‡", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ØĒØ´ØŽÛŒØĩ Ų…ØˇØ§Ø¨Ų‚ØĒ", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Ø¨ØąØąØŗÛŒ Ų…ØˇØ§Ø¨Ų‚ØĒ ŲžÛŒØ´â€ŒŲØąØļ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Ú¯Ø˛ÛŒŲ†Ų‡ Ų‡Ø§ÛŒ ØĒØ¨Ø¯ÛŒŲ„" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Ų‡ÛŒÚ† ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØąÛŒ Ø¨ØąØ§ÛŒ ŲŲ‡ØąØŗØĒ ÚŠØąØ¯Ų† ؈ØŦŲˆØ¯ Ų†Ø¯Ø§ØąØ¯." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Ø­Ø°Ų" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Ø¨Ø§Ø˛ ÚŠØąØ¯Ų† با ŲžÛŒŲ†" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "ڊد ŲžÛŒŲ† ØŽŲˆØ¯ ØąØ§ Ø¨ØąØ§ÛŒ Ø¨Ø§Ø˛ ÚŠØąØ¯Ų† Bitwarden ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ÛŒØ¯. Ø§Ú¯Øą Ø¨Ų‡ ØˇŲˆØą ÚŠØ§Ų…Ų„ Ø§Ø˛ Ø¨ØąŲ†Ø§Ų…Ų‡ ØŽØ§ØąØŦ Ø´ŲˆÛŒØ¯ØŒ ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ ŲžÛŒŲ† Ø´Ų…Ø§ Ø§Ø˛ Ø¨ÛŒŲ† Ų…ÛŒâ€ŒØąŲˆØ¯." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "ڊد ŲžÛŒŲ† Ø§Ų„Ø˛Ø§Ų…ÛŒØŗØĒ." }, "invalidPin": { "message": "ڊد ŲžÛŒŲ† Ų…ØšØĒØ¨Øą Ų†ÛŒØŗØĒ." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ø¨ÛŒŲˆŲ…ØĒØąÛŒÚŠ Ø¨Ø§Ø˛ ÚŠŲ†ÛŒØ¯" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Ø¯Øą Ø§Ų†ØĒØ¸Ø§Øą ØĒØŖÛŒÛŒØ¯ Ø§Ø˛ Ø¯ØŗÚŠØĒØ§Ųž" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Ø¯Øą Ø˛Ų…Ø§Ų† Ø´ØąŲˆØš Ų…ØŦدد، با ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ ؂؁؄ ÚŠŲ†" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Ø´Ų…Ø§ باید Ø­Ø¯Ø§Ų‚Ų„ یڊ Ų…ØŦŲ…ŲˆØšŲ‡ ØąØ§ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "یڊ یا Ú†Ų†Ø¯ ØŗÛŒØ§ØŗØĒ ØŗØ§Ø˛Ų…Ø§Ų† Ø¨Øą ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ ØĒŲˆŲ„ÛŒØ¯ ÚŠŲ†Ų†Ø¯Ų‡ Ø´Ų…Ø§ ØĒØŖØĢÛŒØą Ų…ÛŒâ€ŒÚ¯Ø°Ø§ØąØ¯." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ØšŲ…Ų„ Ų…ØĒŲˆŲ‚Ų Ø´Ø¯Ų† Ú¯Ø§Ųˆâ€ŒØĩŲ†Ø¯ŲˆŲ‚" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "؂؁؄", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Ø˛Ø¨Ø§Ų„Ų‡â€ŒŲ‡Ø§", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Ų…ŲˆØąØ¯ Ø¨Ø§Ø˛ÛŒØ§Ø¨ÛŒ شد" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "ØŽØąŲˆØŦ Ø§Ø˛ ØŗÛŒØŗØĒŲ…ØŒ ØĒŲ…Ø§Ų… Ø¯ØŗØĒØąØŗÛŒ Ų‡Ø§ Ø¨Ų‡ Ú¯Ø§Ųˆâ€ŒØĩŲ†Ø¯ŲˆŲ‚ Ø´Ų…Ø§ ØąØ§ Ø§Ø˛ Ø¨ÛŒŲ† Ų…ÛŒâ€ŒØ¨ØąØ¯ ؈ Ų†ÛŒØ§Ø˛ Ø¨Ų‡ Ø§Ø­ØąØ§Ø˛ Ų‡ŲˆÛŒØĒ ØĸŲ†Ų„Ø§ÛŒŲ† ŲžØŗ Ø§Ø˛ Ų…Ø¯ØĒ Ø˛Ų…Ø§Ų† ØĒŲˆŲ‚Ų Ø¯Ø§ØąØ¯. Øĸیا Ų…ØˇŲ…ØĻŲ† Ų‡ØŗØĒید ÚŠŲ‡ Ų…ÛŒâ€ŒØŽŲˆØ§Ų‡ÛŒØ¯ Ø§Ø˛ Ø§ÛŒŲ† ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØ¯ØŸ" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą ؈ Ø°ØŽÛŒØąŲ‡" }, + "fillAndSave": { + "message": "ŲžØąÚŠØąØ¯Ų† ؈ Ø°ØŽÛŒØąŲ‡" + }, "autoFillSuccessAndSavedUri": { "message": "Ų…ŲˆØąØ¯ ØŽŲˆØ¯ÚŠØ§Øą ŲžØą شد ؈ Ų†Ø´Ø§Ų†ÛŒ Ø§ÛŒŲ†ØĒØąŲ†ØĒی Ø°ØŽÛŒØąŲ‡ شد" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ ØŦدید Ø´Ų…Ø§ Ø§Ø˛ Ø´ØąØ§ÛŒØˇ ØŗÛŒØ§ØŗØĒ ŲžÛŒØąŲˆÛŒ Ų†Ų…ÛŒâ€ŒÚŠŲ†Ø¯." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Ų„Øē؈ اشØĒØąØ§ÚŠ" + }, + "atAnyTime": { + "message": "Ø¯Øą Ų‡Øą Ø˛Ų…Ø§Ų†." + }, + "byContinuingYouAgreeToThe": { + "message": "با Ø§Ø¯Ø§Ų…Ų‡ Ø¯Ø§Ø¯Ų†ØŒ Ø´Ų…Ø§ Ų…ŲˆØ§ŲŲ‚ØĒ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØ¯ ÚŠŲ‡" + }, + "and": { + "message": "؈" + }, "acceptPolicies": { "message": "با ØšŲ„Ø§Ų…ØĒ Ø˛Ø¯Ų† Ø§ÛŒŲ† ÚŠØ§Ø¯Øą با Ų…ŲˆØ§ØąØ¯ Ø˛ÛŒØą Ų…ŲˆØ§ŲŲ‚ØĒ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØ¯:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "ØĒØŖÛŒÛŒØ¯" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "ØĒØŖÛŒÛŒØ¯ Ų‡Ų…Ú¯Ø§Ų…â€ŒØŗØ§Ø˛ÛŒ Ø¯ØŗÚŠØĒØ§Ųž" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "ØšØ¯Ų… Ų…ØˇØ§Ø¨Ų‚ØĒ Ø­ØŗØ§Ø¨ ÚŠØ§ØąØ¨ØąÛŒ" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Ø¨ÛŒŲˆŲ…ØĒØąÛŒÚŠ Ø¨ØąŲžØ§ Ų†Ø´Ø¯Ų‡" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "Ø¨ÛŒŲˆŲ…ØĒØąÛŒÚŠ Ų…ØąŲˆØąÚ¯Øą Ø¯Øą Ø§ÛŒŲ† Ø¯ØŗØĒÚ¯Ø§Ų‡ ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ų†Ų…ÛŒâ€ŒØ´ŲˆØ¯." }, + "biometricsNotUnlockedTitle": { + "message": "ÚŠØ§ØąØ¨Øą ؂؁؄ یا ØŽØ§ØąØŦ شد" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { - "message": "Ø˛ÛŒØŗØĒâ€ŒØŗŲ†ØŦی Ų†Ø§ØĒŲ…Ø§Ų… Ų…Ø§Ų†Ø¯" + "message": "Ø˛ÛŒØŗØĒâ€ŒØŗŲ†ØŦی Ų†Ø§Ų…ŲˆŲŲ‚ Ø¨ŲˆØ¯" }, "biometricsFailedDesc": { - "message": "Ø˛ÛŒØŗØĒâ€ŒØŗŲ†ØŦی Ų†Ų…ÛŒ ØĒŲˆØ§Ų†Ø¯ Ø§Ų†ØŦØ§Ų… Ø´ŲˆØ¯ØŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ یا ØŽØąŲˆØŦ ØąØ§ Ø¯Øą Ų†Ø¸Øą Ø¨Ú¯ÛŒØąÛŒØ¯. Ø§Ú¯Øą Ø§ÛŒŲ† Ų…Ø´ÚŠŲ„ Ø§Ø¯Ø§Ų…Ų‡ ÛŒØ§ŲØĒ Ų„ØˇŲØ§ با ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Bitwarden ØĒŲ…Ø§Øŗ Ø¨Ú¯ÛŒØąÛŒØ¯." + "message": "Ø˛ÛŒØŗØĒâ€ŒØŗŲ†ØŦی Ų†Ų…ÛŒâ€ŒØĒŲˆØ§Ų†Ø¯ Ø§Ų†ØŦØ§Ų… Ø´ŲˆØ¯ØŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ یا ØŽØąŲˆØŦ ØąØ§ Ø¯Øą Ų†Ø¸Øą Ø¨Ú¯ÛŒØąÛŒØ¯. Ø§Ú¯Øą Ø§ÛŒŲ† Ų…Ø´ÚŠŲ„ Ø§Ø¯Ø§Ų…Ų‡ ÛŒØ§ŲØĒ Ų„ØˇŲØ§Ų‹ با ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Bitwarden ØĒŲ…Ø§Øŗ Ø¨Ú¯ÛŒØąÛŒØ¯." }, "nativeMessaginPermissionErrorTitle": { "message": "Ų…ØŦŲˆØ˛ Ø§ØąØ§ØĻŲ‡ Ų†Ø´Ø¯Ų‡ Ø§ØŗØĒ" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ØŗÛŒØ§ØŗØĒ ØŗØ§Ø˛Ų…Ø§Ų†ÛŒ Ø¨Øą ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ Ų…Ø§Ų„ÚŠÛŒØĒ Ø´Ų…Ø§ ØĒØŖØĢÛŒØą Ų…ÛŒâ€ŒÚ¯Ø°Ø§ØąØ¯." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Ø¯Ø§Ų…Ų†Ų‡ Ų‡Ø§ÛŒ Ų…ØŗØĒØĢŲ†ÛŒ" }, "excludedDomainsDesc": { "message": "Bitwarden Ø¨ØąØ§ÛŒ Ø°ØŽÛŒØąŲ‡ ØŦØ˛ØĻیاØĒ ŲˆØąŲˆØ¯ Ø¨Ų‡ ØŗÛŒØŗØĒŲ… Ø§ÛŒŲ† Ø¯Ø§Ų…Ų†Ų‡ Ų‡Ø§ ØŗŲˆØ§Ų„ Ų†Ų…ÛŒâ€ŒÚŠŲ†Ø¯. Ø¨ØąØ§ÛŒ Ø§ÛŒŲ†ÚŠŲ‡ ØĒØēÛŒÛŒØąØ§ØĒ Ø§ØšŲ…Ø§Ų„ Ø´ŲˆØ¯ باید ØĩŲØ­Ų‡ ØąØ§ ØĒØ§Ø˛Ų‡ ÚŠŲ†ÛŒØ¯." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ Ø¯Ø§Ų…Ų†Ų‡ Ų…ØšØĒØ¨ØąÛŒ Ų†ÛŒØŗØĒ", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Ø§ØąØŗØ§Ų„", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ØŦØŗØĒØŦŲˆÛŒ Ø§ØąØŗØ§Ų„â€ŒŲ‡Ø§", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Ų…ØĒŲ†" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ŲžØąŲˆŲ†Ø¯Ų‡" }, @@ -1666,6 +2406,9 @@ "message": "Ų‡Ų…Ų‡ Ø§ØąØŗØ§Ų„ Ų‡Ø§", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Ø¨Ų‡ حداڊØĢØą ØĒؚداد Ø¯ØŗØĒØąØŗÛŒ ØąØŗÛŒØ¯Ų‡ Ø§ØŗØĒ", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Ų…Ø­Ø§ŲØ¸ØĒ â€ŒØ´Ø¯Ų‡ با ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "ŲžÛŒŲˆŲ†Ø¯ Ø§ØąØŗØ§Ų„ ØąØ§ ÚŠŲžÛŒ ÚŠŲ†", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Øĸیا Ų…ØˇŲ…ØĻŲ† Ų‡ØŗØĒید ÚŠŲ‡ Ų…ÛŒâ€ŒØŽŲˆØ§Ų‡ÛŒØ¯ Ø§ÛŒŲ† Ø§ØąØŗØ§Ų„ ØąØ§ Ø­Ø°Ų ÚŠŲ†ÛŒØ¯ØŸ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "ŲˆÛŒØąØ§ÛŒØ´ Ø§ØąØŗØ§Ų„", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Ø§ØąØŗØ§Ų„ Ø¯Øą ØĒØ§ØąÛŒØŽ ؈ ØŗØ§ØšØĒ Ų…Ø´ØŽØĩ Ø´Ø¯Ų‡ Ø¨ØąØ§ÛŒ Ų‡Ų…ÛŒØ´Ų‡ Ø­Ø°Ų ØŽŲˆØ§Ų‡Ø¯ شد.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "ØĒØ§ØąŲŠØŽ Ø§Ų†Ų‚ØļØ§ØĄ" }, @@ -1769,6 +2523,10 @@ "message": "Ø¨Ų‡ ØĩŲˆØąØĒ ا؎ØĒÛŒØ§ØąÛŒ Ø¨ØąØ§ÛŒ Ø¯ØŗØĒØąØŗÛŒ ÚŠØ§ØąØ¨ØąØ§Ų† Ø¨Ų‡ Ø§ÛŒŲ† Ø§ØąØŗØ§Ų„ Ø¨Ų‡ یڊ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą Ų†ÛŒØ§Ø˛ Ø¯Ø§ØąÛŒØ¯.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "یادداشØĒ Ų‡Ø§ÛŒ ØŽØĩ؈Øĩی Ø¯Øą Ų…ŲˆØąØ¯ Ø§ÛŒŲ† Ø§ØąØŗØ§Ų„.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Ø§ØąØŗØ§Ų„ ØŗØ§ØŽØĒŲ‡ شد", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Ø§ØąØŗØ§Ų„ Ø°ØŽÛŒØąŲ‡ شد", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Ø¨ØąØ§ÛŒ Ø§Ų†ØĒ؎اب ŲžØąŲˆŲ†Ø¯Ų‡ØŒ ŲžØŗŲˆŲ†Ø¯ ØąØ§ Ø¯Øą Ų†ŲˆØ§Øą ÚŠŲ†Ø§ØąÛŒ Ø¨Ø§Ø˛ ÚŠŲ†ÛŒØ¯ (Ø¯Øą ØĩŲˆØąØĒ Ø§Ų…ÚŠØ§Ų†) یا با ÚŠŲ„ÛŒÚŠ Ø¨Øą ØąŲˆÛŒ Ø§ÛŒŲ† Ø¨Ų†Øą ŲžŲ†ØŦØąŲ‡ ØŦدیدی Ø¨Ø§Ø˛ ÚŠŲ†ÛŒØ¯." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Ø¨ØąØ§ÛŒ Ø§Ų†ØĒ؎اب ŲžØąŲˆŲ†Ø¯Ų‡ ای با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Safari، با ÚŠŲ„ÛŒÚŠ ØąŲˆÛŒ Ø§ÛŒŲ† Ø¨Ų†Øą ŲžŲ†ØŦØąŲ‡ ØŦدیدی Ø¨Ø§Ø˛ ÚŠŲ†ÛŒØ¯." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Ų‚Ø¨Ų„ Ø§Ø˛ Ø§ÛŒŲ†ÚŠŲ‡ Ø´ØąŲˆØš ÚŠŲ†ÛŒ" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Ų†Ø´Ø§Ų†ÛŒ Ø§ÛŒŲ…ÛŒŲ„Ų… ØąØ§ Ø§Ø˛ Ú¯ÛŒØąŲ†Ø¯Ú¯Ø§Ų† Ų…ØŽŲÛŒ ÚŠŲ†." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "یڊ یا Ú†Ų†Ø¯ ØŗÛŒØ§ØŗØĒ ØŗØ§Ø˛Ų…Ø§Ų† Ø¨Øą Ú¯Ø˛ÛŒŲ†Ų‡ Ų‡Ø§ÛŒ Ø§ØąØŗØ§Ų„ Ø´Ų…Ø§ ØĒØŖØĢÛŒØą Ų…ÛŒâ€ŒÚ¯Ø°Ø§ØąØ¯." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ØĒØŖÛŒÛŒØ¯ Ø§ÛŒŲ…ÛŒŲ„ Ų„Ø§Ø˛Ų… Ø§ØŗØĒ" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "Ø¨ØąØ§ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ø§ÛŒŲ† ŲˆÛŒÚ˜Ú¯ÛŒ باید Ø§ÛŒŲ…ÛŒŲ„ ØŽŲˆØ¯ ØąØ§ ØĒØŖÛŒÛŒØ¯ ÚŠŲ†ÛŒØ¯. Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ Ø§ÛŒŲ…ÛŒŲ„ ØŽŲˆØ¯ ØąØ§ Ø¯Øą Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ ŲˆØ¨ ØĒØŖÛŒÛŒØ¯ ÚŠŲ†ÛŒØ¯." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ Ø´Ų…Ø§ با یڊ یا Ú†Ų†Ø¯ ØŗÛŒØ§ØŗØĒ ØŗØ§Ø˛Ų…Ø§Ų†â€ŒØĒØ§Ų† Ų…ØˇØ§Ø¨Ų‚ØĒ Ų†Ø¯Ø§ØąØ¯. Ø¨ØąØ§ÛŒ Ø¯ØŗØĒØąØŗÛŒ Ø¨Ų‡ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ØŒ باید Ų‡Ų…ÛŒŲ† Ø­Ø§Ų„Ø§ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ ØŽŲˆØ¯ ØąØ§ Ø¨Ų‡â€ŒØąŲˆØ˛ ÚŠŲ†ÛŒØ¯. Ø¯Øą ØĩŲˆØąØĒ Ø§Ø¯Ø§Ų…Ų‡ØŒ Ø´Ų…Ø§ Ø§Ø˛ Ų†Ø´ØŗØĒ ŲØšŲ„ÛŒ ØŽŲˆØ¯ ØŽØ§ØąØŦ Ų…ÛŒâ€ŒØ´ŲˆÛŒØ¯ ؈ باید Ø¯ŲˆØ¨Ø§ØąŲ‡ ŲˆØ§ØąØ¯ ØŗÛŒØŗØĒŲ… Ø´ŲˆÛŒØ¯. Ų†Ø´ØŗØĒ ŲØšØ§Ų„ Ø¯Øą Ø¯ØŗØĒÚ¯Ø§Ų‡ Ų‡Ø§ÛŒ Ø¯ÛŒÚ¯Øą Ų…Ų…ÚŠŲ† Ø§ØŗØĒ ØĒا یڊ ØŗØ§ØšØĒ Ų‡Ų…Ú†Ų†Ø§Ų† ŲØšØ§Ų„ Ø¨Ø§Ų‚ÛŒ Ø¨Ų…Ø§Ų†Ų†Ø¯." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "ØĢبØĒ Ų†Ø§Ų… ØŽŲˆØ¯ÚŠØ§Øą" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "ŲžŲˆØ´Ų‡ ØąØ§ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯..." }, - "ssoCompleteRegistration": { - "message": "Ø¨ØąØ§ÛŒ ŲžØą ÚŠØąØ¯Ų† ŲˆØąŲˆØ¯ Ø¨Ų‡ ØŗÛŒØŗØĒŲ… با SSO، Ų„ØˇŲØ§Ų‹ یڊ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ Ø¨ØąØ§ÛŒ Ø¯ØŗØĒØąØŗÛŒ ؈ Ų…Ø­Ø§ŲØ¸ØĒ Ø§Ø˛ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ ØŽŲˆØ¯ ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ÛŒØ¯." + "noFoldersFound": { + "message": "Ų‡ÛŒÚ† ŲžŲˆØ´Ų‡â€ŒØ§ÛŒ ŲžÛŒØ¯Ø§ Ų†Ø´Ø¯", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "ØĒایید Ų„Ø§Ø˛Ų… Ø§ØŗØĒ", + "description": "Default title for the user verification dialog." }, "hours": { "message": "ØŗØ§ØšØĒ" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Ø¯Ų‚ÛŒŲ‚Ų‡" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "ØŗÛŒØ§ØŗØĒâ€ŒŲ‡Ø§ÛŒ ØŗØ§Ø˛Ų…Ø§Ų†ØĒØ§Ų† Ø¨Øą Ų…Ų‡Ų„ØĒ Ø˛Ų…Ø§Ų†ÛŒ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø´Ų…Ø§ ØĒØŖØĢÛŒØą Ų…ÛŒâ€ŒÚ¯Ø°Ø§ØąØ¯. حداڊØĢØą Ø˛Ų…Ø§Ų† Ų…ØŦØ§Ø˛ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ $HOURS$ ØŗØ§ØšØĒ ؈ $MINUTES$ Ø¯Ų‚ÛŒŲ‚Ų‡ Ø§ØŗØĒ", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "ØŗÛŒØ§ØŗØĒâ€ŒŲ‡Ø§ÛŒ ØŗØ§Ø˛Ų…Ø§Ų†ØĒØ§Ų† Ø¨Øą Ų…Ų‡Ų„ØĒ Ø˛Ų…Ø§Ų†ÛŒ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø´Ų…Ø§ ØĒØŖØĢÛŒØą Ų…ÛŒâ€ŒÚ¯Ø°Ø§ØąØ¯. حداڊØĢØą Ø˛Ų…Ø§Ų† Ų…ØŦØ§Ø˛ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ $HOURS$ ØŗØ§ØšØĒ ؈ $MINUTES$ Ø¯Ų‚ÛŒŲ‚Ų‡ Ø§ØŗØĒ. ØšŲ…Ų„Ú¯Øą Ų…Ų‡Ų„ØĒ Ø˛Ų…Ø§Ų†ÛŒ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø´Ų…Ø§ ØąŲˆÛŒ $ACTION$ ØĒŲ†Ø¸ÛŒŲ… Ø´Ø¯Ų‡ Ø§ØŗØĒ.", "placeholders": { @@ -1992,7 +2857,7 @@ "message": "Ø¨ØąŲˆŲ† ØąÛŒØ˛ÛŒ Ú¯Ø§Ųˆâ€ŒØĩŲ†Ø¯ŲˆŲ‚ Ø´ØŽØĩی" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "ŲŲ‚Øˇ Ų…ŲˆØ§ØąØ¯ Ø´ØŽØĩی Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ų…ØąØĒØ¨Øˇ با $EMAIL$ Ø¨ØąŲˆŲ† ØąÛŒØ˛ÛŒ ØŽŲˆØ§Ų‡Ų†Ø¯ شد. Ų…ŲˆØ§ØąØ¯ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ ØŗØ§Ø˛Ų…Ø§Ų† Ø´Ø§Ų…Ų„ Ų†ØŽŲˆØ§Ų‡Ø¯ شد. ŲŲ‚Øˇ Ø§ØˇŲ„Ø§ØšØ§ØĒ Ų…ŲˆØąØ¯ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚ Ø¨ØąŲˆŲ† ØąÛŒØ˛ÛŒ ØŽŲˆØ§Ų‡Ø¯ شد ؈ Ø´Ø§Ų…Ų„ ØĒØ§ØąÛŒØŽÚ†Ų‡ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą Ų…ØąØĒØ¨Øˇ یا ŲžÛŒŲˆØŗØĒ Ų†Ų…ÛŒâ€ŒØ´ŲˆØ¯.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "ØŽØˇØ§" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ایØŦاد Ų†Ø§Ų… ÚŠØ§ØąØ¨ØąÛŒ" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Ų†ŲˆØš Ų†Ø§Ų… ÚŠØ§ØąØ¨ØąÛŒ" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "یڊ Ų†Ø§Ų… Ų…ØŗØĒØšØ§Øą Ø§ÛŒŲ…ÛŒŲ„ با یڊ ØŗØąŲˆÛŒØŗ Ø§ØąØŗØ§Ų„ ØŽØ§ØąØŦی ایØŦاد ÚŠŲ†ÛŒØ¯." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Ø¯Ø§Ų…Ų†Ų‡ $SERVICENAME$ Ų†Ø§Ų…ØšØĒØ¨Øą.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "ØĸØ¯ØąØŗ $SERVICENAME$ Ų†Ø§Ų…ØšØĒØ¨Øą.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "ØŽØˇØ§ÛŒ $SERVICENAME$ Ų†Ø§Ų…ØšŲ„ŲˆŲ…ÛŒ ØąØŽ داد.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Ų†Ø§Ų… Ų…ÛŒØ˛Ø¨Ø§Ų†", "description": "Part of a URL." @@ -2126,7 +3130,7 @@ "message": "Ø´Ų…Ø§ Ų†ÛŒØŗØĒید؟" }, "newAroundHere": { - "message": "Ø§ÛŒŲ†ØŦا ØŦØ¯ÛŒØ¯Ų‡ØŸ" + "message": "Ø§ÛŒŲ†ØŦا ØĒØ§Ø˛Ų‡ ŲˆØ§ØąØ¯ÛŒØŸ" }, "rememberEmail": { "message": "Ø§ÛŒŲ…ÛŒŲ„ ØąØ§ Ø¨Ų‡ ØŽØ§ØˇØą Ø¨ØŗŲžØ§Øą" @@ -2192,7 +3196,7 @@ "message": "Ų†Ø­ŲˆŲ‡ ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą" }, "autofillSelectInfoWithCommand": { - "message": "یڊ Ų…ŲˆØąØ¯ ØąØ§ Ø§Ø˛ Ø§ÛŒŲ† ØĩŲØ­Ų‡ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯ یا Ø§Ø˛ Ų…ÛŒØ§Ų†Ø¨Øą Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØ¯: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "یڊ Ų…ŲˆØąØ¯ ØąØ§ Ø§Ø˛ Ø§ÛŒŲ† ØĩŲØ­Ų‡ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯ یا یڊ Ų…ÛŒØ§Ų†Ø¨Øą Ø¯Øą ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ÛŒØ¯." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Ų…ØĒ؈ØŦŲ‡ Ø´Ø¯Ų…" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "Ų…ÛŒØ§Ų†Ø¨Øą ØĩŲØ­Ų‡ ÚŠŲ„ÛŒØ¯ ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą" }, - "autofillShortcutNotSet": { - "message": "Ų…ÛŒØ§Ų†Ø¨Øą ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą ØĒŲ†Ø¸ÛŒŲ… Ų†Ø´Ø¯Ų‡ Ø§ØŗØĒ. Ø§ÛŒŲ† ØąØ§ Ø¯Øą ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ Ų…ØąŲˆØąÚ¯Øą ØĒØēÛŒÛŒØą Ø¯Ų‡ÛŒØ¯." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "Ų…ÛŒØ§Ų†Ø¨Øą ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą: $COMMAND$ Ø§ØŗØĒ. Ø§ÛŒŲ† ØąØ§ Ø¯Øą ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ Ų…ØąŲˆØąÚ¯Øą ØĒØēÛŒÛŒØą Ø¯Ų‡ÛŒØ¯.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,43 +3246,55 @@ } } }, - "loggingInOn": { - "message": "ŲˆØąŲˆØ¯ Ø¨Ų‡ ØšŲ†ŲˆØ§Ų†" - }, "opensInANewWindow": { "message": "Ø¯Øą ŲžŲ†ØŦØąŲ‡ ØŦدید Ø¨Ø§Ø˛ Ų…ÛŒâ€ŒØ´ŲˆØ¯" }, "deviceApprovalRequired": { - "message": "ØĒایید Ø¯ØŗØĒÚ¯Ø§Ų‡ Ų„Ø§Ø˛Ų… Ø§ØŗØĒ. یڊ ØąŲˆØ´ ØĒایید Ø¨ØąÚ¯Ø˛ÛŒŲ†ÛŒØ¯:" + "message": "ØĒØŖÛŒÛŒØ¯ Ø¯ØŗØĒÚ¯Ø§Ų‡ Ų„Ø§Ø˛Ų… Ø§ØŗØĒ. یڊ ØąŲˆØ´ ØĒØŖÛŒÛŒØ¯ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯:" }, "rememberThisDevice": { "message": "Ø§ÛŒŲ† Ø¯ØŗØĒÚ¯Ø§Ų‡ ØąØ§ Ø¨Ų‡ ØŽØ§ØˇØą Ø¨ØŗŲžØ§Øą" }, "uncheckIfPublicDevice": { - "message": "Ø¨ØąØ¯Ø§ØąÛŒØ¯ Ø§Ú¯Øą Ø§Ø˛ Ø¯ØŗØĒÚ¯Ø§Ų‡ ØšŲ…ŲˆŲ…ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒÚŠŲ†ÛŒØ¯" + "message": "Ø§Ú¯Øą Ø§Ø˛ Ø¯ØŗØĒÚ¯Ø§Ų‡ ØšŲ…ŲˆŲ…ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†ÛŒØ¯ ØšŲ„Ø§Ų…ØĒ ØąØ§ Ø¨ØąØ¯Ø§ØąÛŒØ¯" }, "approveFromYourOtherDevice": { - "message": "ØĒایید با Ø¯ØŗØĒÚ¯Ø§Ų‡ Ø¯ÛŒÚ¯ØąØĒØ§Ų†" + "message": "ØĒØŖÛŒÛŒØ¯ با Ø¯ØŗØĒÚ¯Ø§Ų‡ Ø¯ÛŒÚ¯ØąØĒØ§Ų†" }, "requestAdminApproval": { - "message": "Ø¯ØąØŽŲˆØ§ØŗØĒ ØĒایید Ų…Ø¯ÛŒØą" + "message": "Ø¯ØąØŽŲˆØ§ØŗØĒ ØĒØŖÛŒÛŒØ¯ Ų…Ø¯ÛŒØą" }, "approveWithMasterPassword": { - "message": "ØĒایید با ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ" + "message": "ØĒØŖÛŒÛŒØ¯ با ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ" }, "ssoIdentifierRequired": { "message": "Ø´Ų†Ø§ØŗŲ‡ ØŗØ§Ø˛Ų…Ø§Ų† SSO Ų…ŲˆØąØ¯ Ų†ÛŒØ§Ø˛ Ø§ØŗØĒ." }, + "creatingAccountOn": { + "message": "Ø¯Øą Ø­Ø§Ų„ ØŗØ§ØŽØĒ Ø­ØŗØ§Ø¨ ØąŲˆÛŒ" + }, + "checkYourEmail": { + "message": "Ø§ÛŒŲ…ÛŒŲ„ ØŽŲˆØ¯ ØąØ§ چک ÚŠŲ†ÛŒØ¯" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Ø¯Ų†Ø¨Ø§Ų„ ÚŠŲ†ÛŒØ¯ Ų„ÛŒŲ†ÚŠÛŒ ØąØ§ ÚŠŲ‡ Ø¯Øą Ø§ÛŒŲ…ÛŒŲ„ ŲØąØŗØĒØ§Ø¯Ų‡ Ø´Ø¯Ų‡ Ø¨Ų‡" + }, + "andContinueCreatingYourAccount": { + "message": "؈ Ø¨Ų‡ ØŗØ§ØŽØĒŲ† Ø­ØŗØ§Ø¨â€ŒØĒØ§Ų† Ø§Ø¯Ø§Ų…Ų‡ Ø¯Ų‡ÛŒØ¯." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "Ø§ØąŲˆŲžØ§", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Ø¯ØŗØĒØąØŗÛŒ ØąØ¯ شد. Ø´Ų…Ø§ اØŦØ§Ø˛Ų‡ Ų…Ø´Ø§Ų‡Ø¯Ų‡ Ø§ÛŒŲ† ØĩŲØ­Ų‡ ØąØ§ Ų†Ø¯Ø§ØąÛŒØ¯." }, @@ -2283,37 +3308,45 @@ "message": "Ø­ØŗØ§Ø¨ ÚŠØ§ØąØ¨ØąÛŒ با Ų…ŲˆŲŲ‚ÛŒØĒ ایØŦاد شد!" }, "adminApprovalRequested": { - "message": "ØĒایید Ų…Ø¯ÛŒØą Ø¯Øą ØŽŲˆØ§ØŗØĒ شد" + "message": "ØĒØŖÛŒÛŒØ¯ Ų…Ø¯ÛŒØą Ø¯ØąØŽŲˆØ§ØŗØĒ شد" }, "adminApprovalRequestSentToAdmins": { "message": "Ø¯ØąØŽŲˆØ§ØŗØĒ Ø´Ų…Ø§ Ø¨Ų‡ Ų…Ø¯ÛŒØąØĒØ§Ų† ŲØąØŗØĒØ§Ø¯Ų‡ شد." }, "youWillBeNotifiedOnceApproved": { - "message": "Ø¨Ų‡ Ų…Ø­Øļ ØĒایید Ų…ØˇŲ„Øš ØŽŲˆØ§Ų‡ÛŒØ¯ شد." + "message": "Ø¨Ų‡ Ų…Ø­Øļ ØĒØŖÛŒÛŒØ¯ Ų…ØˇŲ„Øš ØŽŲˆØ§Ų‡ÛŒØ¯ شد." }, "troubleLoggingIn": { "message": "Ø¯Øą ŲˆØąŲˆØ¯ Ų…Ø´ÚŠŲ„ÛŒ Ø¯Ø§ØąÛŒØ¯ØŸ" }, "loginApproved": { - "message": "ŲˆØąŲˆØ¯ ØĒایید شد" + "message": "ŲˆØąŲˆØ¯ ØĒØŖÛŒÛŒØ¯ شد" }, "userEmailMissing": { - "message": "ØąØ§ÛŒØ§Ų†Ø§Ų…Ų‡ ÚŠØ§ØąØ¨Øą ÚŠŲ… Ø§ØŗØĒ" + "message": "Ø§ÛŒŲ…ÛŒŲ„ ÚŠØ§ØąØ¨Øą ؈ØŦŲˆØ¯ Ų†Ø¯Ø§ØąØ¯" }, "deviceTrusted": { "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." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { - "message": "ŲˆØąŲˆØ¯ÛŒ Ų…ŲˆØąØ¯ Ų†ÛŒØ§Ø˛ Ø§ØŗØĒ." + "message": "ŲˆØąŲˆØ¯ÛŒ ØļØąŲˆØąÛŒ Ø§ØŗØĒ." }, "required": { - "message": "Ø§Ų„Ø˛Ø§Ų…ÛŒ" + "message": "ØļØąŲˆØąÛŒ" }, "search": { "message": "ØŦØŗØĒØŦ؈" }, "inputMinLength": { - "message": "ŲˆØąŲˆØ¯ÛŒ باید Ø­Ø¯Ø§Ų‚Ų„ $COUNT$ Ų†Ø´Ø§Ų†Ų‡ داشØĒŲ‡ باشد.", + "message": "ŲˆØąŲˆØ¯ÛŒ باید Ø­Ø¯Ø§Ų‚Ų„ $COUNT$ ÚŠØ§ØąØ§ÚŠØĒØą داشØĒŲ‡ باشد.", "placeholders": { "count": { "content": "$1", @@ -2322,7 +3355,7 @@ } }, "inputMaxLength": { - "message": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲˆØąŲˆØ¯ÛŒ Ų†Ø¨Ø§ÛŒØ¯ بیش Ø§Ø˛ $COUNT$ Ų†Ø´Ø§Ų†Ų‡ باشد.", + "message": "ØˇŲˆŲ„ ŲˆØąŲˆØ¯ÛŒ Ų†Ø¨Ø§ÛŒØ¯ بیش Ø§Ø˛ $COUNT$ ÚŠØ§ØąØ§ÚŠØĒØą باشد.", "placeholders": { "count": { "content": "$1", @@ -2331,7 +3364,7 @@ } }, "inputForbiddenCharacters": { - "message": "Ų†Ø´Ø§Ų†Ų‡ Ų‡Ø§ÛŒ Ø˛ÛŒØą Ų…ØŦØ§Ø˛ Ų†ÛŒØŗØĒŲ†Ø¯: $CHARACTERS$", + "message": "ÚŠØ§ØąØ§ÚŠØĒØąŲ‡Ø§ÛŒ Ø˛ÛŒØą Ų…ØŦØ§Ø˛ Ų†ÛŒØŗØĒŲ†Ø¯: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Ų…Ų‚Ø¯Ø§Øą ŲˆØąŲˆØ¯ÛŒ باید Ø¯ØŗØĒ ÚŠŲ… $MIN$ باشد.", + "message": "Ų…Ų‚Ø¯Ø§Øą ŲˆØąŲˆØ¯ÛŒ باید Ø­Ø¯Ø§Ų‚Ų„ $MIN$ باشد.", "placeholders": { "min": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Ų…Ų‚Ø¯Ø§Øą ŲˆØąŲˆØ¯ÛŒ Ų†Ø¨Ø§ÛŒØ¯ بیش Ø§Ø˛ $MAX$ باشد.", + "message": "Ų…Ų‚Ø¯Ø§Øą ŲˆØąŲˆØ¯ÛŒ Ų†Ø¨Ø§ÛŒØ¯ Ø§Ø˛ $MAX$ ØĒØŦØ§ŲˆØ˛ ÚŠŲ†Ø¯.", "placeholders": { "max": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "یڊ یا Ú†Ų†Ø¯ ØąØ§ÛŒØ§Ų†Ø§Ų…Ų‡ Ų†Ø§Ų…ØšØĒØ¨Øą Ø§ØŗØĒ" + "message": "یڊ یا Ú†Ų†Ø¯ Ø§ÛŒŲ…ÛŒŲ„ Ų†Ø§Ų…ØšØĒØ¨Øą Ø§ØŗØĒ" }, "inputTrimValidator": { - "message": "ŲˆØąŲˆØ¯ÛŒ Ų†Ø¨Ø§ÛŒØ¯ ŲŲ‚Øˇ ŲØ§ØĩŲ„Ų‡ باشد.", + "message": "ŲˆØąŲˆØ¯ÛŒ Ų†Ø¨Ø§ÛŒØ¯ ŲŲ‚Øˇ Ø­Ø§ŲˆÛŒ ؁Øļای ØŽØ§Ų„ÛŒ باشد.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "ŲˆØąŲˆØ¯ÛŒ یڊ Ų†Ø´Ø§Ų†ÛŒ ØąØ§ÛŒØ§Ų†Ø§Ų…Ų‡ Ų†ÛŒØŗØĒ." + "message": "ŲˆØąŲˆØ¯ÛŒ یڊ Ų†Ø´Ø§Ų†ÛŒ Ø§ÛŒŲ…ÛŒŲ„ Ų†ÛŒØŗØĒ." }, "fieldsNeedAttention": { - "message": "ب؎ش (Ų‡Ø§ÛŒ) $COUNT$ Ø¯Øą Ø¨Ø§Ų„Ø§ Ų†ÛŒØ§Ø˛Ų…Ų†Ø¯ ØĒ؈ØŦŲ‡ Ø´Ų…Ø§ Ø§ØŗØĒ.", + "message": "ŲÛŒŲ„Ø¯ $COUNT$ Ø¯Øą Ø¨Ø§Ų„Ø§ Ø¨Ų‡ ØĒ؈ØŦŲ‡ Ø´Ų…Ø§ Ų†ÛŒØ§Ø˛ Ø¯Ø§ØąØ¯.", "placeholders": { "count": { "content": "$1", @@ -2376,20 +3409,32 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Ø§Ų†ØĒ؎اب --" }, "multiSelectPlaceholder": { - "message": "-- Ø¨ØąØ§ÛŒ Ú¯Ø˛ÛŒŲ†Ø´ Ú†ÛŒØ˛ÛŒ Ø¨Ų†ŲˆÛŒØŗÛŒØ¯ --" + "message": "-- Ø¨ØąØ§ÛŒ ŲÛŒŲ„ØĒØą ØĒØ§ÛŒŲž ÚŠŲ†ÛŒØ¯ --" }, "multiSelectLoading": { "message": "Ø¯Øą Ø­Ø§Ų„ Ø¨Ø§Ø˛ÛŒØ§Ø¨ÛŒ Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§..." }, "multiSelectNotFound": { - "message": "Ų…ŲˆØąØ¯ÛŒ ŲžÛŒØ¯Ø§ Ų†Ø´Ø¯" + "message": "Ų…ŲˆØąØ¯ÛŒ ÛŒØ§ŲØĒ Ų†Ø´Ø¯" }, "multiSelectClearAll": { - "message": "ŲžØ§ÚŠ ÚŠØąØ¯Ų† Ų‡Ų…Ų‡" + "message": "ŲžØ§ÚŠâ€ŒÚŠØąØ¯Ų† Ų‡Ų…Ų‡" }, "plusNMore": { "message": "+ $QUANTITY$ بیشØĒØą", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Ø˛ÛŒØąŲŲ‡ØąØŗØĒ" + "message": "Ø˛ÛŒØąŲ…Ų†Ųˆ" }, "toggleCollapse": { - "message": "Ø¨Ø§Ø˛ ؈ Ø¨ØŗØĒŲ‡ ÚŠØąØ¯Ų†", + "message": "Ø¯ÚŠŲ…Ų‡ Ø¨ØŗØĒŲ†", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Ø¯Ø§Ų…Ų†Ų‡ Ų…ØŗØĒØšØ§Øą" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Ų…ŲˆØ§ØąØ¯ با Ø¯ØąØŽŲˆØ§ØŗØĒ Ų…ØŦدد ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ ØąØ§ Ų†Ų…ÛŒâ€ŒØĒŲˆØ§Ų† Ø¯Øą Ø¨Ø§ØąÚ¯Ø°Ø§ØąÛŒ ØĩŲØ­Ų‡ Ø¨Ų‡â€ŒØĩŲˆØąØĒ ØŽŲˆØ¯ÚŠØ§Øą ŲžØą ÚŠØąØ¯. ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą Ø¯Øą Ø¨Ø§ØąÚ¯ÛŒØąÛŒ ØĩŲØ­Ų‡ ØŽØ§Ų…ŲˆØ´ شد.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "ŲžØą ÚŠØąØ¯Ų† ØŽŲˆØ¯ÚŠØ§Øą Ø¯Øą Ø¨Ø§ØąÚ¯ÛŒØąÛŒ ØĩŲØ­Ų‡ Ø¨ØąØ§ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ ŲžÛŒØ´â€ŒŲØąØļ ØĒŲ†Ø¸ÛŒŲ… Ø´Ø¯Ų‡ Ø§ØŗØĒ.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Ø¨ØąØ§ÛŒ ŲˆÛŒØąØ§ÛŒØ´ Ø§ÛŒŲ† ŲÛŒŲ„Ø¯ØŒ Ø¯ØąØŽŲˆØ§ØŗØĒ Ų…ØŦدد ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ ØąØ§ ØŽØ§Ų…ŲˆØ´ ÚŠŲ†ÛŒØ¯", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Ų…ŲˆØąØ¯ÛŒ Ø¨ØąØ§ÛŒ Ų†Ų…Ø§ÛŒØ´ ؈ØŦŲˆØ¯ Ų†Ø¯Ø§ØąØ¯", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Ų…ŲˆØąØ¯ ØŦدید", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Ø§ŲØ˛ŲˆØ¯Ų† Ų…ŲˆØąØ¯ÛŒ ØŦدید Ø¨Ų‡ Ú¯Ø§ŲˆØĩŲ†Ø¯ŲˆŲ‚", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ØąŲˆØ´Ų† ÚŠØąØ¯Ų†" + }, + "ignore": { + "message": "Ų†Ø§Ø¯ÛŒØ¯Ų‡ Ú¯ØąŲØĒŲ†" + }, + "importData": { + "message": "ŲˆØ§ØąØ¯ ÚŠØąØ¯Ų† Ø§ØˇŲ„Ø§ØšØ§ØĒ", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "ØŽØˇØ§ÛŒ ŲˆØ§ØąØ¯ ÚŠØąØ¯Ų†" + }, + "importErrorDesc": { + "message": "Ų…Ø´ÚŠŲ„ÛŒ با Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ ØŗØšÛŒ ÚŠØąØ¯ÛŒØ¯ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯ ؈ØŦŲˆØ¯ داشØĒ. Ų„ØˇŲØ§Ų‹ ØŽØˇØ§Ų‡Ø§ÛŒ ŲŲ‡ØąØŗØĒ Ø´Ø¯Ų‡ Ø˛ÛŒØą ØąØ§ Ø¯Øą ŲØ§ÛŒŲ„ Ų…Ų†Ø¨Øš ØŽŲˆØ¯ Ø¨ØąØˇØąŲ ÚŠØąØ¯Ų‡ ؈ Ø¯ŲˆØ¨Ø§ØąŲ‡ Ø§Ų…ØĒØ­Ø§Ų† ÚŠŲ†ÛŒØ¯." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "ØĒ؈ØļیحاØĒ" + }, + "importSuccess": { + "message": "Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§ با Ų…ŲˆŲŲ‚ÛŒØĒ ŲˆØ§ØąØ¯ شد" + }, + "importSuccessNumberOfItems": { + "message": "Ø¯Øą ÚŠŲ„ $AMOUNT$ Ų…ŲˆØąØ¯ ŲˆØ§ØąØ¯ Ø´Ø¯Ų‡ Ø§ØŗØĒ.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Ø¯ŲˆØ¨Ø§ØąŲ‡ ØŗØšÛŒ ÚŠŲ†ÛŒØ¯" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "ØĒŲ†Ø¸ÛŒŲ… PIN" + }, + "verifyWithBiometrics": { + "message": "ØĒایید با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ø¨ÛŒŲˆŲ…ØĒØąÛŒÚŠ" + }, + "awaitingConfirmation": { + "message": "Ø¯Øą Ø§Ų†ØĒØ¸Ø§Øą ØĒایید" + }, + "couldNotCompleteBiometrics": { + "message": "ØĒÚŠŲ…ÛŒŲ„ Ø¨ÛŒŲˆŲ…ØĒØąÛŒÚŠ Ų…Ų…ÚŠŲ† Ų†Ø´Ø¯." + }, + "needADifferentMethod": { + "message": "Ų†ÛŒØ§Ø˛Ų…Ų†Ø¯ ØąŲˆØ´ Ø¯ÛŒÚ¯ØąÛŒ Ų‡ØŗØĒید؟" + }, + "useMasterPassword": { + "message": "Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ØąŲ…Ø˛ ØšØ¨ŲˆØą اØĩŲ„ÛŒ" + }, + "usePin": { + "message": "Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ PIN" + }, + "useBiometrics": { + "message": "Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ø¨ÛŒŲˆŲ…ØĒØąÛŒÚŠ" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Ų…ØŦŲ…ŲˆØš" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "اØŦØąØ§ÛŒ Duo" + }, + "importFormatError": { + "message": "Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§ Ø¨Ų‡ Ø¯ØąØŗØĒی Ų‚Ø§Ų„Ø¨â€ŒØ¨Ų†Ø¯ÛŒ Ų†Ø´Ø¯Ų‡â€ŒØ§Ų†Ø¯. Ų„ØˇŲØ§ ŲØ§ÛŒŲ„ ŲˆØ§ØąØ¯ Ø´Ø¯Ų‡ ØŽŲˆØ¯ ØąØ§ Ø¨ØąØąØŗÛŒ ؈ Ø¯ŲˆØ¨Ø§ØąŲ‡ Ø§Ų…ØĒØ­Ø§Ų† ÚŠŲ†ÛŒØ¯." + }, + "importNothingError": { + "message": "Ú†ÛŒØ˛ÛŒ ŲˆØ§ØąØ¯ Ų†Ø´Ø¯." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "یڊ ŲžŲˆØ´Ų‡ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØą ÚŠŲžÛŒ Ų†Ų…ÛŒâ€ŒØ´ŲˆØ¯" + }, + "passkeyNotCopiedAlert": { + "message": "ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØą Ø¯Øą Ų…ŲˆØąØ¯ Ø´Ø¨ÛŒŲ‡ ØŗØ§Ø˛ÛŒ Ø´Ø¯Ų‡ ÚŠŲžÛŒ Ų†Ų…ÛŒâ€ŒØ´ŲˆØ¯. Øĸیا Ų…ÛŒâ€ŒØŽŲˆØ§Ų‡ÛŒØ¯ Ø¨Ų‡ Ø´Ø¨ÛŒŲ‡ ØŗØ§Ø˛ÛŒ Ø§ÛŒŲ† Ų…ŲˆØąØ¯ Ø§Ø¯Ø§Ų…Ų‡ Ø¯Ų‡ÛŒØ¯ØŸ" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "ØĒØŖÛŒÛŒØ¯ ØĒŲˆØŗØˇ ØŗØ§ÛŒØĒ ØĸØēØ§Ø˛Ú¯Øą Ø§Ų„Ø˛Ø§Ų…ÛŒ Ø§ØŗØĒ. Ø§ÛŒŲ† ŲˆÛŒÚ˜Ú¯ÛŒ Ų‡Ų†ŲˆØ˛ Ø¨ØąØ§ÛŒ Ø­ØŗØ§Ø¨â€ŒŲ‡Ø§ÛŒ Ø¨Ø¯ŲˆŲ† ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą اØĩŲ„ÛŒ اØŦØąØ§ Ų†Ø´Ø¯Ų‡ Ø§ØŗØĒ." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "یڊ ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØą Ø§Ø˛ Ų‚Ø¨Ų„ Ø¨ØąØ§ÛŒ Ø§ÛŒŲ† Ø¨ØąŲ†Ø§Ų…Ų‡ ؈ØŦŲˆØ¯ Ø¯Ø§ØąØ¯." + }, + "noPasskeysFoundForThisApplication": { + "message": "Ų‡ÛŒÚ† ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØąÛŒ Ø¨ØąØ§ÛŒ Ø§ÛŒŲ† Ø¨ØąŲ†Ø§Ų…Ų‡ ÛŒØ§ŲØĒ Ų†Ø´Ø¯." + }, + "noMatchingPasskeyLogin": { + "message": "Ø´Ų…Ø§ Ų‡ÛŒÚ† ŲˆØąŲˆØ¯ Ų…Ø´Ø§Ø¨Ų‡ÛŒ Ø¨ØąØ§ÛŒ Ø§ÛŒŲ† ØŗØ§ÛŒØĒ Ų†Ø¯Ø§ØąÛŒØ¯." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "ØĒØŖÛŒÛŒØ¯" + }, + "savePasskey": { + "message": "Ø°ØŽÛŒØąŲ‡ ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØą" + }, + "savePasskeyNewLogin": { + "message": "ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØą ØąØ§ Ø¨Ų‡ ØšŲ†ŲˆØ§Ų† ŲˆØąŲˆØ¯ ØŦدید Ø°ØŽÛŒØąŲ‡ ÚŠŲ†" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Ų…ŲˆØąØ¯ ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØą" + }, + "overwritePasskey": { + "message": "Ø¨Ø§Ø˛Ų†ŲˆÛŒØŗÛŒ ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØąØŸ" + }, + "overwritePasskeyAlert": { + "message": "Ø§ÛŒŲ† Ų…ŲˆØąØ¯ Ø§Ø˛ Ų‚Ø¨Ų„ Ø¯Ø§ØąØ§ÛŒ یڊ ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØą Ø§ØŗØĒ. Øĸیا Ų…ØˇŲ…ØĻŲ†ÛŒØ¯ ÚŠŲ‡ Ų…ÛŒâ€ŒØŽŲˆØ§Ų‡ÛŒØ¯ ÚŠŲ„Ų…Ų‡ ØšØ¨ŲˆØą ŲØšŲ„ÛŒ ØąØ§ Ø¨Ø§Ø˛Ų†ŲˆÛŒØŗÛŒ ÚŠŲ†ÛŒØ¯ØŸ" + }, + "featureNotSupported": { + "message": "ŲˆÛŒÚ˜Ú¯ÛŒ Ų‡Ų†ŲˆØ˛ ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ Ų†Ų…ÛŒâ€ŒØ´ŲˆØ¯" + }, + "yourPasskeyIsLocked": { + "message": "Ø¨ØąØ§ÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ÚŠŲ„ÛŒØ¯ ØšØ¨ŲˆØąØŒ Ø§Ø­ØąØ§Ø˛ Ų‡ŲˆÛŒØĒ Ų„Ø§Ø˛Ų… Ø§ØŗØĒ. Ø¨ØąØ§ÛŒ Ø§Ø¯Ø§Ų…Ų‡ØŒ Ų‡ŲˆÛŒØĒ ØŽŲˆØ¯ ØąØ§ ØĒØŖÛŒÛŒØ¯ ÚŠŲ†ÛŒØ¯." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 81bf6c64322..e902e2d241d 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden – Ilmainen salasanahallinta", + "message": "Bitwarden Salasanahallinta", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Turvallinen ja ilmainen salasanahallinta kaikille laitteillesi.", - "description": "Extension description" + "message": "Kotona, tÃļissä tai reissussa, Bitwarden suojaa salasanasi, pääsyavaimesi ja arkaluonteiset tietosi helposti.", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "Kirjaudu tai luo uusi tili käyttääksesi salattua holviasi." + "message": "Käytä salattua holviasi kirjautumalla sisään tai luo uusi tili." + }, + "inviteAccepted": { + "message": "Kutsu hyväksyttiin" }, "createAccount": { "message": "Luo tili" }, - "login": { - "message": "Kirjaudu" + "newToBitwarden": { + "message": "Oletko uusi Bitwarden-käyttäjä?" + }, + "logInWithPasskey": { + "message": "Kirjaudu pääsyavaimella" + }, + "useSingleSignOn": { + "message": "Käytä kertakirjautumista" + }, + "welcomeBack": { + "message": "Tervetuloa takaisin" + }, + "setAStrongPassword": { + "message": "Aseta vahva salasana" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Viimeistele tilin luonti asettamalla salasana" }, "enterpriseSingleSignOn": { "message": "Yrityksen kertakirjautuminen (SSO)" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Pääsalasanan vihje voi auttaa sinua muistamaan unohtamasi salasanan." }, + "masterPassHintText": { + "message": "Jos unohdat salasanasi, salasanavihje voidaan lähettää sähkÃļpostiisi. Merkkien enimmäismäärä: $CURRENT$/$MAXIMUM$.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "SyÃļtä pääsalasana uudelleen" }, "masterPassHint": { "message": "Pääsalasanan vihje (valinnainen)" }, + "joinOrganization": { + "message": "Liity organisaatioon" + }, + "joinOrganizationName": { + "message": "Liity organisaatioon $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Viimeistele liittyminen organisaatioon asettamalla pääsalasana." + }, "tab": { "message": "Välilehti" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopioi salasana" }, + "copyPassphrase": { + "message": "Kopioi salalause" + }, "copyNote": { "message": "Kopioi merkinnät" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Kopioi turvakoodi" }, + "copyName": { + "message": "Kopioi nimi" + }, + "copyCompany": { + "message": "Kopioi yritys" + }, + "copySSN": { + "message": "Kopioi henkilÃļtunnus" + }, + "copyPassportNumber": { + "message": "Kopioi passin numero" + }, + "copyLicenseNumber": { + "message": "Kopioi ajokortin numero" + }, + "copyPrivateKey": { + "message": "Kopioi yksityinen avain" + }, + "copyPublicKey": { + "message": "Kopioi julkinen avain" + }, + "copyFingerprint": { + "message": "Kopioi sormenjälki" + }, + "copyCustomField": { + "message": "Kopioi $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopioi verkkosivusto" + }, + "copyNotes": { + "message": "Kopioi merkinnät" + }, + "fill": { + "message": "Täytä", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Automaattinen täyttÃļ" + "message": "AutomaattitäyttÃļ" + }, + "autoFillLogin": { + "message": "Automaattitäytä kirjautumistieto" + }, + "autoFillCard": { + "message": "Automaattitäytä kortti" + }, + "autoFillIdentity": { + "message": "Automaattitäytä henkilÃļllisyys" }, "generatePasswordCopied": { "message": "Luo salasana (leikepÃļydälle)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Ei tunnistettuja kirjautumistietoja." }, + "noCards": { + "message": "Kortteja ei ole" + }, + "noIdentities": { + "message": "Identiteettejä ei ole" + }, + "addLoginMenu": { + "message": "Lisää kirjautumistieto" + }, + "addCardMenu": { + "message": "Lisää kortti" + }, + "addIdentityMenu": { + "message": "Lisää henkilÃļllisyys" + }, "unlockVaultMenu": { "message": "Avaa holvisi" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Lisää kohde" }, + "accountEmail": { + "message": "Tilin sähkÃļpostiosoite" + }, + "requestHint": { + "message": "Pyydä vihje" + }, + "requestPasswordHint": { + "message": "Pyydä pääsalasanan vihje" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "SyÃļtä tilisi sähkÃļpostiosoite, niin salasanavihjeesi lähetetään sinulle sähkÃļpostitse" + }, "passwordHint": { "message": "Salasanavihje" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Jatka vahvistamalla henkilÃļllisyytesi." }, - "account": { - "message": "Käyttäjätili" - }, "changeMasterPassword": { "message": "Vaihda pääsalasana" }, + "continueToWebApp": { + "message": "Avataanko verkkosovellus?" + }, + "continueToWebAppDesc": { + "message": "Tutustu Bitwarden-tilisi muihin ominaisuuksiin verkkosovelluksessa." + }, + "continueToHelpCenter": { + "message": "Avataanko tukikeskus?" + }, + "continueToHelpCenterDesc": { + "message": "Lue Tukikeskuksesta lisää Bitwardenin käytÃļstä." + }, + "continueToBrowserExtensionStore": { + "message": "Avataanko selaimen laajennuskauppa?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Auta muita selvittämään sopiiko Bitwarden heille. Arvioi se selaimesi laajennuskaupassa nyt." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Voit vaihtaa pääsalasanasi Bitwardenin verkkosovelluksessa." + }, "fingerprintPhrase": { "message": "Tunnistelauseke", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Kirjaudu ulos" }, + "aboutBitwarden": { + "message": "Tietoja Bitwardenista" + }, "about": { "message": "Tietoja" }, + "moreFromBitwarden": { + "message": "Lisää Bitwardenilta" + }, + "continueToBitwardenDotCom": { + "message": "Avataanko bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticatorin avulla voit säilyttää todennusavaimet ja luoda TOTP-koodeja kaksivaiheista kirjautumista varten. Lue lisää bitwarden.com-sivustolta." + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Salaisuushallinta" + }, + "continueToSecretsManagerPageDesc": { + "message": "Säilytä, hallitse ja jaa kehittäjäsalaisuuksia turvallisesti Bitwardenin Salaisuushallinnalla. Lue lisää bitwarden.com-sivustolta." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Luo perinteisistä salasanoista vapaita sujuvia ja turvallisia kirjautumisratkaisuja Passwordless.dev-palvelussa. Tutustu palveluun bitwarden.com-sivustolla." + }, + "freeBitwardenFamilies": { + "message": "Ilmainen Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Olet oikeutettu ilmaiseen Bitwarden Families -tilaukseen. Lunasta tarjous verkkosovelluksessa tänään." + }, "version": { "message": "Versio" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Muokkaa kansiota" }, + "newFolder": { + "message": "Uusi kansio" + }, + "folderName": { + "message": "Kansion nimi" + }, + "folderHintText": { + "message": "Luo alikansio lisäämällä olemassa olevan kansion nimi \"/\"-merkin edelle. Esim: Some/Foorumit." + }, + "noFoldersAdded": { + "message": "Kansioita ei ole lisätty" + }, + "createFoldersToOrganize": { + "message": "Järjestä holvisi kohteita luomalla kansioita" + }, + "deleteFolderPermanently": { + "message": "Haluatko varmasti poistaa kansion pysyvästi?" + }, "deleteFolder": { "message": "Poista kansio" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generaattori", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Luo kirjautumistiedoillesi automaattisesti vahvoja, ainutlaatuisia salasanoja." }, - "bitWebVault": { - "message": "Bitwarden Verkkoholvi" + "bitWebVaultApp": { + "message": "Bitwarden Verkkosovellus" }, "importItems": { "message": "Tuo kohteita" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Luo salasana" }, + "generatePassphrase": { + "message": "Luo salalause" + }, "regeneratePassword": { "message": "Luo uusi salasana" }, @@ -244,17 +447,60 @@ "length": { "message": "Pituus" }, + "passwordMinLength": { + "message": "Salasanan vähimmäispituus" + }, "uppercase": { - "message": "Isot kirjaimet (A-Z)" + "message": "Isot kirjaimet (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Pienet kirjaimet (a-z)" + "message": "Pienet kirjaimet (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numerot (0-9)" + "message": "Numerot (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Erikoismerkit (!@#$%^&*)" + "message": "Erikoismerkit (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Sisällytys", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Sisällytä isoja kirjaimia", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Sisällytä pieniä kirjaimia", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Sisällytä numeroita", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Sisällytä erikoismerkkejä", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Sanojen määrä" @@ -276,7 +522,16 @@ "message": "Erikoismerkkejä vähintään" }, "avoidAmbChar": { - "message": "Vältä epäselviä merkkejä" + "message": "Vältä epäselviä merkkejä", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Vältä epäselviä merkkejä", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "YrityskäytännÃļn säännÃļt vaikuttavat generaattoriasetuksiisi.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Etsi holvista" @@ -299,15 +554,30 @@ "password": { "message": "Salasana" }, + "totp": { + "message": "Todennuksen salaisuus" + }, "passphrase": { "message": "Salauslauseke" }, "favorite": { "message": "Suosikki" }, + "unfavorite": { + "message": "Poista suosikeista" + }, + "itemAddedToFavorites": { + "message": "Kohde lisättiin suosikkeihin" + }, + "itemRemovedFromFavorites": { + "message": "Kohde poistettiin suosikeista" + }, "notes": { "message": "Merkinnät" }, + "privateNote": { + "message": "Yksityinen muistiinpano" + }, "note": { "message": "Merkintä" }, @@ -326,6 +596,18 @@ "launch": { "message": "Avaa" }, + "launchWebsite": { + "message": "Avaa verkkosivusto" + }, + "launchWebsiteName": { + "message": "Avaa verkkosivusto $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Verkkosivusto" }, @@ -333,14 +615,29 @@ "message": "Näytä tai piilota" }, "manage": { - "message": "Hallinnoi" + "message": "Hallitse" }, "other": { "message": "Muut" }, + "unlockMethods": { + "message": "Avausasetukset" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Muuta holvisi aikakatkaisutoimintoa määrittämällä lukituksen avaustapa." }, + "unlockMethodNeeded": { + "message": "Määritä avaustapa asetuksista" + }, + "sessionTimeoutHeader": { + "message": "Istunnon aikakatkaisu" + }, + "vaultTimeoutHeader": { + "message": "Holvin aikakatkaisu" + }, + "otherOptions": { + "message": "Muut asetukset" + }, "rateExtension": { "message": "Arvioi laajennus" }, @@ -351,11 +648,20 @@ "message": "Selaimesi ei tue helppoa leikepÃļydälle kopiointia. Kopioi kohde manuaalisesti." }, "verifyIdentity": { - "message": "Vahvista henkilÃļllisyys" + "message": "Vahvista henkilÃļllisyytesi" }, "yourVaultIsLocked": { "message": "Holvisi on lukittu. Jatka vahvistamalla henkilÃļllisyytesi." }, + "yourVaultIsLockedV2": { + "message": "Holvisi on lukittu" + }, + "yourAccountIsLocked": { + "message": "Tilisi on lukittu" + }, + "or": { + "message": "tai" + }, "unlock": { "message": "Avaa" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Holvin aikakatkaisu" }, + "vaultTimeout1": { + "message": "Aikakatkaisu" + }, "lockNow": { "message": "Lukitse nyt" }, + "lockAll": { + "message": "Lukitse kaikki" + }, "immediately": { "message": "VälittÃļmästi" }, @@ -426,6 +738,18 @@ "security": { "message": "Suojaus" }, + "confirmMasterPassword": { + "message": "Vahvista pääsalasana" + }, + "masterPassword": { + "message": "Pääsalasana" + }, + "masterPassImportant": { + "message": "Pääsalasanaasi ei ole mahdollista palauttaa, jos unohdat sen!" + }, + "masterPassHintLabel": { + "message": "Pääsalasanan vihje" + }, "errorOccurred": { "message": "Tapahtui virhe" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Uusi käyttäjätilisi on luotu! Voit nyt kirjautua sisään." }, + "newAccountCreated2": { + "message": "Uusi tilisi on luotu!" + }, + "youHaveBeenLoggedIn": { + "message": "Sinut on kirjattu sisään!" + }, + "youSuccessfullyLoggedIn": { + "message": "Kirjautuminen onnistui" + }, + "youMayCloseThisWindow": { + "message": "Voit sulkea tämän ikkunan" + }, "masterPassSent": { "message": "Lähetimme pääsalasanasi vihjeen sähkÃļpostitse." }, "verificationCodeRequired": { "message": "Todennuskoodi vaaditaan." }, + "webauthnCancelOrTimeout": { + "message": "Tunnistautuminen peruttiin tai se kesti liian kauan. Yritä uudelleen." + }, "invalidVerificationCode": { "message": "Virheellinen todennuskoodi" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Valittua kohdetta ei voitu täyttää tälle sivulle automaattisesti. Kopioi ja liitä tiedot itse." }, + "totpCaptureError": { + "message": "QR-koodin skannaus nykyiseltä sivulta ei onnistu." + }, + "totpCaptureSuccess": { + "message": "Todennusavain on lisätty" + }, + "totpCapture": { + "message": "Skannaa todennusavaimen QR-koodi nykyiseltä verkkosivulta" + }, + "totpHelperTitle": { + "message": "Tee kaksivaiheisesta kirjautumisesta saumatonta" + }, + "totpHelper": { + "message": "Bitwarden voi säilyttää ja täyttää kaksivaiheisen kirjautumisen koodit. Kopioi ja liitä todennusavain tähän kenttään." + }, + "totpHelperWithCapture": { + "message": "Bitwarden voi säilyttää ja täyttää kaksivaiheisen kirjautumisen koodit. Kamerakuvakkeella voit kaapata todennusavaimen avoimen sivun QR-koodista automaattisesti, tai voit kopioida ja liittää sen tähän kenttään manuaalisesti." + }, + "learnMoreAboutAuthenticators": { + "message": "Lue lisää todentajista" + }, + "copyTOTP": { + "message": "Kopioi todennusavain (TOTP)" + }, "loggedOut": { "message": "Kirjauduttu ulos" }, + "loggedOutDesc": { + "message": "Sinut on kirjattu ulos tililtäsi." + }, "loginExpired": { "message": "Kirjautumisistuntosi on erääntynyt." }, + "logIn": { + "message": "Kirjaudu" + }, + "logInToBitwarden": { + "message": "Kirjaudu Bitwardeniin" + }, + "restartRegistration": { + "message": "Aloita rekisterÃļityminen alusta" + }, + "expiredLink": { + "message": "Vanhentunut linkki" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Aloita rekisterÃļityminen alusta tai yritä kirjautua sisään uudelleen." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Sinulla saattaa jo olla tili" + }, "logOutConfirmation": { "message": "Haluatko varmasti kirjautua ulos?" }, @@ -503,14 +887,14 @@ "addedFolder": { "message": "Kansio lisätty" }, - "changeMasterPass": { - "message": "Vaihda pääsalasana" - }, - "changeMasterPasswordConfirmation": { - "message": "Voit vaihtaa pääsalasanasi bitwarden.com-verkkoholvissa. Haluatko käydä sivustolla nyt?" - }, "twoStepLoginConfirmation": { - "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi todennuslaitteen, ‑sovelluksen, tekstiviestin, puhelun tai sähkÃļpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttÃļÃļn bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" + "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi suojausavaimen, ‑sovelluksen, tekstiviestin, puhelun tai sähkÃļpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttÃļÃļn bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" + }, + "twoStepLoginConfirmationContent": { + "message": "Paranna tilisi suojausta määrittämällä kaksivaiheinen kirjautuminen Bitwardenin verkkosovelluksessa." + }, + "twoStepLoginConfirmationTitle": { + "message": "Avataanko verkkosovellus?" }, "editedFolder": { "message": "Kansio tallennettiin" @@ -552,6 +936,10 @@ "newUri": { "message": "Uusi URI" }, + "addDomain": { + "message": "Lisää verkkotunnus", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Kohde lisättiin" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Kysy lisätäänkÃļ kirjautumistieto" }, + "vaultSaveOptionsTitle": { + "message": "Holvitallennuksen valinnat" + }, "addLoginNotificationDesc": { "message": "Kysy lisätäänkÃļ uusi kohde, jos holvissa ei vielä ole sopivaa kohdetta." }, + "addLoginNotificationDescAlt": { + "message": "Ehdota kohteen tallennusta, jos holvistasi ei vielä lÃļydy vastaavaa kohdetta. Koskee kaikkia kirjautuneita tilejä." + }, + "showCardsInVaultView": { + "message": "Näytä kortit automaattitäytÃļn ehdotuksina Holvi-näkymässä" + }, "showCardsCurrentTab": { "message": "Näytä kortit välilehtiosiossa" }, "showCardsCurrentTabDesc": { - "message": "Kortit näytetään laajennuksen välilehtisivulla niiden automaattisen täytÃļn helpottamiseksi." + "message": "Näytä kortit Välilehti-sivulla automaattitäytÃļn helpottamiseksi." + }, + "showIdentitiesInVaultView": { + "message": "Näytä henkilÃļllisyydet automaattitäytÃļn ehdotuksina Holvi-sivulla." }, "showIdentitiesCurrentTab": { "message": "Näytä henkilÃļllisyydet välilehtiosiossa" }, "showIdentitiesCurrentTabDesc": { - "message": "HenkilÃļllisyydet näytetään laajennuksen välilehtisivulla niiden automaattisen täytÃļn helpottamiseksi." + "message": "Näytä henkilÃļllisyydet Välilehti-sivulla automaattitäytÃļn helpottamiseksi." }, "clearClipboard": { "message": "Tyhjennä leikepÃļytä", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Kysy päivitetäänkÃļ kirjautumistiedon salasana sivustolla havaittua muutosta vastaavaksi." }, + "changedPasswordNotificationDescAlt": { + "message": "Tarjoa kirjautumistiedon salasanan päivitystä, kun verkkosivustolla havaitaan uusi salasana. Koskee kaikkia kirjautuneita tilejä." + }, + "enableUsePasskeys": { + "message": "Tarjoa pääsyavainten tallennusta ja käyttÃļä" + }, + "usePasskeysDesc": { + "message": "Tarjoa uusien pääsyavainten tallennusta sekä kirjautumista holvissasi olevilla pääsyavaimilla. Koskee kaikkia kirjautuneita tilejä." + }, "notificationChangeDesc": { "message": "Haluatko päivittää salasanan Bitwardeniin?" }, @@ -634,23 +1043,29 @@ "message": "Päivitä" }, "notificationUnlockDesc": { - "message": "Viimeistele automaattitäytÃļn pyyntÃļ avaamalla Bitwarden-holvisi lukitus." + "message": "Viimeistele automaattitäyttÃļ avaamalla Bitwarden-holvisi lukitus." }, "notificationUnlock": { "message": "Avaa" }, + "additionalOptions": { + "message": "Lisävalinnat" + }, "enableContextMenuItem": { "message": "Näytä sisältÃļvalikon valinnat" }, "contextMenuItemDesc": { - "message": "Käytä salasanageneraattoria ja avoimelle sivulle soveltuvia kirjautumistietoja hiiren kakkospainikkeella avattavasta valikosta." + "message": "Käytä salasanageneraattoria ja avoimelle sivulle soveltuvia kirjautumistietoja hiiren kakkospainikkeella." + }, + "contextMenuItemDescAlt": { + "message": "Käytä salasanageneraattoria ja avoimelle sivulle soveltuvia kirjautumistietoja hiiren kakkospainikkeella avattavasta valikosta. Koskee kaikkia kirjautuneita tilejä." }, "defaultUriMatchDetection": { - "message": "URI:n oletusarvoinen täsmäystapa", - "description": "Default URI match detection for auto-fill." + "message": "URI:n oletuarvoinen tunnistustapa", + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Valitse oletustapa, jolla URI tunnistetaan esimerkiksi automaattisen täytÃļn yhteydessä." + "message": "Valitse kirjautumistietojen URI:en oletusarvoinen tunnistustapa suoritettaessa automaattisen täytÃļn kaltaisia toimintoja." }, "theme": { "message": "Teema" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Vaihda sovelluksen väriteemaa." }, + "themeDescAlt": { + "message": "Muuta laajennujksen väriteemaa. Koskee kaikkia kirjautuneita tilejä." + }, "dark": { "message": "Tumma", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized, tumma", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Vie lähteestä" + }, "exportVault": { "message": "Vie holvi" }, "fileFormat": { "message": "Tiedostomuoto" }, + "fileEncryptedExportWarningDesc": { + "message": "Tämä vientitiedosto suojataan salasanalla, joka on syÃļtettävä ja salauksen purkamiseksi." + }, + "filePassword": { + "message": "Tiedoston salasana" + }, + "exportPasswordDescription": { + "message": "Tätä salasanaa käytetään tämän tiedoston viennissä ja tuonnissa" + }, + "accountRestrictedOptionDescription": { + "message": "Salaa vienti ja rajoita tuonti vain nykyiselle Bitwarden-tilille tilisi käyttäjätunnukseen ja pääsalasanaan pohjautuvalla salausavaimella." + }, + "passwordProtectedOptionDescription": { + "message": "Salaa vientitiedosto salasanalla, joka mahdollistaa sen tuonnin mille tahansa Bitwarden-tilille." + }, + "exportTypeHeading": { + "message": "Viennin tyyppi" + }, + "accountRestricted": { + "message": "Tiliä on rajoitettu" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Tiedoston salasana\" ja \"Vahvista tiedoston salasana\" eivät täsmää." + }, "warning": { "message": "VAROITUS", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Jaettu" }, - "learnOrg": { - "message": "Lisätietoja organisaatioista" - }, - "learnOrgConfirmation": { - "message": "Bitwarden mahdollistaa holvin sisällÃļn jaon organisaatiotilin avulla. Haluatko lukea lisää bitwarden.com-sivustolta?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business mahdollistaa holvisi sisällÃļn jakamisen organisaation avulla. Lue lisää osoitteesta bitwarden.com." }, "moveToOrganization": { "message": "Siirrä organisaatiolle" @@ -730,7 +1172,7 @@ "message": "Lue lisää" }, "authenticatorKeyTotp": { - "message": "Todennusmenetelmän avain (TOTP)" + "message": "Todennusavain (TOTP)" }, "verificationCodeTotp": { "message": "Todennuskoodi (TOTP)" @@ -762,6 +1204,9 @@ "file": { "message": "Tiedosto" }, + "fileToShare": { + "message": "Jaettava tiedosto" + }, "selectFile": { "message": "Valitse tiedosto." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 Gt salattua tallennustilaa tiedostoliitteille." }, + "premiumSignUpEmergency": { + "message": "VarmuuskäyttÃļ" + }, "premiumSignUpTwoStepOptions": { "message": "Omisteiset kaksivaiheisen kirjautumisen vaihtoehdot, kuten YubiKey ja Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Voit ostaa Premium-jäsenyyden bitwarden.com-verkkoholvista. Haluatko avata sivuston nyt?" }, + "premiumPurchaseAlertV2": { + "message": "Voit ostaa Premiumin tiliasetuksistasi Bitwardenin verkkosovelluksen kautta." + }, "premiumCurrentMember": { "message": "Olet Premium-jäsen!" }, "premiumCurrentMemberThanks": { "message": "Kiitos kun tuet Bitwardenia." }, + "premiumFeatures": { + "message": "Päivitä Premiumiin niin saat:" + }, "premiumPrice": { "message": "Kaikki tämä vain $PRICE$/vuosi!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Kaikki tämä vain $PRICE$/vuosi!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Päivitys valmistui" }, @@ -838,7 +1301,7 @@ "message": "Kopioi TOTP-koodi automaattisesti" }, "disableAutoTotpCopyDesc": { - "message": "Jos kirjautumistieto sisältää kaksivaiheisen todennusmenetelmän avaimen, kopioidaan TOTP-todennuskoodi leikepÃļydälle kohteen automaattisen täytÃļn yhteydessä." + "message": "Jos kirjautumistieto sisältää kaksivaiheisen kirjautumisen todennusavaimen, kopioidaan TOTP-koodi leikepÃļydälle kohteen automaattisen täytÃļn yhteydessä." }, "enableAutoBiometricsPrompt": { "message": "Pyydä Biometristä todennusta käynnistettäessä" @@ -850,10 +1313,10 @@ "message": "Tämä ominaisuus edellyttää Premium-jäsenyyttä." }, "enterVerificationCodeApp": { - "message": "SyÃļtä 6-numeroinen todennuskoodi todennussovelluksestasi." + "message": "SyÃļtä todennussovelluksesi näyttämä kuusinumeroinen todennuskoodi." }, "enterVerificationCodeEmail": { - "message": "SyÃļtä 6-numeroinen todennuskoodi, joka lähetettiin sähkÃļpostitse osoitteeseen $EMAIL$.", + "message": "SyÃļtä osoitteeseen $EMAIL$ lähetetty kuusinumeroinen todennuskoodi.", "placeholders": { "email": { "content": "$1", @@ -877,16 +1340,16 @@ "message": "Lähetä todennuskoodi sähkÃļpostitse uudelleen" }, "useAnotherTwoStepMethod": { - "message": "Käytä toista kaksivaiheisen kirjautumisen todentajaa" + "message": "Käytä vaihtoehtoista todennustapaa" }, "insertYubiKey": { "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." }, "insertU2f": { - "message": "Kytke todennuslaitteesi tietokoneen USB-porttiin. Jos laitteessa on painike, paina sitä." + "message": "Kytke suojausavaimesi tietokoneen USB-porttiin. Jos laitteessa on painike, paina sitä." }, "webAuthnNewTab": { - "message": "Aloittaaksesi kaksivaiheisen WebAuthn-todennuksen, seuraa alla olevasta painikkeesta uuteen välilehteen avautuvia ohjeita." + "message": "Aloittaaksesi kaksivaiheisen WebAuthn-tunnistautumisen, seuraa alla olevasta painikkeesta uuteen välilehteen avautuvia ohjeita." }, "webAuthnNewTabOpen": { "message": "Avaa uusi välilehti" @@ -915,51 +1378,64 @@ "authenticatorAppTitle": { "message": "Todennussovellus" }, - "authenticatorAppDesc": { - "message": "Käytä todennussovellusta (kuten Authy, Google tai Microsoft Authenticator) luodaksesi aikarajallisia todennuskoodeja.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "SyÃļtä Bitwarden Authenticatorin kaltaisen todennusovelluksen luoma koodi.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP -todennuslaite" + "yubiKeyTitleV2": { + "message": "Yubico OTP -suojausavain" }, "yubiKeyDesc": { "message": "Käytä YubiKey-todennuslaitetta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C sekä NEO -laitteiden kanssa." }, - "duoDesc": { - "message": "Vahvista Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-todennuslaitetta.", + "duoDescV2": { + "message": "SyÃļtä Duo Securityn luoma koodi.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-todennuslaitetta.", + "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-suojausavainta.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Käytä mitä tahansa WebAuthn‑yhteensopivaa todennuslaitetta päästäksesi käsiksi tiliisi." + "message": "Käytä mitä tahansa WebAuthn‑yhteensopivaa suojausavainta päästäksesi tilillesi." }, "emailTitle": { "message": "SähkÃļposti" }, - "emailDesc": { - "message": "Todennuskoodit lähetetään sinulle sähkÃļpostitse." + "emailDescV2": { + "message": "SyÃļtä sähkÃļpostiisi lähetetty koodi." }, "selfHostedEnvironment": { "message": "Itse ylläpidetty palvelinympäristÃļ" }, "selfHostedEnvironmentFooter": { - "message": "Määritä omassa palvelinympäristÃļssäsi suoritettavan Bitwarden-asennuksen pääverkkotunnus." + "message": "Määritä omassa palvelinympäristÃļssäsi suoritettavan Bitwarden-asennuksen perusosoite." + }, + "selfHostedBaseUrlHint": { + "message": "Määritä itse ylläpitämäsi Bitwarden-asennuksen perusosoite. Esimerkki: https://bitwarden.yritys.fi." + }, + "selfHostedCustomEnvHeader": { + "message": "Edistynyttä määritystä varten voit syÃļttää jokaisen palvelun perusosoitteen erikseen." + }, + "selfHostedEnvFormInvalid": { + "message": "Sinun on lisättävä joko palvelimen perusosoite tai ainakin yksi mukautettu palvelinympäristÃļ." }, "customEnvironment": { "message": "Mukautettu palvelinympäristÃļ" }, "customEnvironmentFooter": { - "message": "Edistyneille käyttäjille. Voit määrittää jokaiselle palvelulle oman pääverkkotunnuksen." + "message": "Edistyneille käyttäjille. Voit määrittää jokaiselle palvelulle oman perusosoitteen." }, "baseUrl": { "message": "Palvelimen URL" }, + "selfHostBaseUrl": { + "message": "Itse ylläpidetyn palvelimen URL-osoite", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API-palvelimen URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "PalvelinympäristÃļn URL-osoitteet tallennettiin" }, + "showAutoFillMenuOnFormFields": { + "message": "Näytä automaattitäytÃļn valikko lomakekentissä", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "AutomaattitäytÃļn ehdotukset" + }, + "showInlineMenuLabel": { + "message": "Näytä automaattitäytÃļn ehdotukset lomakekentissä" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Näytä identiteetit ehdotuksina" + }, + "showInlineMenuCardsLabel": { + "message": "Näytä kortit ehdotuksina" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Näytä ehdotukset kun kuvaketta painetaan" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Koskee kaikkia kirjautuneita tilejä." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Poista käytÃļstä selaimesi asetuksista sen sisäänrakennettu salasanahallinta ristiriitojen välttämiseksi." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Muokkaa selaimen asetuksia" + }, + "autofillOverlayVisibilityOff": { + "message": "Ei käytÃļssä", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Kun kenttä valitaan (kohdistetaan)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Kun automaattitäytÃļn kuvake valitaan", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "AutomaattitäyttÃļ sivun avautuessa" + }, "enableAutoFillOnPageLoad": { - "message": "Automaattinen täyttÃļ sivun avautuessa" + "message": "AutomaattitäyttÃļ sivun avautuessa" }, "enableAutoFillOnPageLoadDesc": { - "message": "Jos havaitaan kirjautumislomake, suorita automaattinen täyttÃļ sivun avautuessa." + "message": "Automaattinen täyttÃļ suoritetaan sivun avautuessa, jos sivulla havaitaan kirjautumislomake." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Varoitus:$CLOSETAG$ Vaarantuneet tai epäluotettavat sivustot voivat hyväksikäyttää sivun avautuessa suoritettavaa automaattista täyttÃļä.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Vaarantuneet tai epäluotettavat sivustot voivat väärinkäyttää sivun avautuessa suoritettavaa automaattista täyttÃļä." + "message": "Vaarantuneet tai epäluotettavat sivustot voivat hyväksikäyttää sivun avautuessa suoritettavaa automaattista täyttÃļä." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Lisätietoja riskeistä" }, "learnMoreAboutAutofill": { - "message": "Lisätietoja automaattisesta täytÃļstä" + "message": "Lisätietoja automaattitäytÃļstä" }, "defaultAutoFillOnPageLoad": { - "message": "Automaattisen täytÃļn oletusasetus kirjautumistiedoille" + "message": "Kirjautumistietojen automaattitäytÃļn oletusasetus" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Voit ottaa automaattisen täytÃļn käyttÃļÃļn tai poistaa sen käytÃļstä kirjautumistietokohtaisesti muokkaamalla kirjautumistetoa." + "message": "Automaattinen täyttÃļ voidaan ottaa käyttÃļÃļn tai poistaa käytÃļstä kohdekohtaisesti muokkaamalla yksittäisiä kirjautumistietoja." }, "itemAutoFillOnPageLoad": { - "message": "Automaattinen täyttÃļ sivun avautuessa (jos määritetty asetuksista)" + "message": "AutomaattitäyttÃļ sivun avautuessa (jos määritetty asetuksista)" }, "autoFillOnPageLoadUseDefault": { "message": "Käytä oletusasetusta" }, "autoFillOnPageLoadYes": { - "message": "Täytä automaattisesti sivun avautuessa" + "message": "Automaattitäytä sivun avautuessa" }, "autoFillOnPageLoadNo": { - "message": "Älä täytä automaattisesti sivun avautuessa" + "message": "Älä automaattitäytä sivun avautuessa" }, "commandOpenPopup": { "message": "Avaa holvin ponnahdusikkuna" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Avaa holvi sivupalkissa" }, - "commandAutofillDesc": { - "message": "Täytä automaattisesti viimeisin nykyisellä sivustolla käytetty kirjautumistieto" + "commandAutofillLoginDesc": { + "message": "Automaattitäytä edellinen tälle sivustolle täytetty kirjautumistieto" + }, + "commandAutofillCardDesc": { + "message": "Automaattitäytä edellinen tälle sivustolle täytetty kortti" + }, + "commandAutofillIdentityDesc": { + "message": "Automaattitäytä edellinen tälle sivustolle täytetty henkilÃļllisyys" }, "commandGeneratePasswordDesc": { "message": "Luo uusi satunnainen salasana ja kopioi se leikepÃļydälle." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lukitse holvi" }, - "privateModeWarning": { - "message": "Yksityisen tilan tuki on kokeellinen ja jotkin ominaisuudet toimivat rajoitetusti." - }, "customFields": { "message": "Lisäkentät" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Totuusarvo" }, + "cfTypeCheckbox": { + "message": "Valintaruutu" + }, "cfTypeLinked": { "message": "Linkitetty", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Näytä tunnistettava kuva jokaiselle kirjautumistiedolle." }, + "faviconDescAlt": { + "message": "Näytä tunnistettava kuva jokaisen kirjautumistiedon vieressä. Koskee kaikkia kirjautuneita tilejä." + }, "enableBadgeCounter": { "message": "Näytä laskuri" }, @@ -1092,7 +1636,7 @@ "message": "Erääntymisvuosi" }, "expiration": { - "message": "Erääntymisaika" + "message": "Voimassaolo päättyy" }, "january": { "message": "Tammikuu" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "HenkilÃļllisyys" }, + "typeSshKey": { + "message": "SSH-avain" + }, + "newItemHeader": { + "message": "Uusi $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Muokkaa tyyppiä $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Näytä $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Salasanahistoria" }, + "generatorHistory": { + "message": "Generaattorihistoria" + }, + "clearGeneratorHistoryTitle": { + "message": "Tyhjennä generaattorihistoria" + }, + "cleargGeneratorHistoryDescription": { + "message": "Jos jatkat, kaikki generaattorihistorian kohteet poistetaan. Haluatko varmasti jatkaa?" + }, "back": { "message": "Takaisin" }, "collections": { "message": "Kokoelmat" }, + "nCollections": { + "message": "$COUNT$ kokoelmaa", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Suosikit" }, @@ -1282,6 +1874,10 @@ "message": "Pääverkkotunnus", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Juuriverkkotunnus (suositus)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Verkkotunnus", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Tunnistustapa", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { - "message": "Tunnistuksen oletustapa", - "description": "Default URI match detection for auto-fill." + "message": "Oletusarvoinen tunnistustapa", + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Näytä tai piilota asetukset" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Ei näytettäviä salasanoja." }, + "clearHistory": { + "message": "Tyhjennä historia" + }, + "nothingToShow": { + "message": "Mitään näytettävää ei ole" + }, + "nothingGeneratedRecently": { + "message": "Et ole luonut mitään hiljattain" + }, "remove": { "message": "Poista" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Avaa PIN-koodilla" }, + "setYourPinTitle": { + "message": "Aseta PIN-koodi" + }, + "setYourPinButton": { + "message": "Aseta PIN" + }, "setYourPinCode": { "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut laajennuksesta kokonaan ulos." }, + "setYourPinCode1": { + "message": "PIN-koodia käytetään pääsalasanasi sijasta Bitwarenin avaukseen. Määritetty PIN-koodi tyhjennetään, jos kirjaudut kokonaan ulos Bitwardenista." + }, "pinRequired": { "message": "PIN-koodi vaaditaan." }, "invalidPin": { "message": "Virheellinen PIN-koodi." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Liian monta epäonnistunutta PIN-yritystä. Kirjaudutaan ulos." + }, "unlockWithBiometrics": { "message": "Avaa biometrialla" }, + "unlockWithMasterPassword": { + "message": "Avaa pääsalasanalla" + }, "awaitDesktop": { "message": "Odottaa vahvistusta tyÃļpÃļydältä" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lukitse pääsalasanalla kun selain käynnistetään uudelleen" }, + "lockWithMasterPassOnRestart1": { + "message": "Vaadi pääsalasana selaimen uudelleenkäynnistyksen yhteydessä" + }, "selectOneCollection": { "message": "Valitse ainakin yksi kokoelma." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Yksi tai useampi organisaatiokäytäntÃļ vaikuttaa generaattorisi asetuksiin." }, + "passwordGenerator": { + "message": "Salasanageneraattori" + }, + "usernameGenerator": { + "message": "Käyttäjätunnusgeneraattori" + }, + "useThisPassword": { + "message": "Käytä tätä salasanaa" + }, + "useThisUsername": { + "message": "Käytä tätä käyttäjätunnusta" + }, + "securePasswordGenerated": { + "message": "Turvallinen salasana luotiin! Muista vaihtaa se myÃļs verkkosivuston tiliasetuksiin." + }, + "useGeneratorHelpTextPartOne": { + "message": "Käytä generaattoria", + "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": "luodaksesi vahvan ainutlaatuisen salasanan", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Holvin aikakatkaisutoiminto" }, + "vaultTimeoutAction1": { + "message": "Aikakatkaisutoiminto" + }, "lock": { "message": "Lukitse", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Roskakori", @@ -1452,8 +2101,11 @@ "restoredItem": { "message": "Kohde palautettiin" }, + "alreadyHaveAccount": { + "message": "Onko sinulla jo tili?" + }, "vaultTimeoutLogOutConfirmation": { - "message": "Uloskirjautuminen estää pääsyn holviisi ja vaatii ajan umpeuduttua todennuksen Internet-yhteyden välityksellä. Haluatko varmasti käyttää asetusta?" + "message": "Uloskirjautuminen estää pääsyn holviisi ja vaatii ajan umpeuduttua tunnistautumisen Internet-yhteyden välityksellä. Haluatko varmasti käyttää asetusta?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Aikakatkaisutoiminnon vahvistus" @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Täytä automaattisesti ja tallenna" }, + "fillAndSave": { + "message": "Täytä ja tallenna" + }, "autoFillSuccessAndSavedUri": { "message": "Kohde täytettiin automaattisesti ja URI tallennettiin" }, @@ -1474,7 +2129,7 @@ "message": "Haluatko silti täyttää kirjautumistiedot?" }, "autofillIframeWarning": { - "message": "Lomakkeen URI-osoite poikkeaa kirjautumistietoon tallennetusta osoitteesta. Täytä se siitä huolimatta valitsemalla OK tai peru täyttÃļ valitsemalla Peruuta." + "message": "Lomakkeen URI-osoite poikkeaa kirjautumistietoon tallennetusta osoitteesta. Salli sen automaattinen täyttÃļ siitä huolimatta valitsemalla OK tai estä se valitsemalla Peruuta." }, "autofillIframeWarningTip": { "message": "Välttyäksesi varoitukselta jatkossa, tallenna URI $HOSTNAME$ sivustolle tallennettuun Bitwarden-kirjautumistietoosi.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Uusi pääsalasanasi ei täytä käytännÃļn määrittämiä vaatimuksia." }, + "receiveMarketingEmailsV2": { + "message": "Vastaanota Bitwardenilta postilaatikkoosi vinkkejä, uutisia ja tutkimusmahdollisuuksia." + }, + "unsubscribe": { + "message": "Lopeta tilaus" + }, + "atAnyTime": { + "message": "milloin tahansa." + }, + "byContinuingYouAgreeToThe": { + "message": "Jatkaessasi hyväksyt" + }, + "and": { + "message": "ja" + }, "acceptPolicies": { "message": "Valitsemalla tämän hyväksyt seuraavat:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "KäyttÃļtunnisteen päivitysvirhe" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Päivitystunnistetta tai API-avaimia ei lÃļytynyt. Kokeile kirjautua ulos ja takaisin sisään." + }, "desktopSyncVerificationTitle": { "message": "TyÃļpÃļytäsynkronoinnin vahvistus" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Tili ei täsmää" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometrinen avain ei täsmää" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrinen avaus epäonnistui. Biometrinen salainen avain ei voinut avata holvia. Yritä määrittää biometria uudelleen." + }, "biometricsNotEnabledTitle": { "message": "Biometriaa ei ole määritetty" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Selaimen biometriaa ei tueta tällä laitteella." }, + "biometricsNotUnlockedTitle": { + "message": "Käyttäjä on lukittu tai kirjattu ulos" + }, + "biometricsNotUnlockedDesc": { + "message": "Poista käyttäjän lukitus tyÃļpÃļytäsovelluksesta ja yritä uudelleen." + }, + "biometricsNotAvailableTitle": { + "message": "Biometrinen avaus ei ole käytettävissä" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrinen avaus ei tällä hetkellä ole käytettävissä. Yritä myÃļhemmin uudelleen." + }, "biometricsFailedTitle": { "message": "Biometria epäonnistui" }, @@ -1624,23 +2318,62 @@ "message": "Toimintoa ei voi suorittaa sivupalkissa, yritä toimintoa uudelleen ponnahdusvalikossa tai ponnahdusikkunassa." }, "personalOwnershipSubmitError": { - "message": "YrityskäytännÃļn johdosta kohteiden tallennus henkilÃļkohtaiseen holviin ei ole mahdollista. Muuta omistusasetus organisaatiolle ja valitse käytettävissä olevista kokoelmista." + "message": "YrityskäytännÃļn vuoksi kohteiden tallennus henkilÃļkohtaiseen holviin ei ole mahdollista. Muuta omistusasetus organisaatiolle ja valitse käytettävissä olevista kokoelmista." }, "personalOwnershipPolicyInEffect": { "message": "OrganisaatiokäytäntÃļ vaikuttaa omistajuusvalintoihisi." }, + "personalOwnershipPolicyInEffectImports": { + "message": "OrganisaatiokäytäntÃļ estää kohteiden tuonnin yksityiseen holviisi." + }, + "domainsTitle": { + "message": "Verkkotunnukset", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Ohitettavat verkkotunnukset" }, "excludedDomainsDesc": { "message": "Bitwarden ei pyydä kirjautumistietojen tallennusta näille verkkotunnuksille. Päivitä sivu ottaaksesi muutokset käyttÃļÃļn." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden ei pyydä kirjautumistietojen tallennusta näillä verkkotunnuksilla. Koskee kaikkia kirjautuneita tilejä. Ota muutokset käyttÃļÃļn päivittämällä sivu." + }, + "websiteItemLabel": { + "message": "Verkkotunnus $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ei ole kelvollinen verkkotunnus", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Rajoitettujen verkkotunnusten muutokset tallennettiin" + }, + "limitSendViews": { + "message": "Rajoita avauksia" + }, + "limitSendViewsHint": { + "message": "Kukaan ei voi avata Sendiä rajoituksen täytyttyä.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ avausta jäljellä", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Sendin tiedot", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Etsi Sendeistä", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Teksti" }, + "sendTypeTextToShare": { + "message": "Jaettava teksti" + }, "sendTypeFile": { "message": "Tiedosto" }, @@ -1666,6 +2406,9 @@ "message": "Kaikki Sendit", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Piilota teksti oletuksena" + }, "maxAccessCountReached": { "message": "KäyttÃļkertojen enimmäismäärä saavutettu", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Salasanasuojattu" }, + "copyLink": { + "message": "Kopioi linkki" + }, "copySendLink": { "message": "Kopioi Send-linkki", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Haluatko varmasti poistaa Sendin?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Haluatko varmasti poistaa Sendin pysyvästi?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Muokkaa Sendiä", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send poistuu pysyvästi määritettynä ajankohtana.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send poistuu pysyvästi tänä päivänä.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Erääntymisajankohta" }, @@ -1769,6 +2523,10 @@ "message": "Halutessasi, vaadi käyttäjiä syÃļttämään salasana Sendin avaamiseksi.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Lisää valinnainen salasana vastaanottajille tähän Sendiin.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Yksityisiä merkintÃļjä tästä Sendistä.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send luotiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Sendin luonti onnistui!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Tämän linkin välityksellä Send on kenen tahansa avattavissa seuraavan tunnin ajan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Tämän linkin välityksellä Send on kenen tahansa avattavissa seuraavien $HOURS$ tunnin ajan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Tämän linkin välityksellä Send on kenen tahansa avattavissa seuraavan päivän ajan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Tämän linkin välityksellä Send on kenen tahansa avattavissa seuraavien $DAYS$ päivän ajan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send-linkki kopioitiin", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send tallennettiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Irrota laajennus?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Irrota laajennus uuteen ikkunaan luodaksesi tiedosto-Sendin.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Jotta voit valita tiedoston, avaa laajennus sivupalkkiin (jos mahdollista) tai erilliseen ikkunaan klikkaamalla tätä banneria." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Jotta voit valita tiedoston käyttäen Safaria, avaa laajennus erilliseen ikkunaan klikkaamalla tätä banneria." }, + "popOut": { + "message": "Irrota" + }, "sendFileCalloutHeader": { "message": "Ennen kuin aloitat" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Piilota sähkÃļpostiosoitteeni vastaanottajilta." }, + "hideYourEmail": { + "message": "Piilota sähkÃļpostiosoitteeni avaajilta." + }, "sendOptionsPolicyInEffect": { "message": "Yksi tai useampi organisaatiokäytäntÃļ vaikuttaa Send-asetuksiisi." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "SähkÃļpostiosoite on vahvistettava" }, + "emailVerifiedV2": { + "message": "SähkÃļpostiosoite on vahvistettu" + }, "emailVerificationRequiredDesc": { "message": "Sinun on vahvistettava sähkÃļpostiosoitteesi käyttääksesi ominaisuutta. Voit vahvistaa osoitteesi verkkoholvissa." }, @@ -1886,17 +2697,42 @@ "updateWeakMasterPasswordWarning": { "message": "Pääsalasanasi ei täytä yhden tai useamman organisaatiokäytännÃļn vaatimuksia ja holvin käyttämiseksi sinun on vaihdettava se nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Organisaatiosi on estänyt luotettavan laitesalauksen. Käytä holviasi asettamalla pääsalasana." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automaattinen liitos" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Organisaatiolla on käytäntÃļ, joka liittää tilisi automaattisesti salasanan palautusapuun. Liitos sallii organisaation ylläpitäjien vaihtaa pääsalasanasi." + "message": "Organisaatiolla on yrityskäytäntÃļ, joka liittää tilisi automaattisesti salasanan palautusapuun. Liitos sallii organisaation ylläpitäjien vaihtaa pääsalasanasi." }, "selectFolder": { "message": "Valitse kansio..." }, - "ssoCompleteRegistration": { - "message": "Kirjautuaksesi sisään käyttäen kertakirjautumista (SSO), suojaa holvisi pääsalasanalla." + "noFoldersFound": { + "message": "Ongelmia ei lÃļytynyt", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Organisaatiosi käyttÃļoikeuksia muutettiin ja tämän seurauksena sinun on asetettava pääsalasana.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Organisaatiosi edellyttää, että asetat pääsalasanan.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "/$TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Vahvistus vaaditaan", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Tuntia" @@ -1904,8 +2740,37 @@ "minutes": { "message": "Minuuttia" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "YrityskäytännÃļn säännÃļt vaikuttavat aikakatkaisuasetuksiisi" + }, "vaultTimeoutPolicyInEffect": { - "message": "OrganisaatiokäytännÃļt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tunti(a) $MINUTES$ minuutti(a).", + "message": "OrganisaatiokäytännÃļt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tuntia $MINUTES$ minuuttia.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "Enintään $HOURS$ tuntia $MINUTES$ minuuttia.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Aikakatkaisu ylittää organisaatiosi määrittämän rajoituksen: Enintään $HOURS$ tuntia $MINUTES$ minuuttia.", "placeholders": { "hours": { "content": "$1", @@ -1918,7 +2783,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "OrganisaatiokäytännÃļt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) $MINUTES$ minuutti(a). Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", + "message": "OrganisaatiokäytännÃļt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tuntia $MINUTES$ minuuttia. Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Organisaation holvin vienti" + }, + "exportingOrganizationVaultDesc": { + "message": "Vain organisaatioon $ORGANIZATION$ liitetyn holvin kohteet viedään. Yksityisen holvin ja muiden organisaatioiden kohteita ei sisällytetä.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Virhe" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Luo käyttäjätunnus" }, + "generateEmail": { + "message": "Luo sähkÃļpostiosoite" + }, + "generatorBoundariesHint": { + "message": "Arvon tulee olla väliltä $MIN$—$MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Käyttäjätunnuksen tyyppi" }, @@ -2044,13 +2938,123 @@ "message": "Palvelu" }, "forwardedEmail": { - "message": "SähkÃļpostialias välitykseen" + "message": "SähkÃļpostialias ohjaukseen" }, "forwardedEmailDesc": { "message": "Luo sähkÃļpostialias ulkoisella ohjauspalvelulla." }, + "forwarderDomainName": { + "message": "SähkÃļpostin verkkotunnus", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Valitse verkkotunnus, jota valittu palvelu tukee", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ -virhe: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwardenin luoma.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Verkkosivusto: $WEBSITE$. Bitwardenin luoma.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Virheellinen $SERVICENAME$ API -tunniste", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Virheellinen $SERVICENAME$ API -tunniste: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ -palvelun peittämän sähkÃļpostitilin tunnusta ei saatu.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Virheellinen $SERVICENAME$ -verkkotunnus.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Virheellinen $SERVICENAME$ -URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Tapahtui tuntematon $SERVICENAME$ -virhe.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Tuntematon ohjaaja: $SERVICENAME$.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { - "message": "Osoite", + "message": "Isäntä", "description": "Part of a URL." }, "apiAccessToken": { @@ -2141,7 +3145,7 @@ "message": "Tunnistelauseke" }, "fingerprintMatchInfo": { - "message": "Varmista, että holvisi on avattu ja tunnistelauseke täsmää toisella laitteella." + "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelausekkeen." }, "resendNotification": { "message": "Lähetä ilmoitus uudelleen" @@ -2174,7 +3178,7 @@ "message": "Tärkeää:" }, "masterPasswordHint": { - "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanaasi ei ole mahdollista palauttaa, jos unohdat sen!" }, "characterMinimum": { "message": "Vähintään $LENGTH$ merkkiä", @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "OrganisaatiokäytännÃļt ovat poistaneet käytÃļstä automaattisen täytÃļn sivun avautuessa." + "message": "OrganisaatiokäytännÃļt ovat poistaneet käytÃļstä avautuessa suoritettavan automaattisen täytÃļn." }, "howToAutofill": { - "message": "Miten täytetään automaattisesti" + "message": "Miten automaattitäyttÃļä käytetään" }, "autofillSelectInfoWithCommand": { - "message": "Valitse tälle sivulle sopiva kohde tai käytä pikanäppäintä $COMMAND$.", + "message": "Valitse kohde tästä ruudusta, käytä pikanäppäintä $COMMAND$ tai tutustu muihin vaihtoehtoihin asetuksissa.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Valitse tälle sivulle sopiva kohde tai määritä pikanäppäin asetuksista." + "message": "Valitse kohde tästä ruudusta tai tutustu muihin vaihtoehtoihin asetuksissa." }, "gotIt": { "message": "Selvä" }, "autofillSettings": { - "message": "TäytÃļn asetukset" + "message": "AutomaattitäytÃļn asetukset" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "AutomaattitäytÃļn pikanäppäin" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Muuta pikanäppäintä" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Hallitse pikanäppäimiä" }, "autofillShortcut": { - "message": "Automaattisen täytÃļn pikanäppäin" + "message": "AutomaattitäytÃļn pikanäppäin" }, - "autofillShortcutNotSet": { - "message": "Automaattisen täytÃļn pikanäppäintä ei ole määritetty. Määritä se selaimen asetuksista." + "autofillLoginShortcutNotSet": { + "message": "AutomaattitäytÃļn pikanäppäintä ei ole määritetty. Määritä se selaimen asetuksista." }, - "autofillShortcutText": { - "message": "Automaattisen täytÃļn pikanäppäin on $COMMAND$. Vaihda se selaimen asetuksista.", + "autofillLoginShortcutText": { + "message": "Kirjautumistiedon automaatttitäytÃļn pikanäppäin on $COMMAND$. Hallitse pikanäppäimiä selaimen asetuksista.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Kirjaudutaan sijaintiin" - }, "opensInANewWindow": { "message": "Avautuu uudessa ikkunassa" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organisaation kertakirjautumistunniste tarvitaan." }, + "creatingAccountOn": { + "message": "Luodaan tili palvelimelle" + }, + "checkYourEmail": { + "message": "Tarkasta sähkÃļpostisi" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Seuraa viestin linkkiä, joka lähetettiin sähkÃļpostitse osoitteeseen" + }, + "andContinueCreatingYourAccount": { + "message": "ja jatka tilin luontia." + }, + "noEmail": { + "message": "EtkÃļ saanut viestiä?" + }, + "goBack": { + "message": "Palaa takaisin" + }, + "toEditYourEmailAddress": { + "message": "muokataksesi sähkÃļpostiosoitettasi." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Pääsy estetty. Sinulla ei ole oikeutta avata sivua." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Laitteeseen luotettu" }, + "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." + }, + "sendsNoItemsMessage": { + "message": "Sendillä voit jakaa salattuja tietoja turvallisesti kenelle tahansa.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "SyÃļte vaaditaan." }, @@ -2310,7 +3343,7 @@ "message": "pakollinen" }, "search": { - "message": "Hae" + "message": "Etsi" }, "inputMinLength": { "message": "SyÃļtteen tulee sisältää ainakin $COUNT$ merkkiä.", @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "Yksi kenttä vaatii huomiotasi." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ kenttää vaatii huomiotasi.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Valitse --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Laajenna tai supista", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Haluatko tuoda tietosi Bitwardeniin?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Haluatko suojata LastPass-tietosi tuomalla ne Bitwardeniin?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Tallenna salaamattomana tiedostona", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Tuo Bitwardeniin", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Tuodaan...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Tietojen tuonti onnistui.", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Tuontivirhe. Näet isätietoja hallinnasta.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Verkkovirhe tuonnin aikana.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Aliaksen verkkotunnus" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Pääsalasanan vahvistuksen vaativia kohteita ei voida automaattitäyttää sivun avautuessa. AutomaattitäyttÃļ sivun avautuessa poistettiin käytÃļstä.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "AutomaattitäyttÃļ sivun avautuessa käyttää oletusasetusta.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Poista pääsalasanan uudelleenkysely käytÃļstä muokataksesi kenttää", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Näytä/piilota sivuvalikko" + }, + "skipToContent": { + "message": "Siirry sisältÃļÃļn" + }, + "bitwardenOverlayButton": { + "message": "Bitwardenin automaattitäytÃļn painike", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Kytke Bitwardenin automaattitäytÃļn valikko", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwardenin automaattitäytÃļn valikko", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Näytä sopivat kirjautumistiedot avaamalla tilisi lukitus", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Näytä automaattitäytÃļn ehdotukset avaamalla tilisi lukitus", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Avaa tili", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Avaa tilisi lukitus. Avautuu uudessa ikkunassa.", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Täytä kirjautumistiedot kohteesta", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Osittainen käyttäjätunnus", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Näytettäviä kohteita ei ole", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Uusi kohde", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Lisää holviin uusi kohde", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Uusi kirjautumistieto", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Lisää holviin uusi kirjautumistieto. Avautuu uudessa ikkunassa.", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Uusi kortti", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Lisää holviin uusi korttitieto. Avautuu uudessa ikkunassa.", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Uusi henkilÃļllisyys", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Lisää holviin uusi henkilÃļllisyys. Avautuu uudessa ikkunassa.", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwardenin automaattitäytÃļn valikko on käytettävissä. Avaa se painamalla alas-nuolinäppäintä.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Ota käyttÃļÃļn" + }, + "ignore": { + "message": "Ohita" + }, + "importData": { + "message": "Tuo tietoja", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Tuontivirhe" + }, + "importErrorDesc": { + "message": "Tiedoissa, joita yritit tuoda, havaittiin ongelma. Korjaa alla listatut virheet lähdetiedostosta ja yritä uudelleen." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Korjaa seuraavat virheet ja yritä uudelleen." + }, + "description": { + "message": "Kuvaus" + }, + "importSuccess": { + "message": "Tietojen tuonti onnistui" + }, + "importSuccessNumberOfItems": { + "message": "Kaikkiaan $AMOUNT$ kohdetta tuotiin.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Yritä uudelleen" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Toiminto vaatii vahvistuksen. Jatka asettamalla PIN-koodi." + }, + "setPin": { + "message": "Aseta PIN-koodi" + }, + "verifyWithBiometrics": { + "message": "Vahvista biometrialla" + }, + "awaitingConfirmation": { + "message": "Odottaa vahvistusta" + }, + "couldNotCompleteBiometrics": { + "message": "Biometrinen todennus ei onnistunut." + }, + "needADifferentMethod": { + "message": "Tarvitsetko eri menetelmän?" + }, + "useMasterPassword": { + "message": "Käytä pääsalasanaa" + }, + "usePin": { + "message": "Käytä PIN-koodia" + }, + "useBiometrics": { + "message": "Käytä biometriaa" + }, + "enterVerificationCodeSentToEmail": { + "message": "SyÃļtä sähkÃļpostiosoitteeseesi lähetetty vahvistuskoodi." + }, + "resendCode": { + "message": "Lähetä koodi uudelleen" + }, + "total": { + "message": "Yhteensä" + }, + "importWarning": { + "message": "Olet tuomassa tietoja organisaatioon $ORGANIZATION$. Tietojasi saatetaan jakaa organisaation jäsenten kesken. Haluatko jatkaa?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Virhe yhdistettäessä Duo-palveluun. Käytä vaihtoehtoista todennustapaa tai ole yhteydessä Duon asiakaspalveluun saadaksesi apua." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Avaa Duo ja viimeistele kirjautuminen seuraamalla ohjeita." + }, + "duoRequiredForAccount": { + "message": "Tilillesi kirjautuminen vaatii Duo-vahvistuksen." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Viimeistele kirjautuminen avaamalla laajennus erilliseen ikkunaan." + }, + "popoutExtension": { + "message": "Irrota laajennus" + }, + "launchDuo": { + "message": "Avaa Duo" + }, + "importFormatError": { + "message": "Tietoja ei ole muotoiltu oikein. Tarkista tuotava tiedosto ja yritä uudelleen." + }, + "importNothingError": { + "message": "Mitään ei tuotu." + }, + "importEncKeyError": { + "message": "Virhe purettaessa viedyn tiedoston salausta. Salausavaimesi ei vastaa viennissä käytettyä salausavainta." + }, + "invalidFilePassword": { + "message": "Tiedoston salasana on virheellinen. Käytä vientitiedoston luonnin yhteydessä syÃļtettyä salasanaa." + }, + "destination": { + "message": "Kohde" + }, + "learnAboutImportOptions": { + "message": "Lue lisää tuontivaihtoehdoista" + }, + "selectImportFolder": { + "message": "Valitse kansio" + }, + "selectImportCollection": { + "message": "Valitse kokoelma" + }, + "importTargetHint": { + "message": "Valitse tämä, jos haluat tuoda tiedoston sisällÃļn kohteeseen \"$DESTINATION$\".", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Tiedosto sisältää määrittämättÃļmiä kohteita." + }, + "selectFormat": { + "message": "Valitse tuotavan tiedoston muoto" + }, + "selectImportFile": { + "message": "Valitse tuotava tiedosto" + }, + "chooseFile": { + "message": "Valitse tiedosto" + }, + "noFileChosen": { + "message": "Tiedostoa ei ole valittu" + }, + "orCopyPasteFileContents": { + "message": "tai kopioi ja liitä tuotavan tiedoston sisältÃļ" + }, + "instructionsFor": { + "message": "$NAME$ -ohjeet", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Vahvista holvin tuonti" + }, + "confirmVaultImportDesc": { + "message": "Tiedosto on salasanasuojattu. Jatka tuontia syÃļttämällä tiedoston salasana." + }, + "confirmFilePassword": { + "message": "Vahvista tiedoston salasana" + }, + "exportSuccess": { + "message": "Holvin tiedot on viety" + }, + "typePasskey": { + "message": "Pääsyavain" + }, + "accessing": { + "message": "Avataan" + }, + "passkeyNotCopied": { + "message": "Pääsyavainta ei kopioida" + }, + "passkeyNotCopiedAlert": { + "message": "Pääsyavain ei kopioidu kloonattuun kohteeseen. Haluatko jatkaa kloonausta?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Käynnistänyt sivusto edellyttää vahvistusta. Ominaisuutta ei ole vielä toteutettu tileille, joilla ei ole pääsalasanaa." + }, + "logInWithPasskeyQuestion": { + "message": "Kirjaudutaanko pääsyavaimella?" + }, + "passkeyAlreadyExists": { + "message": "Tälle sovellukselle on jo tallennettu pääsyavain." + }, + "noPasskeysFoundForThisApplication": { + "message": "Tälle sovellukselle ei lÃļytynyt pääsyavaimia." + }, + "noMatchingPasskeyLogin": { + "message": "Holvissasi ei ole tälle sivustolle sopivaa kirjautumistietoa." + }, + "noMatchingLoginsForSite": { + "message": "Tälle sivustolle sopivia kirjautumistietoja ei ole" + }, + "searchSavePasskeyNewLogin": { + "message": "Hae tai tallenna pääsyavain uutena kirjautumistietona" + }, + "confirm": { + "message": "Vahvista" + }, + "savePasskey": { + "message": "Tallenna pääsyavain" + }, + "savePasskeyNewLogin": { + "message": "Tallenna pääsyavain uuteen kirjautumistietoon" + }, + "chooseCipherForPasskeySave": { + "message": "Valitse kirjautumistieto, johon pääsyavain tallennetaan" + }, + "chooseCipherForPasskeyAuth": { + "message": "Valitse pääsyavain, jolla kirjaudutaan" + }, + "passkeyItem": { + "message": "Pääsyavainkohde" + }, + "overwritePasskey": { + "message": "Korvataanko pääsyavain?" + }, + "overwritePasskeyAlert": { + "message": "Kohde sisältää jo pääsyavaimen. Haluatko varmasti korvata nykyisen avaimen?" + }, + "featureNotSupported": { + "message": "Ominaisuutta ei vielä tueta" + }, + "yourPasskeyIsLocked": { + "message": "Pääsyavaimen käyttÃļ edellyttää tunnistautumista. Jatka vahvistamalla henkilÃļllisyytesi." + }, + "multifactorAuthenticationCancelled": { + "message": "Monivaiheinen todennus peruttiin" + }, + "noLastPassDataFound": { + "message": "LastPass-tietoja ei lÃļytynyt" + }, + "incorrectUsernameOrPassword": { + "message": "Virheellinen käyttäjätunnus tai salasana" + }, + "incorrectPassword": { + "message": "Virheellinen salasana" + }, + "incorrectCode": { + "message": "Virheellinen koodi" + }, + "incorrectPin": { + "message": "Virheellinen PIN-koodi" + }, + "multifactorAuthenticationFailed": { + "message": "Monivaiheinen todennus epäonnistui" + }, + "includeSharedFolders": { + "message": "Sisällytä jaetut kansiot" + }, + "lastPassEmail": { + "message": "LastPass-sähkÃļpostiosoite" + }, + "importingYourAccount": { + "message": "Tiliäsi tuodaan..." + }, + "lastPassMFARequired": { + "message": "Monivaiheinen LastPass-todennus vaaditaan" + }, + "lastPassMFADesc": { + "message": "SyÃļtä kertakäyttÃļkoodi todennussovelluksestasi." + }, + "lastPassOOBDesc": { + "message": "Hyväksy kirjautumispyyntÃļ todennussovelluksesta tai syÃļtä kertakäyttÃļkoodi." + }, + "passcode": { + "message": "Suojakoodi" + }, + "lastPassMasterPassword": { + "message": "LastPass-pääsalasana" + }, + "lastPassAuthRequired": { + "message": "LastPass-todennus vaaditaan" + }, + "awaitingSSO": { + "message": "Odotetaan kertakirjautumista" + }, + "awaitingSSODesc": { + "message": "Jatka kirjautumista tyÃļtunnuksillasi." + }, + "seeDetailedInstructions": { + "message": "Katso tarkemmat ohjeet tukisivustoltamme osoitteesta", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Tuo suoraan LastPassista" + }, + "importFromCSV": { + "message": "Tuo CSV-tiedostosta" + }, + "lastPassTryAgainCheckEmail": { + "message": "Yritä uudelleen tai etsi LastPassin lähettämää sähkÃļpostia, jolla vahvistat sen olleen sinä." + }, + "collection": { + "message": "Kokoelma" + }, + "lastPassYubikeyDesc": { + "message": "Kytke LastPass-tiliisi liitetty YubiKey tietokoneen USB-porttiin ja kosketa sen painiketta." + }, + "switchAccount": { + "message": "Vaihda tiliä" + }, + "switchAccounts": { + "message": "Vaihda tiliä" + }, + "switchToAccount": { + "message": "Vaihda tiliin" + }, + "activeAccount": { + "message": "Aktiivinen tili" + }, + "availableAccounts": { + "message": "Käytettävissä olevat tilit" + }, + "accountLimitReached": { + "message": "Tilien enimmäismäärä on saavutettu. Kirjaa jokin niistä ulos lisätäksesi tilin." + }, + "active": { + "message": "aktiivinen" + }, + "locked": { + "message": "lukittu" + }, + "unlocked": { + "message": "avoin" + }, + "server": { + "message": "palvelin" + }, + "hostedAt": { + "message": "palvelimelta" + }, + "useDeviceOrHardwareKey": { + "message": "Käytä laittettasi tai fyysistä suojausavainta" + }, + "justOnce": { + "message": "Vain kerran" + }, + "alwaysForThisSite": { + "message": "Aina tällä sivustolla" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ lisättiin ohitettaviin verkkotunnuksiin.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Yleiset muodot", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Avataanko selaimen asetukset?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Avataanko tukikeskus?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Muuta selaimesi automaattitäytÃļn ja salasanahallinnan asetuksia.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "Voit tarkastella ja määrittää laajennuksen pikanäppäimiä selaimesi asetuksista.", + "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": "Muuta selaimesi automaattitäytÃļn ja salasanahallinnan asetuksia.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "Voit tarkastella ja määrittää laajennuksen pikanäppäimiä selaimesi asetuksista.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "MääritetäänkÃļ Bitwarden oletusarvoiseksi salasanahallinnaksi?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Tämän asetuksen ohituksesta voi seurata ongelmia Bitwardenin ja selaimen automaattitäytÃļn välillä.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Määritä Bitwarden oletusarvoiseksi salasanahallinnaksi", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Bitwardenia ei voida määrittää oletusarvoiseksi salasanahallinnaksi", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Jotta Bitwarden voidaan määrittää oletusarvoiseksi salasanahallinnaksi, on sille myÃļnettävä oikeus käsitellä yksityisiä tietoja selaimessa.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Määritä oletukseksi", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Käyttäjätiedot tallennettiin!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Salasana tallennettiin!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Käyttäjätiedot päivitettiin!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Salasana vaihdettiin!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Virhe tallennettaessa käyttäjätietoja. Näet isätietoja hallinnasta.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Onnistui" + }, + "removePasskey": { + "message": "Poista pääsyavain" + }, + "passkeyRemoved": { + "message": "Pääsyavain poistettiin" + }, + "autofillSuggestions": { + "message": "AutomaattitäytÃļn ehdotukset" + }, + "autofillSuggestionsTip": { + "message": "Tallenna tälle sivustolle automaattisesti täytettävä kirjautumistieto." + }, + "yourVaultIsEmpty": { + "message": "Holvisi on tyhjä" + }, + "noItemsMatchSearch": { + "message": "Mikään kohde ei vastaa hakuasi" + }, + "clearFiltersOrTryAnother": { + "message": "Tyhjennä suodattimet tai kokeile toista hakutermiä" + }, + "copyInfoTitle": { + "message": "Kopioi tiedot - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Kopioi muistio - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Lisää valintoja, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Lisää valintoja - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Tarkastele kohdetta - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Automaattitäytä - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Ei kopioitavia arvoja" + }, + "assignToCollections": { + "message": "Määritä kokoelmat" + }, + "copyEmail": { + "message": "Kopioi sähkÃļpostiosoite" + }, + "copyPhone": { + "message": "Kopioi puhelinnumero" + }, + "copyAddress": { + "message": "Kopioi osoite" + }, + "adminConsole": { + "message": "Hallintapaneelista" + }, + "accountSecurity": { + "message": "Tilin suojaus" + }, + "notifications": { + "message": "Ilmoitukset" + }, + "appearance": { + "message": "Ulkoasu" + }, + "errorAssigningTargetCollection": { + "message": "Virhe määritettäessä kohdekokoelmaa." + }, + "errorAssigningTargetFolder": { + "message": "Virhe määritettäessä kohdekansiota." + }, + "viewItemsIn": { + "message": "Näytä kohteen $NAME$ kohteet", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Palaa kohteeseen $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Uusi" + }, + "removeItem": { + "message": "Poista $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Kansiottomat kohteet" + }, + "itemDetails": { + "message": "Kohteen tiedot" + }, + "itemName": { + "message": "Kohteen nimi" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organisaatio on poistettu käytÃļstä" + }, + "owner": { + "message": "Omistaja" + }, + "selfOwnershipLabel": { + "message": "Sinä", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "KäytÃļstä poistettujen organisaatioiden kohteet eivät ole käytettävissä. Ole yhteydessä organisaation omistajaan saadaksesi apua." + }, + "additionalInformation": { + "message": "Lisätiedot" + }, + "itemHistory": { + "message": "Kohteen historia" + }, + "lastEdited": { + "message": "Viimeksi muokattu" + }, + "ownerYou": { + "message": "Omistaja: Sinä" + }, + "linked": { + "message": "Linkitetty" + }, + "copySuccessful": { + "message": "Kopiointi onnistui" + }, + "upload": { + "message": "Lähetä" + }, + "addAttachment": { + "message": "Lisää liite" + }, + "maxFileSizeSansPunctuation": { + "message": "Tiedoston enimmäiskoko on 500 Mt" + }, + "deleteAttachmentName": { + "message": "Poista liite $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Lataa $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Haluatko varmasti poistaa liitteen pysyvästi?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Ilmaiset organisaatiot eivät voi käyttää liitteitä" + }, + "filters": { + "message": "Suodattimet" + }, + "personalDetails": { + "message": "HenkilÃļkohtaiset tiedot" + }, + "identification": { + "message": "Tunnistautuminen" + }, + "contactInfo": { + "message": "Yhteystiedot" + }, + "downloadAttachment": { + "message": "Lataa - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "kortin numero päättyy", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Kirjautumistiedot" + }, + "authenticatorKey": { + "message": "Todennusavain" + }, + "autofillOptions": { + "message": "AutomaattitäytÃļn asetukset" + }, + "websiteUri": { + "message": "Verkkosivusto (URI)" + }, + "websiteUriCount": { + "message": "Verkkosivusto (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Verkkosivusto lisättiin" + }, + "addWebsite": { + "message": "Lisää verkkosivusto" + }, + "deleteWebsite": { + "message": "Poista verkkosivusto" + }, + "defaultLabel": { + "message": "Oletus ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Näytä vastaavuuden tunnistus $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Piilota vastaavuuden tunnistus $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "AutomaattitäytetäänkÃļ sivun avautuessa?" + }, + "cardExpiredTitle": { + "message": "Kortti on vanhentunut" + }, + "cardExpiredMessage": { + "message": "Jos olet uudistanut kortin, päivitä sen tiedot" + }, + "cardDetails": { + "message": "Kortin tiedot" + }, + "cardBrandDetails": { + "message": "$BRAND$-tiedot", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Käytä animaatioita" + }, + "showAnimations": { + "message": "Näytä animaatiot" + }, + "addAccount": { + "message": "Lisää tili" + }, + "loading": { + "message": "Ladataan" + }, + "data": { + "message": "Tiedot" + }, + "passkeys": { + "message": "Pääsyavaimet", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Salasanat", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Kirjaudu pääsyavaimella", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Määritä" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Vain näiden kokoelmien käyttÃļoikeuden omaavat organisaation jäsenet voivat nähdä kohteen." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Vain näiden kokoelmien käyttÃļoikeuden omaavat organisaation jäsenet voivat nähdä kohteet." + }, + "bulkCollectionAssignmentWarning": { + "message": "Olet valinnut $TOTAL_COUNT$ kohdetta. Näistä $READONLY_COUNT$ et voi muuttaa, koska käyttÃļoikeutesi eivät salli muokkausta.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Lisää kenttä" + }, + "add": { + "message": "Lisää" + }, + "fieldType": { + "message": "Kentän tyyppi" + }, + "fieldLabel": { + "message": "Kentän nimi" + }, + "textHelpText": { + "message": "Käytä tekstikenttiä esimerkiksi turvakysymysten kaltaisille tiedoille." + }, + "hiddenHelpText": { + "message": "Käytä piilotettuja kenttiä esimerkiksi salasanojen kaltaisille arkaluonteisille tiedoille." + }, + "checkBoxHelpText": { + "message": "Käytä valintaruutuja esimerkiksi sähkÃļpostiosoitteen muistamisen kaltaisten valintaruutujen automaattiseen merkintään." + }, + "linkedHelpText": { + "message": "Käytä linkitettyjä kenttiä kohdatessasi sivustokohtaisia automaattitäytÃļn ongelmia." + }, + "linkedLabelHelpText": { + "message": "SyÃļtä kentän HTML-koodista lÃļytyvä id-, name-, aria-label- tai placeholder-arvo." + }, + "editField": { + "message": "Muokkaa kenttää" + }, + "editFieldLabel": { + "message": "Muokkaa kohdetta $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Poista $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ lisättiin", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Siirrä $LABEL$. Liikuta kohdetta ylÃļs- tai alaspäin nuolinäppäimillä.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ siirrettiin ylemmäs, sijainti: $INDEX$/$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Valitse määritettävät kokoelmat" + }, + "personalItemTransferWarningSingular": { + "message": "1 kohde siirretään pysyvästi valitulle organisaatiolle, jonka jälkeen et enää omista sitä." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ kohdetta siirretään pysyvästi valitulle organisaatiolle, jonka jälkeen et enää omista niitä.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 kohde siirretään pysyvästi organisaatiolle $ORG$, jonka jälkeen et enää omista sitä.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ kohdetta siirretään pysyvästi organisaatiolle $ORG$, jonka jälkeen et enää omista niitä.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Kokoelmat määritettiin" + }, + "nothingSelected": { + "message": "Et ole valinnut mitään." + }, + "movedItemsToOrg": { + "message": "Valitut kohteet siirrettiin organisaatiolle $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Kohteet siirrettiin organisaatiolle $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Kohde siirrettiin organisaatiolle $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ siirrettiin alemmas, sijainti: $INDEX$/$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Kohteen sijainti" + }, + "fileSend": { + "message": "Tiedosto-Send" + }, + "fileSends": { + "message": "Tiedosto-Sendit" + }, + "textSend": { + "message": "Teksti-Send" + }, + "textSends": { + "message": "Teksti-Sendit" + }, + "bitwardenNewLook": { + "message": "Bitwardenilla on uusi ulkoasu!" + }, + "bitwardenNewLookDesc": { + "message": "Automaattinen täyttÃļ ja sisällÃļn haku Holvi-välilehdeltä on nyt entistä helpompaa ja luontevampaa. Kokeile nyt!" + }, + "accountActions": { + "message": "Tilitoiminnot" + }, + "showNumberOfAutofillSuggestions": { + "message": "Näytä automaattitäytÃļn ehdotusten määrä laajennuksen kuvakkeessa" + }, + "systemDefault": { + "message": "Järjestelmän oletus" + }, + "enterprisePolicyRequirementsApplied": { + "message": "YrityskäytännÃļn vaatimukset vaikuttavat tähän asetukseen" + }, + "sshPrivateKey": { + "message": "Yksityinen avain" + }, + "sshPublicKey": { + "message": "Julkinen avain" + }, + "sshFingerprint": { + "message": "Sormenjälki" + }, + "sshKeyAlgorithm": { + "message": "Avaintyyppi" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Yritä uudelleen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Mukautetun aikakatkaisun vähimmäisaika on yksi minuutti." + }, + "additionalContentAvailable": { + "message": "LisäsisältÃļä on käytettävissä" + }, + "fileSavedToDevice": { + "message": "Tiedosto tallennettiin laitteelle. Hallitse sitä laitteesi latauksista." + }, + "showCharacterCount": { + "message": "Näytä merkkimäärä" + }, + "hideCharacterCount": { + "message": "Piilota merkkimäärä" + }, + "itemsInTrash": { + "message": "Roskakorin kohteet" + }, + "noItemsInTrash": { + "message": "Roskakorissa ei ole kohteita" + }, + "noItemsInTrashDesc": { + "message": "Poistamasi kohteet näkyvät täällä ja poistetaan pysyvästi 30 päivän kuluttua." + }, + "trashWarning": { + "message": "Roskakorissa yli 30 päivää olleet kohteet poistetaan automaattisesti" + }, + "restore": { + "message": "Palauta" + }, + "deleteForever": { + "message": "Poista pysyvästi" + }, + "noEditPermissions": { + "message": "Sinulla ei ole oikeutta muokata tätä kohdetta" + }, + "authenticating": { + "message": "Todennetaan" + }, + "fillGeneratedPassword": { + "message": "Täytä luotu salasana", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Salasana luotiin uudelleen", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Tallennetaanko kirjautumistieto Bitwardeniin?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "VälilyÃļnti", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Aaltoviiva", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Graaviaksentti", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Huutomerkkli", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "Ät-merkki", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Ristikkomerkki", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollarin merkki", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Prosenttimerkki", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Hattu", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersandi", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asteriski", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Vasen kaarisulje", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Oikea kaarisulje", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Alaviiva", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Yhdysmerkki", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus-merkki", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Yhtäsuuri kuin", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Vasen aaltosulje", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Oikea aaltosulje", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Vasen hakasulje", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Oikea hakasulje", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Putkimerkki", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Kenoviiva", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Kaksoispiste", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Puolipiste", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Lainausmerkki", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Heittomerkki", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Pienempi kuin", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Suurempi kuin", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Pilkku", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Piste", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Kysymysmerkki", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Kauttaviiva", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Pienet kirjaimet" + }, + "uppercaseAriaLabel": { + "message": "Isot kirjaimet" + }, + "generatedPassword": { + "message": "Luotu salasana" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index df4726ac9cb..c077a8704c5 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Libreng Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Isang ligtas at libreng password manager para sa lahat ng iyong mga aparato.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Maglog-in o gumawa ng bagong account para ma-access ang iyong ligtas na kahadeyero." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Gumawa ng Account" }, - "login": { - "message": "Mag-login" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise Single Sign-On sa Filipino ay Isang Sign-On na Enterprise" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "May isang pahiwatig para sa master password na makakatulong na maalala mo ang iyong password kapag nakalimutan mo ito." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Muling i-type ang Master Password" }, "masterPassHint": { "message": "Mungkahi sa Master Password (opsyonal)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopyahin ang Password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Kopyahin ang Note" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopyahin ang code ng seguridad" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-fill sa Filipino ay Awtomatikong Pagpuno" }, + "autoFillLogin": { + "message": "Auto-fill na pag-login" + }, + "autoFillCard": { + "message": "Auto-fill card" + }, + "autoFillIdentity": { + "message": "Awtomatikong punan ang pagkakakilanlan" + }, "generatePasswordCopied": { "message": "Maglagay ng Password" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Walang tumutugmang mga login" }, + "noCards": { + "message": "Walang card" + }, + "noIdentities": { + "message": "Walang pagkakakilanlan" + }, + "addLoginMenu": { + "message": "Magdagdag ng login" + }, + "addCardMenu": { + "message": "Magdagdag ng card" + }, + "addIdentityMenu": { + "message": "Magdagdag ng pagkakakilanlan" + }, "unlockVaultMenu": { "message": "Buksan ang iyong kahadeyero" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Magdagdag ng Item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Mungkahi sa Password" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Kumpirmahin ang iyong identididad upang magpatuloy." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Baguhin ang Master Password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Hulmabig ng Hilik ng Dako", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Mag-Log Out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Tungkol" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Bersyon" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "I-edit ang folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Burahin ang folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Magmamana", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatiko na gumawa ng mga malakas at natatanging mga password para sa iyong mga logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Isingit ang Vault ngayon" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Magtatag ng Password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Muling I-generate ang Password" }, @@ -244,17 +447,60 @@ "length": { "message": "Kahabaan" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-t) sa Filipino ay mababang-letra (a-t)" + "message": "Lowercase (a-t) sa Filipino ay mababang-letra (a-t)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Mga espesyal na character (!@#$%^&*) sa Filipino ay tinatawag na mga simbolong pambihira" + "message": "Mga espesyal na character (!@#$%^&*) sa Filipino ay tinatawag na mga simbolong pambihira", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Ang bilang ng mga salita\n\nNumero ng mga salita" @@ -276,7 +522,16 @@ "message": "Inakamababang espesyal" }, "avoidAmbChar": { - "message": "Iwasan ang mga hindi malinaw na character" + "message": "Iwasan ang mga hindi malinaw na character", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Hanapin ang vault" @@ -299,15 +554,30 @@ "password": { "message": "Ang Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Pasa salita" }, "favorite": { "message": "Ang Paborito" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Mga nota" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Ang paalala" }, @@ -326,6 +596,18 @@ "launch": { "message": "Paglulunsad" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,8 +620,23 @@ "other": { "message": "Iba pa" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Mag-set up ng paraan ng pag-unlock upang baguhin ang iyong pagkilos sa pag-timeout ng vault." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" }, "rateExtension": { "message": "I-rate ang extension" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Naka-lock ang iyong vault. Patunayan ang iyong pagkakakilanlan upang magpatuloy." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Buksan" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Mag-kandado Na" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Kaagad" }, @@ -426,6 +738,18 @@ "security": { "message": "Kaligtasan" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "Nagkaroon ng error" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Nalikha na ang iyong bagong account! Maaari ka nang mag-log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "Pinadala na namin sa iyo ang email na may hint ng master password mo." }, "verificationCodeRequired": { "message": "Kinakailangan ang verification code." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Maling verification code" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Hindi makapag-auto-fill ng napiling item sa pahinang ito. Kopya at i-paste ang impormasyon sa halip." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "Umalis na" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Nag-expire na ang iyong session sa login." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Sigurado ka bang gusto mong mag-log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Idinagdag na folder" }, - "changeMasterPass": { - "message": "Palitan ang master password" - }, - "changeMasterPasswordConfirmation": { - "message": "Maaari mong palitan ang iyong master password sa bitwarden.com web vault. Gusto mo bang bisitahin ang website ngayon?" - }, "twoStepLoginConfirmation": { "message": "Ang two-step login ay nagpapagaan sa iyong account sa pamamagitan ng pag-verify sa iyong login sa isa pang device tulad ng security key, authenticator app, SMS, tawag sa telepono o email. Ang two-step login ay maaaring magawa sa bitwarden.com web vault. Gusto mo bang bisitahin ang website ngayon?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Nai-save na folder" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Bagong URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Ang item ay idinagdag" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Tanungin na magdagdag ng login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Tanungin na magdagdag ng isang item kung wala itong nakita sa iyong vault." }, + "addLoginNotificationDescAlt": { + "message": "Hilingin na magdagdag ng isang item kung ang isa ay hindi mahanap sa iyong vault. Nalalapat sa lahat ng naka-log in na account." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Ipakita ang mga card sa Tab page" }, "showCardsCurrentTabDesc": { "message": "Itala ang mga item ng card sa Tab page para sa madaling auto-fill." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Ipakita ang mga pagkatao sa Tab page" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Tanungin ang update ng password ng isang login kapag napansin ang pagbabago sa websi." }, + "changedPasswordNotificationDescAlt": { + "message": "Hilingin na i-update ang password ng login kapag may nakitang pagbabago sa isang website. Nalalapat sa lahat ng naka-log in na account.\nI-unlock ang iyong Bitwarden vault para makumpleto ang kahilingan sa auto-fill." + }, + "enableUsePasskeys": { + "message": "Ask to save and use passkeys" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Nais mo bang i-update ang password na ito sa Bitwarden?" }, @@ -634,10 +1043,13 @@ "message": "I-update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "I-unlock ang iyong Bitwarden vault para makumpleto ang kahilingan sa auto-fill." }, "notificationUnlock": { - "message": "Unlock" + "message": "I-unlock" + }, + "additionalOptions": { + "message": "Additional options" }, "enableContextMenuItem": { "message": "Ipakita ang mga opsyon ng menu ng konteksto" @@ -645,9 +1057,12 @@ "contextMenuItemDesc": { "message": "Gamitin ang pangalawang pag-click upang ma-access ang password generation at matching logins para sa website. " }, + "contextMenuItemDescAlt": { + "message": "Gumamit ng pangalawang pag-click upang ma-access ang pagbuo ng password at pagtutugma ng mga login para sa website. Nalalapat sa lahat ng naka-log in na account." + }, "defaultUriMatchDetection": { "message": "Default na pagtukoy ng tugma ng URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Pumili ng default na paraan ng paghanda ng URI match detection para sa mga login kapag ginagawa ang mga aksyon tulad ng auto-fill." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Baguhin ang tema ng kulay ng application." }, + "themeDescAlt": { + "message": "Baguhin ang tema ng kulay ng application. Nalalapat sa lahat ng naka-log in na account." + }, "dark": { "message": "Madilim", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "I-export vault" }, "fileFormat": { "message": "Format ng file" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "BABALA", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Iniimbak" }, - "learnOrg": { - "message": "Matuto tungkol sa mga organisasyon" - }, - "learnOrgConfirmation": { - "message": "Pinapahintulutan ka ng Bitwarden na i-share ang iyong mga item sa vault sa iba pang tao gamit ang isang organisasyon. Gusto mo bang bisitahin ang website ng bitwarden.com upang matuto nang higit pa?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Lumipat sa organisasyon" @@ -762,6 +1204,9 @@ "file": { "message": "Mag-file" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Pumili ng File" }, @@ -772,7 +1217,7 @@ "message": "Hindi magagamit ang tampok" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Kinakailangan ang paglilipat ng encryption key. Mangyaring mag-login sa pamamagitan ng web vault upang i-update ang iyong encryption key." }, "premiumMembership": { "message": "Pagiging miyembro ng premium" @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage para sa mga file attachment." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "Pagmamay-ari na dalawang hakbang na opsyon sa pag-log in gaya ng YubiKey at Duo." }, "ppremiumSignUpReports": { "message": "Pasahod higiyena, kalusugan ng account, at mga ulat sa data breach upang panatilihing ligtas ang iyong vault." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Maaari kang mamili ng membership sa Premium sa website ng bitwarden.com. Gusto mo bang bisitahin ang website ngayon?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Ikaw ay isang Premium na miyembro!" }, "premiumCurrentMemberThanks": { "message": "Salamat sa pagsuporta sa Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "Lahat para lamang sa $PRICE$ /taon!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "I-refresh ang lahat" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "App ng Authenticator" }, - "authenticatorAppDesc": { - "message": "Gamitin ang isang authenticator app (tulad ng Authy o Google Authenticator) upang lumikha ng time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Gamitin ang YubiKey upang ma-access ang iyong account. Gumagana sa mga YubiKey 4, 4 Nano, 4C, at NEO devices." }, - "duoDesc": { - "message": "Patunayan sa pamamagitan ng Duo Security gamit ang Duo Mobile app, SMS, tawag sa telepono, o key ng seguridad ng U2F.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Mag-email" }, - "emailDesc": { - "message": "Mga kodigong pang-pagpapatunay ang ipapadala sa iyo sa pamamagitan ng email." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Kapaligirang self-hosted" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Tukuyin ang base URL ng iyong Bitwarden installation na naka-host sa on-premises." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Kapaligirang Custom" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL ng Server" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API Server URL" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "Nai-save ang mga URL ng Kapaligiran" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Nakasara", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Awtomatikong punan sa pagkarga ng pahina" }, "enableAutoFillOnPageLoadDesc": { "message": "Kung natukoy ang isang form sa pag login, awtomatikong punan kapag naglo load ang web page." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Ang mga nakompromiso o hindi pinagkakatiwalaang mga website ay maaaring samantalahin ang awtomatikong pagpuno sa pag load ng pahina." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "Matuto nang higit pa tungkol sa auto fill" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Buksan ang vault sa sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill ang huling ginamit na login para sa kasalukuyang website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Gumawa at kopyahin ang bagong random na password sa clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "I-lock ang vault" }, - "privateModeWarning": { - "message": "Ang suporta sa private mode ay eksperimental at limitado ang ilang mga tampok." - }, "customFields": { "message": "Pasadyang mga patlang" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Nilikha", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Ipakita ang isang kilalang larawan sa tabi ng bawat login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Ipakita ang badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Pagkakakilanlan" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Kasaysayan ng Password" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Bumalik" }, "collections": { "message": "Koleksyon" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Mga Paborito" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Pangalan ng domain", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match Detection - Pagtuklas ng Pares", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Kamalian ng Default", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Mga pagpipilian sa toggle" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Walang mga password na i-list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Alisin" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock sa pamamagitan ng PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Itakda ang iyong PIN code para sa pag-unlock ng Bitwarden. Ang iyong mga setting ng PIN ay ma-reset kung kailanman ay lubusang lumabas ka mula sa application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Kinakailangan ang PIN code." }, "invalidPin": { "message": "Hindi wastong PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "I-unlock sa pamamagitan ng biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Naghihintay ng kumpirmasyon mula sa desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "I-lock sa master password sa restart ng browser" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Kailangan mong piliin ang hindi bababa sa isang koleksyon." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Isang o higit pang patakaran ng organisasyon ay nakakaapekto sa iyong mga setting ng generator." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Aksyon sa Vault timeout" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "I-lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Basurahan", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item na nai-restore" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Sigurado ka bang gusto mong gamitin ang setting na ito? Pagsasara ay magtatanggal ng lahat ng access sa iyong vault at nangangailangan ng online authentication pagkatapos ng timeout period?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Auto-fill at i-save" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Item na auto-filled at URI na nai-save" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1492,10 +2147,10 @@ "message": "Current master password" }, "newMasterPass": { - "message": "New master password" + "message": "Bagong master password" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "Kumpirmahin ang bagong master password" }, "masterPasswordPolicyInEffect": { "message": "Isang o higit pang mga patakaran ng organisasyon ay nangangailangan ng iyong master password upang matugunan ang sumusunod na kinakailangan:" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Hindi matugunan ng iyong bagong pangunahing password ang mga kinakailangan ng patakaran." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "Sa pamamagitan ng pag-tsek sa kahon na ito ay sumasang-ayon ka sa sumusunod:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Pag verify ng pag sync ng desktop" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Mismatch sa Account" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Hindi naka-setup ang biometrics" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Ang browser biometrics ay hindi sinusuportahan sa device na ito." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Isang organisasyon policy ang nakakaapekto sa iyong mga pagpipilian sa ownership." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Hinarang ng isang patakaran ng organisasyon ang pag-import ng mga item sa iyong vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Inilayo na Domain" }, "excludedDomainsDesc": { "message": "Hindi tatanungin ng Bitwarden na i-save ang mga detalye ng pag-login para sa mga domain na ito. Kailangan mo nang i-refresh ang page para maipatupad ang mga pagbabago." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ay hindi isang valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Ipadala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Maghanap ng Mga Padala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Teksto" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Mag-file" }, @@ -1666,6 +2406,9 @@ "message": "Lahat ng Mga Padala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Ang pinaka-access count ay nakaabot na", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Protektado ng Password" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Kopyahin ang Link ng Padala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Sigurado ka bang gusto mo na i-delete ang Ipadala na ito?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "I-edit ang Ipadala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Ang Ipadala ay tatanggalin nang permanente sa tinukoy na petsa at oras.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Petsa ng pag-expire" }, @@ -1769,6 +2523,10 @@ "message": "Maipapayo na mag-require ng password para sa mga user na ma-access ang Send na ito.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Pribadong mga tala tungkol sa Send na ito.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Ipadala na nilikha", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Ipadala na nai-save", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Upang pumili ng isang file, buksan ang extension sa sidebar (kung posible) o bumalik sa isang bagong window sa pamamagitan ng pag-click sa banner na ito." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Upang pumili ng isang file gamit ang Safari, bumalik sa isang bagong window sa pamamagitan ng pag-click sa banner na ito." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Bago ka magsimula" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Itago ang aking email address mula sa mga tatanggap." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Isang o higit pang mga patakaran ng organisasyon ay nakaapekto sa iyong mga pagpipilian sa Pagpadala." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Kailangan ang pag verify ng email" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "Kailangan mong i-verify ang iyong email upang gamitin ang tampok na ito. Maaari mong i-verify ang iyong email sa web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Awtomatikong pagpapatala" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Pumili ng folder..." }, - "ssoCompleteRegistration": { - "message": "Upang matapos ang pag-log in sa SSO, mangyaring magtakda ng master password upang ma-access at maprotektahan ang iyong vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Oras" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minuto" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Nakakaapekto ang mga patakaran ng iyong organisasyon sa iyong vault timeout. Ang pinakamataas na pinapayagang Vault Timeout ay $HOURS$ oras at $MINUTES$ minuto", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Mali" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Lumikha ng username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Uri ng username" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Bumuo ng isang email alias na may isang panlabas na serbisyo sa pagpapasa." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Pangalan ng Hostname", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Paano mag-auto-fill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Nakuha ko" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Mga setting ng auto-fill" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "Keyboard shortcut para sa auto-fill" }, - "autofillShortcutNotSet": { - "message": "Hindi naka-set ang shortcut ng auto-fill. Baguhin ito sa mga setting ng browser." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "Ang shortcut ng auto-fill ay: $COMMAND$. Baguhin ito sa mga setting ng browser.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index d4b04dfa24f..c32445ae96a 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Gestion des mots de passe", + "message": "Gestionnaire de mots de passe Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Un gestionnaire de mots de passe sÊcurisÊ et gratuit pour tous vos appareils.", - "description": "Extension description" + "message": "Chez vous, au travail, n'importe oÚ, Bitwarden sÊcurise mots de passe, clÊs d'accès et informations sensibles", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Identifiez-vous ou crÊez un nouveau compte pour accÊder à votre coffre sÊcurisÊ." }, + "inviteAccepted": { + "message": "Invitation acceptÊe" + }, "createAccount": { "message": "CrÊer un compte" }, - "login": { - "message": "Se connecter" + "newToBitwarden": { + "message": "Nouveau sur Bitwarden ?" + }, + "logInWithPasskey": { + "message": "Se connecter avec une clÊ d'accès" + }, + "useSingleSignOn": { + "message": "Utiliser l'authentification unique" + }, + "welcomeBack": { + "message": "Content de vous revoir" + }, + "setAStrongPassword": { + "message": "DÊfinir un mot de passe fort" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Terminer la crÊation de votre compte en dÊfinissant un mot de passe" }, "enterpriseSingleSignOn": { "message": "Portail de connexion unique d'entreprise" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Un indice de mot de passe principal peut vous aider à vous souvenir de votre mot de passe si vous l'oubliez." }, + "masterPassHintText": { + "message": "Si vous oubliez votre mot de passe, l'indice peut ÃĒtre envoyÊ à votre courriel. $CURRENT$/$MAXIMUM$ caractères maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Ressaisir le mot de passe principal" }, "masterPassHint": { "message": "Indice du mot de passe principal (facultatif)" }, + "joinOrganization": { + "message": "Rejoindre l'organisation" + }, + "joinOrganizationName": { + "message": "Rejoindre $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Terminer de rejoindre cette organisation en configurant un mot de passe principal." + }, "tab": { "message": "Onglet" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copier le mot de passe" }, + "copyPassphrase": { + "message": "Copier la phrase de passe" + }, "copyNote": { "message": "Copier la note" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copier le code de sÊcuritÊ" }, + "copyName": { + "message": "Copier le nom" + }, + "copyCompany": { + "message": "Copier l'entreprise" + }, + "copySSN": { + "message": "Copier le numÊro de sÊcuritÊ sociale" + }, + "copyPassportNumber": { + "message": "Copier le numÊro de passeport" + }, + "copyLicenseNumber": { + "message": "Copier la plaque d'immatriculation" + }, + "copyPrivateKey": { + "message": "Copier la clÊ privÊe" + }, + "copyPublicKey": { + "message": "Copier la clÊ publique" + }, + "copyFingerprint": { + "message": "Copier l'empreinte digitale" + }, + "copyCustomField": { + "message": "Copier $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copier le site web" + }, + "copyNotes": { + "message": "Copier les notes" + }, + "fill": { + "message": "Remplir", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Saisie automatique" }, + "autoFillLogin": { + "message": "Saisie automatique de l'identifiant" + }, + "autoFillCard": { + "message": "Saisie automatique de la carte de paiement" + }, + "autoFillIdentity": { + "message": "Saisie automatique de l'identitÊ" + }, "generatePasswordCopied": { "message": "GÊnÊrer un mot de passe (copiÊ)" }, @@ -98,7 +199,22 @@ "message": "Copier le nom du champ personnalisÊ" }, "noMatchingLogins": { - "message": "Aucun identifiant correspondant." + "message": "Aucun identifiant correspondant" + }, + "noCards": { + "message": "Aucune carte de paiement" + }, + "noIdentities": { + "message": "Aucune identitÊ" + }, + "addLoginMenu": { + "message": "Ajouter un identifiant" + }, + "addCardMenu": { + "message": "Ajouter une carte de paiement" + }, + "addIdentityMenu": { + "message": "Ajouter une identitÊ" }, "unlockVaultMenu": { "message": "DÊverrouillez votre coffre" @@ -107,7 +223,7 @@ "message": "Connectez-vous à votre coffre" }, "autoFillInfo": { - "message": "Il n'y a pas d'identifiants disponibles à saisir automatiquement pour l'onglet actuel du navigateur." + "message": "Il n'y a aucun identifiant disponible pour le remplissage automatique de l'onglet actuel du navigateur." }, "addLogin": { "message": "Ajouter un identifiant" @@ -115,8 +231,20 @@ "addItem": { "message": "Ajouter un ÊlÊment" }, + "accountEmail": { + "message": "Courriel du compte" + }, + "requestHint": { + "message": "Demander l'indice" + }, + "requestPasswordHint": { + "message": "Obtenir l'indice du mot de passe" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Saisissez l'adresse courriel de votre compte et votre indice de mot de passe vous sera envoyÊ" + }, "passwordHint": { - "message": "Indice mot de passe" + "message": "Indice de mot de passe" }, "enterEmailToGetHint": { "message": "Saisissez l'adresse Êlectronique de votre compte pour recevoir l'indice de votre mot de passe principal." @@ -142,18 +270,36 @@ "confirmIdentity": { "message": "Confirmez votre identitÊ pour continuer." }, - "account": { - "message": "Compte" - }, "changeMasterPassword": { "message": "Changer le mot de passe principal" }, + "continueToWebApp": { + "message": "Poursuivre vers l'application web ?" + }, + "continueToWebAppDesc": { + "message": "Explorez plus de fonctionnalitÊs de votre compte Bitwarden sur l'application Web." + }, + "continueToHelpCenter": { + "message": "Continuer vers le centre d'aide ?" + }, + "continueToHelpCenterDesc": { + "message": "En savoir plus sur l'utilisation de Bitwarden dans le centre d'aide." + }, + "continueToBrowserExtensionStore": { + "message": "Continuer vers le magasin d'extension du navigateur ?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Aidez les autres à savoir si Bitwarden est fait pour eux. Visitez le magasin d'extension de votre navigateur et laissez une Êvaluation maintenant." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Vous pouvez modifier votre mot de passe principal sur l'application web de Bitwarden." + }, "fingerprintPhrase": { "message": "Phrase d'empreinte", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "La phrase d'empreinte de votre compte", + "message": "Phrase d'empreinte de votre compte", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { @@ -162,9 +308,45 @@ "logOut": { "message": "Se dÊconnecter" }, + "aboutBitwarden": { + "message": "À propos de Bitwarden" + }, "about": { "message": "À propos" }, + "moreFromBitwarden": { + "message": "Plus de Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continuer vers bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden pour les entreprises" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator vous permet de stocker les clÊs d'authentification et de gÊnÊrer des codes TOTP pour les flux de vÊrification en 2 Êtapes. En savoir plus sur le site web bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Stockez, gÊrez et partagez des mots de passe de dÊveloppement avec Bitwarden Secrets Manager. Apprenez-en plus sur le site web bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "CrÊez des expÊriences de connexion faciles et sÊcurisÊes à partir des mots de passe traditionnels avec Passwordless.dev. Apprenez-en plus sur le site web bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Familles gratuit" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Vous ÃĒtes Êligible pour obtenir Bitwarden Familles gratuitement. Souscrivez à cette offre aujourd'hui dans l'application Web." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Modifier le dossier" }, + "newFolder": { + "message": "Nouveau dossier" + }, + "folderName": { + "message": "Nom de dossier" + }, + "folderHintText": { + "message": "Imbriquer un dossier en ajoutant le nom du dossier parent suivi d'un \"/\". Par exemple : Social/Forums" + }, + "noFoldersAdded": { + "message": "Pas de dossier ajoutÊ" + }, + "createFoldersToOrganize": { + "message": "CrÊer des dossiers pour organiser les ÊlÊments de votre coffre" + }, + "deleteFolderPermanently": { + "message": "Êtes-vous sÃģr de vouloir supprimer dÊfinitivement ce dossier ?" + }, "deleteFolder": { "message": "Supprimer le dossier" }, @@ -199,13 +399,13 @@ "message": "Centre d'aide Bitwarden" }, "communityForums": { - "message": "Explorez les forums de la communautÊ Bitwarden" + "message": "Explorer les forums de la communautÊ Bitwarden" }, "contactSupport": { "message": "Contacter le support Bitwarden" }, "sync": { - "message": "Synchroniser" + "message": "Synchronisation" }, "syncVaultNow": { "message": "Synchroniser le coffre maintenant" @@ -218,13 +418,13 @@ }, "generator": { "message": "GÊnÊrateur", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "GÊnÊrer automatiquement des mots de passe robustes et uniques pour vos identifiants." }, - "bitWebVault": { - "message": "Coffre web bitwarden" + "bitWebVaultApp": { + "message": "Application web Bitwarden" }, "importItems": { "message": "Importer des ÊlÊments" @@ -235,6 +435,9 @@ "generatePassword": { "message": "GÊnÊrer un mot de passe" }, + "generatePassphrase": { + "message": "GÊnÊrer une phrase de passe" + }, "regeneratePassword": { "message": "RÊgÊnÊrer un mot de passe" }, @@ -244,17 +447,60 @@ "length": { "message": "Longueur" }, + "passwordMinLength": { + "message": "Longueur minimale du mot de passe" + }, "uppercase": { - "message": "Majuscules (A-Z)" + "message": "Majuscules (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minuscules (a-z)" + "message": "Minuscules (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Chiffres (0-9)" + "message": "Chiffres (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caractères spÊciaux (!@#$%^&*)" + "message": "Caractères spÊciaux (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Inclure", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Inclure des caractères majuscules", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Inclure des caractères minuscules", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Inclure des nombres", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Inclure des caractères spÊciaux", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Nombre de mots" @@ -276,7 +522,16 @@ "message": "Minimum de caractères spÊciaux" }, "avoidAmbChar": { - "message": "Éviter les caractères ambigus" + "message": "Éviter les caractères ambigus", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Éviter les caractères ambigus", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Les exigences de la politique d'entreprise ont ÊtÊ appliquÊes à vos options de gÊnÊrateur.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Rechercher dans le coffre" @@ -285,7 +540,7 @@ "message": "Modifier" }, "view": { - "message": "Voir" + "message": "Afficher" }, "noItemsInList": { "message": "Aucun identifiant à afficher." @@ -299,15 +554,30 @@ "password": { "message": "Mot de passe" }, + "totp": { + "message": "Secret de l'Authentificateur" + }, "passphrase": { "message": "Phrase de passe" }, "favorite": { "message": "Favori" }, + "unfavorite": { + "message": "Retirer des favoris" + }, + "itemAddedToFavorites": { + "message": "ÉlÊment ajoutÊ aux favoris" + }, + "itemRemovedFromFavorites": { + "message": "ÉlÊment retirÊ des favoris" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Note privÊe" + }, "note": { "message": "Note" }, @@ -326,11 +596,23 @@ "launch": { "message": "Ouvrir" }, + "launchWebsite": { + "message": "Ouvrir le site web" + }, + "launchWebsiteName": { + "message": "Lancer le site web $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Site web" }, "toggleVisibility": { - "message": "Afficher/Masquer" + "message": "Permuter la visibilitÊ" }, "manage": { "message": "GÊrer" @@ -338,8 +620,23 @@ "other": { "message": "Autre" }, + "unlockMethods": { + "message": "Options de dÊverrouillage" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Configurez une mÊthode de dÊverrouillage pour changer le dÊlai d'expiration de votre coffre." + }, + "unlockMethodNeeded": { + "message": "Configurer une mÊthode de dÊverrouillage dans les Paramètres" + }, + "sessionTimeoutHeader": { + "message": "Expiration de la session" + }, + "vaultTimeoutHeader": { + "message": "DÊlai d'expiration du coffre" + }, + "otherOptions": { + "message": "Autres options" }, "rateExtension": { "message": "Noter l'extension" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Votre coffre est verrouillÊ. VÊrifiez votre identitÊ pour continuer." }, + "yourVaultIsLockedV2": { + "message": "Votre coffre est verrouillÊ" + }, + "yourAccountIsLocked": { + "message": "Votre compte est verrouillÊ" + }, + "or": { + "message": "ou" + }, "unlock": { "message": "DÊverrouiller" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "DÊlai d'expiration du coffre" }, + "vaultTimeout1": { + "message": "DÊlai d'expiration" + }, "lockNow": { "message": "Verrouiller maintenant" }, + "lockAll": { + "message": "Tout verrouiller" + }, "immediately": { "message": "ImmÊdiatement" }, @@ -426,6 +738,18 @@ "security": { "message": "SÊcuritÊ" }, + "confirmMasterPassword": { + "message": "Confirmer le mot de passe principal" + }, + "masterPassword": { + "message": "Mot de passe principal" + }, + "masterPassImportant": { + "message": "Votre mot de passe principal ne peut pas ÃĒtre rÊcupÊrÊ si vous l'oubliez !" + }, + "masterPassHintLabel": { + "message": "Indice du mot de passe principal" + }, "errorOccurred": { "message": "Une erreur est survenue" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Votre nouveau compte a ÊtÊ crÊÊ ! Vous pouvez maintenant vous authentifier." }, + "newAccountCreated2": { + "message": "Votre nouveau compte a ÊtÊ crÊÊ !" + }, + "youHaveBeenLoggedIn": { + "message": "Vous avez ÊtÊ connectÊ !" + }, + "youSuccessfullyLoggedIn": { + "message": "Vous vous ÃĒtes connectÊ avec succès" + }, + "youMayCloseThisWindow": { + "message": "Vous pouvez fermer cette fenÃĒtre" + }, "masterPassSent": { "message": "Nous vous avons envoyÊ un courriel avec votre indice de mot de passe principal." }, "verificationCodeRequired": { "message": "Le code de vÊrification est requis." }, + "webauthnCancelOrTimeout": { + "message": "L'authentification a ÊtÊ annulÊe ou a pris trop de temps. Veuillez rÊessayer." + }, "invalidVerificationCode": { "message": "Code de vÊrification invalide" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Impossible de saisir automatiquement l'ÊlÊment sÊlectionnÊ sur cette page. Copiez-collez plutôt l'information." + "message": "Impossible de remplir automatiquement le site sÊlectionnÊ sur cette page. Copiez/collez plutôt votre nom d'utilisateur et/ou votre mot de passe." + }, + "totpCaptureError": { + "message": "Impossible de scanner le QR code à partir de la page web actuelle" + }, + "totpCaptureSuccess": { + "message": "ClÊ Authenticator ajoutÊe" + }, + "totpCapture": { + "message": "Scanner le QR code de l'authentificateur à partir de la page web actuelle" + }, + "totpHelperTitle": { + "message": "Rendre la vÊrification en deux Êtapes transparente" + }, + "totpHelper": { + "message": "Bitwarden peut stocker et remplir des codes de vÊrification en 2 Êtapes. Copiez et collez la clÊ dans ce champ." + }, + "totpHelperWithCapture": { + "message": "Bitwarden peut stocker et remplir des codes de vÊrification en 2 Êtapes. SÊlectionnez l'icône camÊra pour prendre une capture d'Êcran du code QR de l'authentificateur de ce site Web, ou copiez et collez la clÊ dans ce champ." + }, + "learnMoreAboutAuthenticators": { + "message": "En savoir plus sur les authentificateurs" + }, + "copyTOTP": { + "message": "Copier la clÊ Authenticator (TOTP)" }, "loggedOut": { "message": "DÊconnectÊ" }, + "loggedOutDesc": { + "message": "Vous avez ÊtÊ dÊconnectÊ de votre compte." + }, "loginExpired": { "message": "Votre session a expirÊ." }, + "logIn": { + "message": "Se connecter" + }, + "logInToBitwarden": { + "message": "Se connecter à Bitwarden" + }, + "restartRegistration": { + "message": "RedÊmarrer l'inscription" + }, + "expiredLink": { + "message": "Lien expirÊ" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Veuillez redÊmarrer votre inscription ou essayez de vous connecter." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Vous avez peut-ÃĒtre dÊjà un compte" + }, "logOutConfirmation": { "message": "Êtes-vous sÃģr de vouloir vous dÊconnecter ?" }, @@ -503,14 +887,14 @@ "addedFolder": { "message": "Dossier ajoutÊ" }, - "changeMasterPass": { - "message": "Changer le mot de passe principal" - }, - "changeMasterPasswordConfirmation": { - "message": "Vous pouvez changer votre mot de passe principal depuis le coffre web de bitwarden.com. Voulez-vous visiter le site web maintenant ?" - }, "twoStepLoginConfirmation": { - "message": "L'authentification à deux facteurs rend votre compte plus sÃģr en vous demandant de vÊrifier votre connexion avec un autre dispositif tel qu'une clÊ de sÊcuritÊ, une application d'authentification, un SMS, un appel tÊlÊphonique ou un courriel. L'authentification à deux facteurs peut ÃĒtre configurÊe sur le coffre web de bitwarden.com. Voulez-vous visiter le site web maintenant ?" + "message": "L'authentification à deux facteurs rend votre compte plus sÃģr en vous demandant de vÊrifier votre connexion avec un autre dispositif tel qu'une clÊ de sÊcuritÊ, une application d'authentification, un SMS, un appel tÊlÊphonique ou un courriel. L'authentification à deux facteurs peut ÃĒtre configurÊe dans le coffre web de bitwarden.com. Voulez-vous visiter le site web maintenant ?" + }, + "twoStepLoginConfirmationContent": { + "message": "Rendez votre compte plus sÊcurisÊ en configurant la connexion en deux Êtapes dans l'application web Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Poursuivre vers l'application web ?" }, "editedFolder": { "message": "Dossier sauvegardÊ" @@ -552,6 +936,10 @@ "newUri": { "message": "Nouvel URI" }, + "addDomain": { + "message": "Ajouter un domaine", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "ÉlÊment ajoutÊ" }, @@ -590,29 +978,41 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Demander à ajouter un identifiant" + "message": "Demander d'ajouter un identifiant" + }, + "vaultSaveOptionsTitle": { + "message": "Enregistrer dans les options de coffre" }, "addLoginNotificationDesc": { - "message": "Demander à ajouter un ÊlÊment si aucun n'est trouvÊ dans votre coffre." + "message": "Demander d'ajouter un ÊlÊment si aucun n'est trouvÊ dans votre coffre." + }, + "addLoginNotificationDescAlt": { + "message": "Demande l'ajout d'un ÊlÊment si celui-ci n'est pas trouvÊ dans votre coffre. S'applique à tous les comptes connectÊs." + }, + "showCardsInVaultView": { + "message": "Afficher les cartes de paiement en tant que suggestions de saisie automatique dans la vue du coffre" }, "showCardsCurrentTab": { - "message": "Afficher les cartes sur la page de l'onglet" + "message": "Afficher les cartes de paiement sur la Page d'onglet" }, "showCardsCurrentTabDesc": { - "message": "Lister les ÊlÊments de la carte sur la page de l'onglet pour faciliter la saisie automatique." + "message": "Liste les ÊlÊments des cartes de paiement sur la Page d'onglet pour faciliter la saisie automatique." + }, + "showIdentitiesInVaultView": { + "message": "Afficher les identitÊs en tant que suggestions de saisie automatique dans la vue du coffre" }, "showIdentitiesCurrentTab": { - "message": "Afficher les identitÊs sur la page Onglet courant" + "message": "Afficher les identitÊs sur la Page d'onglet" }, "showIdentitiesCurrentTabDesc": { - "message": "Lister les ÊlÊments d'identitÊ sur la page de l'onglet pour faciliter la saisie automatique." + "message": "Liste les ÊlÊments d'identitÊ sur la Page d'onglet pour faciliter la saisie automatique." }, "clearClipboard": { "message": "Effacer le presse-papiers", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "Effacer automatiquement de votre presse-papiers les valeurs copiÊes.", + "message": "Efface automatiquement les valeurs copiÊes de votre presse-papiers.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { @@ -622,10 +1022,19 @@ "message": "Enregistrer" }, "enableChangedPasswordNotification": { - "message": "Demander à mettre à jour l'identifiant existant" + "message": "Demander de mettre à jour un identifiant existant" }, "changedPasswordNotificationDesc": { - "message": "Demander à mettre à jour le mot de passe d'un identifiant lorsqu'un changement est dÊtectÊ sur un site Web." + "message": "Demande la mise à jour du mot de passe d'un identifiant lorsqu'un changement est dÊtectÊ sur un site Web." + }, + "changedPasswordNotificationDescAlt": { + "message": "Demande la mise à jour du mot de passe d'un identifiant lorsqu'un changement est dÊtectÊ sur un site web. S'applique à tous les comptes connectÊs." + }, + "enableUsePasskeys": { + "message": "Demander d'enregistrer et d'utiliser les clÊs d'identification (passkeys)" + }, + "usePasskeysDesc": { + "message": "Demande l'enregistrement de nouvelles clÊs d'identification (passkeys) ou la connexion à l'aide des clÊs d'identification (passkeys) stockÊes dans votre coffre. S'applique à tous les comptes connectÊs." }, "notificationChangeDesc": { "message": "Souhaitez-vous mettre à jour ce mot de passe dans Bitwarden ?" @@ -634,23 +1043,29 @@ "message": "Mettre à jour" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "DÊverrouillez votre coffre Bitwarden pour terminer la demande de saisie automatique." }, "notificationUnlock": { "message": "DÊverrouiller" }, + "additionalOptions": { + "message": "Options supplÊmentaires" + }, "enableContextMenuItem": { "message": "Afficher les options du menu contextuel" }, "contextMenuItemDesc": { - "message": "Utilisez un clic secondaire pour accÊder à la gÊnÊration de mots de passe et les identifiants correspondants pour le site Web. " + "message": "Utilise un clic secondaire pour accÊder à la gÊnÊration de mots de passe et aux identifiants correspondants pour le site web." + }, + "contextMenuItemDescAlt": { + "message": "Utilise un clic secondaire pour accÊder à la gÊnÊration de mot de passe et aux identifiants correspondants pour le site web. S'applique à tous les comptes connectÊs." }, "defaultUriMatchDetection": { "message": "DÊtection de correspondance URI par dÊfaut", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choisissez la manière de gestion par dÊfaut de la dÊtection de correspondance URI pour les identifiants lors de l'exÊcution d'actions telles que la saisie automatique." + "message": "Choisit la manière dont la dÊtection des correspondances URI est gÊrÊe par dÊfaut pour les connexions lors d'actions telles que la saisie automatique." }, "theme": { "message": "Thème" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Modifier le thème de couleur de l'application." }, + "themeDescAlt": { + "message": "Modifie le thème de couleur de l'application. S'applique à tous les comptes connectÊs." + }, "dark": { "message": "Sombre", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Exporter à partir de" + }, "exportVault": { "message": "Exporter le coffre" }, "fileFormat": { "message": "Format de fichier" }, + "fileEncryptedExportWarningDesc": { + "message": "L'export de ce fichier sera protÊgÊ par un mot de passe et nÊcessitera le mot de passe du fichier pour ÃĒtre dÊchiffrÊ." + }, + "filePassword": { + "message": "Mot de passe du fichier" + }, + "exportPasswordDescription": { + "message": "Ce mot de passe sera utilisÊ pour exporter et importer ce fichier" + }, + "accountRestrictedOptionDescription": { + "message": "Utilisez la clÊ de chiffrement de votre compte, dÊrivÊe du nom d'utilisateur et du mot de passe principal de votre compte, pour chiffrer l'export et restreindre l'import au seul compte Bitwarden actuel." + }, + "passwordProtectedOptionDescription": { + "message": "DÊfinissez un mot de passe de fichier pour chiffrer l'exportation et l'importer dans n'importe quel compte Bitwarden en utilisant le mot de passe pour le dÊchiffrage." + }, + "exportTypeHeading": { + "message": "Type d'exportation" + }, + "accountRestricted": { + "message": "Compte restreint" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "Le \"Mot de passe du fichier\" et le \"Confirmation du mot de passe du fichier\" ne correspondent pas." + }, "warning": { "message": "AVERTISSEMENT", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "PartagÊ" }, - "learnOrg": { - "message": "En savoir plus sur les organisations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden vous permet de partager des ÊlÊments de votre coffre avec d'autres personnes en utilisant un compte d'organisation. Souhaitez-vous visiter le site web bitwarden.com pour en savoir plus ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden pour entreprises vous permet de partager les ÊlÊments de votre coffre avec les autres en utilisant une organisation. Apprenez-en plus sur le site bitwarden.com." }, "moveToOrganization": { "message": "DÊplacer vers l'organisation" @@ -730,7 +1172,7 @@ "message": "En savoir plus" }, "authenticatorKeyTotp": { - "message": "ClÊ d'authentification (TOTP)" + "message": "ClÊ Authenticator (TOTP)" }, "verificationCodeTotp": { "message": "Code de vÊrification (TOTP)" @@ -762,6 +1204,9 @@ "file": { "message": "Fichier" }, + "fileToShare": { + "message": "Fichier à partager" + }, "selectFile": { "message": "SÊlectionnez un fichier." }, @@ -769,7 +1214,7 @@ "message": "La taille maximale du fichier est de 500 Mo." }, "featureUnavailable": { - "message": "FonctionnalitÊ non disponible" + "message": "FonctionnalitÊ indisponible" }, "encryptionKeyMigrationRequired": { "message": "Migration de la clÊ de chiffrement nÊcessaire. Veuillez vous connecter sur le coffre web pour mettre à jour votre clÊ de chiffrement." @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 Go de stockage chiffrÊ pour les fichiers joints." }, + "premiumSignUpEmergency": { + "message": "Accès d'urgence." + }, "premiumSignUpTwoStepOptions": { "message": "Options de connexion propriÊtaires à deux facteurs telles que YubiKey et Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Vous pouvez acheter une adhÊsion Premium sur le coffre web de bitwarden.com. Voulez-vous visiter le site web maintenant ?" }, + "premiumPurchaseAlertV2": { + "message": "Vous pouvez acheter la version Premium depuis les paramètres de votre compte dans l'application web Bitwarden." + }, "premiumCurrentMember": { "message": "Vous ÃĒtes un membre Premium !" }, "premiumCurrentMemberThanks": { "message": "Merci de soutenir Bitwarden." }, + "premiumFeatures": { + "message": "Mettre à niveau à la version Premium et recevez :" + }, "premiumPrice": { "message": "Tout pour seulement $PRICE$/an !", "placeholders": { @@ -831,14 +1285,23 @@ } } }, + "premiumPriceV2": { + "message": "Tout pour seulement $PRICE$ /an !", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Actualisation terminÊe" }, "enableAutoTotpCopy": { - "message": "Copier le code TOTP automatiquement" + "message": "Copier le TOTP automatiquement" }, "disableAutoTotpCopyDesc": { - "message": "Si un identifiant possède une clÊ d'authentification, copiez le code de vÊrification TOTP dans votre presse-papiers lorsque vous saisissez automatiquement l'identifiant." + "message": "Si un identifiant possède une clÊ d'authentification, copie le code de vÊrification TOTP dans votre presse-papiers lorsque vous saisissez automatiquement l'identifiant." }, "enableAutoBiometricsPrompt": { "message": "Demander la biomÊtrie au lancement" @@ -895,7 +1358,7 @@ "message": "Authentifier WebAuthn" }, "loginUnavailable": { - "message": "Identifiant non disponible" + "message": "Identifiant indisponible" }, "noTwoStepProviders": { "message": "Ce compte dispose d'une authentification à deux facteurs de configurÊe, cependant, aucun des fournisseurs à deux facteurs configurÊs n'est pris en charge par ce navigateur web." @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Application d'authentification" }, - "authenticatorAppDesc": { - "message": "Utiliser une application d'authentification (comme Authy ou Google Authenticator) pour gÊnÊrer des codes de vÊrification basÊs sur le temps.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Entrez un code gÊnÊrÊ par une application d'authentification comme Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "ClÊ de sÊcuritÊ YubiKey OTP" + "yubiKeyTitleV2": { + "message": "ClÊ de sÊcuritÊ OTP de Yubico" }, "yubiKeyDesc": { "message": "Utiliser une YubiKey pour accÊder à votre compte. Fonctionne avec les appareils YubiKey 4, 4 Nano, 4C et NEO." }, - "duoDesc": { - "message": "S'authentifier avec Duo Security via l'application Duo Mobile, un SMS, un appel tÊlÊphonique, ou une clÊ de sÊcuritÊ U2F.", + "duoDescV2": { + "message": "Entrez un code gÊnÊrÊ par Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Courriel" }, - "emailDesc": { - "message": "Les codes de vÊrification vous seront envoyÊs par courriel." + "emailDescV2": { + "message": "Entrez le code envoyÊ à votre adresse courriel." }, "selfHostedEnvironment": { "message": "Environnement auto-hÊbergÊ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "SpÊcifiez l'URL de base de votre installation Bitwarden auto-hÊbergÊe." }, + "selfHostedBaseUrlHint": { + "message": "SpÊcifiez l'URL de base de votre installation autohÊbergÊe par Bitwarden. Exemple : https://bitwarden.compagnie.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Pour une configuration avancÊe. Vous pouvez spÊcifier l'URL de base indÊpendamment pour chaque service." + }, + "selfHostedEnvFormInvalid": { + "message": "Vous devez ajouter soit l'URL du serveur de base, soit au moins un environnement personnalisÊ." + }, "customEnvironment": { "message": "Environnement personnalisÊ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL du serveur" }, + "selfHostBaseUrl": { + "message": "URL du serveur auto-hÊbergÊ", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL du serveur de l'API" }, @@ -978,14 +1454,73 @@ "environmentSaved": { "message": "Les URLs d'environnement ont ÊtÊ enregistrÊes." }, + "showAutoFillMenuOnFormFields": { + "message": "Afficher le menu de saisie automatique dans les champs d'un formulaire", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Suggestions de saisie automatique" + }, + "showInlineMenuLabel": { + "message": "Afficher les suggestions de saisie automatique dans les champs d'un formulaire" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Afficher les identitÊs sous forme de suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Afficher les cartes de paiement sous forme de suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Afficher les suggestions lorsque l'icône est sÊlectionnÊe" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "S'applique à tous les comptes connectÊs." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "DÊsactivez les paramètres du gestionnaire de mots de passe intÊgrÊ à votre navigateur pour Êviter les conflits." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Éditer les paramètres du navigateur." + }, + "autofillOverlayVisibilityOff": { + "message": "DÊsactivÊ", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Lorsque le champ est sÊlectionnÊ (sur \"focus\")", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Lorsque l'icône de saisie automatique est sÊlectionnÊe", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Saisie automatique lors du chargement de la page" + }, "enableAutoFillOnPageLoad": { "message": "Saisir automatiquement au chargement de la page" }, "enableAutoFillOnPageLoadDesc": { - "message": "Si un formulaire de connexion est dÊtectÊ, saisir automatiquement lors du chargement de la page web." + "message": "Si un formulaire de connexion est dÊtectÊ, il sera saisi automatiquement lors du chargement de la page web." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Attention :$CLOSETAG$ Les sites web compromis ou non fiables peuvent exploiter la saisie automatique lors du chargement de la page.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Les sites web compromis ou non fiables peuvent exploiter la saisie automatique au chargement de la page." + "message": "les sites web compromis ou non fiables peuvent exploiter la saisie automatique au chargement de la page." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "En savoir plus sur les risques" }, "learnMoreAboutAutofill": { "message": "En savoir plus sur la saisie automatique" @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "Ouvrir le coffre dans la barre latÊrale" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "Saisir automatiquement le dernier identifiant utilisÊ pour le site web actuel" }, + "commandAutofillCardDesc": { + "message": "Saisir automatiquement la dernière carte utilisÊe pour le site web actuel" + }, + "commandAutofillIdentityDesc": { + "message": "Saisir automatiquement la dernière identitÊ utilisÊe pour le site web actuel" + }, "commandGeneratePasswordDesc": { "message": "GÊnÊrer et copier un nouveau mot de passe alÊatoire dans le presse-papiers." }, "commandLockVaultDesc": { "message": "Verrouiller le coffre" }, - "privateModeWarning": { - "message": "La prise en charge de la navigation privÊe est expÊrimentale et certaines fonctionnalitÊs sont limitÊes." - }, "customFields": { "message": "Champs personnalisÊs" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "BoolÊen" }, + "cfTypeCheckbox": { + "message": "Case à cocher" + }, "cfTypeLinked": { "message": "LiÊ", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1065,16 +1606,19 @@ "message": "Ce navigateur ne peut pas traiter les demandes U2F dans cette fenÃĒtre popup. Voulez-vous ouvrir cette popup dans une nouvelle fenÃĒtre afin de pouvoir vous connecter à l'aide de l'U2F ?" }, "enableFavicon": { - "message": "Afficher les icônes du site web" + "message": "Afficher les icônes des sites web" }, "faviconDesc": { - "message": "Afficher une image reconnaissable à côtÊ de chaque identifiant." + "message": "Affiche une image reconnaissable à côtÊ de chaque identifiant." + }, + "faviconDescAlt": { + "message": "Affiche une image reconnaissable à côtÊ de chaque identifiant. S'applique à tous les comptes connectÊs." }, "enableBadgeCounter": { "message": "Afficher le compteur de badge" }, "badgeCounterDesc": { - "message": "Indique le nombre d'identifiants que vous avez pour la page web actuelle." + "message": "Indique le nombre d'identifiants dont vous disposez pour la page web en cours." }, "cardholderName": { "message": "Nom du titulaire de la carte" @@ -1179,7 +1723,7 @@ "message": "NumÊro de passeport" }, "licenseNumber": { - "message": "NumÊro de permis de Conduire" + "message": "NumÊro de licence" }, "email": { "message": "Courriel" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "IdentitÊ" }, + "typeSshKey": { + "message": "ClÊ SSH" + }, + "newItemHeader": { + "message": "Nouveau/nouvelle $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Éditer $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Voir les $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Historique des mots de passe" }, + "generatorHistory": { + "message": "Historique du gÊnÊrateur" + }, + "clearGeneratorHistoryTitle": { + "message": "Effacer l'historique du gÊnÊrateur" + }, + "cleargGeneratorHistoryDescription": { + "message": "Si vous continuez, toutes les entrÊes seront dÊfinitivement supprimÊes de l'historique du gÊnÊrateur. Êtes-vous sÃģr de vouloir continuer ?" + }, "back": { "message": "Retour" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collection(s)", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoris" }, @@ -1282,6 +1874,10 @@ "message": "Domaine de base", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Domaine de base (recommandÊ)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Nom de domaine", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "DÊtection de correspondance", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "DÊtection de correspondance par dÊfaut", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Options de basculement" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Aucun mot de passe à afficher." }, + "clearHistory": { + "message": "Effacer l'historique" + }, + "nothingToShow": { + "message": "Rien à montrer" + }, + "nothingGeneratedRecently": { + "message": "Vous n'avez rien gÊnÊrÊ rÊcemment" + }, "remove": { "message": "Supprimer" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "DÊverrouiller avec un code PIN" }, + "setYourPinTitle": { + "message": "DÊfinir PIN" + }, + "setYourPinButton": { + "message": "DÊfinir PIN" + }, "setYourPinCode": { "message": "DÊfinissez votre code PIN pour dÊverrouiller Bitwarden. Les paramètres relatifs à votre code PIN seront rÊinitialisÊs si vous vous dÊconnectez complètement de l'application." }, + "setYourPinCode1": { + "message": "Votre code PIN sera utilisÊ pour dÊverrouiller Bitwarden au lieu de votre mot de passe principal. Votre code PIN sera rÊinitialisÊ si vous vous dÊconnectez complètement de Bitwarden." + }, "pinRequired": { "message": "Le code PIN est requis." }, "invalidPin": { "message": "Code PIN invalide." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Trop de tentatives de saisie du code PIN incorrectes. DÊconnexion." + }, "unlockWithBiometrics": { "message": "DÊverrouiller par biomÊtrie" }, + "unlockWithMasterPassword": { + "message": "DÊverrouiller avec le mot de passe principal" + }, "awaitDesktop": { "message": "En attente de confirmation de l'application de bureau" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Verrouiller avec le mot de passe principal au redÊmarrage du navigateur" }, + "lockWithMasterPassOnRestart1": { + "message": "Exiger le mot de passe principal au redÊmarrage du navigateur" + }, "selectOneCollection": { "message": "Vous devez sÊlectionner au moins une collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Une ou plusieurs politiques de sÊcuritÊ de l'organisation affectent les paramètres de votre gÊnÊrateur." }, + "passwordGenerator": { + "message": "GÊnÊrateur de mot de passe" + }, + "usernameGenerator": { + "message": "GÊnÊrateur de nom d'utilisateur" + }, + "useThisPassword": { + "message": "Utiliser ce mot de passe" + }, + "useThisUsername": { + "message": "Utiliser ce nom d'utilisateur" + }, + "securePasswordGenerated": { + "message": "Mot de passe sÊcurisÊ gÊnÊrÊ ! N'oubliez pas aussi de mettre à jour votre mot de passe sur le site Web." + }, + "useGeneratorHelpTextPartOne": { + "message": "Utiliser le gÊnÊrateur", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "pour crÊer un mot de passe fort unique", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Action après dÊlai d'expiration du coffre" }, + "vaultTimeoutAction1": { + "message": "Expiration de l'action" + }, "lock": { "message": "Verrouiller", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Corbeille", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ÉlÊment restaurÊ" }, + "alreadyHaveAccount": { + "message": "Vous avez dÊjà un compte ?" + }, "vaultTimeoutLogOutConfirmation": { "message": "La dÊconnexion supprimera tout accès à votre coffre et nÊcessitera une authentification en ligne après la pÊriode d'expiration. Êtes-vous sÃģr de vouloir utiliser ce paramètre ?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Saisir automatiquement et sauvegarder" }, + "fillAndSave": { + "message": "Remplir et enregistrer" + }, "autoFillSuccessAndSavedUri": { "message": "ÉlÊment saisi automatiquement et URI sauvegardÊ" }, @@ -1468,7 +2123,7 @@ "message": "ÉlÊment saisi automatiquement" }, "insecurePageWarning": { - "message": "Avertissement : il s'agit d'une page HTTP non sÊcurisÊe, et toute information que vous soumettez peut potentiellement ÃĒtre vue et modifiÊe par d'autres. À l'origine, cet identifiant a ÊtÊ enregistrÊ sur une page sÊcurisÊe (HTTPS)." + "message": "Avertissement : il s'agit d'une page HTTP non sÊcurisÊe, et toute information que vous soumettez peut potentiellement ÃĒtre vue et modifiÊe par un tiers. À l'origine, cet identifiant a ÊtÊ enregistrÊ sur une page sÊcurisÊe (HTTPS)." }, "insecurePageWarningFillPrompt": { "message": "Voulez-vous toujours saisir automatiquement cet identifiant ?" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Votre nouveau mot de passe principal ne rÊpond pas aux exigences de politique de sÊcuritÊ." }, + "receiveMarketingEmailsV2": { + "message": "Obtenez des conseils, des annonces et des opportunitÊs de recherche de la part de Bitwarden dans votre boÃŽte de rÊception." + }, + "unsubscribe": { + "message": "Se dÊsabonner" + }, + "atAnyTime": { + "message": "à tout moment." + }, + "byContinuingYouAgreeToThe": { + "message": "En continuant, vous acceptez les" + }, + "and": { + "message": "et" + }, "acceptPolicies": { "message": "En cochant cette case vous acceptez ce qui suit :" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Erreur d'Actualisation du Jeton d'Accès" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Aucun jeton de rafraÃŽchissement ou clÊ d'API trouvÊ. Veuillez essayer de vous dÊconnecter et de vous reconnecter." + }, "desktopSyncVerificationTitle": { "message": "VÊrification de la synchronisation avec l'application de bureau" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Erreur de correspondance entre les comptes" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Non-concordance des clÊs biomÊtriques" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Le dÊverrouillage biomÊtrique a ÊchouÊ. La clÊ secrète biomÊtrique n'a pas rÊussi à dÊverrouiller le coffre. Veuillez essayer de configurer à nouveau la biomÊtrie." + }, "biometricsNotEnabledTitle": { "message": "Le dÊverrouillage biomÊtrique n'est pas activÊ" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Le dÊverrouillage biomÊtrique dans le navigateur n’est pas pris en charge sur cet appareil" }, + "biometricsNotUnlockedTitle": { + "message": "Utilisateur verrouillÊ ou dÊconnectÊ" + }, + "biometricsNotUnlockedDesc": { + "message": "Veuillez dÊverrouiller cet utilisateur dans l'application de bureau et rÊessayer." + }, + "biometricsNotAvailableTitle": { + "message": "DÊverrouillage biomÊtrique indisponible" + }, + "biometricsNotAvailableDesc": { + "message": "Le dÊverrouillage biomÊtrique est actuellement indisponible. Veuillez rÊessayer plus tard." + }, "biometricsFailedTitle": { "message": "Le dÊverrouillage biomÊtique a ÊchouÊ\n" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Une politique d'organisation affecte vos options de propriÊtÊ." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Une politique d'organisation a bloquÊ l'import d'ÊlÊments dans votre coffre personel." + }, + "domainsTitle": { + "message": "Domaines", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Domaines exclus" }, "excludedDomainsDesc": { - "message": "Bitwarden ne proposera pas d'enregistrer les informations de connexion pour ces domaines. Vous devez actualiser la page pour que les modifications prennent effet." + "message": "Bitwarden ne demandera pas d'enregistrer les dÊtails de connexion pour ces domaines. Vous devez actualiser la page pour que les modifications prennent effet." + }, + "excludedDomainsDescAlt": { + "message": "Bitwarden ne demandera pas d'enregistrer les dÊtails de connexion pour ces domaines pour tous les comptes connectÊs. Vous devez actualiser la page pour que les modifications prennent effet." + }, + "websiteItemLabel": { + "message": "Site web $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ n'est pas un domaine valide", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Changements de domaines exclus enregistrÊs" + }, + "limitSendViews": { + "message": "Limiter les vues" + }, + "limitSendViewsHint": { + "message": "Personne ne peut voir ce Send une fois la limite atteinte.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ vues restantes", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "DÊtails du Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Rechercher dans les Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Texte" }, + "sendTypeTextToShare": { + "message": "Texte à partager" + }, "sendTypeFile": { "message": "Fichier" }, @@ -1666,6 +2406,9 @@ "message": "Tous les Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Masquer le texte par dÊfaut" + }, "maxAccessCountReached": { "message": "Nombre maximum d'accès atteint", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "ProtÊgÊ par un mot de passe" }, + "copyLink": { + "message": "Copier le lien" + }, "copySendLink": { "message": "Copier le lien du Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Êtes-vous sÃģr de vouloir supprimer ce Send ?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Êtes-vous sÃģr de vouloir supprimer dÊfinitivement ce Send ?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Modifier le Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Le Send sera dÊfinitivement supprimÊ à la date et heure spÊcifiÊes.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Le Send sera dÊfinitivement supprimÊ à la date spÊcifiÊe.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Date d'expiration" }, @@ -1769,6 +2523,10 @@ "message": "Vous pouvez, si vous le souhaitez, exiger un mot de passe pour accÊder à ce Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Ajouter un mot de passe facultatif pour que les destinataires puissent accÊder à ce Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notes privÊes à propos de ce Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1778,7 +2536,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Copier dans le presse-papiers le lien de ce Send lors de l'enregistrement.", + "message": "Copier le lien de ce Send dans le presse-papiers lors de l'enregistrement.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { @@ -1810,10 +2568,54 @@ "message": "Send crÊÊ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send crÊÊ avec succès !", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Le Send sera accessible à toute personne disposant du lien pendant une heure.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Le Send sera accessible à toute personne disposant du lien pendant les prochaines $HOURS$ heures.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Le Send sera accessible à toute personne disposant du lien pendant un jour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Le Send sera accessible à toute personne disposant du lien pendant les prochains $DAYS$ jours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Lien Send copiÊ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send sauvegardÊ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "DÊtacher l'extension ?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Pour crÊer un envoi de fichier Send, vous devez dÊtacher l'extension dans une nouvelle fenÃĒtre.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Pour choisir un fichier, ouvrez l'extension dans la barre latÊrale (si possible) ou ouvrez une nouvelle fenÃĒtre en cliquant sur cette bannière." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Pour choisir un fichier avec Safari, ouvrez une nouvelle fenÃĒtre en cliquant sur cette bannière." }, + "popOut": { + "message": "DÊtacher" + }, "sendFileCalloutHeader": { "message": "Avant de commencer" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Masquer mon adresse Êlectronique aux destinataires." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Une ou plusieurs politiques de sÊcuritÊ de l'organisation affectent vos options Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "VÊrification de courriel requise" }, + "emailVerifiedV2": { + "message": "Courriel vÊrifiÊ" + }, "emailVerificationRequiredDesc": { "message": "Vous devez vÊrifier votre courriel pour utiliser cette fonctionnalitÊ. Vous pouvez vÊrifier votre courriel dans le coffre web." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Votre mot de passe principal ne rÊpond pas aux exigences de politique de sÊcuritÊ de cette organisation. Pour accÊder au coffre, vous devez mettre à jour votre mot de passe principal dès maintenant. En poursuivant, vous serez dÊconnectÊ de votre session actuelle et vous devrez vous reconnecter. Les sessions actives sur d'autres appareils peuver rester actives pendant encore une heure." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Votre organisation a dÊsactivÊ le dÊchiffrement de votre appareil de confiance. Veuillez configurer un mot de passe principal pour accÊder à votre coffre." + }, "resetPasswordPolicyAutoEnroll": { "message": "Inscription automatique" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "SÊlectionnez un dossier..." }, - "ssoCompleteRegistration": { - "message": "Afin de finaliser la connexion avec SSO, veuillez dÊfinir un mot de passe principal pour accÊder et protÊger votre coffre." + "noFoldersFound": { + "message": "Aucun dossier trouvÊ", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Les autorisations de votre organisation ont ÊtÊ mises à jour, vous obligeant à dÊfinir un mot de passe principal.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Votre organisation exige que vous dÊfinissiez un mot de passe principal.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "sur $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "VÊrification requise", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Heures" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Les politiques de sÊcuritÊ de votre organisation ont dÊfini le dÊlai d'expiration de votre coffre à $HOURS$ heure(s) et $MINUTES$ minute(s) maximum.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Les politiques de sÊcuritÊ de votre organisation affectent le dÊlai d'expiration de votre coffre. Le dÊlai autorisÊ d'expiration du coffre est de $HOURS$ heure(s) et $MINUTES$ minute(s) maximum. L'action après dÊlai d'expiration de votre coffre est fixÊe à $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Export du coffre de l'organisation" + }, + "exportingOrganizationVaultDesc": { + "message": "Seul le coffre d'organisation associÊ à $ORGANIZATION$ sera exportÊ. Les ÊlÊments dans les coffres individuels ou d'autres organisations ne seront pas inclus.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Erreur" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "GÊnÊrer un nom d'utilisateur" }, + "generateEmail": { + "message": "GÊnÊrer un courriel" + }, + "generatorBoundariesHint": { + "message": "La valeur doit ÃĒtre comprise entre $MIN$ et $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Type de nom d'utilisateur" }, @@ -2044,11 +2938,121 @@ "message": "Service" }, "forwardedEmail": { - "message": "Alias d'email transfÊrÊ" + "message": "Alias de courriel transfÊrÊ" }, "forwardedEmailDesc": { "message": "GÊnÊrer un alias de courriel avec un service de transfert externe." }, + "forwarderDomainName": { + "message": "Domaine du courriel", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choisissez un domaine qui est supportÊ par le service sÊlectionnÊ", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Erreur $SERVICENAME$ : $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "GÊnÊrÊ par Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Site web : $WEBSITE$. GÊnÊrÊ par Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Jeton API $SERVICENAME$ invalide", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Jeton API $SERVICENAME$ non valide : $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Impossible d'obtenir l'ID du compte de courriel masquÊ $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Domaine de $SERVICENAME$ invalide.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "L'URL $SERVICENAME$ invalide.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Une erreur $SERVICENAME$ inconnue s'est produite.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Émetteur inconnu: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nom d'hôte", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Comment saisir automatiquement" }, "autofillSelectInfoWithCommand": { - "message": "SÊlectionnez un ÊlÊment depuis cette page ou utilisez le raccourci : $COMMAND$", + "message": "SÊlectionnez un ÊlÊment à partir de cet Êcran, utilisez le raccourci $COMMAND$ ou explorez d'autres options dans les paramètres.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "SÊlectionnez un ÊlÊment depuis cette page ou dÊfinissez un raccourci dans les paramètres." + "message": "SÊlectionnez un ÊlÊment à partir de cet Êcran ou explorez d'autres options dans les paramètres." }, "gotIt": { "message": "Compris" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Paramètres de saisie automatique" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Raccourci de saisie automatique" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Modifier le raccourci" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "GÊrer les raccourcis" + }, "autofillShortcut": { "message": "Raccourci clavier de saisie automatique" }, - "autofillShortcutNotSet": { - "message": "Le raccourci de saisie automatique n'est pas dÊfini. Changez-le dans les paramètres du navigateur." + "autofillLoginShortcutNotSet": { + "message": "Le raccourci de saisie automatique de l'identifiant n'est pas configurÊ. Changez-le dans les paramètres du navigateur." }, - "autofillShortcutText": { - "message": "Le raccourci de saisie automatique est : $COMMAND$. Changez-le dans les paramètres du navigateur.", + "autofillLoginShortcutText": { + "message": "Le raccourci de saisie automatique de l'identifiant est $COMMAND$. GÊrez tous les raccourcis dans les paramètres du navigateur.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Connexion sur" - }, "opensInANewWindow": { "message": "S'ouvre dans une nouvelle fenÃĒtre" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Identifiant SSO de l'organisation requis." }, + "creatingAccountOn": { + "message": "CrÊation du compte sur" + }, + "checkYourEmail": { + "message": "VÊrifiez vos courriels" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Suivez le lien dans le courriel envoyÊ à" + }, + "andContinueCreatingYourAccount": { + "message": "et continuer à crÊer votre compte." + }, + "noEmail": { + "message": "Pas de courriel ?" + }, + "goBack": { + "message": "Revenir en arrière" + }, + "toEditYourEmailAddress": { + "message": "pour modifier votre adresse mail." + }, "eu": { "message": "UE", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Accès refusÊ. Vous n'avez pas l'autorisation de voir cette page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Appareil de confiance" }, + "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." + }, + "sendsNoItemsMessage": { + "message": "Utilisez Send pour partager en toute sÊcuritÊ des informations chiffrÊes avec tout le monde.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Saisie requise." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 champ nÊcessite votre attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ champs nÊcessitent votre attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- SÊlectionner --" }, @@ -2404,7 +3449,1379 @@ "message": "Sous-menu" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "DÊplier/Replier", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Importer vos donnÊes dans Bitwarden ?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "ProtÊger vos donnÊes LastPass et importer dans Bitwarden ?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Enregistrer en tant que fichier non chiffrÊ", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importer vers Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importation en cours...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "DonnÊes importÊes avec succès !", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Erreur lors de l'importation. Consultez la console pour plus de dÊtails.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Une erreur rÊseau s'est produite lors de l'importation.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Domaine de l'alias" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Les ÊlÊments pour lesquels le mot de passe principal est redemandÊ ne peuvent pas ÃĒtre remplis automatiquement lors du chargement de la page. La saisie automatique au chargement de la page est dÊsactivÊe.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "La saisie automatique au chargement de la page est configurÊ selon les paramètres par dÊfaut.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "DÊsactivez la resaisie du mot de passe maÃŽtre pour Êditer ce champ", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Basculer la navigation latÊrale" + }, + "skipToContent": { + "message": "AccÊder directement au contenu" + }, + "bitwardenOverlayButton": { + "message": "Bouton menu de saisie automatique Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "(DÊs)activer le menu de saisie automatique de Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Menu de saisie automatique Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "DÊverrouillez votre compte pour afficher les identifiants correspondants", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "DÊverrouillez votre compte pour afficher les suggestions de saisie automatique", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "DÊverrouiller le compte", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "DÊverrouiller votre compte, s'ouvre dans une nouvelle fenÃĒtre", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Remplir les identifiants pour", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Nom d'utilisateur partiel", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Aucun ÊlÊment à afficher", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nouvel ÊlÊment", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Ajouter un nouvel ÊlÊment de coffre", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Nouvel identifiant", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Ajouter un nouvel ÊlÊment de connexion au coffre, s'ouvre dans une nouvelle fenÃĒtre", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Nouvelle carte de paiement", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Ajouter un nouvel ÊlÊment de carte au coffre, s'ouvre dans une nouvelle fenÃĒtre", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Nouvelle identitÊ", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Ajouter un nouvel ÊlÊment d'identitÊ au coffre, s'ouvre dans une nouvelle fenÃĒtre", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Menu de saisie automatique de Bitwarden disponible. Appuyez sur la touche Flèche bas pour sÊlectionner.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Activer" + }, + "ignore": { + "message": "Ignorer" + }, + "importData": { + "message": "Importer des donnÊes", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Erreur lors de l'importation" + }, + "importErrorDesc": { + "message": "Il y a eu un problème avec les donnÊes que vous avez essayÊ d'importer. Veuillez rÊsoudre les erreurs listÊes ci-dessous dans votre fichier source et rÊessayer." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "RÊsolvez les erreurs ci-dessous et rÊessayez." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "DonnÊes importÊes avec succès" + }, + "importSuccessNumberOfItems": { + "message": "Un total de $AMOUNT$ ÊlÊment(s) a ÊtÊ importÊ.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Essayez de nouveau" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "VÊrification requise pour cette action. DÊfinissez un code PIN pour continuer." + }, + "setPin": { + "message": "DÊfinir le code PIN" + }, + "verifyWithBiometrics": { + "message": "VÊrifier par biomÊtrie" + }, + "awaitingConfirmation": { + "message": "En attente de confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Impossible de complÊter la biomÊtrie." + }, + "needADifferentMethod": { + "message": "Besoin d'une mÊthode diffÊrente ?" + }, + "useMasterPassword": { + "message": "Utiliser le mot de passe principal" + }, + "usePin": { + "message": "Utiliser le code PIN" + }, + "useBiometrics": { + "message": "Utiliser la biomÊtrie" + }, + "enterVerificationCodeSentToEmail": { + "message": "Entrez le code de vÊrification qui a ÊtÊ envoyÊ à votre adresse de messagerie." + }, + "resendCode": { + "message": "Renvoyer le code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "Vous importez des donnÊes vers $ORGANIZATION$. Vos donnÊes pourraient ÃĒtre partagÊes avec les membres de cette organisation. Voulez-vous continuer ?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Erreur de connexion avec le service Duo. Utilisez une autre mÊthode de connexion en deux Êtapes ou contactez Duo pour obtenir de l'aide." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Lancez DUO et suivez les Êtapes pour terminer la connexion." + }, + "duoRequiredForAccount": { + "message": "L'authentification à deux facteurs Duo est requise pour votre compte." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Faire apparaÃŽtre l'extension pour terminer la connexion." + }, + "popoutExtension": { + "message": "DÊtacher l'extension" + }, + "launchDuo": { + "message": "Lancer DUO" + }, + "importFormatError": { + "message": "Les donnÊes ne sont pas formatÊes correctement. Veuillez vÊrifier votre fichier d'origine et rÊessayer." + }, + "importNothingError": { + "message": "Rien n'a ÊtÊ importÊ." + }, + "importEncKeyError": { + "message": "Erreur lors du dÊchiffrement du fichier exportÊ. Votre clÊ de chiffrement ne correspond pas à la clÊ utilisÊe pour exporter les donnÊes." + }, + "invalidFilePassword": { + "message": "Mot de passe du fichier incorrect, veuillez utiliser le mot de passe saisi lors de l'exportation du fichier." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "En savoir plus sur vos options d'importation" + }, + "selectImportFolder": { + "message": "Choisir un dossier" + }, + "selectImportCollection": { + "message": "SÊlectionner une collection" + }, + "importTargetHint": { + "message": "SÊlectionnez cette option si vous voulez que le contenu du fichier importÊ soit dÊplacÊ vers un(e) $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Le fichier contient des ÊlÊments non assignÊs." + }, + "selectFormat": { + "message": "SÊlectionnez le format du fichier d'import" + }, + "selectImportFile": { + "message": "SÊlectionnez le fichier d'import" + }, + "chooseFile": { + "message": "Choisir le fichier" + }, + "noFileChosen": { + "message": "Aucun fichier choisi" + }, + "orCopyPasteFileContents": { + "message": "ou copiez/collez les contenus du fichier d'importation" + }, + "instructionsFor": { + "message": "Instructions $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirmez l'import du coffre" + }, + "confirmVaultImportDesc": { + "message": "Ce fichier est protÊgÊ par mot de passe. Veuillez entrer le mot de passe du fichier pour importer des donnÊes." + }, + "confirmFilePassword": { + "message": "Confirmez le mot de passe du fichier" + }, + "exportSuccess": { + "message": "DonnÊes du coffre exportÊes" + }, + "typePasskey": { + "message": "ClÊ d'identification (passkey)" + }, + "accessing": { + "message": "Accès en cours" + }, + "passkeyNotCopied": { + "message": "La clÊ d'identification (passkey) ne sera pas copiÊe" + }, + "passkeyNotCopiedAlert": { + "message": "La clÊ d'identification (passkey) ne sera pas copiÊe dans l'ÊlÊment clonÊ. Voulez-vous continuer à cloner cet ÊlÊment ?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "VÊrification requise par le site initiateur. Cette fonctionnalitÊ n'est pas encore implÊmentÊe pour les comptes sans mot de passe principal." + }, + "logInWithPasskeyQuestion": { + "message": "Se connecter avec une clÊ d'accès ?" + }, + "passkeyAlreadyExists": { + "message": "Une clÊ d'identification (passkey) existe dÊjà pour cette application." + }, + "noPasskeysFoundForThisApplication": { + "message": "Aucune clÊ d'identification (passkey) trouvÊe pour cette application." + }, + "noMatchingPasskeyLogin": { + "message": "Vous n'avez pas d'identifiant correspondant à ce site." + }, + "noMatchingLoginsForSite": { + "message": "Aucun identifiant correspondant pour ce site" + }, + "searchSavePasskeyNewLogin": { + "message": "Rechercher ou enregistrer la clÊ d'accès comme nouvel identifiant" + }, + "confirm": { + "message": "Confirmer" + }, + "savePasskey": { + "message": "Enregistrer la clÊ d'identification (passkey)" + }, + "savePasskeyNewLogin": { + "message": "Enregistrer la clÊ d'identification (passkey) comme nouvel identifiant" + }, + "chooseCipherForPasskeySave": { + "message": "Choisissez un identifiant ou enregistrer cette clÊ d'accès" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choisissez une clÊ d'accès pour vous connecter" + }, + "passkeyItem": { + "message": "ÉlÊment clÊ d'identification (passkey)" + }, + "overwritePasskey": { + "message": "Écraser la clÊ d'identification (passkey) ?" + }, + "overwritePasskeyAlert": { + "message": "Cet ÊlÊment contient dÊjà une clÊ d'identification (passkey). Êtes-vous sÃģr de vouloir Êcraser la clÊ d'identification (passkey) actuelle ?" + }, + "featureNotSupported": { + "message": "FonctionnalitÊ non supportÊe" + }, + "yourPasskeyIsLocked": { + "message": "Authentification requise pour utiliser une clÊ d'identification (passkey). VÊrifiez votre identitÊ pour continuer." + }, + "multifactorAuthenticationCancelled": { + "message": "Authentification multi-facteurs annulÊe" + }, + "noLastPassDataFound": { + "message": "Aucune donnÊe LastPass trouvÊe" + }, + "incorrectUsernameOrPassword": { + "message": "Nom d'utilisateur ou mot de passe incorrect" + }, + "incorrectPassword": { + "message": "Mot de passe incorrect" + }, + "incorrectCode": { + "message": "Code incorrect" + }, + "incorrectPin": { + "message": "Code PIN incorrect" + }, + "multifactorAuthenticationFailed": { + "message": "Authentification multifacteur ÊchouÊe" + }, + "includeSharedFolders": { + "message": "Inclure les dossiers partagÊs" + }, + "lastPassEmail": { + "message": "Courriel LastPass" + }, + "importingYourAccount": { + "message": "Importation de votre compte..." + }, + "lastPassMFARequired": { + "message": "Authentification multi-facteurs LastPass requise" + }, + "lastPassMFADesc": { + "message": "Entrez votre code d'accès unique depuis votre application d'authentification" + }, + "lastPassOOBDesc": { + "message": "Approuvez la demande de connexion dans votre application d'authentification ou saisissez le code d'accès à usage unique." + }, + "passcode": { + "message": "Code d'accès" + }, + "lastPassMasterPassword": { + "message": "Mot de passe principal LastPass" + }, + "lastPassAuthRequired": { + "message": "Authentification LastPass requise" + }, + "awaitingSSO": { + "message": "En attente de l'authentification SSO" + }, + "awaitingSSODesc": { + "message": "Veuillez continuer à vous connecter en utilisant les identifiants de votre entreprise." + }, + "seeDetailedInstructions": { + "message": "Consultez les instructions dÊtaillÊes sur notre site d'aide à", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importer directement de LastPass" + }, + "importFromCSV": { + "message": "Importer depuis un fichier CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Essayez à nouveau ou cherchez un courriel de LastPass pour vÊrifier que c'est vous." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "InsÊrez la YubiKey associÊe à votre compte LastPass dans le port USB de votre ordinateur, puis appuyez sur son bouton." + }, + "switchAccount": { + "message": "Basculer le compte" + }, + "switchAccounts": { + "message": "Basculer les comptes" + }, + "switchToAccount": { + "message": "Basculer vers le compte" + }, + "activeAccount": { + "message": "Compte actif" + }, + "availableAccounts": { + "message": "Comptes disponibles" + }, + "accountLimitReached": { + "message": "Limite du compte atteinte. DÊconnectez-vous d'un compte pour en ajouter un autre." + }, + "active": { + "message": "actif" + }, + "locked": { + "message": "verrouillÊ" + }, + "unlocked": { + "message": "dÊverrouillÊ" + }, + "server": { + "message": "serveur" + }, + "hostedAt": { + "message": "hÊbergÊ sur" + }, + "useDeviceOrHardwareKey": { + "message": "Utilisez votre appareil ou votre clÊ matÊrielle" + }, + "justOnce": { + "message": "Une seule fois" + }, + "alwaysForThisSite": { + "message": "Toujours pour ce site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ a ÊtÊ ajoutÊ à la liste des domaines exclus.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Formats communs", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continuer vers les paramètres du navigateur ?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continuer vers le centre d'aide ?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Modifiez les paramètres de saisie automatique et de gestion des mots de passe de votre navigateur.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "Vous pouvez afficher et dÊfinir les raccourcis d'extension dans les paramètres de votre navigateur.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Modifiez les paramètres de saisie automatique et de gestion des mots de passe de votre navigateur.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "Vous pouvez afficher et dÊfinir les raccourcis d'extension dans les paramètres de votre navigateur.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Faire de Bitwarden votre gestionnaire de mots de passe par dÊfaut ?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignorer cette option peut causer des conflits entre le menu de saisie automatique de Bitwarden et celui de votre navigateur.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Faire de Bitwarden votre gestionnaire de mots de passe par dÊfaut", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Impossible de dÊfinir Bitwarden comme gestionnaire de mots de passe par dÊfaut", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Vous devez accorder les permissions de confidentialitÊ du navigateur à Bitwarden pour le dÊfinir comme gestionnaire de mots de passe par dÊfaut.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "DÊfinir par dÊfaut", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Identifiants enregistrÊs avec succès !", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Mot de passe enregistrÊ !", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Identifiants mis à jour avec succès !", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Mot de passe mis à jour !", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Erreur lors de l'enregistrement des identifiants. Consultez la console pour plus de dÊtails.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Succès" + }, + "removePasskey": { + "message": "Retirer la clÊ d'identification (passkey)" + }, + "passkeyRemoved": { + "message": "ClÊ d'identification (passkey) retirÊe" + }, + "autofillSuggestions": { + "message": "Suggestions de saisie automatique" + }, + "autofillSuggestionsTip": { + "message": "Enregistrez un ÊlÊment de connexion à remplir automatiquement pour ce site" + }, + "yourVaultIsEmpty": { + "message": "Votre coffre-fort est vide" + }, + "noItemsMatchSearch": { + "message": "Aucun ÊlÊment ne correspond à votre recherche" + }, + "clearFiltersOrTryAnother": { + "message": "Effacer les filtres ou essayer un autre terme de recherche" + }, + "copyInfoTitle": { + "message": "Copier les informations - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copier la note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Plus d'options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Plus d'options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Voir l'ÊlÊment - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Saisie automatique - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Aucune valeur à copier" + }, + "assignToCollections": { + "message": "Assigner aux collections" + }, + "copyEmail": { + "message": "Copier l'email" + }, + "copyPhone": { + "message": "Copier le numÊro de tÊlÊphone" + }, + "copyAddress": { + "message": "Copier l'adresse" + }, + "adminConsole": { + "message": "Console Admin" + }, + "accountSecurity": { + "message": "SÊcuritÊ du compte" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Apparence" + }, + "errorAssigningTargetCollection": { + "message": "Erreur lors de l'assignation de la collection cible." + }, + "errorAssigningTargetFolder": { + "message": "Erreur lors de l'assignation du dossier cible." + }, + "viewItemsIn": { + "message": "Voir les ÊlÊments dans $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Retour à $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nouveau" + }, + "removeItem": { + "message": "Retirer $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "ElÊments sans dossier" + }, + "itemDetails": { + "message": "DÊtails de l'ÊlÊment" + }, + "itemName": { + "message": "Nom de l’ÊlÊment" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "L'organisation est dÊsactivÊe" + }, + "owner": { + "message": "PropriÊtaire" + }, + "selfOwnershipLabel": { + "message": "Vous", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Les ÊlÊments des Organisations dÊsactivÊes ne sont pas accessibles. Contactez le propriÊtaire de votre Organisation pour obtenir de l'aide." + }, + "additionalInformation": { + "message": "Informations supplÊmentaires" + }, + "itemHistory": { + "message": "Historique de l'ÊlÊment" + }, + "lastEdited": { + "message": "Dernière modification" + }, + "ownerYou": { + "message": "PropriÊtaire : Vous" + }, + "linked": { + "message": "LiÊ" + }, + "copySuccessful": { + "message": "CopiÊ avec succès" + }, + "upload": { + "message": "TÊlÊverser" + }, + "addAttachment": { + "message": "Ajouter une pièce jointe" + }, + "maxFileSizeSansPunctuation": { + "message": "La taille maximale du fichier est de 500 Mo" + }, + "deleteAttachmentName": { + "message": "Supprimer la pièce jointe $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "TÊlÊcharger $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Êtes-vous sÃģr de vouloir supprimer dÊfinitivement cette pièce jointe ?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Les organisations gratuites ne peuvent pas utiliser de pièces jointes" + }, + "filters": { + "message": "Filtres" + }, + "personalDetails": { + "message": "DonnÊes personnelles" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Informations de contact" + }, + "downloadAttachment": { + "message": "TÊlÊcharger - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "numÊro de la carte se termine par", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Identifiants de connexion" + }, + "authenticatorKey": { + "message": "ClÊ d'authentification" + }, + "autofillOptions": { + "message": "Options de saisie automatique" + }, + "websiteUri": { + "message": "Site web (URI)" + }, + "websiteUriCount": { + "message": "Site web (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Site web ajoutÊ" + }, + "addWebsite": { + "message": "Ajouter le site web" + }, + "deleteWebsite": { + "message": "Supprimer le site web" + }, + "defaultLabel": { + "message": "Par dÊfaut ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Saisir automatiquement lors du chargement de la page ?" + }, + "cardExpiredTitle": { + "message": "Carte de paiement expirÊe" + }, + "cardExpiredMessage": { + "message": "Si vous l'avez renouvelÊe, mettez à jour les informations de la carte de paiement" + }, + "cardDetails": { + "message": "DÊtails de la carte de paiement" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Activer les animations" + }, + "showAnimations": { + "message": "Afficher les animations" + }, + "addAccount": { + "message": "Ajouter un compte" + }, + "loading": { + "message": "Chargement" + }, + "data": { + "message": "DonnÊes" + }, + "passkeys": { + "message": "ClÊs d'accès", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Mots de passe", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Se connecter avec une clÊ d'accès", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assigner" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Seuls les membres de l'organisation ayant accès à ces collections pourront voir l'ÊlÊment." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Seuls les membres de l'organisation ayant accès à ces collections pourront voir les ÊlÊments." + }, + "bulkCollectionAssignmentWarning": { + "message": "Vous avez sÊlectionnÊ $TOTAL_COUNT$ ÊlÊments. Vous ne pouvez pas mettre à jour $READONLY_COUNT$ de ces ÊlÊments parce que vous n'avez pas les autorisations pour les Êditer.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Ajouter un champ" + }, + "add": { + "message": "Ajouter" + }, + "fieldType": { + "message": "Type du champ" + }, + "fieldLabel": { + "message": "IntitulÊ du champ" + }, + "textHelpText": { + "message": "Utiliser des champs de texte pour les donnÊes telles que les questions de sÊcuritÊ" + }, + "hiddenHelpText": { + "message": "Utiliser des champs cachÊs pour des donnÊes sensibles telles qu'un mot de passe" + }, + "checkBoxHelpText": { + "message": "Utilisez les cases à cocher si vous souhaitez saisir automatiquement la case à cocher d'un formulaire, tel qu'un courriel de rappel" + }, + "linkedHelpText": { + "message": "Utilisez un champ liÊ lorsque vous rencontrez des problèmes de saisie automatique pour un site Web spÊcifique." + }, + "linkedLabelHelpText": { + "message": "Entrez l'identifiant html, le nom, l'Êtiquette aria ou l'espace rÊservÊ du champ." + }, + "editField": { + "message": "Éditer le champ" + }, + "editFieldLabel": { + "message": "Éditer $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Supprimer $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ ajoutÊ", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "RÊorganiser $LABEL$. Utilisez les flèches de votre clavier pour dÊplacer l'ÊlÊment vers le haut ou vers le bas.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "SÊlectionnez les collections à assigner" + }, + "personalItemTransferWarningSingular": { + "message": "1 ÊlÊment sera transfÊrÊ dÊfinitivement à l'organisation sÊlectionnÊe. Vous ne serez plus le propriÊtaire de cet ÊlÊment." + }, + "personalItemsTransferWarningPlural": { + "message": "Les ÊlÊments $PERSONAL_ITEMS_COUNT$ seront transfÊrÊs de façon permanente à l'organisation sÊlectionnÊe. Vous ne serez plus le propriÊtaire de ces ÊlÊments.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 ÊlÊment sera transfÊrÊ dÊfinitivement à $ORG$. Vous ne serez plus le propriÊtaire de cet ÊlÊment.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "Les ÊlÊments $PERSONAL_ITEMS_COUNT$ seront transfÊrÊs à $ORG$ de façon permanente. Vous ne serez plus propriÊtaire de ces ÊlÊments.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Collections assignÊes avec succès" + }, + "nothingSelected": { + "message": "Vous n'avez rien sÊlectionnÊ." + }, + "movedItemsToOrg": { + "message": "Les ÊlÊments sÊlectionnÊs ont ÊtÊ dÊplacÊs vers $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "ÉlÊments dÊplacÊs vers $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "ÉlÊment dÊplacÊ vers $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Emplacement de l'ÊlÊment" + }, + "fileSend": { + "message": "Send en fichier" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Send en texte" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden a un nouveau look !" + }, + "bitwardenNewLookDesc": { + "message": "Il est plus facile et plus intuitif que jamais de remplir automatiquement les champs et d'effectuer des recherches à partir de l'onglet \"Coffre\". Jetez un coup d'œil !" + }, + "accountActions": { + "message": "Actions du compte" + }, + "showNumberOfAutofillSuggestions": { + "message": "Afficher le nombre de suggestions de saisie automatique d'identifiant sur l'icône d'extension" + }, + "systemDefault": { + "message": "Par dÊfaut" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Les exigences de la politique d'entreprise ont ÊtÊ appliquÊes à ce paramètre" + }, + "sshPrivateKey": { + "message": "ClÊ privÊe" + }, + "sshPublicKey": { + "message": "ClÊ publique" + }, + "sshFingerprint": { + "message": "Empreinte digitale" + }, + "sshKeyAlgorithm": { + "message": "Type de clÊ" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-bits" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-bits" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-bits" + }, + "retry": { + "message": "RÊessayer" + }, + "vaultCustomTimeoutMinimum": { + "message": "Le dÊlai d'expiration personnalisÊ minimum est de 1 minute." + }, + "additionalContentAvailable": { + "message": "Du contenu supplÊmentaire est disponible" + }, + "fileSavedToDevice": { + "message": "Fichier enregistrÊ sur l'appareil. GÊrez à partir des tÊlÊchargements de votre appareil." + }, + "showCharacterCount": { + "message": "Afficher le nombre de caractères" + }, + "hideCharacterCount": { + "message": "Cacher le nombre de caractères" + }, + "itemsInTrash": { + "message": "ÉlÊments dans la corbeille" + }, + "noItemsInTrash": { + "message": "Aucun ÊlÊment dans la corbeille" + }, + "noItemsInTrashDesc": { + "message": "Les ÊlÊments que vous supprimez apparaÃŽtront ici et seront dÊfinitivement supprimÊs au bout de 30 jours" + }, + "trashWarning": { + "message": "Les ÊlÊments qui se trouvent dans la corbeille depuis plus de 30 jours sont automatiquement supprimÊs" + }, + "restore": { + "message": "Restaurer" + }, + "deleteForever": { + "message": "Supprimer dÊfinitivement" + }, + "noEditPermissions": { + "message": "Vous n'ÃĒtes pas autorisÊ à modifier cet ÊlÊment" + }, + "authenticating": { + "message": "Authentification" + }, + "fillGeneratedPassword": { + "message": "Remplir le mot de passe gÊnÊrÊ", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Mot de passe rÊgÊnÊrÊ", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Enregistrer l'identifiant sur Bitwarden ?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Espace", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Accent grave", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Point d'exclamation", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "Signe arobase", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Signe dièse", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Signe dollar", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Signe pourcentage", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Accent circonflexe", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Esperluette", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "AstÊrisque", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Parenthèse ouvrante", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Parenthèse fermante", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Tiret bas", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Trait d'union", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Egal à", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Accolade ouvrante", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Accolade fermante", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Crochet ouvrante", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Crochet fermante", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Barre", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Barre oblique inverse", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Deux-points", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Point-virgule", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Guillemets doubles", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Guillemets simples", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "InfÊrieure à", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "SupÊrieur à", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Virgule", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Point", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Point d'interrogation", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Barre oblique", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Minuscule" + }, + "uppercaseAriaLabel": { + "message": "Majuscule" + }, + "generatedPassword": { + "message": "Mot de passe gÊnÊrÊ" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index bf1eedd8261..c128b556bdb 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -3,364 +3,670 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden - Xestor de contrasinais", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "Na casa, no traballo ou en ruta, Bitwarden protexe os teus contrasinais, chaves de acceso e datos sensíbeis", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "Log in or create a new account to access your secure vault." + "message": "Rexístrate ou crea unha nova conta para acceder ÃĄ tÃēa caixa forte." + }, + "inviteAccepted": { + "message": "Invitation accepted" }, "createAccount": { - "message": "Create account" + "message": "Crea unha conta" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { - "message": "Enterprise single sign-on" + "message": "Inicio de sesiÃŗn Ãēnico empresarial" }, "cancel": { - "message": "Cancel" + "message": "Cancelar" }, "close": { - "message": "Close" + "message": "Pechar" }, "submit": { - "message": "Submit" + "message": "Enviar" }, "emailAddress": { - "message": "Email address" + "message": "Enderezo de correo electrÃŗnico" }, "masterPass": { - "message": "Master password" + "message": "Contrasinal mestre" }, "masterPassDesc": { - "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." + "message": "O contrasinal mestre Ê a chave que empregas para acceder ÃĄ tÃēa caixa forte. É moi importante que non esquezas o teu contrasinal mestre. Non hai xeito de recuperala se a esqueces." }, "masterPassHintDesc": { - "message": "A master password hint can help you remember your password if you forget it." + "message": "Unha pista do contrasinal mestre pode axudarte a lembrar o teu contrasinal se o esqueces." + }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } }, "reTypeMasterPass": { - "message": "Re-type master password" + "message": "Reescriba o contrasinal mestre" }, "masterPassHint": { - "message": "Master password hint (optional)" + "message": "Pista do contrasinal mestre (opcional)" + }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." }, "tab": { - "message": "Tab" + "message": "Separador" }, "vault": { - "message": "Vault" + "message": "Caixa forte" }, "myVault": { - "message": "My vault" + "message": "A miÃąa caixa forte" }, "allVaults": { - "message": "All vaults" + "message": "Todas as caixas fortes" }, "tools": { - "message": "Tools" + "message": "Ferramentas" }, "settings": { - "message": "Settings" + "message": "Axustes" }, "currentTab": { - "message": "Current tab" + "message": "Separador actual" }, "copyPassword": { - "message": "Copy password" + "message": "Copiar contrasinal" + }, + "copyPassphrase": { + "message": "Copy passphrase" }, "copyNote": { - "message": "Copy note" + "message": "Copiar nota" }, "copyUri": { - "message": "Copy URI" + "message": "Copiar URI" }, "copyUsername": { - "message": "Copy username" + "message": "Copiar nome de usuario" }, "copyNumber": { - "message": "Copy number" + "message": "Copiar nÃēmero" }, "copySecurityCode": { - "message": "Copy security code" + "message": "Copiar cÃŗdigo de seguranza" + }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { - "message": "Auto-fill" + "message": "Auto-encher" + }, + "autoFillLogin": { + "message": "Encher automaticamente inicio de sesiÃŗn" + }, + "autoFillCard": { + "message": "Encher automaticamente tarxeta" + }, + "autoFillIdentity": { + "message": "Encher automaticamente identidade" }, "generatePasswordCopied": { - "message": "Generate password (copied)" + "message": "Xerar contrasinal (copiado)" }, "copyElementIdentifier": { - "message": "Copy custom field name" + "message": "Copiar nome de campo personalizado" }, "noMatchingLogins": { - "message": "No matching logins" + "message": "Sen inicios de sesiÃŗn coincidentes" + }, + "noCards": { + "message": "Sen tarxetas" + }, + "noIdentities": { + "message": "Sen identidades" + }, + "addLoginMenu": { + "message": "Engadir inicio de sesiÃŗn" + }, + "addCardMenu": { + "message": "Engadir tarxeta" + }, + "addIdentityMenu": { + "message": "Engadir identidade" }, "unlockVaultMenu": { - "message": "Unlock your vault" + "message": "Desbloquear a sÃēa caixa forte" }, "loginToVaultMenu": { - "message": "Log in to your vault" + "message": "Rexistrarse na sÃēa caixa forte" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "Non hai inicios de sesiÃŗn dispoÃąÃ­beis para encher automaticamente para o separador actual do navegador." }, "addLogin": { - "message": "Add a login" + "message": "Engadir inicio de sesiÃŗn" }, "addItem": { - "message": "Add item" + "message": "Engadir elemento" + }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" }, "passwordHint": { - "message": "Password hint" + "message": "Pista do contrasinal" }, "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." + "message": "Introduce a direcciÃŗn de correo da tÃēa conta para recibir a pista do contrasinal mestre." }, "getMasterPasswordHint": { - "message": "Get master password hint" + "message": "Obter pista do contrasinal mestre" }, "continue": { - "message": "Continue" + "message": "Continuar" }, "sendVerificationCode": { - "message": "Send a verification code to your email" + "message": "Envía un cÃŗdigo de verificaciÃŗn ao teu correo" }, "sendCode": { - "message": "Send code" + "message": "Enviar cÃŗdigo" }, "codeSent": { - "message": "Code sent" + "message": "CÃŗdigo enviado" }, "verificationCode": { - "message": "Verification code" + "message": "CÃŗdigo de verificaciÃŗn" }, "confirmIdentity": { - "message": "Confirm your identity to continue." - }, - "account": { - "message": "Account" + "message": "Confirma a tÃēa identidade para continuar." }, "changeMasterPassword": { - "message": "Change master password" + "message": "Cambiar o contrasinal mestre" + }, + "continueToWebApp": { + "message": "Continuar ÃĄ aplicaciÃŗn web?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Podes cambiar o teu contrasinal mestre na aplicaciÃŗn web de Bitwarden." }, "fingerprintPhrase": { - "message": "Fingerprint phrase", + "message": "Frase de pegada dactilar", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "Your account's fingerprint phrase", + "message": "Frase de pegada dactilar da tÃēa conta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "Two-step login" + "message": "AutenticaciÃŗn en dous pasos" }, "logOut": { - "message": "Log out" + "message": "Pechar sesiÃŗn" + }, + "aboutBitwarden": { + "message": "About Bitwarden" }, "about": { - "message": "About" + "message": "Acerca de" + }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." }, "version": { - "message": "Version" + "message": "VersiÃŗn" }, "save": { - "message": "Save" + "message": "Gardar" }, "move": { - "message": "Move" + "message": "Mover" }, "addFolder": { - "message": "Add folder" + "message": "Engadir cartafol" }, "name": { - "message": "Name" + "message": "Nome" }, "editFolder": { - "message": "Edit folder" + "message": "Editar cartafol" + }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" }, "deleteFolder": { - "message": "Delete folder" + "message": "Eliminar cartafol" }, "folders": { - "message": "Folders" + "message": "Cartafois" }, "noFolders": { - "message": "There are no folders to list." + "message": "Non hai cartafois que listar." }, "helpFeedback": { - "message": "Help & feedback" + "message": "Axuda e comentarios" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "Centro de axuda de Bitwarden" }, "communityForums": { - "message": "Explore Bitwarden community forums" + "message": "Explorar os foros da comunidade de Bitwarden" }, "contactSupport": { - "message": "Contact Bitwarden support" + "message": "Contactar co soporte de Bitwarden" }, "sync": { - "message": "Sync" + "message": "Sincronizar" }, "syncVaultNow": { - "message": "Sync vault now" + "message": "Sincronizar caixa forte agora" }, "lastSync": { - "message": "Last sync:" + "message": "Última sincronizaciÃŗn:" }, "passGen": { - "message": "Password generator" + "message": "Xerador de contrasinais" }, "generator": { - "message": "Generator", - "description": "Short for 'Password Generator'." + "message": "Xerador", + "description": "Short for 'credential generator'." }, "passGenInfo": { - "message": "Automatically generate strong, unique passwords for your logins." + "message": "Xera automaticamente contrasinais fortes e Ãēnicos para os seus inicios de sesiÃŗn." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { - "message": "Import items" + "message": "Importar elementos" }, "select": { - "message": "Select" + "message": "Seleccionar" }, "generatePassword": { - "message": "Generate password" + "message": "Xerar contrasinal" + }, + "generatePassphrase": { + "message": "Generate passphrase" }, "regeneratePassword": { - "message": "Regenerate password" + "message": "Volver xerar contrasinal" }, "options": { - "message": "Options" + "message": "OpciÃŗns" }, "length": { - "message": "Length" + "message": "Lonxitude" + }, + "passwordMinLength": { + "message": "Lonxitude mínima do contrasinal" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "MaiÃēsculas (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "MinÃēsculas (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "NÃēmeros (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { - "message": "Number of words" + "message": "NÃēmero de palabras" }, "wordSeparator": { - "message": "Word separator" + "message": "Separador de palabras" }, "capitalize": { - "message": "Capitalize", + "message": "Facer a primeira letra da palabra maiÃēscula", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include number" + "message": "Incluír nÃēmero" }, "minNumbers": { - "message": "Minimum numbers" + "message": "Mínimo de nÃēmeros" }, "minSpecial": { - "message": "Minimum special" + "message": "Mínimo de caracteres especiais" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Evitar caracteres ambiguos", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { - "message": "Search vault" + "message": "Buscar na caixa forte" }, "edit": { - "message": "Edit" + "message": "Editar" }, "view": { - "message": "View" + "message": "Ver" }, "noItemsInList": { - "message": "There are no items to list." + "message": "Non hai elementos que listar." }, "itemInformation": { - "message": "Item information" + "message": "InformaciÃŗn do elemento" }, "username": { - "message": "Username" + "message": "Nome de usuario" }, "password": { - "message": "Password" + "message": "Contrasinal" + }, + "totp": { + "message": "Secreto de autenticador" }, "passphrase": { - "message": "Passphrase" + "message": "Frase de contrasinal" }, "favorite": { - "message": "Favorite" + "message": "Favorito" + }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" }, "notes": { - "message": "Notes" + "message": "Notas" + }, + "privateNote": { + "message": "Private note" }, "note": { - "message": "Note" + "message": "Nota" }, "editItem": { - "message": "Edit item" + "message": "Editar elemento" }, "folder": { - "message": "Folder" + "message": "Cartafol" }, "deleteItem": { - "message": "Delete item" + "message": "Eliminar elemento" }, "viewItem": { - "message": "View item" + "message": "Ver elemento" }, "launch": { - "message": "Launch" + "message": "Iniciar" + }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } }, "website": { - "message": "Website" + "message": "Sitio web" }, "toggleVisibility": { - "message": "Toggle visibility" + "message": "Alternar visibilidade" }, "manage": { - "message": "Manage" + "message": "Xestionar" }, "other": { - "message": "Other" + "message": "Outro" + }, + "unlockMethods": { + "message": "OpciÃŗns de desbloqueo" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Configura un mÊtodo de desbloqueo para cambiar a tÃēa acciÃŗn de peche de sesiÃŗn da caixa forte." + }, + "unlockMethodNeeded": { + "message": "Configura un mÊtodo de desbloqueo nos axustes" + }, + "sessionTimeoutHeader": { + "message": "Tempo de sesiÃŗn esgotado" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Outras opciÃŗns" }, "rateExtension": { - "message": "Rate the extension" + "message": "Valorar a extensiÃŗn" }, "rateExtensionDesc": { - "message": "Please consider helping us out with a good review!" + "message": "Por favor, considera axudarnos cunha boa recensiÃŗn!" }, "browserNotSupportClipboard": { - "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + "message": "O teu navegador web non soporta copia doada ao portapapeis. CÃŗpiao manualmente no seu lugar." }, "verifyIdentity": { - "message": "Verify identity" + "message": "Verificar identidade" }, "yourVaultIsLocked": { - "message": "Your vault is locked. Verify your identity to continue." + "message": "A tÃēa caixa forte estÃĄ bloqueada. Verifica a tÃēa identidade para continuar." + }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" }, "unlock": { - "message": "Unlock" + "message": "Desbloquear" }, "loggedInAsOn": { - "message": "Logged in as $EMAIL$ on $HOSTNAME$.", + "message": "Conectado coma $EMAIL$ en $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -373,76 +679,94 @@ } }, "invalidMasterPassword": { - "message": "Invalid master password" + "message": "Contrasinal mestre non vÃĄlido" }, "vaultTimeout": { - "message": "Vault timeout" + "message": "Tempo de espera da caixa forte" + }, + "vaultTimeout1": { + "message": "Timeout" }, "lockNow": { - "message": "Lock now" + "message": "Bloquear agora" + }, + "lockAll": { + "message": "Bloquear todo" }, "immediately": { - "message": "Immediately" + "message": "Inmediatamente" }, "tenSeconds": { - "message": "10 seconds" + "message": "10 segundos" }, "twentySeconds": { - "message": "20 seconds" + "message": "20 segundos" }, "thirtySeconds": { - "message": "30 seconds" + "message": "30 segundos" }, "oneMinute": { - "message": "1 minute" + "message": "1 minuto" }, "twoMinutes": { - "message": "2 minutes" + "message": "2 minutos" }, "fiveMinutes": { - "message": "5 minutes" + "message": "5 minutos" }, "fifteenMinutes": { - "message": "15 minutes" + "message": "15 minutos" }, "thirtyMinutes": { - "message": "30 minutes" + "message": "30 minutos" }, "oneHour": { - "message": "1 hour" + "message": "1 hora" }, "fourHours": { - "message": "4 hours" + "message": "4 horas" }, "onLocked": { - "message": "On system lock" + "message": "Ao bloquear o sistema" }, "onRestart": { - "message": "On browser restart" + "message": "Ao reiniciar o navegador" }, "never": { - "message": "Never" + "message": "Nunca" }, "security": { - "message": "Security" + "message": "Seguridade" + }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" }, "errorOccurred": { - "message": "An error has occurred" + "message": "Produciuse un erro" }, "emailRequired": { - "message": "Email address is required." + "message": "É preciso un enderezo de correo electrÃŗnico." }, "invalidEmail": { - "message": "Invalid email address." + "message": "Enderezo de correo electrÃŗnico non vÃĄlido." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "É preciso o contrasinal mestre." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "É preciso volver escribir o contrasinal mestre." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "O contrasinal mestre debe ter polo menos $VALUE$ caracteres de lonxitude.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -452,22 +776,37 @@ } }, "masterPassDoesntMatch": { - "message": "Master password confirmation does not match." + "message": "A confirmaciÃŗn de contrasinal mestre non coincide." }, "newAccountCreated": { - "message": "Your new account has been created! You may now log in." + "message": "A tÃēa nova conta foi creada! Podes iniciar sesiÃŗn agora." + }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "Iniciaches sesiÃŗn correctamente" + }, + "youMayCloseThisWindow": { + "message": "Podes pechar estÃĄ ventÃĄ" }, "masterPassSent": { - "message": "We've sent you an email with your master password hint." + "message": "EnviÃĄmoste un correo electrÃŗnico coa tÃēa pista de contrasinal mestre." }, "verificationCodeRequired": { - "message": "Verification code is required." + "message": "É preciso cÃŗdigo de verificaciÃŗn." + }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "CÃŗdigo de verificaciÃŗn non vÃĄlido" }, "valueCopied": { - "message": "$VALUE$ copied", + "message": "$VALUE$ copiado", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -477,64 +816,109 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Incapaz de encher automaticamente o elemento seleccionado nesta pÃĄxina. Copia e pega a informaciÃŗn no seu lugar." + }, + "totpCaptureError": { + "message": "Incapaz escanear o cÃŗdigo QR da pÃĄxina web actual" + }, + "totpCaptureSuccess": { + "message": "Clave de autenticaciÃŗn engadida" + }, + "totpCapture": { + "message": "Escanea o cÃŗdigo QR autenticador da pÃĄxina web actual" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copiar clave de autenticaciÃŗn (TOTP)" }, "loggedOut": { - "message": "Logged out" + "message": "SesiÃŗn pechada" + }, + "loggedOutDesc": { + "message": "You have been logged out of your account." }, "loginExpired": { - "message": "Your login session has expired." + "message": "A tÃēa sesiÃŗn caducou." + }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, "yes": { - "message": "Yes" + "message": "Si" }, "no": { - "message": "No" + "message": "Non" }, "unexpectedError": { - "message": "An unexpected error has occurred." + "message": "Produciuse un erro inesperado." }, "nameRequired": { - "message": "Name is required." + "message": "Requírese o nome." }, "addedFolder": { - "message": "Folder added" - }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Cartafol engadido" }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { - "message": "Folder saved" + "message": "Cartafol gardado" }, "deleteFolderConfirmation": { - "message": "Are you sure you want to delete this folder?" + "message": "EstÃĄs seguro de que queres eliminar este cartafol?" }, "deletedFolder": { - "message": "Folder deleted" + "message": "Cartafol eliminado" }, "gettingStartedTutorial": { - "message": "Getting started tutorial" + "message": "Tutorial introdutivo" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." }, "syncingComplete": { - "message": "Syncing complete" + "message": "SincronizaciÃŗn completa" }, "syncingFailed": { - "message": "Syncing failed" + "message": "SincronizaciÃŗn fallida" }, "passwordCopied": { - "message": "Password copied" + "message": "Contrasinal copiado" }, "uri": { "message": "URI" @@ -550,65 +934,81 @@ } }, "newUri": { - "message": "New URI" + "message": "Nova URI" + }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." }, "addedItem": { - "message": "Item added" + "message": "Elemento engadido" }, "editedItem": { - "message": "Item saved" + "message": "Elemento gardado" }, "deleteItemConfirmation": { - "message": "Do you really want to send to the trash?" + "message": "Realmente queres enviar ao lixo?" }, "deletedItem": { - "message": "Item sent to trash" + "message": "Elemento enviado ao lixo" }, "overwritePassword": { - "message": "Overwrite password" + "message": "Sobrescribir contrasinal" }, "overwritePasswordConfirmation": { - "message": "Are you sure you want to overwrite the current password?" + "message": "EstÃĄs seguro de que queres sobrescribir o contrasinal actual?" }, "overwriteUsername": { - "message": "Overwrite username" + "message": "Sobrescribir nome de usuario" }, "overwriteUsernameConfirmation": { - "message": "Are you sure you want to overwrite the current username?" + "message": "EstÃĄs seguro de que queres sobrescribir o nome de usuario actual?" }, "searchFolder": { - "message": "Search folder" + "message": "Buscar cartafol" }, "searchCollection": { - "message": "Search collection" + "message": "Buscar colecciÃŗn" }, "searchType": { - "message": "Search type" + "message": "Buscar tipo" }, "noneFolder": { - "message": "No folder", + "message": "Sen cartafol", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Solicita engadir inicio de sesiÃŗn" + }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Amosar tarxetas no separador" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Lista os elementos de tarxeta no separador para fÃĄcil auto-completado." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Mostrar identidades no separador" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Lista os elementos de identidade no separador para fÃĄcil auto-completado." }, "clearClipboard": { - "message": "Clear clipboard", + "message": "Limpar portapapeis", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { @@ -619,7 +1019,7 @@ "message": "Should Bitwarden remember this password for you?" }, "notificationAddSave": { - "message": "Save" + "message": "Gardar" }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" @@ -627,57 +1027,102 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, "notificationChangeSave": { - "message": "Update" + "message": "Actualizar" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { - "message": "Unlock" + "message": "Desbloquear" + }, + "additionalOptions": { + "message": "Additional options" }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { - "message": "Theme" + "message": "Tema" }, "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { - "message": "Dark", + "message": "Escuro", "description": "Dark color" }, "light": { - "message": "Light", + "message": "Claro", "description": "Light color" }, "solarizedDark": { - "message": "Solarized dark", + "message": "Solarizado escuro", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { - "message": "Export vault" + "message": "Exportar caixa forte" }, "fileFormat": { - "message": "File format" + "message": "Formato de ficheiro" + }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." }, "warning": { - "message": "WARNING", + "message": "ADVERTENCIA", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { @@ -696,19 +1141,16 @@ "message": "Enter your master password to export your vault data." }, "shared": { - "message": "Shared" + "message": "Compartido" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" }, "share": { - "message": "Share" + "message": "Compartir" }, "movedItemToOrg": { "message": "$ITEMNAME$ moved to $ORGNAME$", @@ -727,58 +1169,61 @@ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, "learnMore": { - "message": "Learn more" + "message": "MÃĄis informaciÃŗn" }, "authenticatorKeyTotp": { - "message": "Authenticator key (TOTP)" + "message": "Clave de autenticaciÃŗn (TOTP)" }, "verificationCodeTotp": { - "message": "Verification code (TOTP)" + "message": "CÃŗdigo de verificaciÃŗn (TOTP)" }, "copyVerificationCode": { - "message": "Copy verification code" + "message": "Copiar cÃŗdigo de verificaciÃŗn" }, "attachments": { - "message": "Attachments" + "message": "Anexos" }, "deleteAttachment": { - "message": "Delete attachment" + "message": "Eliminar anexos" }, "deleteAttachmentConfirmation": { - "message": "Are you sure you want to delete this attachment?" + "message": "EstÃĄs seguro de que queres eliminar este anexo?" }, "deletedAttachment": { - "message": "Attachment deleted" + "message": "Anexo eliminado" }, "newAttachment": { - "message": "Add new attachment" + "message": "Engadir novo anexo" }, "noAttachments": { - "message": "No attachments." + "message": "Sen anexos." }, "attachmentSaved": { - "message": "Attachment saved" + "message": "Anexo gardado" }, "file": { - "message": "File" + "message": "Ficheiro" + }, + "fileToShare": { + "message": "File to share" }, "selectFile": { - "message": "Select a file" + "message": "Selecciona un ficheiro" }, "maxFileSize": { - "message": "Maximum file size is 500 MB." + "message": "O tamaÃąo mÃĄximo de ficheiro Ê de 500 MB." }, "featureUnavailable": { - "message": "Feature unavailable" + "message": "Característica non dispoÃąible" }, "encryptionKeyMigrationRequired": { "message": "Encryption key migration required. Please login through the web vault to update your encryption key." }, "premiumMembership": { - "message": "Premium membership" + "message": "Membresía de luxo" }, "premiumManage": { - "message": "Manage membership" + "message": "Xestionar membresía" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -871,7 +1334,7 @@ } }, "rememberMe": { - "message": "Remember me" + "message": "LÊmbrame" }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" @@ -889,13 +1352,13 @@ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." }, "webAuthnNewTabOpen": { - "message": "Open new tab" + "message": "Abrir novo separador" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "Autenticar con WebAuthn" }, "loginUnavailable": { - "message": "Login unavailable" + "message": "Inicio de sesiÃŗn non dispoÃąÃ­bel" }, "noTwoStepProviders": { "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." @@ -904,29 +1367,29 @@ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step login options" + "message": "OpciÃŗns de inicio de sesiÃŗn en dous pasos" }, "recoveryCodeDesc": { "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery code" + "message": "CÃŗdigo de recuperaciÃŗn" }, "authenticatorAppTitle": { - "message": "Authenticator app" + "message": "AplicaciÃŗn de autenticaciÃŗn" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -940,73 +1403,145 @@ "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { - "message": "Email" + "message": "Correo electrÃŗnico" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { - "message": "Self-hosted environment" + "message": "Entorno de auto-aloxamento" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { - "message": "Custom environment" + "message": "Entorno personalizado" }, "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." + "message": "Para usuarios avanzados. Poder especificar o URL base de cada servizo de xeito independente." }, "baseUrl": { - "message": "Server URL" + "message": "URL do servidor" + }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { - "message": "API server URL" + "message": "URL do servidor da API" }, "webVaultUrl": { - "message": "Web vault server URL" + "message": "URL do servidor da caixa forte web" }, "identityUrl": { - "message": "Identity server URL" + "message": "URL do servidor de identidade" }, "notificationsUrl": { - "message": "Notifications server URL" + "message": "URL do servidor de notificaciÃŗns" }, "iconsUrl": { - "message": "Icons server URL" + "message": "URL do servidor de iconas" }, "environmentSaved": { - "message": "Environment URLs saved" + "message": "URLs do entorno gardadas" + }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Apagado", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,39 +1564,39 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { - "message": "Custom fields" + "message": "Campos personalizados" }, "copyValue": { - "message": "Copy value" + "message": "Copiar valor" }, "value": { - "message": "Value" + "message": "Valor" }, "newCustomField": { - "message": "New custom field" + "message": "Novo campo personalizado" }, "dragToSort": { - "message": "Drag to sort" + "message": "Arrastra para ordenar" }, "cfTypeText": { - "message": "Text" + "message": "Texto" }, "cfTypeHidden": { - "message": "Hidden" + "message": "Agochado" }, "cfTypeBoolean": { - "message": "Boolean" + "message": "Booleano" + }, + "cfTypeCheckbox": { + "message": "Checkbox" }, "cfTypeLinked": { - "message": "Linked", + "message": "Vinculado", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Linked value", + "message": "Valor vinculado", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1077,76 +1621,76 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder name" + "message": "Nome do titular da tarxeta" }, "number": { - "message": "Number" + "message": "NÃēmero" }, "brand": { - "message": "Brand" + "message": "Marca" }, "expirationMonth": { - "message": "Expiration month" + "message": "Mes de expiraciÃŗn" }, "expirationYear": { - "message": "Expiration year" + "message": "Ano de vencemento" }, "expiration": { - "message": "Expiration" + "message": "Vencemento" }, "january": { - "message": "January" + "message": "Xaneiro" }, "february": { - "message": "February" + "message": "Febreiro" }, "march": { - "message": "March" + "message": "Marzo" }, "april": { - "message": "April" + "message": "Abril" }, "may": { - "message": "May" + "message": "Maio" }, "june": { - "message": "June" + "message": "XuÃąo" }, "july": { - "message": "July" + "message": "Xullo" }, "august": { - "message": "August" + "message": "Agosto" }, "september": { - "message": "September" + "message": "Setembro" }, "october": { - "message": "October" + "message": "Outubro" }, "november": { - "message": "November" + "message": "Novembro" }, "december": { - "message": "December" + "message": "Decembro" }, "securityCode": { - "message": "Security code" + "message": "CÃŗdigo de seguridade" }, "ex": { "message": "ex." }, "title": { - "message": "Title" + "message": "Título" }, "mr": { - "message": "Mr" + "message": "Sr" }, "mrs": { - "message": "Mrs" + "message": "Sra" }, "ms": { - "message": "Ms" + "message": "Srta" }, "dr": { "message": "Dr" @@ -1155,112 +1699,160 @@ "message": "Mx" }, "firstName": { - "message": "First name" + "message": "Nome" }, "middleName": { - "message": "Middle name" + "message": "Segundo nome" }, "lastName": { - "message": "Last name" + "message": "Apelido" }, "fullName": { - "message": "Full name" + "message": "Nome completo" }, "identityName": { - "message": "Identity name" + "message": "Nome de identidade" }, "company": { - "message": "Company" + "message": "Empresa" }, "ssn": { - "message": "Social Security number" + "message": "NÃēmero da seguridade social" }, "passportNumber": { - "message": "Passport number" + "message": "NÃēmero de pasaporte" }, "licenseNumber": { - "message": "License number" + "message": "NÃēmero de licencia" }, "email": { - "message": "Email" + "message": "Correo electrÃŗnico" }, "phone": { - "message": "Phone" + "message": "TelÊfono" }, "address": { - "message": "Address" + "message": "Enderezo" }, "address1": { - "message": "Address 1" + "message": "Enderezo 1" }, "address2": { - "message": "Address 2" + "message": "Enderezo 2" }, "address3": { - "message": "Address 3" + "message": "Enderezo 3" }, "cityTown": { - "message": "City / Town" + "message": "Localidade" }, "stateProvince": { - "message": "State / Province" + "message": "Estado / Provincia" }, "zipPostalCode": { - "message": "Zip / Postal code" + "message": "CÃŗdigo postal" }, "country": { - "message": "Country" + "message": "País" }, "type": { - "message": "Type" + "message": "Tipo" }, "typeLogin": { - "message": "Login" + "message": "Inicio de sesiÃŗn" }, "typeLogins": { - "message": "Logins" + "message": "Inicios se sesiÃŗn" }, "typeSecureNote": { - "message": "Secure note" + "message": "Nota segura" }, "typeCard": { - "message": "Card" + "message": "Tarxeta" }, "typeIdentity": { - "message": "Identity" + "message": "Identidade" + }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } }, "passwordHistory": { - "message": "Password history" + "message": "Historial de contrasinais" + }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" }, "back": { - "message": "Back" + "message": "AtrÃĄs" }, "collections": { - "message": "Collections" + "message": "ColecciÃŗns" + }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } }, "favorites": { - "message": "Favorites" + "message": "Favoritos" }, "popOutNewWindow": { "message": "Pop out to a new window" }, "refresh": { - "message": "Refresh" + "message": "Actualizar" }, "cards": { - "message": "Cards" + "message": "Tarxetas" }, "identities": { - "message": "Identities" + "message": "Identidades" }, "logins": { - "message": "Logins" + "message": "Inicios de sesiÃŗn" }, "secureNotes": { - "message": "Secure notes" + "message": "Notas seguras" }, "clear": { - "message": "Clear", + "message": "Limpar", "description": "To clear something out. example: To clear browser history." }, "checkPassword": { @@ -1279,34 +1871,38 @@ "message": "This password was not found in any known data breaches. It should be safe to use." }, "baseDomain": { - "message": "Base domain", + "message": "Dominio base", + "description": "Domain name. Ex. website.com" + }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain name", + "message": "Nome de dominio", "description": "Domain name. Ex. website.com" }, "host": { - "message": "Host", + "message": "AnfitriÃŗn", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { - "message": "Exact" + "message": "Exacto" }, "startsWith": { - "message": "Starts with" + "message": "Comeza por" }, "regEx": { - "message": "Regular expression", + "message": "ExpresiÃŗn regular", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1316,38 +1912,47 @@ "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "Current URI", + "message": "URI actual", "description": "The URI of one of the current open tabs in the browser." }, "organization": { - "message": "Organization", + "message": "OrganizaciÃŗn", "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { - "message": "Types" + "message": "Tipos" }, "allItems": { - "message": "All items" + "message": "Todos os elementos" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "Non hai contrasinais que listar." + }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" }, "remove": { - "message": "Remove" + "message": "Eliminar" }, "default": { - "message": "Default" + "message": "Por defecto" }, "dateUpdated": { - "message": "Updated", + "message": "Actualizado", "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "Creado", "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Password updated", + "message": "Contrasinal actualizado", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1360,25 +1965,25 @@ "message": "There are no collections to list." }, "ownership": { - "message": "Ownership" + "message": "Propiedade" }, "whoOwnsThisItem": { - "message": "Who owns this item?" + "message": "Quen posÃēe este elemento?" }, "strong": { - "message": "Strong", + "message": "Forte", "description": "ex. A strong password. Scale: Weak -> Good -> Strong" }, "good": { - "message": "Good", + "message": "Boa", "description": "ex. A good password. Scale: Weak -> Good -> Strong" }, "weak": { - "message": "Weak", + "message": "Feble", "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak master password" + "message": "Contrasinal mestre feble" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,27 +2031,56 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone item" + "message": "Clonar elemento" }, "clone": { - "message": "Clone" + "message": "Clonar" }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { - "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "message": "Bloquear", + "description": "Verb form: to make secure or inaccessible by" }, "trash": { - "message": "Trash", + "message": "Lixo", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,30 +2381,40 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { - "message": "Search Sends", + "message": "Buscar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Add Send", + "message": "Engadir Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "Texto" + }, + "sendTypeTextToShare": { + "message": "Text to share" }, "sendTypeFile": { - "message": "File" + "message": "Ficheiro" }, "allSends": { - "message": "All Sends", + "message": "Todos os Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { - "message": "Expired" + "message": "Caducado" }, "pendingDeletion": { "message": "Pending deletion" @@ -1679,25 +2422,28 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { - "message": "Copy Send link", + "message": "Copiar ligazÃŗn Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { "message": "Remove Password" }, "delete": { - "message": "Delete" + "message": "Eliminar" }, "removedPassword": { "message": "Password removed" }, "deletedSend": { - "message": "Send deleted", + "message": "Send eliminado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Send link", + "message": "LigazÃŗn Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { @@ -1707,15 +2453,19 @@ "message": "Are you sure you want to remove the password?" }, "deleteSend": { - "message": "Delete Send", + "message": "Eliminar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { - "message": "Edit Send", + "message": "Editar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1744,10 +2498,10 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { - "message": "1 day" + "message": "1 día" }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ días", "placeholders": { "days": { "content": "$1", @@ -1756,7 +2510,7 @@ } }, "custom": { - "message": "Custom" + "message": "Personalizado" }, "maximumAccessCount": { "message": "Maximum Access Count" @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1792,14 +2550,14 @@ "message": "Current access count" }, "createSend": { - "message": "New Send", + "message": "Novo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "New password" + "message": "Novo contrasinal" }, "sendDisabled": { - "message": "Send removed", + "message": "Send eliminado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1807,11 +2565,55 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send created", + "message": "Send creado", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send saved", + "message": "Send gardado", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,14 +2709,39 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { - "message": "Hours" + "message": "Horas" }, "minutes": { - "message": "Minutes" + "message": "Minutos" + }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,8 +2865,20 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { - "message": "Error" + "message": "Erro" }, "regenerateUsername": { "message": "Regenerate username" @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2026,13 +2920,13 @@ "message": "Use your domain's configured catch-all inbox." }, "random": { - "message": "Random" + "message": "Aleatorio" }, "randomWord": { - "message": "Random word" + "message": "Palabra aleatoria" }, "websiteName": { - "message": "Website name" + "message": "Nome do sitio web" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" @@ -2049,15 +2943,125 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { - "message": "Hostname", + "message": "Nome do anfitriÃŗn", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "Token de acceso ÃĄ API" }, "apiKey": { - "message": "API Key" + "message": "Clave da API" }, "ssoKeyConnectorError": { "message": "Key connector error: make sure key connector is available and working correctly." @@ -2093,7 +3097,7 @@ "message": "Server version" }, "selfHostedServer": { - "message": "self-hosted" + "message": "autoaloxado" }, "thirdParty": { "message": "Third-party" @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,24 +3270,39 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { - "message": "EU", + "message": "UE", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, "general": { - "message": "General" + "message": "Xeral" }, "display": { - "message": "Display" + "message": "Amosar" }, "accountSuccessfullyCreated": { "message": "Account successfully created!" @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 48d88f82d40..4c200333464 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - מנהל סיסמאו×Ē ×—×™× ×ž×™", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "מנהל סיסמאו×Ē ×—×™× ×ž×™ ומאובטח ×ĸבור כל המכשירים שלך.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "×Ļור חשבון חדש או ה×Ēחבר כדי לגש×Ē ×œ×›×Ą×¤×Ē ×”×ž××•×‘×˜×—×Ē ×Š×œ×š." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "×Ļור חשבון" }, - "login": { - "message": "ה×Ēחבר" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "כניסה ארגוני×Ē ××—×™×“×”" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ני×Ēן להש×Ēמ׊ ברמז לסיסמה הראשי×Ē ×× שכח×Ē ××•×Ēה." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "הקלד שוב סיסמה ראשי×Ē" }, "masterPassHint": { "message": "רמז לסיסמה ראשי×Ē (אופ×Ļיונאלי)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "ה×Ļטרפו×Ē ××œ $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "לשוני×Ē" }, @@ -59,7 +105,7 @@ "message": "הכספ×Ē ×Š×œ×™" }, "allVaults": { - "message": "All vaults" + "message": "כל הכספו×Ē" }, "tools": { "message": "כלים" @@ -73,6 +119,9 @@ "copyPassword": { "message": "ה×ĸ×Ē×§ סיסמה" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "ה×ĸ×Ē×§ פ×Ē×§" }, @@ -88,18 +137,85 @@ "copySecurityCode": { "message": "ה×ĸ×Ē×§ קוד אבטחה" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "השלמה אוטומטי×Ē" }, + "autoFillLogin": { + "message": "מילוי פרטי כניסה אוטומטי×Ē" + }, + "autoFillCard": { + "message": "מילוי פרטי כרטיס אוטומטי×Ē" + }, + "autoFillIdentity": { + "message": "מילוי פרטי זיהוי אוטומטי×Ē" + }, "generatePasswordCopied": { "message": "×Ļור סיסמה (ה×ĸ×Ē×§)" }, "copyElementIdentifier": { - "message": "Copy custom field name" + "message": "ה×ĸ×Ē×§×Ē ×Š× שדה מו×Ēאם אישי×Ē" }, "noMatchingLogins": { "message": "לא נמ×Ļאו פרטי כניסה ×Ēואמים." }, + "noCards": { + "message": "אין כרטיסים" + }, + "noIdentities": { + "message": "אין זהויו×Ē" + }, + "addLoginMenu": { + "message": "הוספ×Ē ×¤×¨×˜×™ כניסה" + }, + "addCardMenu": { + "message": "הוספ×Ē ×›×¨×˜×™×Ą" + }, + "addIdentityMenu": { + "message": "הוספ×Ē ×–×”×•×Ē" + }, "unlockVaultMenu": { "message": "שחרור הכספ×Ē ×Š×œ×š" }, @@ -115,6 +231,18 @@ "addItem": { "message": "×”×•×Ą×Ŗ פריט" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "רמז לסיסמה" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "יש לאשר א×Ē ×–×”×•×Ēך כדי להמשיך." }, - "account": { - "message": "חשבון" - }, "changeMasterPassword": { "message": "×”×—×œ×Ŗ סיסמה ראשי×Ē" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "סיסמ×Ē ×˜×‘×™×ĸ×Ē ××Ļב×ĸ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ה×Ē× ×Ē×§" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "אודו×Ē" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "גירסה" }, @@ -172,7 +354,7 @@ "message": "שמור" }, "move": { - "message": "Move" + "message": "ה×ĸברה" }, "addFolder": { "message": "×”×•×Ą×Ŗ ×Ēיקייה" @@ -183,6 +365,24 @@ "editFolder": { "message": "×ĸרוך ×Ēיקייה" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "מחק ×Ēיקייה" }, @@ -196,7 +396,7 @@ "message": "×ĸזרה ומשוב" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "מרכז ה×ĸזרה של Bitwarden" }, "communityForums": { "message": "Explore Bitwarden community forums" @@ -218,13 +418,13 @@ }, "generator": { "message": "מיי×Ļר", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "×Ļור אוטומטי×Ē ×Ą×™×Ą×ž××•×Ē ×—×–×§×•×Ē ×•×™×—×•×“×™×•×Ē ×ĸבור פרטי הכניסה שלך." }, - "bitWebVault": { - "message": "כספ×Ē ×‘××Ēר Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "יבא פריטים" @@ -235,6 +435,9 @@ "generatePassword": { "message": "×Ļור סיסמה" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "×Ļור סיסמה חדשה" }, @@ -244,17 +447,60 @@ "length": { "message": "אורך" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "מספר מילים" @@ -276,7 +522,16 @@ "message": "מינימום ×Ēוים מיוחדים" }, "avoidAmbChar": { - "message": "המנ×ĸ מאו×Ēיו×Ē ×•×Ēוים דומים" + "message": "המנ×ĸ מאו×Ēיו×Ē ×•×Ēוים דומים", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "חיפוש בכספ×Ē" @@ -299,15 +554,30 @@ "password": { "message": "סיסמה" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "משפט סיסמה" }, "favorite": { "message": "מו×ĸדת" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "פריט × ×•×Ą×Ŗ למו×ĸדפים" + }, + "itemRemovedFromFavorites": { + "message": "פריט הוסר מהמו×ĸדפים" + }, "notes": { "message": "ה×ĸרו×Ē" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "ה×ĸרה" }, @@ -326,6 +596,18 @@ "launch": { "message": "הפ×ĸל" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "א×Ēר" }, @@ -338,9 +620,24 @@ "other": { "message": "אחר" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "דירוג הרחבה" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "הכספ×Ē ×Š×œ×š × ×ĸולה. הזן א×Ē ×”×Ą×™×Ą×ž×” הראשי×Ē ×Š×œ×š כדי להמשיך." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "בטל × ×ĸילה" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "משך זמן מירבי ×ĸבור חיבור לכספ×Ē" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "× ×ĸל ×ĸכשיו" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "באופן מיידי" }, @@ -426,6 +738,18 @@ "security": { "message": "אבטחה" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "איר×ĸה שגיאה" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "החשבון שלך נו×Ļר בה×Ļלחה! כ×ĸ×Ē × ×™×Ēן להכנס למ×ĸרכ×Ē." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "שלחנו לך אימייל ×ĸם רמז לסיסמה הראשי×Ē." }, "verificationCodeRequired": { "message": "נדרש קוד אימו×Ē." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "קוד אימו×Ē ×Š×’×•×™" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "לא ה×Ļלחנו לב×Ļ×ĸ פ×ĸול×Ē ×”×Š×œ×ž×” האוטומטי×Ē ×‘×ĸמוד זה. אנא ה×ĸ×Ē×§ והדבק א×Ē ×”×ž×™×“×ĸ הנחו×Ĩ ב×Ļורה ידני×Ē." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "בו×Ļ×ĸה י×Ļיאה" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "×Ēוקת החיבור שלך הס×Ēיים." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "האם א×Ēה בטוח שבר×Ļונך לה×Ē× ×Ē×§?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "נוספה ×Ēיקייה" }, - "changeMasterPass": { - "message": "×”×—×œ×Ŗ סיסמה ראשי×Ē" - }, - "changeMasterPasswordConfirmation": { - "message": "באפשרו×Ēך לשנו×Ē ××Ē ×”×Ą×™×Ą×ž×” הראשי×Ē ×Š×œ×š דרך הכספ×Ē ×‘××Ēר bitwarden.com. האם בר×Ļונך לפ×Ēוח א×Ē ×”××Ēר כ×ĸ×Ē?" - }, "twoStepLoginConfirmation": { "message": "ה×Ēחברו×Ē ×‘×Š× ×™-שלבים הופכ×Ē ××Ē ×”×—×Š×‘×•×Ÿ שלך למאובטח יו×Ēר בכך ׊א×Ēה נדרש לוודא בכל כניסה ב×ĸזר×Ē ×ž×›×Š×™×¨ אחר כדוגמ×Ē ×ž×¤×Ēח אבטחה, ×Ēוכנ×Ē ××™×ž×•×Ē, SMS, שיח×Ē ×˜×œ×¤×•×Ÿ, או אימייל. ני×Ēן להפ×ĸיל א×Ē \"ה×Ēחברו×Ē ×‘×Š× ×™-שלבים\" בכספ×Ē ×Š×‘××Ēר bitwarden.com. האם בר×Ļונך לפ×Ēוח א×Ē ×”××Ēר כ×ĸ×Ē?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "×Ēיקייה ׊נ×ĸרכה" }, @@ -552,6 +936,10 @@ "newUri": { "message": "כ×Ēוב×Ē ×—×“×Š×”" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "פריט שה×Ē×•×•×Ą×Ŗ" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "ההוד×ĸה \"שמור פרטי כניסה\" מופי×ĸה בכל פ×ĸם ׊×Ēכנס לא×Ēר חדש בפ×ĸם הראשונה." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "נקה לוח ה×ĸ×Ēקו×Ē", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "האם בר×Ļונך ל×ĸדכן א×Ē ×”×Ą×™×Ą×ž×” הזו ב×Ēוכנ×Ē Bitwarden?" }, @@ -634,20 +1043,26 @@ "message": "כן, ×ĸדכן ×ĸכשיו" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "בריר×Ē ×ž×—×“×œ לזיהוי ה×Ēאמ×Ē ×›×Ēובו×Ē", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "בחר א×Ē ×Š×™×˜×Ē ×‘×¨×™×¨×Ē ×”×ž×—×“×œ ×ĸבור זיהוי ה×Ēאמ×Ē ×›×Ēובו×Ē ×›×Š×ž×‘×Ļ×ĸים פ×ĸולו×Ē ×”×Š×œ×ž×” אוטומטי×Ē." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "שנה א×Ē ×ĸרכ×Ē ×”×Ļב×ĸ של האפליק×Ļיה." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "כהה", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "י×Ļוא כספ×Ē" }, "fileFormat": { "message": "פורמט קוב×Ĩ" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "אזהרה", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "משו×Ē×Ŗ" }, - "learnOrg": { - "message": "מיד×ĸ ×ĸל ארגונים" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "קוב×Ĩ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "בחר קוב×Ĩ." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 ג'יגה של מקום אחסון ×ĸבור קב×Ļים מ×Ļורפים." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "באפשרו×Ēך לרכוש מנוי פרימיום בכספ×Ē ×‘××Ēר bitwarden.com. האם בר×Ļונך לפ×Ēוח א×Ē ×”××Ēר כ×ĸ×Ē?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "א×Ēה מנוי פרימיום!" }, "premiumCurrentMemberThanks": { "message": "×Ēודה ×ĸל ×Ēמיכ×Ēך בBitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "הכל רק ב$PRICE$ לשנה!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "הר×ĸנון הושלם" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "אפליק×Ļיי×Ē ××™×ž×•×Ē" }, - "authenticatorAppDesc": { - "message": "הש×Ēמ׊ באפליק×Ļי×Ē ××™×ž×•×Ē (כמו לדוגמא Authy או Google Authenticator) ליי×Ļור סיסמאו×Ē ××™×ž×•×Ē ×ž×‘×•×Ą×Ą×•×Ē ×–×ž×Ÿ.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "מפ×Ēח אבטחה OTP של YubiKey" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "הש×Ēמ׊ בYubiKey ×ĸבור גישה לחשבון שלך. ×ĸובד ×ĸם YubiKey בגירסאו×Ē 4, 4C, 4Nano, ומכשירי NEO." }, - "duoDesc": { - "message": "ב×Ļ×ĸ אימו×Ē ×ž×•×œ Duo Security באמ×Ļ×ĸו×Ē ××¤×œ×™×§×Ļי×Ē Duo לפלאפון, SMS, שיח×Ē ×˜×œ×¤×•×Ÿ, או מפ×Ēח אבטחה U2F.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "אימייל" }, - "emailDesc": { - "message": "קודי אימו×Ē ×™×Š×œ×—×• לאימייל שלך." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "סביבה ×ĸל ׊ר×Ēים מקומיים" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "הזן א×Ē ×›×Ēוב×Ē ×”×Š×¨×Ē ×”×ž×§×•×ž×™ של Bitwarden." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "סביבה מו×Ēאמ×Ē ××™×Š×™×Ē" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "כ×Ēוב×Ē ×Š×¨×Ē" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "כ×Ēוב×Ē ×Š×¨×Ē ×”API" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "כ×Ēובו×Ē ×”×Ą×‘×™×‘×” נשמרו." }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "הפ×ĸל השלמה אוטומטי×Ē ×‘×–×ž×Ÿ ט×ĸינ×Ē ×”×ĸמוד" }, "enableAutoFillOnPageLoadDesc": { "message": "אם זוהה טופס כניסה, ב×Ļ×ĸ אוטומטי×Ē ×ž×™×œ×•×™-אוטומטי כשה×ĸמוד נט×ĸן." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "הגדר×Ē ×‘×¨×™×¨×Ē ×ž×—×“×œ למילוי אוטומטי של פרטי ה×Ēחברו×Ē" @@ -1006,7 +1541,7 @@ "message": "מילוי אוטומטי אחרי ט×ĸינ×Ē ×“×¤×™×" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "פ×Ēיח×Ē ×›×Ą×¤×Ē ×‘×—×œ×•× ×™×Ē ×Ļפה" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "פ×Ēיח×Ē ×›×Ą×¤×Ē ×‘×Ą×¨×’×œ ×Ļד" }, - "commandAutofillDesc": { - "message": "הש×Ēמ׊ בהשלמה-האוטומטי×Ē ×”××—×¨×•× ×” שבו×Ļ×ĸה בא×Ēר זה." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "×Ļור וה×ĸ×Ē×§ סיסמה רנדומלי×Ē ×—×“×Š×”." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "× ×ĸל א×Ē ×”×›×Ą×¤×Ē" }, - "privateModeWarning": { - "message": "המ×Ļב הפרטי הוא במסגר×Ē × ×™×Ą×•×™ וחלק מהיכולו×Ē ×ž×•×’×‘×œ×•×Ē." - }, "customFields": { "message": "שדו×Ē ×ž×•×Ēאמים אישי×Ē" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "אמ×Ē ××• ׊קר" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "מקושר", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "זהו×Ē" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "היסטוריי×Ē ×Ą×™×Ą×ž××•×Ē" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "הקודם" }, "collections": { "message": "אוספים" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "מו×ĸדפים" }, @@ -1282,6 +1874,10 @@ "message": "׊ם בסיס הדומיין", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "׊ם ×Ēחום", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "זיהוי ה×Ēאמה", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "בריר×Ē ×ž×—×“×œ לזיהוי ה×Ēאמו×Ē", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ה×Ļגה\\הס×Ēרה של אפשרויו×Ē" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "אין סיסמאו×Ē ×œ×”×Ļגה ברשימה." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "הסר" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "בטל × ×ĸילה ×ĸם קוד PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "קב×ĸ קוד PIN לביטול × ×ĸיל×Ē Bitwarden. הגדרו×Ē ×”PIN יאופסו אם ×Ēב×Ļ×ĸ י×Ļיאה מה×Ēוכנה." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "נדרש קוד PIN." }, "invalidPin": { "message": "קוד PIN לא ×Ēקין." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "פ×Ēח × ×ĸילה ×ĸם זיהוי ביומטרי" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "ממ×Ēין לאישור משולחן ה×ĸבודה" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "× ×ĸל ב×ĸזר×Ē ×”×Ą×™×Ą×ž×” הראשי×Ē ×‘×”×¤×ĸל×Ē ×”×“×¤×“×¤×Ÿ מחדש" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "×ĸליך לבחור לפחו×Ē ××•×Ą×Ŗ אחד." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "מדיניו×Ē ××¨×’×•× ×™×Ē ××—×Ē ××• יו×Ēר משפי×ĸה ×ĸל הגדרו×Ē ×”×ž×—×•×œ×œ שלך." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "פ×ĸולה לבי×Ļו×ĸ בכספ×Ē ×‘×Ēום זמן החיבור" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "× ×ĸילה", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "סל המחזור", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "פריט ששוחזר" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "י×Ļיאה מהחשבון ×Ēסיר א×Ē ×›×œ הגישה לכספ×Ē ×•×™×™×“×¨×Š אימו×Ē ×ž×§×•×•×Ÿ לאחר משך הזמן שהוק×Ļב. האם א×Ēה בטוח שבר×Ļונך להש×Ēמ׊ בהגדרה זו?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ב×Ļ×ĸ השלמה אוטומטי×Ē ×•×Š×ž×•×¨" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "בו×Ļ×ĸה השלמה אוטומטי×Ē ×•×”×›×Ēוב×Ē × ×Š×ž×¨×”" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "הסיסמה הראשי×Ē ×”×—×“×Š×” השלך לא ×ĸומד×Ē ×‘×“×¨×™×Š×•×Ē ×”×ž×“×™× ×™×•×Ē." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "סימון ×Ēיבה זו מהווה א×Ē ×”×Ą×›×ž×Ēך ל×Ēנאים הבאים:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "אישור" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "אימו×Ē ×Ą× ×›×¨×•×Ÿ מול שולחן ה×ĸבודה" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "חוסר ה×Ēאמה בין חשבונו×Ē" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "אמ×Ļ×ĸי זיהוי ביומטרים לא מאופשרים" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "מכשיר זה לא ×Ēומך בזיהוי ביומטרי בדפדפן." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "מדיניו×Ē ××¨×’×•× ×™×Ē ×ž×Š×¤×™×ĸה ×ĸל אפשרויו×Ē ×”×‘×ĸלו×Ē ×Š×œ×š." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "×Ēאריך ×Ēפוגה" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "הרשאו×Ē ×”××¨×’×•×Ÿ שלך ×ĸודכנו, מה שמאל×Ĩ או×Ēך להגדיר סיסמה ראשי×Ē.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "הארגון שלך דורש ממך להגדיר סיסמה ראשי×Ē.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "שגיאה" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "סוג ׊ם מ׊×Ēמ׊" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "י×Ļיר×Ē ×›×™× ×•×™ דוא״ל ×ĸם שירו×Ē ×”×ĸברה חי×Ļוני." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "׊ם מארח", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "ייבוא × ×Ēונים", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "שגיא×Ē ×™×™×‘×•×" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "×Ēיאור" + }, + "importSuccess": { + "message": "הנ×Ēונים יובאו בה×Ļלחה" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "סך הכול" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "×Ēסדירים נפו×Ļים", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 2619e217370..82a1190cd48 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -3,21 +3,39 @@ "message": "bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "ā¤Ŧā¤ŋ⤟ā¤ĩā¤žā¤°āĨā¤Ąā¤¨ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤ŽāĨˆā¤¨āĨ‡ā¤œā¤°", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "bitwarden is a secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "⤘⤰ ā¤Ē⤰, ā¤•ā¤žā¤Ž ā¤Ē⤰ ā¤¯ā¤ž ⤚⤞⤤āĨ‡-ā¤Ģā¤ŋ⤰⤤āĨ‡, ā¤Ŧā¤ŋ⤟ā¤ĩ⤰āĨā¤Ąā¤¨ ⤆ā¤Ē⤕āĨ‡ ⤏⤭āĨ€ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą, ā¤Ēā¤žā¤¸ā¤•āĨ€ ⤔⤰ ⤏⤂ā¤ĩāĨ‡ā¤Ļ⤍ā¤ļāĨ€ā¤˛ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ⤕āĨ‹ ā¤†ā¤¸ā¤žā¤¨āĨ€ ⤏āĨ‡ ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ā¤°ā¤–ā¤¤ā¤ž ā¤šāĨˆ", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "⤅ā¤Ē⤍āĨ€ ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤¨ā¤¯ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤ā¤‚ ā¤¯ā¤ž ⤞āĨ‰ā¤— ⤇⤍ ⤕⤰āĨ‡ā¤‚āĨ¤" }, + "inviteAccepted": { + "message": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ⤏āĨā¤ĩāĨ€ā¤•āĨƒā¤¤" + }, "createAccount": { "message": "Create Account" }, - "login": { - "message": "Log In" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "ā¤Žā¤œā¤ŦāĨ‚⤤ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨ‡ā¤Ÿ ⤕⤰⤕āĨ‡ ⤅ā¤Ēā¤¨ā¤ž ā¤–ā¤žā¤¤ā¤ž ⤍ā¤ŋ⤰āĨā¤Žā¤žā¤Ŗ ā¤ĒāĨ‚ā¤°ā¤ž ⤕⤰āĨ‡ā¤‚" }, "enterpriseSingleSignOn": { "message": "⤉ā¤ĻāĨā¤¯ā¤Ž ā¤ā¤•ā¤˛ ā¤¸ā¤žā¤‡ā¤¨-⤑⤍" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏⤂⤕āĨ‡ā¤¤ ⤆ā¤Ē⤕āĨ‹ ⤭āĨ‚⤞ ā¤œā¤žā¤¨āĨ‡ ⤕āĨ€ ⤅ā¤ĩ⤏āĨā¤Ĩā¤ž ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‹ ā¤¯ā¤žā¤Ļ ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤" }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type Master Password" }, "masterPassHint": { "message": "Master Password Hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "⤟āĨˆā¤Ŧ" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy Password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy Note" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copy Security Code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "⤏āĨā¤ĩ⤤:⤭⤰⤪" }, + "autoFillLogin": { + "message": "⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤞āĨ‰ā¤—ā¤ŋ⤍ ā¤ĩā¤ŋā¤ĩ⤰⤪" + }, + "autoFillCard": { + "message": "⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ā¤•ā¤žā¤°āĨā¤Ą ā¤ĩā¤ŋā¤ĩ⤰⤪" + }, + "autoFillIdentity": { + "message": "⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ĩā¤ŋā¤ĩ⤰⤪" + }, "generatePasswordCopied": { "message": "Generate Password (copied)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "⤕āĨ‹ā¤ˆ ā¤ŽāĨ‡ā¤˛-ā¤Žā¤ŋā¤˛ā¤ž ⤞āĨ‰ā¤—ā¤ŋ⤍ ā¤¨ā¤šāĨ€ā¤‚ |" }, + "noCards": { + "message": "⤕āĨ‹ā¤ˆ ā¤•ā¤žā¤°āĨā¤Ą ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚" + }, + "noIdentities": { + "message": "⤕āĨ‹ā¤ˆ ā¤Ēā¤šā¤šā¤žā¤¨ ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚" + }, + "addLoginMenu": { + "message": "⤞āĨ‰ā¤—ā¤ŋ⤍ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" + }, + "addCardMenu": { + "message": "ā¤•ā¤žā¤°āĨā¤Ą ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" + }, + "addIdentityMenu": { + "message": "ā¤Ēā¤šā¤šā¤žā¤¨ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" + }, "unlockVaultMenu": { "message": "⤆ā¤Ē⤕āĨ€ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤•ā¤ž ā¤¤ā¤žā¤˛ā¤ž ⤖āĨ‹ā¤˛āĨ‡ā¤‚" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Add Item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password Hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "⤆⤗āĨ‡ ā¤ŦāĨā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤅ā¤Ē⤍āĨ‡ ā¤Ēā¤šā¤šā¤žā¤¨ ⤕āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ⤕⤰āĨ‡ā¤‚" }, - "account": { - "message": "ā¤–ā¤žā¤¤ā¤ž" - }, "changeMasterPassword": { "message": "Change Master Password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint Phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log Out" }, + "aboutBitwarden": { + "message": "ā¤Ŧā¤ŋ⤟ā¤ĩā¤žā¤°āĨā¤Ąā¤¨ ā¤•ā¤ž ā¤Ē⤰ā¤ŋ⤚⤝" + }, "about": { "message": "ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "⤏⤂⤏āĨā¤•⤰⤪" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit Folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete Folder" }, @@ -199,7 +399,7 @@ "message": "ā¤Ŧā¤ŋ⤟ā¤ĩāĨ‰ā¤°āĨā¤ĄāĨ‡ā¤¨ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ⤕āĨ‡ā¤‚ā¤ĻāĨā¤°" }, "communityForums": { - "message": "Explore Bitwarden community forums" + "message": "Bitwarden ā¤¸ā¤žā¤ŽāĨā¤Ļā¤žā¤¯ā¤ŋ⤕ ā¤Žā¤‚ā¤šāĨ‹ā¤‚ ā¤•ā¤ž ⤅⤍āĨā¤ĩāĨ‡ā¤ˇā¤Ŗ ⤕⤰āĨ‡ā¤‚" }, "contactSupport": { "message": "ā¤Ŧā¤ŋ⤟ā¤ĩāĨ‰ā¤°āĨā¤ĄāĨ‡ā¤¨ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ⤏āĨ‡ ⤏⤂ā¤Ē⤰āĨā¤• ⤕⤰āĨ‡ā¤‚" @@ -218,13 +418,13 @@ }, "generator": { "message": "⤉⤤āĨā¤Ē⤍āĨā¤¨ ⤕⤰āĨ‡ā¤‚!", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ⤅ā¤Ē⤍āĨ‡ ⤞āĨ‰ā¤—ā¤ŋ⤍ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Žā¤œā¤ŦāĨ‚⤤, ⤅ā¤ĻāĨā¤ĩā¤ŋ⤤āĨ€ā¤¯ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤉⤤āĨā¤Ē⤍āĨā¤¨ ⤕⤰⤤āĨ‡ ā¤šāĨˆā¤‚āĨ¤" }, - "bitWebVault": { - "message": "bitwarden Web Vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import Items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate Password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate Password" }, @@ -244,17 +447,60 @@ "length": { "message": "⤞⤂ā¤Ŧā¤žā¤ˆ" }, + "passwordMinLength": { + "message": "⤍āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤞⤂ā¤Ŧā¤žā¤ˆ" + }, "uppercase": { - "message": "ā¤ŦāĨœāĨ‡ ⤅⤕āĨā¤ˇā¤° (A-Z)" + "message": "ā¤ŦāĨœāĨ‡ ⤅⤕āĨā¤ˇā¤° (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "⤛āĨ‹ā¤ŸāĨ‡ ⤅⤕āĨā¤ˇā¤° (a-z)" + "message": "⤛āĨ‹ā¤ŸāĨ‡ ⤅⤕āĨā¤ˇā¤° (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "⤏⤂⤖āĨā¤¯ā¤ž (0-9)" + "message": "⤏⤂⤖āĨā¤¯ā¤ž (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ⤅⤕āĨā¤ˇā¤° (!@#$%^&*)" + "message": "ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ⤅⤕āĨā¤ˇā¤° (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of Words" @@ -276,7 +522,16 @@ "message": "Minimum Special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid Ambiguous Characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "ā¤ā¤‚ā¤Ÿā¤°ā¤ĒāĨā¤°ā¤žā¤‡ā¤œā¤ŧ ⤍āĨ€ā¤¤ā¤ŋ ⤆ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤žā¤ā¤ ⤆ā¤Ē⤕āĨ‡ ⤜⤍⤰āĨ‡ā¤Ÿā¤° ā¤ĩā¤ŋ⤕⤞āĨā¤ĒāĨ‹ā¤‚ ā¤Ē⤰ ā¤˛ā¤žā¤—āĨ‚ ⤕āĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤‚.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ⤖āĨ‹ā¤œāĨ‡" @@ -299,15 +554,30 @@ "password": { "message": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "ā¤Ēā¤žā¤¸ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤œā¤ŧ" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "⤍āĨ‹ā¤ŸāĨā¤¸" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "⤍āĨ‹ā¤Ÿ:" }, @@ -326,6 +596,18 @@ "launch": { "message": "⤖āĨ‹ā¤˛āĨ‡ā¤‚" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ" }, @@ -338,9 +620,24 @@ "other": { "message": "⤅⤍āĨā¤¯" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the Extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "⤆ā¤Ē⤕āĨ€ ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ⤞āĨ‰ā¤• ā¤šāĨ‹ ā¤—ā¤ˆ ā¤šāĨˆāĨ¤ ā¤œā¤žā¤°āĨ€ ⤰⤖⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤅ā¤Ē⤍āĨ‡ ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‹ ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚āĨ¤" }, + "yourVaultIsLockedV2": { + "message": "⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤Ē⤰ ⤞āĨ‰ā¤• ā¤˛ā¤—ā¤ž ā¤šāĨˆ" + }, + "yourAccountIsLocked": { + "message": "⤆ā¤Ēā¤•ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤Ŧ⤂ā¤Ļ ā¤šāĨˆ." + }, + "or": { + "message": "ā¤¯ā¤ž" + }, "unlock": { "message": "ā¤¤ā¤žā¤˛ā¤ž ⤖āĨ‹ā¤˛āĨ‡ā¤‚" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ā¤Žā¤§āĨā¤¯ā¤žā¤‚⤤⤰" }, + "vaultTimeout1": { + "message": "ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ" + }, "lockNow": { "message": "Lock Now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "⤤⤤āĨâ€ā¤•ā¤žā¤˛" }, @@ -426,6 +738,18 @@ "security": { "message": "⤏āĨā¤°ā¤•āĨā¤ˇā¤ž" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "⤕āĨ‹ā¤ˆ ⤗ā¤ŧ⤞⤤āĨ€ ā¤šāĨā¤ˆāĨ¤" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "⤆ā¤Ēā¤•ā¤ž ā¤¨ā¤¯ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ! ⤅ā¤Ŧ ⤆ā¤Ē ⤞āĨ‰ā¤— ⤇⤍ ⤕⤰ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚āĨ¤" }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "ā¤šā¤Žā¤¨āĨ‡ ⤆ā¤Ē⤕āĨ‹ ⤅ā¤Ē⤍āĨ‡ ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏⤂⤕āĨ‡ā¤¤ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ⤭āĨ‡ā¤œā¤ž ā¤šāĨˆāĨ¤" }, "verificationCodeRequired": { "message": "⤏⤤āĨā¤¯ā¤žā¤Ē⤍ ⤟āĨ‹ā¤•⤍ ⤆ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ" }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "⤏⤤āĨā¤¯ā¤žā¤Ē⤍ ⤕āĨ‹ā¤Ą ⤅ā¤ĩāĨˆā¤§ ā¤šāĨˆ" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Unable to auto-fill the selected login on this page. Copy/paste your username and/or password instead." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "⤞āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "⤅ā¤Ē⤍āĨ‡ ⤞āĨ‰ā¤—ā¤ŋ⤍ ⤏⤤āĨā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤" }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ⤞āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "⤜āĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤°" }, - "changeMasterPass": { - "message": "Change Master Password" - }, - "changeMasterPasswordConfirmation": { - "message": "⤆ā¤Ē ā¤ĩāĨ‡ā¤Ŧ ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ bitwarden.com ā¤Ē⤰ ⤅ā¤Ēā¤¨ā¤ž ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤Ŧā¤Ļ⤞ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ā¤•āĨā¤¯ā¤ž ⤆ā¤Ē ⤅ā¤Ŧ ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ ā¤Ē⤰ ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to enter a security code from an authenticator app whenever you log in. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "ā¤Ŧā¤ŋ⤟ā¤ĩ⤰āĨā¤Ąā¤¨ ā¤ĩāĨ‡ā¤Ŧ ⤐ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤ĻāĨ‹-⤚⤰⤪āĨ€ā¤¯ ⤞āĨ‰ā¤—ā¤ŋ⤍ ⤏āĨ‡ā¤Ÿ ⤕⤰⤕āĨ‡ ⤅ā¤Ē⤍āĨ‡ ā¤–ā¤žā¤¤āĨ‡ ⤕āĨ‹ ⤅⤧ā¤ŋ⤕ ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ā¤Ŧā¤¨ā¤žā¤ā¤‚āĨ¤" + }, + "twoStepLoginConfirmationTitle": { + "message": "ā¤ĩāĨ‡ā¤Ŧ ⤐ā¤Ē ā¤Ē⤰ ā¤œā¤žā¤ā¤‚?" + }, "editedFolder": { "message": "Edited Folder" }, @@ -552,6 +936,10 @@ "newUri": { "message": "ā¤¨ā¤¯ā¤ž URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "⤜āĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤†ā¤‡ā¤Ÿā¤Ž" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "⤞āĨ‰ā¤—ā¤ŋ⤍ ⤜āĨ‹ā¤Ąā¤ŧ⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤•ā¤šāĨ‡ā¤‚" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "⤟āĨˆā¤Ŧ ā¤ĒāĨ‡ā¤œ ā¤Ē⤰ ā¤•ā¤žā¤°āĨā¤Ą ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" }, "showCardsCurrentTabDesc": { "message": "ā¤†ā¤¸ā¤žā¤¨ ā¤‘ā¤ŸāĨ‹-ā¤Ģā¤ŋ⤞ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤟āĨˆā¤Ŧ ā¤ĒāĨ‡ā¤œ ā¤Ē⤰ ā¤•ā¤žā¤°āĨā¤Ą ā¤†ā¤‡ā¤Ÿā¤Ž ⤏āĨ‚ā¤šāĨ€ā¤Ŧā¤ĻāĨā¤§ ⤕⤰āĨ‡ā¤‚āĨ¤" }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "⤟āĨˆā¤Ŧ ā¤ĒāĨ‡ā¤œ ā¤Ē⤰ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "⤕ā¤ŋ⤏āĨ€ ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ ā¤Ē⤰ ā¤Ē⤰ā¤ŋā¤ĩ⤰āĨā¤¤ā¤¨ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ⤚⤞⤍āĨ‡ ā¤Ē⤰ ⤞āĨ‰ā¤—ā¤ŋ⤍ ā¤•ā¤ž ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤•ā¤šāĨ‡ā¤‚āĨ¤" }, + "changedPasswordNotificationDescAlt": { + "message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts." + }, + "enableUsePasskeys": { + "message": "ā¤Ēā¤žā¤¸ā¤•āĨ€ ā¤¸ā¤šāĨ‡ā¤œā¤¨āĨ‡ ⤔⤰ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĒāĨ‚⤛āĨ‡ā¤‚" + }, + "usePasskeysDesc": { + "message": "⤍⤈ ā¤Ēā¤žā¤¸ā¤•āĨ€ ā¤¸ā¤šāĨ‡ā¤œā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤•ā¤šāĨ‡ā¤‚ ā¤¯ā¤ž ⤅ā¤Ē⤍āĨ€ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤ŽāĨ‡ā¤‚ ⤏⤂⤗āĨā¤°ā¤šāĨ€ā¤¤ ā¤Ēā¤žā¤¸ā¤•āĨ€ ⤏āĨ‡ ⤞āĨ‰ā¤— ⤇⤍ ⤕⤰āĨ‡ā¤‚āĨ¤ ⤏⤭āĨ€ ⤞āĨ‰ā¤— ⤇⤍ ⤕ā¤ŋā¤ ā¤—ā¤ ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤Ē⤰ ā¤˛ā¤žā¤—āĨ‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆāĨ¤" + }, "notificationChangeDesc": { "message": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ā¤Ŧā¤ŋ⤟ā¤ĩ⤰āĨā¤Ąā¤¨ ā¤ŽāĨ‡ā¤‚ ⤇⤏ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‹ ⤅ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?" }, @@ -634,20 +1043,26 @@ "message": "Yes, Update Now" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "⤏⤂ā¤Ļ⤰āĨā¤­ ā¤ŽāĨ‡ā¤¨āĨ‚ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" }, "contextMenuItemDesc": { "message": "ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤜āĨ‡ā¤¨ā¤°āĨ‡ā¤ļ⤍ ⤔⤰ ā¤ŽāĨˆā¤šā¤ŋ⤂⤗ ⤞āĨ‰ā¤— ⤇⤍ ⤤⤕ ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤏āĨ‡ā¤•āĨ‡ā¤‚ā¤Ąā¤°āĨ€ ⤕āĨā¤˛ā¤ŋ⤕ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚āĨ¤ " }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "ā¤Ąā¤ŋā¤ĢāĨ‰ā¤˛āĨā¤Ÿ URI ā¤ŽāĨˆā¤š ā¤Ąā¤ŋ⤟āĨ‡ā¤•āĨā¤ļ⤍", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "ā¤‘ā¤ŸāĨ‹-ā¤Ģā¤ŋ⤞ ⤜āĨˆā¤¸āĨ‡ ā¤•ā¤žā¤°āĨā¤¯āĨ‹ā¤‚ ⤕āĨ‹ ⤕⤰⤤āĨ‡ ā¤¸ā¤Žā¤¯ ⤞āĨ‰ā¤—ā¤ŋ⤍ ⤕āĨ‡ ⤞ā¤ŋā¤ URI ā¤ŽāĨˆā¤š ā¤Ąā¤ŋ⤟āĨ‡ā¤•āĨā¤ļ⤍ ⤕āĨ‹ ā¤¸ā¤‚ā¤­ā¤žā¤˛āĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤•ā¤ž ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ⤤⤰āĨ€ā¤•ā¤ž ⤚āĨā¤¨āĨ‡ā¤‚āĨ¤ " @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "⤅⤂⤧āĨ‡ā¤°ā¤ž", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "⤏āĨŒā¤°āĨ€ā¤•āĨƒā¤¤ ⤅⤂⤧āĨ‡ā¤°ā¤ž", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export Vault" }, "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "⤚āĨ‡ā¤¤ā¤žā¤ĩ⤍āĨ€", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ā¤¸ā¤žā¤ā¤ž ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž" }, - "learnOrg": { - "message": "⤏⤂⤗⤠⤍āĨ‹ā¤‚ ⤕āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤¨āĨ‡ā¤‚" - }, - "learnOrgConfirmation": { - "message": "ā¤Ŧā¤ŋ⤟ā¤ĩ⤰āĨā¤Ąā¤¨ ⤆ā¤Ē⤕āĨ‹ ā¤ā¤• ⤏⤂⤗⤠⤍ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤕āĨ‡ ⤅ā¤Ē⤍āĨ€ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤ĩ⤏āĨā¤¤āĨā¤“⤂ ⤕āĨ‹ ā¤ĻāĨ‚⤏⤰āĨ‹ā¤‚ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤žā¤ā¤ž ⤕⤰⤍āĨ‡ ⤕āĨ€ ⤅⤍āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤ā¤•āĨā¤¯ā¤ž ⤆ā¤Ē ⤅⤧ā¤ŋ⤕ ā¤œā¤žā¤¨ā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ bitwarden.com ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ ā¤Ē⤰ ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šāĨ‡ā¤‚⤗āĨ‡?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "⤏⤂⤗⤠⤍ ā¤ŽāĨ‡ā¤‚ ⤞āĨ‡ ā¤œā¤žā¤ā¤" @@ -762,6 +1204,9 @@ "file": { "message": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ⤚⤝⤍ ⤕⤰āĨ‡ā¤‚āĨ¤" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB of encrypted file storage." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "⤆ā¤Ē bitwarden.com ā¤ĩāĨ‡ā¤Ŧ ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ā¤Ē⤰ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ⤏ā¤Ļ⤏āĨā¤¯ā¤¤ā¤ž ⤖⤰āĨ€ā¤Ļ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ā¤•āĨā¤¯ā¤ž ⤆ā¤Ē ⤅ā¤Ŧ ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ ā¤Ē⤰ ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "⤆ā¤Ē ā¤ā¤• ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ⤏ā¤Ļ⤏āĨā¤¯ ā¤šāĨˆā¤‚!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤ĒāĨ‚ā¤°ā¤ž" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator App" }, - "authenticatorAppDesc": { - "message": "ā¤¸ā¤Žā¤¯-ā¤†ā¤§ā¤žā¤°ā¤ŋ⤤ ⤏⤤āĨā¤¯ā¤žā¤Ē⤍ ⤕āĨ‹ā¤Ą ⤉⤤āĨā¤Ē⤍āĨā¤¨ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤• ⤐ā¤Ē (⤜āĨˆā¤¸āĨ‡ Authy ā¤¯ā¤ž Google Authenticator) ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚āĨ¤", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "⤅ā¤Ē⤍āĨ‡ ā¤–ā¤žā¤¤āĨ‡ ⤤⤕ ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ YubiKey ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚āĨ¤ YubiKey 4, 4 ⤍āĨˆā¤¨āĨ‹, 4C, ⤔⤰ NEO ⤉ā¤Ē⤕⤰⤪āĨ‹ā¤‚ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤" }, - "duoDesc": { - "message": "ā¤ĄāĨā¤“ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ⤐ā¤Ē, ā¤ā¤¸ā¤ā¤Žā¤ā¤¸, ā¤ĢāĨ‹ā¤¨ ⤕āĨ‰ā¤˛ ā¤¯ā¤ž U2F ⤏āĨā¤°ā¤•āĨā¤ˇā¤ž ⤕āĨā¤‚ā¤œāĨ€ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤕āĨ‡ ā¤ĄāĨā¤“ ⤏ā¤ŋ⤕āĨā¤¯āĨ‹ā¤°ā¤ŋ⤟āĨ€ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚āĨ¤", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "ā¤ˆā¤ŽāĨ‡ā¤˛" }, - "emailDesc": { - "message": "⤏⤤āĨā¤¯ā¤žā¤Ē⤍ ⤕āĨ‹ā¤Ą ⤆ā¤Ē⤕āĨ‹ ā¤ˆā¤ŽāĨ‡ā¤˛ ⤕ā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤" + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted Environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premise hosted bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom Environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "⤏⤰āĨā¤ĩ⤰ URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API Server URL" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "ā¤Ē⤰āĨā¤¯ā¤žā¤ĩ⤰⤪ URL ⤕āĨ‹ ā¤Ŧā¤šā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "ā¤Ÿā¤•ā¤°ā¤žā¤ĩ ⤏āĨ‡ ā¤Ŧ⤚⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤅ā¤Ē⤍āĨ‡ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ⤰ ⤕āĨ€ ⤅⤂⤤⤰āĨā¤¨ā¤ŋā¤šā¤ŋ⤤ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤ĒāĨā¤°ā¤Ŧ⤂⤧⤕ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗ ⤕āĨ‹ ā¤Ŧ⤂ā¤Ļ ⤕⤰āĨ‡ā¤‚." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ⤰ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗ ⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Enable Auto-fill On Page Load." }, "enableAutoFillOnPageLoadDesc": { "message": "⤝ā¤Ļā¤ŋ ⤞āĨ‰ā¤—ā¤ŋ⤍ ā¤ĢāĨ‰ā¤°āĨā¤Ž ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤šā¤˛ā¤¤ā¤ž ā¤šāĨˆ, ⤤āĨ‹ ā¤ĩāĨ‡ā¤Ŧ ā¤ĒāĨ‡ā¤œ ⤞āĨ‹ā¤Ą ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ē⤰ ⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤‘ā¤ŸāĨ‹-ā¤Ģā¤ŋ⤞ ⤕⤰āĨ‡ā¤‚āĨ¤" }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "⤞āĨ‰ā¤—ā¤ŋ⤍ ā¤†ā¤‡ā¤Ÿā¤Ž ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤‘ā¤ŸāĨ‹ā¤Ģā¤ŋ⤞ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "ā¤¸ā¤žā¤‡ā¤Ąā¤Ŧā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ⤖āĨ‹ā¤˛āĨ‡" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ⤞āĨ‰ā¤• ⤕⤰āĨ‡ā¤‚" }, - "privateModeWarning": { - "message": "⤍ā¤ŋ⤜āĨ€ ā¤ŽāĨ‹ā¤Ą ā¤¸ā¤Žā¤°āĨā¤Ĩ⤍ ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤—ā¤ŋ⤕ ā¤šāĨˆ ⤔⤰ ⤕āĨā¤› ⤏āĨā¤ĩā¤ŋā¤§ā¤žā¤ā¤ ⤏āĨ€ā¤Žā¤ŋ⤤ ā¤šāĨˆā¤‚āĨ¤" - }, "customFields": { "message": "Custom Fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "ā¤ŦāĨ‚⤞ā¤ŋ⤝⤍" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "⤜āĨā¤Ąā¤ŧā¤ž ā¤šāĨā¤†", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ⤞āĨ‰ā¤—ā¤ŋ⤍ ⤕āĨ‡ ⤆⤗āĨ‡ ā¤ā¤• ā¤Ēā¤šā¤šā¤žā¤¨ā¤¨āĨ‡ ⤝āĨ‹ā¤—āĨā¤¯ ⤛ā¤ĩā¤ŋ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚āĨ¤" }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "ā¤ŦāĨˆā¤œ ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "ā¤Ēā¤šā¤šā¤žā¤¨" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "ā¤¨ā¤¯ā¤ž $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ ⤏⤂ā¤Ēā¤žā¤Ļ⤍", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤇⤤ā¤ŋā¤šā¤žā¤¸" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "ā¤ĩā¤žā¤Ē⤏ ā¤œā¤žā¤ā¤‚" }, "collections": { "message": "⤏⤂⤗āĨā¤°ā¤š" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "ā¤ŦāĨ‡ā¤¸ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤¨ā¤žā¤Ž", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match Detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ā¤Ąā¤ŋā¤ĢāĨ‰ā¤˛āĨā¤Ÿ ā¤ŽāĨˆā¤š ā¤Ąā¤ŋ⤟āĨ‡ā¤•āĨā¤ļ⤍", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle Options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "⤏āĨ‚ā¤šāĨ€ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤕āĨ‹ā¤ˆ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤" }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "ā¤šā¤Ÿā¤žā¤ā¤‚" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "ā¤Ēā¤ŋ⤍ ⤏āĨ‡ ⤅⤍⤞āĨ‰ā¤• ⤕⤰āĨ‡ā¤‚ " }, + "setYourPinTitle": { + "message": "ā¤Ēā¤ŋ⤍ ⤏āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚" + }, + "setYourPinButton": { + "message": "ā¤Ēā¤ŋ⤍ ⤏āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚" + }, "setYourPinCode": { "message": "ā¤Ŧā¤ŋ⤟ā¤ĩ⤰āĨā¤Ąā¤¨ ⤕āĨ‹ ⤅⤍⤞āĨ‰ā¤• ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤅ā¤Ēā¤¨ā¤ž ā¤Ēā¤ŋ⤍ ⤕āĨ‹ā¤Ą ⤏āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚ ⤝ā¤Ļā¤ŋ ⤆ā¤Ē ⤕⤭āĨ€ ⤭āĨ€ ⤆ā¤ĩāĨ‡ā¤Ļ⤍ ⤏āĨ‡ ā¤ĒāĨ‚⤰āĨ€ ā¤¤ā¤°ā¤š ⤞āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ⤕⤰⤤āĨ‡ ā¤šāĨˆā¤‚ ⤤āĨ‹ ⤆ā¤Ē⤕āĨ€ ā¤Ēā¤ŋ⤍ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸ ⤰āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ€āĨ¤" }, + "setYourPinCode1": { + "message": "ā¤Ŧā¤ŋ⤟ā¤ĩ⤰āĨā¤Ąā¤¨ ⤕āĨ‹ ⤅⤍⤞āĨ‰ā¤• ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤆ā¤Ē⤕āĨ‡ ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ⤆ā¤Ē⤕āĨ‡ ā¤Ēā¤ŋ⤍ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ⤝ā¤Ļā¤ŋ ⤆ā¤Ē ⤕⤭āĨ€ ⤭āĨ€ ā¤Ŧā¤ŋ⤟ā¤ĩ⤰āĨā¤Ąā¤¨ ⤏āĨ‡ ā¤ĒāĨ‚⤰āĨ€ ā¤¤ā¤°ā¤š ⤞āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤šāĨ‹ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚ ⤤āĨ‹ ⤆ā¤Ēā¤•ā¤ž ā¤Ēā¤ŋ⤍ ⤰āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤" + }, "pinRequired": { "message": "ā¤Ēā¤ŋ⤍-⤕āĨ‹ā¤Ą ⤆ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ |" }, "invalidPin": { "message": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤Ēā¤ŋ⤍ ⤕āĨ‹ā¤ĄāĨ¤" }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "ā¤Ŧā¤žā¤¯āĨ‹ā¤ŽāĨ‡ā¤ŸāĨā¤°ā¤ŋ⤕āĨā¤¸ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰ ⤅⤍⤞āĨ‰ā¤• ⤕⤰āĨ‡ā¤‚" }, + "unlockWithMasterPassword": { + "message": "ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨ‡ ⤖āĨ‹ā¤˛āĨ‡ā¤‚" + }, "awaitDesktop": { "message": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ⤏āĨ‡ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤ž ā¤‡ā¤‚ā¤¤ā¤œā¤žā¤°" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ⤰ ā¤ĒāĨā¤¨ā¤ƒ ⤆⤰⤂⤭ ⤕⤰⤍āĨ‡ ā¤Ē⤰ ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤞āĨ‰ā¤• ⤕⤰āĨ‡ā¤‚" }, + "lockWithMasterPassOnRestart1": { + "message": "ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ⤰ ā¤ĒāĨā¤¨ā¤°ā¤žā¤°ā¤‚⤭ ā¤Ē⤰ ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ€ ⤆ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ" + }, "selectOneCollection": { "message": "⤆ā¤Ē⤕āĨ‹ ā¤•ā¤Ž ⤏āĨ‡ ā¤•ā¤Ž ā¤ā¤• ⤏⤂⤗āĨā¤°ā¤š ā¤•ā¤ž ⤚⤝⤍ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤" }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "ā¤ā¤• ā¤¯ā¤ž ā¤ā¤• ⤏āĨ‡ ⤅⤧ā¤ŋ⤕ ⤏⤂⤗⤠⤍ ⤍āĨ€ā¤¤ā¤ŋā¤¯ā¤žā¤‚ ⤆ā¤Ē⤕āĨ€ ⤜⤍⤰āĨ‡ā¤Ÿā¤° ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋ⤤ ⤕⤰ ā¤°ā¤šāĨ€ ā¤šāĨˆā¤‚āĨ¤" }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ā¤Žā¤§āĨā¤¯ā¤žā¤‚⤤⤰ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ" }, + "vaultTimeoutAction1": { + "message": "ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ" + }, "lock": { "message": "⤞āĨ‰ā¤•", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ā¤ĨāĨā¤°āĨˆā¤ļ", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ā¤Ŧā¤šā¤žā¤˛ ā¤†ā¤‡ā¤Ÿā¤Ž" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "⤞āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ⤕⤰⤍āĨ‡ ⤏āĨ‡ ā¤ĩāĨ‰ā¤˛āĨā¤Ÿā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ⤏⤂⤭ā¤ĩ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž ⤔⤰ ā¤¸ā¤Žā¤¯ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ⤕āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•⤰⤪ ⤕āĨ€ ⤆ā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤—āĨ€āĨ¤ ⤆ā¤Ē ⤇⤏ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĩā¤ŋā¤ļāĨā¤ĩ⤏āĨā¤¤ ā¤šāĨˆā¤‚?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ā¤‘ā¤ŸāĨ‹ ā¤Ģā¤ŋ⤞ ⤔⤰ ⤏āĨ‡ā¤ĩ" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "ā¤‘ā¤ŸāĨ‹ ā¤Ģā¤ŋ⤞ ā¤†ā¤‡ā¤Ÿā¤Ž ⤔⤰ ⤏āĨ‡ā¤ĩ URI" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "⤆ā¤Ēā¤•ā¤ž ā¤¨ā¤¯ā¤ž ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤ĒāĨ‰ā¤˛ā¤ŋ⤏āĨ€ ⤆ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤žā¤“ā¤‚ ⤕āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤" }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "⤇⤏ ā¤ŦāĨ‰ā¤•āĨā¤¸ ⤕āĨ€ ā¤œā¤žā¤‚ā¤š ⤕⤰⤕āĨ‡ ⤆ā¤Ē ⤍ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋ⤖ā¤ŋ⤤ ⤏āĨ‡ ā¤¸ā¤šā¤Žā¤¤ ā¤šāĨˆā¤‚:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "⤠āĨ€ā¤• ā¤šāĨˆ" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ⤏ā¤ŋ⤂⤕ ⤏⤤āĨā¤¯ā¤žā¤Ē⤍" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "ā¤–ā¤žā¤¤ā¤ž ⤗⤞⤤ ā¤ŽāĨˆā¤š" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "ā¤ŦāĨ‡ā¤ŽāĨ‡ā¤˛ ā¤Ŧā¤žā¤¯āĨ‹ā¤ŽāĨ‡ā¤ŸāĨā¤°ā¤ŋ⤕ ⤕āĨā¤‚ā¤œāĨ€" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "ā¤Ŧā¤žā¤¯āĨ‹ā¤ŽāĨ‡ā¤ŸāĨā¤°ā¤ŋ⤕ ⤅⤍⤞āĨ‰ā¤• ā¤ĩā¤ŋā¤Ģ⤞ ā¤°ā¤šā¤ž. ā¤Ŧā¤žā¤¯āĨ‹ā¤ŽāĨ‡ā¤ŸāĨā¤°ā¤ŋ⤕ ⤗āĨā¤ĒāĨā¤¤ ⤕āĨā¤‚ā¤œāĨ€ ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ⤕āĨ‹ ⤅⤍⤞āĨ‰ā¤• ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģ⤞ ā¤°ā¤šāĨ€. ⤕āĨƒā¤Ēā¤¯ā¤ž ā¤Ŧā¤žā¤¯āĨ‹ā¤ŽāĨ‡ā¤ŸāĨā¤°ā¤ŋ⤕āĨā¤¸ ⤕āĨ‹ ā¤Ģā¤ŋ⤰ ⤏āĨ‡ ⤏āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ⤕⤰āĨ‡ā¤‚." + }, "biometricsNotEnabledTitle": { "message": "ā¤ŦāĨ‰ā¤¯āĨ‹ā¤ŽāĨ€ā¤ŸāĨā¤°ā¤ŋ⤕āĨā¤¸ ⤏⤕āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ⤰ ā¤ŦāĨ‰ā¤¯āĨ‹ā¤ŽāĨ€ā¤ŸāĨā¤°ā¤ŋ⤕āĨā¤¸ ⤇⤏ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ē⤰ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋ⤤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ā¤ā¤• ⤏⤂⤗⤠⤍ ⤍āĨ€ā¤¤ā¤ŋ ⤆ā¤Ē⤕āĨ‡ ⤏āĨā¤ĩā¤žā¤Žā¤ŋ⤤āĨā¤ĩ ā¤ĩā¤ŋ⤕⤞āĨā¤ĒāĨ‹ā¤‚ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋ⤤ ⤕⤰ ā¤°ā¤šāĨ€ ā¤šāĨˆāĨ¤" }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "ā¤Ŧā¤šā¤ŋ⤎āĨā¤•āĨƒā¤¤ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨" }, "excludedDomainsDesc": { "message": "ā¤Ŧā¤ŋ⤟ā¤ĩ⤰āĨā¤Ąā¤¨ ⤇⤍ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤞āĨ‰ā¤—ā¤ŋ⤍ ā¤ĩā¤ŋā¤ĩ⤰⤪ ā¤¸ā¤šāĨ‡ā¤œā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤šāĨ‡ā¤—ā¤žāĨ¤ā¤Ē⤰ā¤ŋā¤ĩ⤰āĨā¤¤ā¤¨āĨ‹ā¤‚ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩāĨ€ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤆ā¤Ē⤕āĨ‹ ā¤ĒāĨƒā¤ˇāĨā¤  ⤕āĨ‹ ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž |" }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "⤭āĨ‡ā¤œāĨ‡ā¤‚", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Sends ā¤ŽāĨ‡ ⤖āĨ‹ā¤œāĨ‡", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ā¤ļā¤ŦāĨā¤Ļ" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛" }, @@ -1666,6 +2406,9 @@ "message": "⤏⤭āĨ€ Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "ā¤ŽāĨˆā¤•āĨā¤¸ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•ā¤žā¤‰ā¤‚ā¤Ÿ ā¤Ēā¤šāĨā¤‚ā¤š ā¤—ā¤¯ā¤ž ā¤šāĨˆ", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ā¤šāĨˆ" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "⤕āĨ‰ā¤ĒāĨ€ Send ⤞ā¤ŋ⤂⤕", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ⤇⤏ Send ⤕āĨ‹ ā¤Žā¤ŋā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē ⤇⤏ ā¤ĒāĨā¤°āĨ‡ā¤ˇā¤ŋ⤤ ⤏⤂ā¤ĻāĨ‡ā¤ļ ⤕āĨ‹ ⤏āĨā¤Ĩā¤žā¤¯āĨ€ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "ā¤ā¤Ąā¤ŋ⤟ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": " ā¤¯ā¤š ⤏āĨ‡ā¤‚ā¤Ą ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ⤤ā¤ŋā¤Ĩā¤ŋ ⤔⤰ ā¤¸ā¤Žā¤¯ ā¤Ē⤰ ⤏āĨā¤Ĩā¤žā¤¯āĨ€ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ ⤤ā¤ŋā¤Ĩā¤ŋ" }, @@ -1769,6 +2523,10 @@ "message": "ā¤ĩāĨˆā¤•⤞āĨā¤Ēā¤ŋ⤕ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤žā¤“⤂ ⤕āĨ‹ ⤇⤏ ⤏āĨ‡ā¤‚ā¤Ą ⤤⤕ ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ€ ⤆ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤—āĨ€āĨ¤", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "⤇⤏ ⤏āĨ‡ā¤‚ā¤Ą ⤕āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤍ā¤ŋ⤜āĨ€ ⤍āĨ‹ā¤ŸāĨā¤¸āĨ¤", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "ā¤¨ā¤¯ā¤ž ⤏āĨ‡ā¤‚ā¤Ą ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "⤏āĨ‡ā¤‚ā¤Ą ā¤ā¤Ąā¤ŋ⤟ ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤚āĨā¤¨ā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤, ā¤¸ā¤žā¤‡ā¤Ąā¤Ŧā¤žā¤° (⤝ā¤Ļā¤ŋ ⤏⤂⤭ā¤ĩ ā¤šāĨ‹) ā¤ŽāĨ‡ā¤‚ ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļ⤍ ⤖āĨ‹ā¤˛āĨ‡ā¤‚ ā¤¯ā¤ž ⤇⤏ ā¤ŦāĨˆā¤¨ā¤° ā¤Ē⤰ ⤕āĨā¤˛ā¤ŋ⤕ ⤕⤰⤕āĨ‡ ā¤ā¤• ⤍⤈ ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹ ⤕āĨ‹ ā¤ĒāĨ‰ā¤Ē ā¤†ā¤‰ā¤Ÿ ⤕⤰āĨ‡ā¤‚āĨ¤" }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "⤏ā¤Ģā¤žā¤°āĨ€ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤕āĨ‡ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤚āĨā¤¨ā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤, ⤇⤏ ā¤ŦāĨˆā¤¨ā¤° ā¤Ē⤰ ⤕āĨā¤˛ā¤ŋ⤕ ⤕⤰⤕āĨ‡ ā¤ā¤• ⤍⤈ ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹ ⤕āĨ‹ ā¤ĒāĨ‰ā¤Ē ā¤†ā¤‰ā¤Ÿ ⤕⤰āĨ‡ā¤‚āĨ¤" }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "ā¤ļāĨā¤°āĨ‚ ⤕⤰⤍āĨ‡ ⤏āĨ‡ ā¤Ēā¤šā¤˛āĨ‡" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ā¤•⤰āĨā¤¤ā¤žā¤“⤂ ⤏āĨ‡ ā¤ŽāĨ‡ā¤°ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ⤛ā¤ŋā¤Ēā¤žā¤ā¤‚āĨ¤" }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "ā¤ā¤• ā¤¯ā¤ž ā¤ā¤• ⤏āĨ‡ ⤅⤧ā¤ŋ⤕ ⤏⤂⤗⤠⤍ ⤍āĨ€ā¤¤ā¤ŋā¤¯ā¤žā¤‚ ⤆ā¤Ē⤕āĨ‡ ⤏āĨ‡ā¤‚ā¤Ą ā¤ĩā¤ŋ⤕⤞āĨā¤ĒāĨ‹ā¤‚ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋ⤤ ⤕⤰ ā¤°ā¤šāĨ€ ā¤šāĨˆā¤‚āĨ¤" }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ā¤ˆā¤ŽāĨ‡ā¤˛ ⤏⤤āĨā¤¯ā¤žā¤Ē⤍ ⤆ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "⤇⤏ ⤏āĨā¤ĩā¤ŋā¤§ā¤ž ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤆ā¤Ē⤕āĨ‹ ⤅ā¤Ē⤍āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ⤕āĨ‹ ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤ ⤆ā¤Ē ā¤ĩāĨ‡ā¤Ŧ ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ā¤ŽāĨ‡ā¤‚ ⤅ā¤Ē⤍āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ⤕āĨ‹ ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ⤕⤰ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚āĨ¤" }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "⤆ā¤Ē⤕āĨ‡ ⤏⤂⤗⤠⤍ ⤍āĨ‡ ā¤ĩā¤ŋā¤ļāĨā¤ĩ⤏⤍āĨ€ā¤¯ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļ⤍ ⤅⤕āĨā¤ˇā¤Ž ⤕⤰ ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ. ⤕āĨƒā¤Ēā¤¯ā¤ž ⤅ā¤Ē⤍āĨ‡ ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ⤤⤕ ā¤Ēā¤šāĨā¤ā¤šā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚." + }, "resetPasswordPolicyAutoEnroll": { "message": "⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ā¤¨ā¤žā¤Žā¤žā¤‚ā¤•ā¤¨" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ⤚āĨā¤¨āĨ‡ā¤‚..." }, - "ssoCompleteRegistration": { - "message": "SSO ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤞āĨ‰ā¤—-⤇⤍ ā¤ĒāĨ‚⤰āĨā¤Ŗ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤, ⤕āĨƒā¤Ēā¤¯ā¤ž ⤅ā¤Ē⤍āĨ€ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ⤤⤕ ā¤Ēā¤šāĨā¤ā¤šā¤¨āĨ‡ ⤔⤰ ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ⤰⤖⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ā¤• ā¤Žā¤žā¤¸āĨā¤Ÿā¤° ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚āĨ¤" + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "⤕āĨā¤˛ $TOTAL$ ā¤ŽāĨ‡ā¤‚ ⤏āĨ‡", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "ā¤˜ā¤‚ā¤ŸāĨ‡" @@ -1904,6 +2740,9 @@ "minutes": { "message": "ā¤Žā¤ŋ⤍⤟" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "ā¤ā¤‚ā¤Ÿā¤°ā¤ĒāĨā¤°ā¤žā¤‡ā¤œā¤ŧ ⤍āĨ€ā¤¤ā¤ŋ ⤆ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤žā¤ā¤ ⤆ā¤Ē⤕āĨ‡ ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ ā¤ĩā¤ŋ⤕⤞āĨā¤ĒāĨ‹ā¤‚ ā¤Ē⤰ ā¤˛ā¤žā¤—āĨ‚ ⤕āĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤‚" + }, "vaultTimeoutPolicyInEffect": { "message": "⤆ā¤Ē⤕āĨ€ ⤏⤂⤗⤠⤍ ⤍āĨ€ā¤¤ā¤ŋā¤¯ā¤žā¤‚ ⤆ā¤Ē⤕āĨ‡ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋ⤤ ⤕⤰ ā¤°ā¤šāĨ€ ā¤šāĨˆā¤‚āĨ¤ ⤅⤧ā¤ŋā¤•ā¤¤ā¤Ž ⤅⤍āĨā¤Žā¤¤ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ $HOURS$ ā¤˜ā¤‚ā¤ŸāĨ‡ ⤔⤰ $MINUTES$ ā¤Žā¤ŋ⤍⤟ ā¤šāĨˆ", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "⤅⤧ā¤ŋā¤•ā¤¤ā¤Ž $HOURS$ ā¤˜ā¤‚ā¤ŸāĨ‡ ⤔⤰ $MINUTES$ ā¤Žā¤ŋ⤍⤟)āĨ¤", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ ⤆ā¤Ē⤕āĨ‡ ⤏⤂⤗⤠⤍ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧ⤂⤧ ⤏āĨ‡ ⤅⤧ā¤ŋ⤕ ā¤šāĨˆ: ⤅⤧ā¤ŋā¤•ā¤¤ā¤Ž $HOURS$ ā¤˜ā¤‚ā¤ŸāĨ‡ ⤔⤰ $MINUTES$ ā¤Žā¤ŋ⤍⤟", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "ā¤ā¤°ā¤°" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤¨ā¤žā¤ā¤" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { "message": "ā¤‘ā¤ŸāĨ‹-ā¤Ģā¤ŧā¤ŋ⤞ ⤕āĨˆā¤¸āĨ‡ ⤕⤰āĨ‡ā¤‚" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ⤉ā¤Ēā¤¨ā¤žā¤Ž" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "⤏āĨ€ā¤§āĨ‡ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤Ē⤰ ā¤œā¤žā¤ā¤‚" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ā¤ĄāĨ‡ā¤Ÿā¤ž ⤍ā¤ŋ⤰āĨā¤¯ā¤žā¤¤ ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "⤐⤕āĨā¤¸āĨ‡ā¤¸ā¤ŋ⤂⤗" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "ā¤šā¤Žā¤žā¤°āĨ€ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ā¤ĩāĨ‡ā¤Ŧ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ē⤰ ā¤ĩā¤ŋ⤏āĨā¤¤āĨƒā¤¤ ⤍ā¤ŋ⤰āĨā¤ĻāĨ‡ā¤ļ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "ā¤Ģā¤ŧā¤ŋ⤞āĨā¤Ÿā¤°" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "ā¤ā¤¨ā¤ŋā¤ŽāĨ‡ā¤ļ⤍ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "ā¤Ŧā¤ŋ⤟ā¤ĩā¤žā¤°āĨā¤Ąā¤¨ ā¤•ā¤ž ā¤¨ā¤¯ā¤ž ⤰āĨ‚ā¤Ē!" + }, + "bitwardenNewLookDesc": { + "message": "ā¤ĩāĨ‰ā¤˛āĨā¤Ÿ ⤟āĨˆā¤Ŧ ⤏āĨ‡ ā¤‘ā¤ŸāĨ‹ā¤Ģā¤ŋ⤞ ⤔⤰ ⤏⤰āĨā¤š ā¤•ā¤°ā¤¨ā¤ž ā¤Ēā¤šā¤˛āĨ‡ ⤏āĨ‡ ā¤•ā¤šāĨ€ā¤‚ ⤜ā¤ŧāĨā¤¯ā¤žā¤Ļā¤ž ā¤†ā¤¸ā¤žā¤¨ ⤔⤰ ā¤¸ā¤šā¤œ ā¤šāĨˆāĨ¤ ⤏ā¤Ŧ⤕āĨā¤› ⤧āĨā¤¯ā¤žā¤¨ ⤏āĨ‡ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "⤇⤏ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗ ā¤Ē⤰ ā¤ā¤‚ā¤Ÿā¤°ā¤ĒāĨā¤°ā¤žā¤‡ā¤œā¤ŧ ⤍āĨ€ā¤¤ā¤ŋ ⤆ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤žā¤ā¤ ā¤˛ā¤žā¤—āĨ‚ ⤕āĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤‚" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "ā¤ĒāĨā¤¨: ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ⤕⤰āĨ‡ā¤‚" + }, + "vaultCustomTimeoutMinimum": { + "message": "⤍āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ⤕⤏āĨā¤Ÿā¤Ž ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ 1 ā¤Žā¤ŋ⤍⤟ ā¤šāĨˆ." + }, + "additionalContentAvailable": { + "message": "⤅⤤ā¤ŋ⤰ā¤ŋ⤕āĨā¤¤ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤šāĨˆ" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 9113a3b2687..3521a247a06 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - besplatni upravitelj lozinki", + "message": "Bitwarden upravitelj lozinki", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden je siguran i besplatan upravitelj lozinki za sve tvoje uređaje.", - "description": "Extension description" + "message": "Kod kuće, na poslu ili u pokretu, Bitwarden ÅĄtiti sve tvoje lozinke, pristupne ključeve i osjetljive informacije", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Prijavi se ili stvori novi račun za pristup svojem sigurnom trezoru." }, + "inviteAccepted": { + "message": "Pozivnica prihvaćena" + }, "createAccount": { "message": "Stvori račun" }, - "login": { - "message": "Prijava" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Postavi jaku lozinku" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "DovrÅĄi stvaranje svog računa postavljanjem lozinke" }, "enterpriseSingleSignOn": { "message": "Jedinstvena prijava na razini tvrtke (SSO)" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Podsjetnik glavne lozinke ti moÅže pomoći da se prisjetiÅĄ svoje lozinke ako ju zaboraviÅĄ." }, + "masterPassHintText": { + "message": "Podsjetnik ti moÅžemo poslati ako zaboraviÅĄ svoju lozinku. NajviÅĄe $CURRENT$/$MAXIMUM$ znakova.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Ponovno upiÅĄi glavnu lozinku" }, "masterPassHint": { "message": "Podsjetnik glavne lozinke (neobavezno)" }, + "joinOrganization": { + "message": "PridruÅži se organizaciji" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "DovrÅĄi pridruÅživanje organizaciji postavljanjem glavne lozinke." + }, "tab": { "message": "Kartica" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopiraj lozinku" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Kopiraj biljeÅĄku" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopiraj kontrolni broj" }, + "copyName": { + "message": "Kopiraj naziv" + }, + "copyCompany": { + "message": "Kopiraj tvrtku" + }, + "copySSN": { + "message": "Kopiraj OIB" + }, + "copyPassportNumber": { + "message": "Kopiraj broj putovnice" + }, + "copyLicenseNumber": { + "message": "Kopiraj OIB" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Kopiraj $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiraj web stranicu" + }, + "copyNotes": { + "message": "Kopiraj biljeÅĄke" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-ispuna" }, + "autoFillLogin": { + "message": "Auto-ispuna prijave" + }, + "autoFillCard": { + "message": "Auto-ispuna kartice" + }, + "autoFillIdentity": { + "message": "Auto-ispuna identiteta" + }, "generatePasswordCopied": { "message": "Generiraj lozinku (i kopiraj)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Nema podudarajućih prijava" }, + "noCards": { + "message": "Nema kartica" + }, + "noIdentities": { + "message": "Nema identiteta" + }, + "addLoginMenu": { + "message": "Dodaj prijavu" + }, + "addCardMenu": { + "message": "Dodaj karticu" + }, + "addIdentityMenu": { + "message": "Dodaj identitet" + }, "unlockVaultMenu": { "message": "Otključaj svoj trezor" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Dodaj stavku" }, + "accountEmail": { + "message": "e-poÅĄta računa" + }, + "requestHint": { + "message": "ZatraÅži podsjetnik" + }, + "requestPasswordHint": { + "message": "ZatraÅži podsjetnik lozinke" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Unesi svoju adresu e-poÅĄte računa i poslat ćemo ti tvoj podsjetnik" + }, "passwordHint": { "message": "Podsjetnik za lozinku" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Potvrdite lozinku za nastavak." }, - "account": { - "message": "Račun" - }, "changeMasterPassword": { "message": "Promjeni glavnu lozinku" }, + "continueToWebApp": { + "message": "Nastavi na web aplikaciju?" + }, + "continueToWebAppDesc": { + "message": "Pronađi viđe značajki svojeg Bitwarden računa u web aplikaciji." + }, + "continueToHelpCenter": { + "message": "Nastavi u centar za pomoć?" + }, + "continueToHelpCenterDesc": { + "message": "Za pomoć oko koriÅĄtenja Bitwardena posjeti centar za pomoć." + }, + "continueToBrowserExtensionStore": { + "message": "Nastaviti na trgovinu proÅĄirenja za preglednik?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "ÅŊeliÅĄ preporučiti Bitwarden drugima? Posjeti trgovinu proÅĄirenja svojeg preglednika i ostavi recenziju." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Svoju lozinku moÅžeÅĄ promijeniti u Bitwarden web aplikaciji." + }, "fingerprintPhrase": { "message": "Jedinstvena fraza", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Odjava" }, + "aboutBitwarden": { + "message": "O Bitwardenu" + }, "about": { "message": "O aplikaciji" }, + "moreFromBitwarden": { + "message": "ViÅĄe od Bitwardena" + }, + "continueToBitwardenDotCom": { + "message": "Nastavi na bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden za tvrtke" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden autentifikator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden autentifikator omogućuje pohranu ključeva za autentifikaciju i generiranje TOTP kodova za dvostruku autentifikaciju. Saznaj viÅĄe na web stranici bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Sigurno pohrani, upravljaj i dijeli programerske tajne s Bitwarden Secrets Managerom. Saznajte viÅĄe na web stranici bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Stvori laka i sigurna iskustva prijave bez tradicionalnih lozinki uz Passwordless.dev. Saznaj viÅĄe na web stranici bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Besplatan obiteljski Bitwarden" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "IspunjavaÅĄ uvjete za besplatni obiteljski Bitwarden. Iskoristi ovu ponudu u web aplikaciji već danas." + }, "version": { "message": "Verzija" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Uredi mapu" }, + "newFolder": { + "message": "Nova mapa" + }, + "folderName": { + "message": "Naziv mape" + }, + "folderHintText": { + "message": "Ugnijezdi mapu dodavanjem naziva roditeljske mape i znaka kroz. Npr. MreÅže/Forumi" + }, + "noFoldersAdded": { + "message": "Mapa nije dodana" + }, + "createFoldersToOrganize": { + "message": "Za organiziranje stavki u trezoru, stvori mape" + }, + "deleteFolderPermanently": { + "message": "Sigurno ÅželiÅĄ trajno izbrisati ovu mapu?" + }, "deleteFolder": { "message": "IzbriÅĄi mapu" }, @@ -218,12 +418,12 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatski generiraj jake, jedinstvene lozinke." }, - "bitWebVault": { + "bitWebVaultApp": { "message": "Bitwarden web trezor" }, "importItems": { @@ -235,26 +435,72 @@ "generatePassword": { "message": "Generiraj lozinku" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Ponovno generiraj lozinku" }, "options": { - "message": "Opcije" + "message": "Mogućnosti" }, "length": { "message": "Duljina" }, + "passwordMinLength": { + "message": "Minimalna duljina lozinke" + }, "uppercase": { - "message": "Velika slova (A - Z)" + "message": "Velika slova (A - Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Mala slova (a - z)" + "message": "Mala slova (a - z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Brojevi (0 - 9)" + "message": "Brojevi (0 - 9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Posebni znakovi (!@#$%^&*)" + "message": "Posebni znakovi (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Uključi", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Uključi velika slova", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Uključi mala slova", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Uključi brojeve", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Uključi posebne znakove", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Broj riječi" @@ -276,7 +522,16 @@ "message": "Najmanje posebnih" }, "avoidAmbChar": { - "message": "Izbjegavaj dvosmislene znakove" + "message": "Izbjegavaj dvosmislene znakove", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Izbjegavaj dvosmislene znakove", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Pravila tvrtke primjenjena su na generator.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "PretraÅži trezor" @@ -299,15 +554,30 @@ "password": { "message": "Lozinka" }, + "totp": { + "message": "Tajna autentifikatora" + }, "passphrase": { "message": "Frazna lozinka" }, "favorite": { "message": "Favorit" }, + "unfavorite": { + "message": "Ukloni iz favorita" + }, + "itemAddedToFavorites": { + "message": "Dodaj stavku u omiljene" + }, + "itemRemovedFromFavorites": { + "message": "Stavka uklonjenja iz omiljenih" + }, "notes": { "message": "BiljeÅĄke" }, + "privateNote": { + "message": "Privatna biljeÅĄka" + }, "note": { "message": "BiljeÅĄka" }, @@ -326,6 +596,18 @@ "launch": { "message": "Pokreni" }, + "launchWebsite": { + "message": "Pokreni web stranicu" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Web stranica" }, @@ -338,9 +620,24 @@ "other": { "message": "Ostalo" }, + "unlockMethods": { + "message": "Mogućnosti otključavanja" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Za promjenu vremena isteka trezora, odredi način otključavanja." }, + "unlockMethodNeeded": { + "message": "Postavi način otključavanja u Postavkama" + }, + "sessionTimeoutHeader": { + "message": "Istek sesije" + }, + "vaultTimeoutHeader": { + "message": "Istek trezora" + }, + "otherOptions": { + "message": "Ostale postavke" + }, "rateExtension": { "message": "Ocijeni proÅĄirenje" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Tvoj trezor je zaključan. Potvrdi glavnu lozinku za nastavak." }, + "yourVaultIsLockedV2": { + "message": "Trezor je zaključan" + }, + "yourAccountIsLocked": { + "message": "Račun je zaključan" + }, + "or": { + "message": "ili" + }, "unlock": { "message": "Otključaj" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Istek trezora" }, + "vaultTimeout1": { + "message": "Vrijeme isteka" + }, "lockNow": { "message": "Zaključaj sada" }, + "lockAll": { + "message": "Zaključaj sve" + }, "immediately": { "message": "Odmah" }, @@ -426,6 +738,18 @@ "security": { "message": "Sigurnost" }, + "confirmMasterPassword": { + "message": "Potvrdi glavnu lozinku" + }, + "masterPassword": { + "message": "Glavna lozinka" + }, + "masterPassImportant": { + "message": "Glavnu lozinku nije moguće oporaviti ako ju zaboraviÅĄ!" + }, + "masterPassHintLabel": { + "message": "Podsjetnik glavne lozinke" + }, "errorOccurred": { "message": "DoÅĄlo je do pogreÅĄke" }, @@ -455,7 +779,19 @@ "message": "Potvrda glavne lozinke se ne podudara." }, "newAccountCreated": { - "message": "Tvoj novi račun je kreiran! Sada se moÅžeÅĄ prijaviti." + "message": "Tvoj novi račun je stvoren! Sada se moÅžeÅĄ prijaviti." + }, + "newAccountCreated2": { + "message": "Tvoj novi račun je stvoren!" + }, + "youHaveBeenLoggedIn": { + "message": "Prijava uspjeÅĄna!" + }, + "youSuccessfullyLoggedIn": { + "message": "Prijava uspjeÅĄna" + }, + "youMayCloseThisWindow": { + "message": "MoÅžeÅĄ zatvoriti ovaj prozor" }, "masterPassSent": { "message": "Poslali smo e-poÅĄtu s podsjetnikom glavne lozinke." @@ -463,6 +799,9 @@ "verificationCodeRequired": { "message": "Potvrdni kôd je obavezan." }, + "webauthnCancelOrTimeout": { + "message": "Autentifikacija je otkazana ili je trajala predugo. Molimo pokuÅĄaj ponovno." + }, "invalidVerificationCode": { "message": "NevaÅžeći kôd za provjeru" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Nije moguće auto-ispuniti odabranu prijavu na ovoj stranici. Umjesto toga kopiraj/zalijepi podatke." }, + "totpCaptureError": { + "message": "Nije moguće skenirati QR kod s trenutne web stranice" + }, + "totpCaptureSuccess": { + "message": "Ključ autentifikatora je dodan" + }, + "totpCapture": { + "message": "Skeniraj QR kôd autentifikatora s trenutne web stranice" + }, + "totpHelperTitle": { + "message": "Učini dvostruku autentifikaciju besprijekornom" + }, + "totpHelper": { + "message": "Bitwarden moÅže pohraniti i ispuniti kodove za dvostruku autentifikaciju. Kopiraj i zalijepi ključ u ovo polje." + }, + "totpHelperWithCapture": { + "message": "Bitwarden moÅže pohraniti i ispuniti kodove za dvostruku autentifikaciju. Odaberi ikonu kamere i označi QR kôd za provjeru autentičnosti ove web stranice ili kopiraj i zalijepi ključ u ovo polje." + }, + "learnMoreAboutAuthenticators": { + "message": "ViÅĄe o autentifikatorima" + }, + "copyTOTP": { + "message": "Kopiraj ključ autentifikatora (TOTP)" + }, "loggedOut": { "message": "Odjavljen" }, + "loggedOutDesc": { + "message": "Odjavljen/a si sa svog računa." + }, "loginExpired": { "message": "Sesija je istekla." }, + "logIn": { + "message": "Prijavi se" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Ponovno pokreni registraciju" + }, + "expiredLink": { + "message": "Istekla poveznica" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Ponovno pokreni registraciju ili se pokuÅĄaj prijaviti." + }, + "youMayAlreadyHaveAnAccount": { + "message": "MoÅžda već imaÅĄ račun" + }, "logOutConfirmation": { "message": "Sigurno se ÅželiÅĄ odjaviti?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Mapa dodana" }, - "changeMasterPass": { - "message": "Promjeni glavnu lozinku" - }, - "changeMasterPasswordConfirmation": { - "message": "Svoju glavnu lozinku moÅžeÅĄ promijeniti na web trezoru. ÅŊeliÅĄ li sada posjetiti bitwarden.com?" - }, "twoStepLoginConfirmation": { "message": "Prijava dvostrukom autentifikacijom čini tvoj račun joÅĄ sigurnijim tako ÅĄto će zahtijevati da potvrdiÅĄ prijavu putem drugog uređaja pomoću sigurnosnog koda, autentifikatorske aplikacije, SMS-om, pozivom ili e-poÅĄtom. Prijavu dvostrukom autentifikacijom moÅžeÅĄ omogućiti na web trezoru. ÅŊeliÅĄ li sada posjetiti bitwarden.com?" }, + "twoStepLoginConfirmationContent": { + "message": "Učini svoj račun sigurnijim uključivanjem prijave dvofaktorskom autentifikacijom u Bitwarden web aplikaciji." + }, + "twoStepLoginConfirmationTitle": { + "message": "Nastavi na web aplikaciju?" + }, "editedFolder": { "message": "Mapa spremljena" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Novi URI" }, + "addDomain": { + "message": "Dodaj domenu", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Stavka dodana" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Upitaj za dodavanje prijave" }, + "vaultSaveOptionsTitle": { + "message": "Mogućnosti spremanja u trezor" + }, "addLoginNotificationDesc": { "message": "Upit za dodavanje prijave pojavljuje se kada se otkrije prva prijava na neko web mjesto. Bitwarden će te pitatati ÅželiÅĄ li uneseno korisničko ime i lozinku spremiti u svoj trezor." }, + "addLoginNotificationDescAlt": { + "message": "Pitaj za dodavanje stavke ako nije pronađena u tvojem trezoru. Primjenjuje se na sve prijavljene račune." + }, + "showCardsInVaultView": { + "message": "PrikaÅži kartice kao prijedloge za auto-ispunu u prikazu trezora" + }, "showCardsCurrentTab": { "message": "PrikaÅži platne kartice" }, "showCardsCurrentTabDesc": { "message": "Prikazuj platne kartice za jednostavnu auto-ispunu." }, + "showIdentitiesInVaultView": { + "message": "PrikaÅži identitete kao prijedloge za auto-ispunu u prikazu trezora" + }, "showIdentitiesCurrentTab": { "message": "PrikaÅži identitete" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Upitaj za aÅžuriranje lozinke prijave ako se otkrije promjena na web stranici." }, + "changedPasswordNotificationDescAlt": { + "message": "Pitaj za aÅžuriranje lozinke za prijavu kada se otkrije promjena na web stranici. Primjenjuje se na sve prijavljene račune." + }, + "enableUsePasskeys": { + "message": "Pitaj za spremanje/koriÅĄtenje pristupnih ključeva" + }, + "usePasskeysDesc": { + "message": "Pitaj za spremanje novih pristupnih ključeva ili se prijavi pomoću pristupnih ključeva pohranjenih u tvojem trezoru. Primjenjuje se na sve prijavljene račune." + }, "notificationChangeDesc": { "message": "ÅŊeliÅĄ li ovu lozinku aÅžurirati u Bitwarden-u?" }, @@ -634,20 +1043,26 @@ "message": "AÅžuriraj" }, "notificationUnlockDesc": { - "message": "Za dovrÅĄetak auto-ispune, otključaj svoj trezor." + "message": "Za dovrÅĄetak auto-ispune, otključaj svoj Bitwarden trezor." }, "notificationUnlock": { "message": "Otključaj" }, + "additionalOptions": { + "message": "Dodatne mogućnosti" + }, "enableContextMenuItem": { "message": "PrikaÅži opcije kotekstualnog izbornika" }, "contextMenuItemDesc": { "message": "Koristi sekundarni klik za pristup generatoru lozinki i pripadajućim prijavama trenunte web stranice. " }, + "contextMenuItemDescAlt": { + "message": "Koristi sekundarni klik za pristup generiranju lozinki i odgovarajućim prijavama za mreÅžno mjesto. Primjenjuje se na sve prijavljene račune." + }, "defaultUriMatchDetection": { "message": "Zadano otkrivanje URI podudaranja", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Odaberi zadani način na koji će se rijeÅĄavati otkrivanje URI-ja za prijavu pri izvođenju radnji kao ÅĄto je auto-ispuna." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Promijeni temu boja." }, + "themeDescAlt": { + "message": "Promijeni boju aplikacije. Primjenjuje se na sve prijavljene račune." + }, "dark": { "message": "Tamna", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Izvezi iz" + }, "exportVault": { "message": "Izvezi trezor" }, "fileFormat": { "message": "Format datoteke" }, + "fileEncryptedExportWarningDesc": { + "message": "Ova izvozna datoteka biti će zaÅĄtićena lozinkom bez koje ju neće biti moguće deÅĄifrirati." + }, + "filePassword": { + "message": "Lozinka datoteke" + }, + "exportPasswordDescription": { + "message": "Ova će se lozinka koristiti za izvoz i uvoz ove datoteke" + }, + "accountRestrictedOptionDescription": { + "message": "Upotrijebi svoj ključ za ÅĄifriranje računa, izveden iz korisničkog imena i glavne lozinke za ÅĄifriranje izvoza i ograničavanje uvoza samo na trenutni Bitwarden račun." + }, + "passwordProtectedOptionDescription": { + "message": "Bitwarden omogućuje dijeljenje trezora s drugima pomoću organizacijskog računa. Za viÅĄe informacija posjeti bitwarden. com." + }, + "exportTypeHeading": { + "message": "Tip izvoza" + }, + "accountRestricted": { + "message": "Račun ograničen" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "Lozinka se ne podudara." + }, "warning": { "message": "UPOZORENJE", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Dijeljeno" }, - "learnOrg": { - "message": "ViÅĄe o organizacijama" - }, - "learnOrgConfirmation": { - "message": "Bitwarden omogućuje dijeljenje trezora s drugima pomoću organizacijskog računa. ÅŊeliÅĄ li sada posjetiti bitwarden.com za viÅĄe informacija?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business omogućuje dijeljenje stavki trezora s drugima koristeći organizacije. Za viÅĄe informacija posjeti bitwarden.com." }, "moveToOrganization": { "message": "Premjesti u organizaciju" @@ -762,6 +1204,9 @@ "file": { "message": "Datoteka" }, + "fileToShare": { + "message": "Datoteka za dijeljenje" + }, "selectFile": { "message": "Odaberi datoteku." }, @@ -772,7 +1217,7 @@ "message": "Značajka nije dostupna" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Potrebna je migracija ključa za ÅĄifriranje. Prijavi se na web trezoru za aÅžuriranje ključa za ÅĄifriranje." }, "premiumMembership": { "message": "Premium članstvo" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB ÅĄifriranog prostora za pohranu podataka." }, + "premiumSignUpEmergency": { + "message": "Pristup u nuÅždi." + }, "premiumSignUpTwoStepOptions": { "message": "Mogućnosti za prijavu u dva koraka kao ÅĄto su YubiKey i Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "MoÅžeÅĄ kupiti premium članstvo na web trezoru. ÅŊeliÅĄ li sada posjetiti bitwarden.com?" }, + "premiumPurchaseAlertV2": { + "message": "Premium moÅžeÅĄ kupiti u postavkama računa na Bitwarden web aplikaciji." + }, "premiumCurrentMember": { "message": "Ti si premium član!" }, "premiumCurrentMemberThanks": { "message": "Hvala ti ÅĄto podupireÅĄ Bitwarden." }, + "premiumFeatures": { + "message": "Nadogradi na Premium za:" + }, "premiumPrice": { "message": "Sve za samo $PRICE$ /godiÅĄnje!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Sve samo za $PRICE$ /godiÅĄnje!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "OsvjeÅžavanje zavrÅĄeno" }, @@ -838,7 +1301,7 @@ "message": "Automatski kopiraj TOTP" }, "disableAutoTotpCopyDesc": { - "message": "Ako se za prijavu koristi dvostruka autentifikacija, TOTP kontrolni kôd se automatski kopira u međuspremnik nakon auto-ispune korisničkog imena i lozinke." + "message": "Ako za prijavu postoji autentifikatorski ključ, kopiraj TOTP kontrolni kôd u međuspremnik nakon auto-ispune prijave." }, "enableAutoBiometricsPrompt": { "message": "TraÅži biometrijsku autentifikaciju pri pokretanju" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Autentifikatorska aplikacija" }, - "authenticatorAppDesc": { - "message": "Koristi autentifikatorsku aplikaciju (npr. Authy ili Google Authentifikator) za generiranje kontrolnih kodova.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Unesi kôd generiran autentifikatorskom aplikacijom kao npr. Bitwarden Authenticatorom.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP sigurnosni ključ" + "yubiKeyTitleV2": { + "message": "Yubico OTP sigurnosni ključ" }, "yubiKeyDesc": { "message": "Koristi YubiKey za pristup svojem računu. Radi s YubiKey 4, 4 Nano, 4C i NEO uređajima." }, - "duoDesc": { - "message": "Potvrdi s Duo Security pomoću aplikacije Duo Mobile, SMS-om, telefonskim pozivom ili U2F sigurnosnim ključem.", + "duoDescV2": { + "message": "Unesi kôd generiran Duo Securityjem.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-poÅĄta" }, - "emailDesc": { - "message": "Verifikacijski kodovi će biti poslani e-poÅĄtom." + "emailDescV2": { + "message": "Unesi kôd poslan e-poÅĄtom." }, "selfHostedEnvironment": { "message": "Vlastito hosting okruÅženje" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Navedi osnovni URL svoje lokalno smjeÅĄtene Bitwarden instalacije." }, + "selfHostedBaseUrlHint": { + "message": "Navedi osnovni URL svoje lokalne Bitwarden instalacije, npr.: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Kao naprednu postavku, moÅžeÅĄ odrediti osnovni URL svake usluge zasebno." + }, + "selfHostedEnvFormInvalid": { + "message": "MoraÅĄ dodati ili osnovni URL posluÅžitelja ili barem jedno prilagođeno okruÅženje." + }, "customEnvironment": { "message": "Prilagođeno okruÅženje" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL posluÅžitelja" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL API posluÅžitelja" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "URL-ovi okoline su spremljeni." }, + "showAutoFillMenuOnFormFields": { + "message": "PrikaÅži izbornik za auto-ispunu u poljima obrasca", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Prijedlozi auto-ispune" + }, + "showInlineMenuLabel": { + "message": "PrikaÅži prijedloge auto-ispune na poljima obrazaca" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "PrikaÅži prijedloge kada je odabrana ikona" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Primjenjuje se na sve prijavljene račune." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Isključi preglednikov upravitelj lozinki kako bi izbjegli sukobe." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Uredi postavke preglednika." + }, + "autofillOverlayVisibilityOff": { + "message": "Isključeno", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Kada je odabrano polje (u fokusu)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Kada je odabrana ikona auto-ispune", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Auto-ispuna kod učitavanja stranice" + }, "enableAutoFillOnPageLoad": { "message": "Auto-ispuna kod učitavanja" }, "enableAutoFillOnPageLoadDesc": { "message": "Nakon učitavanja web stranice, ako je otkriven obrazac za prijavu, auto-ispuni." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Upozorenje:$CLOSETAG$ UgroÅžene ili nepouzdane web stranice mogu iskoristiti auto-ispunu prilikom učitavanja stranice.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "UgroÅžene ili nepouzdane web stranice mogu iskoristiti auto-ispunu prilikom učitavanja stranice." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Saznaj viÅĄe o rizicima" + }, "learnMoreAboutAutofill": { "message": "Saznaj viÅĄe o auto-ispuni" }, @@ -994,7 +1529,7 @@ "message": "Zadana postvaka Auto-ispune za prijave" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Nakon omogućavanja auto-ispune kod učitavanja stranice, moguće je uključiti/isključiti ovu značajku za svaku pojedinu prijavu. Ovo je zadana postavka za prijave koje nisu pojedinčano određene." + "message": "Auto-ispunu kod učitavanju stranice je moguće uključiti/isključiti za svaku pojedinu prijavu unutar uređivanja stavke." }, "itemAutoFillOnPageLoad": { "message": "Auto-ispuna kod učitavanja stranice (ako je uključeno u Postavkama)" @@ -1003,10 +1538,10 @@ "message": "Koristi zadane postavke" }, "autoFillOnPageLoadYes": { - "message": "Auto-ispuna kod učitavanja" + "message": "Auto-ispuna kod učitavanja stranice" }, "autoFillOnPageLoadNo": { - "message": "Ne koristi Auto-ispunu kod učitavanja" + "message": "Ne koristi auto-ispunu kod učitavanja stranice" }, "commandOpenPopup": { "message": "Otvori iskočni prozor trezora" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Otvori trezor u bočnoj traci" }, - "commandAutofillDesc": { - "message": "Auto-ispuni zadnju koriÅĄtenu prijavu za trenutnu web stranicu." + "commandAutofillLoginDesc": { + "message": "Auto-ispuni zadnje koriÅĄtenu prijavu za trenutnu web stranicu" + }, + "commandAutofillCardDesc": { + "message": "Auto-ispuni zadnje koriÅĄtenu karticu za trenutnu web stranicu" + }, + "commandAutofillIdentityDesc": { + "message": "Auto-ispuni zadnje koriÅĄteni identitet za trenutnu web stranicu" }, "commandGeneratePasswordDesc": { "message": "Generiraj i kopiraj novu nasumičnu lozinku u međuspremnik." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Zaključaj trezor" }, - "privateModeWarning": { - "message": "PodrÅĄka za privatni način rada je eksperimentalna, a neke su značajke ograničene." - }, "customFields": { "message": "Prilagođena polja" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Potvrdni okvir" + }, "cfTypeLinked": { "message": "Povezano", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "PrikaÅži prepoznatljivu sliku pored svake prijave." }, + "faviconDescAlt": { + "message": "PrikaÅži prepoznatljivu sliku pokraj svake prijave. Primjenjuje se na sve prijavljene račune." + }, "enableBadgeCounter": { "message": "PrikaÅži značku brojača" }, @@ -1152,7 +1696,7 @@ "message": "dr." }, "mx": { - "message": "Mx" + "message": "gx." }, "firstName": { "message": "Ime" @@ -1173,13 +1717,13 @@ "message": "Tvrtka" }, "ssn": { - "message": "Broj zdravstvenog osiguranja" + "message": "OIB" }, "passportNumber": { "message": "Broj putovnice" }, "licenseNumber": { - "message": "Broj vozačke dozvole" + "message": "Broj osobne iskaznice" }, "email": { "message": "E-poÅĄta" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitet" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "Novi $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Uredi $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Pogledaj $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Povijest" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Natrag" }, "collections": { "message": "Zbirke" }, + "nCollections": { + "message": "$COUNT$ zbirki", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoriti" }, @@ -1282,6 +1874,10 @@ "message": "Primarna domena", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Osnovna domena (preporučeno)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Naziv domene", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Otkrivanje podudaranja", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Zadano otkrivanje podudaranja", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Uključi/isključi opcije" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Nema lozinki na popisu." }, + "clearHistory": { + "message": "Očisti povijest" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Ukloni" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Otključaj PIN-om" }, + "setYourPinTitle": { + "message": "Postavi PIN" + }, + "setYourPinButton": { + "message": "Postavi PIN" + }, "setYourPinCode": { "message": "Postavi svoj PIN kôd za otključavanje Bitwardena. Postavke PIN-a se resetiraju ako se potpuno odjaviÅĄ iz aplikacije." }, + "setYourPinCode1": { + "message": "Tvoj PIN će se koristiti za otključavanje Bitwardena umjesto glavne lozinke. PIN će se restirati ukoliko se odjaviÅĄ iz Bitwardena. " + }, "pinRequired": { "message": "Potreban je PIN." }, "invalidPin": { "message": "Nerispravan PIN." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "PreviÅĄe netočnih pokuÅĄaja unosa PIN-a. Odjava..." + }, "unlockWithBiometrics": { "message": "Otključaj biometrijom" }, + "unlockWithMasterPassword": { + "message": "Otključaj glavnom lozinkom" + }, "awaitDesktop": { "message": "Čekanje potvrde iz desktop aplikacije" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Zaključaj glavnom lozinkom kod svakog pokretanja preglednika" }, + "lockWithMasterPassOnRestart1": { + "message": "Zaključaj glavnom lozinkom kod svakog pokretanja preglednika" + }, "selectOneCollection": { "message": "MoraÅĄ odabrati barem jednu zbirku." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Jedno ili viÅĄe pravila organizacije utječe na postavke generatora." }, + "passwordGenerator": { + "message": "Generator lozinki" + }, + "usernameGenerator": { + "message": "Generator korisničkih imena" + }, + "useThisPassword": { + "message": "Koristi ovu lozinku" + }, + "useThisUsername": { + "message": "Koristi ovo korisničko ime" + }, + "securePasswordGenerated": { + "message": "Sigurna lozinka generirana! Ne zaboravi aÅžurirati lozinku na web stranici." + }, + "useGeneratorHelpTextPartOne": { + "message": "Koristi generator", + "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": "za stvaranje snaÅžne, jedinstvene lozinke", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Nakon isteka trezora" }, + "vaultTimeoutAction1": { + "message": "Radnja nakon isteka " + }, "lock": { "message": "Zaključaj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Smeće", @@ -1441,7 +2090,7 @@ "message": "Trajno izbriÅĄi stavku" }, "permanentlyDeleteItemConfirmation": { - "message": "ÅŊeliÅĄ li zaista trajno izbrisati ovu stavku?" + "message": "Sigurno ÅželiÅĄ trajno izbrisati ovu stavku?" }, "permanentlyDeletedItem": { "message": "Stavka trajno izbrisana" @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Stavka vraćena" }, + "alreadyHaveAccount": { + "message": "Već imaÅĄ račun?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Odjava će ukloniti pristup tvom trezoru i zahtijevati mreÅžnu potvrdu identiteta nakon isteka vremenske neaktivnosti. Sigurno ÅželiÅĄ koristiti ovu postavku?" }, @@ -1461,11 +2113,14 @@ "autoFillAndSave": { "message": "Auto-ispuni i spremi" }, + "fillAndSave": { + "message": "Ispuni i spremi" + }, "autoFillSuccessAndSavedUri": { - "message": "Auto-ispunjena stavka i spremanje URI" + "message": "Stavka auto-ispunjena i spremljen URI" }, "autoFillSuccess": { - "message": "Auto-ispunjena stavka" + "message": "Stavka je auto-ispunjena " }, "insecurePageWarning": { "message": "Upozorenje: Ovo je nezaÅĄtićena HTTP stranica i svi podaci koje preko nje poÅĄaljeÅĄ drugi mogu vidjeti i izmijeniti. Ova prijava je prvotno bila spremljena za sigurnu (HTTPS) stranicu." @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Tvoja nova glavna lozinka ne ispunjava zahtjeve." }, + "receiveMarketingEmailsV2": { + "message": "Primaj e-poÅĄtom od Bitwardena savjete, najave i mogućnosti istraÅživanja." + }, + "unsubscribe": { + "message": "PoniÅĄti pretplatu" + }, + "atAnyTime": { + "message": "bilo kada." + }, + "byContinuingYouAgreeToThe": { + "message": "Ako nastaviÅĄ, slaÅžeÅĄ se s" + }, + "and": { + "message": "i" + }, "acceptPolicies": { "message": "Označavanjem ove kućice slaÅžete se sa sljedećim:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "U redu" }, + "errorRefreshingAccessToken": { + "message": "PogreÅĄka osvjeÅžavanja tokena pristupa" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Nije pronađen token za osvjeÅžavanje ili API ključevi. PokuÅĄaj se odjaviti i ponovno prijaviti." + }, "desktopSyncVerificationTitle": { "message": "Potvrda desktop sinkronizacije" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "PogreÅĄan korisnički račun" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Neusklađenost biometrijskog ključa" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrijsko otključavanje nije uspjelo. Biometrijski tajni ključ nije uspio otključati trezor. PokuÅĄaj ponovo postaviti biometriju." + }, "biometricsNotEnabledTitle": { "message": "Biometrija nije omogućena" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Biometrija preglednika nije podrÅžana na ovom uređaju." }, + "biometricsNotUnlockedTitle": { + "message": "Korisnik zaključan ili odjavljen" + }, + "biometricsNotUnlockedDesc": { + "message": "Otključaj ovog korisnika u desktop aplikaciji i pokuÅĄaj ponovno." + }, + "biometricsNotAvailableTitle": { + "message": "Biometrijsko otključavanje nije dostupno" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrijsko otključavanje trenutno nije dostupno. PokuÅĄaj ponovno kasnije." + }, "biometricsFailedTitle": { "message": "Biometrija neuspjeÅĄna" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Pravila organizacije utječu na tvoje mogućnosti vlasniÅĄtva. " }, + "personalOwnershipPolicyInEffectImports": { + "message": "Organizacijsko pravilo onemogućuje uvoz stavki u tvoj osobni trezor." + }, + "domainsTitle": { + "message": "Domene", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Izuzete domene" }, "excludedDomainsDesc": { "message": "Bitwarden neće pitati treba li spremiti prijavne podatke za ove domene. Za primjenu promjena, potrebno je osvjeÅžiti stranicu." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden neće nuditi spremanje podataka za prijavu za ove domene za sve prijavljene račune. MoraÅĄ osvjeÅžiti stranicu kako bi promjene stupile na snagu." + }, + "websiteItemLabel": { + "message": "Web stranica $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nije valjana domena", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Spremljene promjene izuzete domene" + }, + "limitSendViews": { + "message": "Ograniči broj pogleda" + }, + "limitSendViewsHint": { + "message": "Nakon dosegnutog broja, nitko neće moći pogledati Send", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Preostalo pogleda: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Detalji Senda", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "PretraÅži Sendove", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Dijeljeni tekst" + }, "sendTypeFile": { "message": "Datoteka" }, @@ -1666,6 +2406,9 @@ "message": "Svi Sendovi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Zadano sakrij tekst" + }, "maxAccessCountReached": { "message": "Dostignut najveći broj pristupanja", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "ZaÅĄtićeno lozinkom" }, + "copyLink": { + "message": "Kopiraj vezu" + }, "copySendLink": { "message": "Kopiraj vezu na Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Sigurno ÅželiÅĄ izbrisati ovaj Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Sigurno ÅželiÅĄ trajno izbrisati ovaj Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Uredi Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send će nakon navedenog vremena biti trajno izbrisan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send će na ovaj datum biti trajno izbrisan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Vremenski ograničeni pristup" }, @@ -1769,6 +2523,10 @@ "message": "Neobavezno zahtijevaj korisnika lozinku za pristup ovom Sendu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Privatne biljeÅĄke o Sendu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send stvoren", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send je uspjeÅĄno stvoren!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send će biti dostupan svakome s poveznicom sljedećih sat vremena.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Send če biti dostupan svakome s poveznicom ovoliko sati: $HOURS$", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send će biti dostupan svakome s poveznicom 1 dan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Send će biti dostupan svakome s poveznom ovoliko dana: $DAYS$", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Kopirana poveznica Senda", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send spremljen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Otvori proÅĄirenje?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Za stvaranje Senda, potrebno je otvoriti proÅĄirenje u novi prozor.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Za odabir datoteke, otvori proÅĄirenje u bočnoj traci (ako je moguće) ili u iskočnom prozoru klikom na ovu poruku." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Za odabir datoteke u Safariju, otvori iskočni prozor klikom na ovu poruku." }, + "popOut": { + "message": "Otvori" + }, "sendFileCalloutHeader": { "message": "Prije početka" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Sakrij moju adresu e-poÅĄte od primatelja." }, + "hideYourEmail": { + "message": "Autentifikacija" + }, "sendOptionsPolicyInEffect": { "message": "Jedno ili viÅĄe pravila organizacije utječe na postavke Senda." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Potrebna je potvrda e-poÅĄte" }, + "emailVerifiedV2": { + "message": "e-poÅĄta potvrđena" + }, "emailVerificationRequiredDesc": { "message": "MoraÅĄ ovjeriti svoju e-poÅĄtu u mreÅžnom trezoru za koritÅĄenje ove značajke." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Tvoja glavna lozinka ne zadovoljava pravila ove organizacije. Za pristup trezoru moraÅĄ odmah aÅžurirati svoju glavnu lozinku. Ako nastaviÅĄ, odjaviti ćeÅĄ se iz trenutne sesije te ćeÅĄ se morati ponovno prijaviti. Aktivne sesije na drugim uređajima mogu ostati aktivne do jedan sat." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Tvoja je organizacija onemogućila ÅĄifriranje pouzdanog uređaja. Postavi glavnu lozinku za pristup svom trezoru." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatsko učlanjenje" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Odaberi mapu..." }, - "ssoCompleteRegistration": { - "message": "Za dovrÅĄetak jedinstvene prijave na razini tvrtke (SSO), postavi glavnu lozinku za pristup i zaÅĄtitu tvog trezora." + "noFoldersFound": { + "message": "Nema pronađenih mapa", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "MoraÅĄ postaviti glavnu lozinku jer su dopuÅĄtenja tvoje organizacije aÅžurirana.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Tvoja organizacija zahtijeva da postaviÅĄ glavnu lozinku.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Potrebna je potvrda", + "description": "Default title for the user verification dialog." }, "hours": { "message": "sat(i)" @@ -1904,6 +2740,9 @@ "minutes": { "message": "minuta" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Pravila tvrtke primijenjena su na vrijeme isteka" + }, "vaultTimeoutPolicyInEffect": { "message": "Pravilo tvoje organizacije podesilo je najveće dozvoljeno vrijeme isteka trezora na $HOURS$:$MINUTES$ h.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Pravila tvrtke primijenjena su na vrijeme isteka", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Tvoja organizacija je zadano postavila kraće vrijeme isteka. NajviÅĄe: $HOURS$:$MINUTES$", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Pravilo tvoje organizacije utječe na istek trezora. Najveće dozvoljeno vrijeme isteka je $HOURS$:$MINUTES$ h. Tvoja radnja nakon isteka trezora je: $ACTION$.", "placeholders": { @@ -1992,7 +2857,7 @@ "message": "Izvoz osobnog trezora" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Izvest će se samo stavke osobnog trezora povezanog s $EMAIL$. Stavke organizacijskog trezora neće biti uključene. Izvest će se samo informacija o stavci trezora bez pripadajućih podataka o povijesti lozinki i privitaka.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Izvoz organizacijskog trezora" + }, + "exportingOrganizationVaultDesc": { + "message": "Izvest će se samo organizacijski trezor povezan s $ORGANIZATION$. Stavke iz osobnih trezora i stavke iz drugih organizacija neće biti uključene.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "PogreÅĄka" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generiraj korisničko ime" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Tip korisničkog imena" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generiraj pseudonim e-poÅĄte s vanjskom uslugom prosljeđivanja." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ greÅĄka: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generirao Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Web: $WEBSITE$. Generirao Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "NevaÅžeći $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "NevaÅžeći $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nije moguće dobiti $SERVICENAME$ maskirani ID računa e-poÅĄte.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "NevaÅžeća $SERVICENAME$ domena.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "NevaÅžeći $SERVICENAME$ URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Nepoznata $SERVICENAME$ greÅĄka.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Nepoznati prosljeditelj: '$SERVICENAME$.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Naziv posluÅžitelja", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Kako auto-ispuniti" }, "autofillSelectInfoWithCommand": { - "message": "Odaberi stavku s ove stranice ili koristi prečac $COMMAND$", + "message": "Odaberi stavku s ovog zaslona, upotrijebi prečac $COMMAND$ ili istraÅži druge opcije u postavkama.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Odaberi stavku s ove stranice ili namjesti prečac u postavkama." + "message": "Odaberi stavku s ovog zaslona ili istraÅži druge opcije u postavkama." }, "gotIt": { "message": "U redu" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Postavke auto-ispune" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Prečac auto-ispune" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Promijeni prečac" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Upravljaj prečacima" + }, "autofillShortcut": { "message": "Tipkovnički precač auto-ispune" }, - "autofillShortcutNotSet": { - "message": "Prečac auto-ispune nije postavljen. Promijeni u postavkama preglednika." + "autofillLoginShortcutNotSet": { + "message": "Prečac auto-ispune prijave nije postavljen. Promijeni u postavkama preglednika." }, - "autofillShortcutText": { - "message": "Prečac auto-ispune je: $COMMAND$. Promijeni u postavkama preglednika.", + "autofillLoginShortcutText": { + "message": "Prečac auto-ispune prijave je: $COMMAND$. Promijeni u postavkama preglednika.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Prijava na" - }, "opensInANewWindow": { "message": "Otvara u novom prozoru" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Potreban je identifikator organizacije." }, + "creatingAccountOn": { + "message": "Stvaranje računa na" + }, + "checkYourEmail": { + "message": "Provjeri svoju e-poÅĄtu" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Slijedi vezu u e-poÅĄti poslanoj na" + }, + "andContinueCreatingYourAccount": { + "message": "za nastavak stvaranja tvojeg računa." + }, + "noEmail": { + "message": "Nema e-poÅĄte?" + }, + "goBack": { + "message": "Nazad" + }, + "toEditYourEmailAddress": { + "message": "na uređivanje svoje adrese e-poÅĄte." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Pristup odbijen. NemaÅĄ prava vidjeti ovu stranicu." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Uređaj pouzdan" }, + "sendsNoItemsTitle": { + "message": "Nema aktivnih Sendova", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Koristi Send za sigurno slanje ÅĄifriranih podataka bilo kome.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Potreban je unos." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 polje treba tvoju paÅžnju." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ polja treba tvoju paÅžnju.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Odaberi --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "SaÅžmi/ProÅĄiri", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Uvezi svoje podatke u Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "ZaÅĄtititi svoje LastPass podatke i uvezi ih u Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Spremi kao nekriptiranu datoteku", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Uvezi u Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Uvoz...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Uvoz podataka u trezor uspjeÅĄan!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "GreÅĄka pri uvozu. Provjeri konzolu za detalje.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "DoÅĄlo je do mreÅžne greÅĄke tijekom uvoza.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domene" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Stavke za koje je potrebna glavna lozinka neće se auto-ispuniti kod učitavanja stranice. Auto-ispuna pri učitavanju stranice je isključena.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Auto-ispuna kod učitavanja stranice koristi zadane postavke.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Isključi traÅženje glavne lozinke za promjenu ovog polja", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "U/Isključi bočnu navigaciju" + }, + "skipToContent": { + "message": "Preskoči na sadrÅžaj" + }, + "bitwardenOverlayButton": { + "message": "Tipka izbornika Bitwarden auto-ispune", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "U/isključivanje izbornika Bitwarden auto-ispune", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Izbornik Bitwarden auto-ispune", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Otklučaj svoj račun za prikaz podudarnih prijava", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Otključaj račun za prikaz prijedloga auto-ispuna", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Otključaj račun", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Otključaj račun; otvara se u novom prozoru", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Unesi vjerodajnice za", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Djelomično korisničko ime", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Nema stavki za prikaz", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nova stavka", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Dodaj novu stavku trezora", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Nova prijava", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Dodaj novu stavku prijave u trezor; otvara se u novom prozoru", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Nova kartica", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Dodaj novu stavku kartice u trezor; otvara se u novom prozoru", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Novi identitet", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Dodaj novu stavku identiteta u trezor; otvara se u novom prozoru", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Dostupan je Bitwarden izbornik auto-ispune. Pritisni tipku sa strelicom prema dolje za odabir.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Uključi" + }, + "ignore": { + "message": "Zanemari" + }, + "importData": { + "message": "Uvezi podatke", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "GreÅĄka prilikom uvoza" + }, + "importErrorDesc": { + "message": "Postoji problem s podacima za uvoz. Potrebno je razrijeÅĄiti doljenavedene greÅĄke u izvornoj datoteci i pokuÅĄati ponovno." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Popravi navedene greÅĄke i pokuÅĄaj ponovo." + }, + "description": { + "message": "Opis" + }, + "importSuccess": { + "message": "Uvoz podataka u trezor je uspio" + }, + "importSuccessNumberOfItems": { + "message": "Ukupno je uvezeno $AMOUNT$ stavaka.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "PokuÅĄaj ponovno" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Za ovu radnju potrebna je potvrda. Postavi PIN za nastavak." + }, + "setPin": { + "message": "Postavi PIN" + }, + "verifyWithBiometrics": { + "message": "Potvrdi biometrijom" + }, + "awaitingConfirmation": { + "message": "Čekanje potvrde" + }, + "couldNotCompleteBiometrics": { + "message": "Nije moguće dovrÅĄiti biometriju." + }, + "needADifferentMethod": { + "message": "Koristi drugi način?" + }, + "useMasterPassword": { + "message": "Koristi glavnu lozinku" + }, + "usePin": { + "message": "Koristi PIN" + }, + "useBiometrics": { + "message": "Koristi biometriju" + }, + "enterVerificationCodeSentToEmail": { + "message": "Unesi kôd za potvrdu primljen e-poÅĄtom." + }, + "resendCode": { + "message": "Ponovno poÅĄalji kod" + }, + "total": { + "message": "Ukupno" + }, + "importWarning": { + "message": "UvoziÅĄ podatke u $ORGANIZATION$. Tvoji podaci moÅžda će biti podijeljeni s članovima ove organizacije. ÅŊeliÅĄ li svejedno uvesti podatke?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "GreÅĄka pri povezivanju s uslugom Duo. Koristi drugu metodu prijave s dvostrukom autentifikacijom ili kontaktiraj Duo za pomoć." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Pokreni Duo i slijedi korake za dovrÅĄetak prijave." + }, + "duoRequiredForAccount": { + "message": "Za tvoj račun je potrebna Duo dvostruka autentifikacija." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Otvori proÅĄirenje za dovrÅĄetak prijave." + }, + "popoutExtension": { + "message": "Otvori proÅĄirenje" + }, + "launchDuo": { + "message": "Pokreni Duo" + }, + "importFormatError": { + "message": "Podaci nisu ispravno formatirani. Provjeri uvoznu datoteku i pokuÅĄaj ponovno." + }, + "importNothingError": { + "message": "NiÅĄta nije uvezeno." + }, + "importEncKeyError": { + "message": "GreÅĄka u deÅĄifriranju izvozne datoteke. Ovaj ključ za ÅĄifriranje ne odgovara ključu za ÅĄifriranje koriÅĄtenom pri izvozu datoteke." + }, + "invalidFilePassword": { + "message": "Nesipravna lozinka datoteke. Unesi lozinku izvozne datoteke." + }, + "destination": { + "message": "OdrediÅĄte" + }, + "learnAboutImportOptions": { + "message": "ViÅĄe o mogućnostima uvoza" + }, + "selectImportFolder": { + "message": "Odaberi mapu" + }, + "selectImportCollection": { + "message": "Odaberi zbirku" + }, + "importTargetHint": { + "message": "Odaberi ovu opciju ako sadrÅžaj uvezene datoteke ÅželiÅĄ spremiti u $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Datoteka sadrÅži nedodijeljene stavke." + }, + "selectFormat": { + "message": "Odaberi format datoteke za uvoz" + }, + "selectImportFile": { + "message": "Odaberi datoteku za uvoz" + }, + "chooseFile": { + "message": "Odaberi datoteku" + }, + "noFileChosen": { + "message": "Nije odabrana datoteka" + }, + "orCopyPasteFileContents": { + "message": "ili kopiraj/zalijepi sadrÅžaj uvozne datoteke" + }, + "instructionsFor": { + "message": "$NAME$ upute", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Potvrdi uvoz trezora" + }, + "confirmVaultImportDesc": { + "message": "Ova je datoteka zaÅĄtićena lozinkom. Unesi lozinku za nastavak uvoza." + }, + "confirmFilePassword": { + "message": "Potvrdi lozinku datoteke" + }, + "exportSuccess": { + "message": "Podaci iz trezora su izvezeni" + }, + "typePasskey": { + "message": "Pristupni ključ" + }, + "accessing": { + "message": "Pristupanje" + }, + "passkeyNotCopied": { + "message": "Pristupni ključ neće biti kopiran" + }, + "passkeyNotCopiedAlert": { + "message": "Pristupni ključ se neće kopirati u kloniranu stavku. ÅŊeliÅĄ li nastaviti klonirati ovu stavku?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "IshodiÅĄna stranica zahtijeva verifikaciju. Ova značajka joÅĄ nije implementirana za račune bez glavne lozinke." + }, + "logInWithPasskeyQuestion": { + "message": "Prijava pristupnim ključem?" + }, + "passkeyAlreadyExists": { + "message": "Za ovu aplikaciju već postoji pristupni ključ." + }, + "noPasskeysFoundForThisApplication": { + "message": "Za ovu aplikaciju nema pristupnih ključeva." + }, + "noMatchingPasskeyLogin": { + "message": "Nema odgovarajuće prijavu za ovu stranicu." + }, + "noMatchingLoginsForSite": { + "message": "Nema prijava za ovu web stranicu" + }, + "searchSavePasskeyNewLogin": { + "message": "PotraÅži ili spremi pristupni ključ kao novu prijavu" + }, + "confirm": { + "message": "Autoriziraj" + }, + "savePasskey": { + "message": "Spremi pristupni ključ" + }, + "savePasskeyNewLogin": { + "message": "Spremi pristupni ključ kao novu prijavu" + }, + "chooseCipherForPasskeySave": { + "message": "Odaberi za koju prijavu ÅželiÅĄ spremiti ovaj pristupni ključ" + }, + "chooseCipherForPasskeyAuth": { + "message": "Odaberi pristupni ključ za prijavu" + }, + "passkeyItem": { + "message": "Stavka pristupnog ključa" + }, + "overwritePasskey": { + "message": "PrebriÅĄi pristupni ključ?" + }, + "overwritePasskeyAlert": { + "message": "Ova stavka već sadrÅži pristupni ključ. Sigurno ÅželiÅĄ prebrisati trenutni pristupni ključ?" + }, + "featureNotSupported": { + "message": "Značajka joÅĄ nije podrÅžana" + }, + "yourPasskeyIsLocked": { + "message": "Za koriÅĄtenje pristpnog ključa potrebna je autentifikacija. Potvrdi svoj identitet." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifaktorska autentifikacija otkazana" + }, + "noLastPassDataFound": { + "message": "Nisu nađeni LastPass podaci" + }, + "incorrectUsernameOrPassword": { + "message": "Neispravno korisničko ime ili lozinka" + }, + "incorrectPassword": { + "message": "Neispravna lozinka" + }, + "incorrectCode": { + "message": "Neispravan kôd" + }, + "incorrectPin": { + "message": "Neispravan PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifaktorska autentifikacija nije uspjela" + }, + "includeSharedFolders": { + "message": "Uključi dijeljene mape" + }, + "lastPassEmail": { + "message": "LastPass e-poÅĄta" + }, + "importingYourAccount": { + "message": "Uvoz tvog računa..." + }, + "lastPassMFARequired": { + "message": "Potrebna LastPass multifaktorska autenfikacija" + }, + "lastPassMFADesc": { + "message": "Unesi svoj jednokratni kôd iz aplikacije za autentifikaciju" + }, + "lastPassOOBDesc": { + "message": "Odobri svoj zahtjev za prijavu u svojoj aplikaciji za autentifikaciju ili unesi jednokratni kôd." + }, + "passcode": { + "message": "Jednokratni kôd" + }, + "lastPassMasterPassword": { + "message": "LastPass glavna lozinka" + }, + "lastPassAuthRequired": { + "message": "Potrebna LastPass autentifikacija" + }, + "awaitingSSO": { + "message": "Čekanje SSO autentifikacije" + }, + "awaitingSSODesc": { + "message": "Prijavi se koristeći pristupne podatke svoje tvrtke." + }, + "seeDetailedInstructions": { + "message": "Detaljne upute za pomoć pronađi na naÅĄoj stranici za pomoć na", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Uvezi direktno iz LastPass-a" + }, + "importFromCSV": { + "message": "Uvezi iz CSV-a" + }, + "lastPassTryAgainCheckEmail": { + "message": "PokuÅĄaj ponovno ili pogledaj e-poÅĄtu od LastPass-a za potvrdu." + }, + "collection": { + "message": "Zbirka" + }, + "lastPassYubikeyDesc": { + "message": "Umetni YubiKey pridruÅžen svojem LastPass računu u USB priključak račuanala, a zatim dodirni njegovu tipku." + }, + "switchAccount": { + "message": "Promijeni račun" + }, + "switchAccounts": { + "message": "Promijeni račune" + }, + "switchToAccount": { + "message": "Promijeni na račun" + }, + "activeAccount": { + "message": "Aktivni račun" + }, + "availableAccounts": { + "message": "Dostupni računi" + }, + "accountLimitReached": { + "message": "Dosegnuto je ograničenje računa. Odjavi se s računa za dodavanje sljedećeg." + }, + "active": { + "message": "aktivan" + }, + "locked": { + "message": "zaključan" + }, + "unlocked": { + "message": "otključan" + }, + "server": { + "message": "posluÅžitelj" + }, + "hostedAt": { + "message": "domaćin na" + }, + "useDeviceOrHardwareKey": { + "message": "Koristi svoj uređaj ili hardverski ključ" + }, + "justOnce": { + "message": "Samo jednom" + }, + "alwaysForThisSite": { + "message": "Uvijek za ovu stranicu" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ dodana u izuzete domene.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Uobičajeni oblici", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Nastavi na postavke preglednika?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Nastavi u centar za pomoć?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Promijeni postavke auto-ispune i upravljanja lozinkama preglednika.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "MoÅžeÅĄ vidjeti i postaviti prečace proÅĄirenja u postavkama preglednika.", + "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": "Promijeni postavke auto-ispune i upravljanja lozinkama u preglednika.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "MoÅžeÅĄ vidjeti i postaviti prečace proÅĄirenja u postavkama preglednika.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Postavi Bitwarden kao zadani upravitelj lozinki?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ostavljanje ove postavke isključenom moÅže uzrokovati sukob između prijedloga za auto-ispunu Bitwardena i tvojeg preglednika.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Postavi Bitwarden kao zadani upravitelj lozinki", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Nije moguće postaviti Bitwarden kao zadani upravitelj lozinki", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Za postavljanje Bitwardena kao zadanog upravitelja lozinki moraÅĄ pregledniku dati dopuÅĄtenje privatnosti.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Postavi kao zadano", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Vjerodajnice uspjeÅĄno spremljene!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Lozinka pohranjena!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Vjerodajnice uspjeÅĄno aÅžurirane!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Lozinka aÅžurirana!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "GreÅĄka pri spremanju vjerodajnica. Za detalje pogledaj konzolu.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "UspjeÅĄno" + }, + "removePasskey": { + "message": "Ukloni pristupni ključ" + }, + "passkeyRemoved": { + "message": "Pristupni ključ uklonjen" + }, + "autofillSuggestions": { + "message": "Prijedlozi auto-ispune" + }, + "autofillSuggestionsTip": { + "message": "Spremi u auto-ispunu stavku prijave za ovu stranicu" + }, + "yourVaultIsEmpty": { + "message": "Tvoj trezor je prazan" + }, + "noItemsMatchSearch": { + "message": "Nema stavki podudarnih s pretragom" + }, + "clearFiltersOrTryAnother": { + "message": "Očisti filtre ili pokuÅĄaj s drugačijom pretragom" + }, + "copyInfoTitle": { + "message": "Kopiraj informacije - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Kopiraj biljeÅĄku - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "ViÅĄe mogućnosti, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "ViÅĄe mogućnosti - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Pogledaj stavku - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Auto-ispuna - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Nema vrijednosti za kopiranje" + }, + "assignToCollections": { + "message": "Dodijeli zbirkama" + }, + "copyEmail": { + "message": "Kopiraj e-poÅĄtu" + }, + "copyPhone": { + "message": "Kopiraj telefon" + }, + "copyAddress": { + "message": "Kopiraj adresu" + }, + "adminConsole": { + "message": "Konzola administratora" + }, + "accountSecurity": { + "message": "Sigurnost računa" + }, + "notifications": { + "message": "Obavijesti" + }, + "appearance": { + "message": "Izgled" + }, + "errorAssigningTargetCollection": { + "message": "GreÅĄka pri dodjeljivanju ciljne zbirke." + }, + "errorAssigningTargetFolder": { + "message": "GreÅĄka pri dodjeljivanju ciljne mape." + }, + "viewItemsIn": { + "message": "Pogledaj stavku u $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Natrag na $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Novo" + }, + "removeItem": { + "message": "Ukloni $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Stavke bez mape" + }, + "itemDetails": { + "message": "Detalji stavke" + }, + "itemName": { + "message": "Naziv stavke" + }, + "cannotRemoveViewOnlyCollections": { + "message": "S dopuÅĄtenjima samo za prikaz ne moÅžeÅĄ ukloniti zbirke: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organizacija je deaktivirana" + }, + "owner": { + "message": "Vlasnik" + }, + "selfOwnershipLabel": { + "message": "Ti", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Ne moÅže se pristupiti stavkama u deaktiviranoj Organizaciji. Kontaktiraj vlasnika Organizacije za pomoć." + }, + "additionalInformation": { + "message": "Dodatne informacije" + }, + "itemHistory": { + "message": "Povijest stavke" + }, + "lastEdited": { + "message": "Zadnje uređeno" + }, + "ownerYou": { + "message": "Vlasnik: Ti" + }, + "linked": { + "message": "Povezano" + }, + "copySuccessful": { + "message": "Kopiranje uspjeÅĄno" + }, + "upload": { + "message": "Prijenos" + }, + "addAttachment": { + "message": "Dodaj privitak" + }, + "maxFileSizeSansPunctuation": { + "message": "Najveća veličina datoteke je 500 MB" + }, + "deleteAttachmentName": { + "message": "IzbriÅĄi privitak", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Preuzmi $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Sigurno ÅželiÅĄ trajno izbrisati ovaj privitak?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Besplatne organizacije ne mogu koristiti privitke" + }, + "filters": { + "message": "Filtri" + }, + "personalDetails": { + "message": "Osobni podaci" + }, + "identification": { + "message": "Identifikacija" + }, + "contactInfo": { + "message": "Kontakt podaci" + }, + "downloadAttachment": { + "message": "Preuzmi - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "broj kartice zavrÅĄava na", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Vjerodajnice za prijavu" + }, + "authenticatorKey": { + "message": "Kôd za provjeru" + }, + "autofillOptions": { + "message": "Postavke auto-ispune" + }, + "websiteUri": { + "message": "Web stranica (URI)" + }, + "websiteUriCount": { + "message": "Broj URI-ja: $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Web stranica dodana" + }, + "addWebsite": { + "message": "Dodaj web stranicu" + }, + "deleteWebsite": { + "message": "IzbriÅĄi web stranicu" + }, + "defaultLabel": { + "message": "Zadano ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "PrikaÅži otkrivanje podudaranja $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Sakrij otkrivanje podudaranja $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Auto-ispuna kod učitavanja?" + }, + "cardExpiredTitle": { + "message": "Istekla kartica" + }, + "cardExpiredMessage": { + "message": "Ako je obnovljeno, aÅžuriraj podatke o kartici" + }, + "cardDetails": { + "message": "Detalji kartice" + }, + "cardBrandDetails": { + "message": "$BRAND$ detalji", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Omogući animacije" + }, + "showAnimations": { + "message": "PrikaÅži animacije" + }, + "addAccount": { + "message": "Dodaj račun" + }, + "loading": { + "message": "Učitavanje" + }, + "data": { + "message": "Podaci" + }, + "passkeys": { + "message": "Pristupni ključevi", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Lozinke", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Prijava pristupnim ključem", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Dodijeli" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Samo članovi organizacije s pristupom ovim zbirkama će moći vidjeti stavku." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Samo članovi organizacije s pristupom ovim zbirkama će moći vidjeti stavke." + }, + "bulkCollectionAssignmentWarning": { + "message": "Odabrano je $TOTAL_COUNT$ stavki. Nije moguće aÅžurirati $READONLY_COUNT$ stavki jer nemaÅĄ dopuÅĄtenje za uređivanje.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Dodaj polje" + }, + "add": { + "message": "Dodaj" + }, + "fieldType": { + "message": "Vrsta polja" + }, + "fieldLabel": { + "message": "Oznaka polja" + }, + "textHelpText": { + "message": "Koristi tekstualna polja za podatke poput sigurnosnih pitanja" + }, + "hiddenHelpText": { + "message": "Koristi skrivena polja za osjetljive podatke poput lozinke" + }, + "checkBoxHelpText": { + "message": "Koristi potvrdne okvire ako ih ÅželiÅĄ auto-ispuniti u obrascu, npr. zapamti adresu e-poÅĄte" + }, + "linkedHelpText": { + "message": "Koristi povezano polje kada imaÅĄ problema s auto-ispunom za određenu web stranicu." + }, + "linkedLabelHelpText": { + "message": "Unesi html id polja, naziv, aria-label ili rezervirano mjesto." + }, + "editField": { + "message": "Uredi polje" + }, + "editFieldLabel": { + "message": "Uredi $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "ObriÅĄi $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ dodana", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Ponovno poredaj $LABEL$. Koristi tipke sa strelicom za pomicanje stavke gore ili dolje.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ pomaknut gore, pozicija $INDEX$ od $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Odaberi zbirke za dodjelu" + }, + "personalItemTransferWarningSingular": { + "message": "1 stavka će biti trajno prenesena u odabranu organizaciju. ViÅĄe nećeÅĄ posjedovati ovu stavku." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ stavke/i će biti trajno prenesene u odabranu organizaciju. ViÅĄe nećeÅĄ posjedovati ove stavke.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 stavka će biti trajno prenesena u $ORG$. ViÅĄe nećeÅĄ posjedovati ovu stavku.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ stavke/i će biti trajno prenesene u $ORG$. ViÅĄe nećeÅĄ posjedovati ove stavke.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Zbirke uspjeÅĄno dodijeljene" + }, + "nothingSelected": { + "message": "NiÅĄta nije odabrano." + }, + "movedItemsToOrg": { + "message": "Odabrane stavke premjeÅĄtene u $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Stavke premjeÅĄtene u $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Stavka premjeÅĄtena u $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ pomaknuto dolje, pozicija $INDEX$ od$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Lokacija stavke" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "Send datoteke" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Send tekstovi" + }, + "bitwardenNewLook": { + "message": "Bitwarden ima novi izgled!" + }, + "bitwardenNewLookDesc": { + "message": "Auto-ispuna i pretraga iz kartice Trezor je lakÅĄa i intuitivnija nego ikad prije. Razgledaj!" + }, + "accountActions": { + "message": "Radnje na računu" + }, + "showNumberOfAutofillSuggestions": { + "message": "PrikaÅži broj prijedloga auto-ispune na ikoni proÅĄirenja" + }, + "systemDefault": { + "message": "Zadano sustavom" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Pravila tvrtke primijenjena su na ovu postavku" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "PokuÅĄaj ponovo" + }, + "vaultCustomTimeoutMinimum": { + "message": "Najmanje prilagođeno vrijeme je 1 minuta." + }, + "additionalContentAvailable": { + "message": "Dostupan je dodatni sadrÅžaj" + }, + "fileSavedToDevice": { + "message": "Datoteka spremljena na uređaj. Upravljaj u preuzimanjima svog uređaja." + }, + "showCharacterCount": { + "message": "PrikaÅži broj znakova" + }, + "hideCharacterCount": { + "message": "Sakrij broj znakova" + }, + "itemsInTrash": { + "message": "Stavke u smeću" + }, + "noItemsInTrash": { + "message": "Nema stavki u smeću" + }, + "noItemsInTrashDesc": { + "message": "Stavke koje obriÅĄeÅĄ biti će premjeÅĄtene ovdje, a nakon 30 dana biti će trajno izbrisane" + }, + "trashWarning": { + "message": "Stavke koje se nalaze u Smeću duÅže od 30 dana će biti automatski izbrisane" + }, + "restore": { + "message": "Vrati" + }, + "deleteForever": { + "message": "IzbriÅĄi zauvijek" + }, + "noEditPermissions": { + "message": "NemaÅĄ prava za uređivanje ove stavke" + }, + "authenticating": { + "message": "Autentifikacija" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 3b1c44dcfbb..cffb6ac3ea1 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Ingyenes jelszÃŗkezelő", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Egy biztonsÃĄgos Ês ingyenes jelszÃŗkezelő az Ãļsszes eszkÃļzre.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "BejelentkezÊs vagy Ãēj fiÃŗk lÊtrehozÃĄsa a biztonsÃĄgi szÊf elÊrÊsÊhez." }, + "inviteAccepted": { + "message": "A meghívÃĄs elfogadÃĄsra kerÃŧlt." + }, "createAccount": { "message": "FiÃŗk lÊtrehozÃĄsa" }, - "login": { - "message": "BejelentkezÊs" + "newToBitwarden": { + "message": "Új vagyunk a Bitwardenben?" + }, + "logInWithPasskey": { + "message": "BejelentkezÊs hozzÃĄfÊrÊsi kulccsal" + }, + "useSingleSignOn": { + "message": "Egyszeri bejelentkezÊs hasznÃĄlata" + }, + "welcomeBack": { + "message": "ÜdvÃļzlet Ãējra" + }, + "setAStrongPassword": { + "message": "Erős jelszÃŗ beÃĄllítÃĄsa" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "A fiÃŗk lÊtrehozÃĄsÃĄnak befejezÊse jelszÃŗ beÃĄllítÃĄsÃĄval" }, "enterpriseSingleSignOn": { "message": "VÃĄllalati ÃļnÃĄllÃŗ bejelentkezÊs" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A mesterjelszÃŗ emlÊkeztető segíthet emlÊkezni a jelszÃŗra elfelejtÊs esetÊn." }, + "masterPassHintText": { + "message": "Ha elfelejtettÃŧk a jelszÃŗt, a jelszÃŗra vonatkozÃŗ tippet elkÃŧldhetjÃŧk a sajÃĄt email címre. $CURRENT$/$MAXIMUM$ maximum karakter.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "A mesterjelszÃŗ ismÊtelt begÊpelÊse" }, "masterPassHint": { "message": "MesterjelszÃŗ emlÊkeztető (nem kÃļtelező)" }, + "joinOrganization": { + "message": "CsatlakozÃĄs szervezethez" + }, + "joinOrganizationName": { + "message": "CsatlakozÃĄs: $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "FejezzÃŧk be a szervezethez csatlakozÃĄst egy mesterjelszÃŗ beÃĄllítÃĄsÃĄval." + }, "tab": { "message": "FÃŧl" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "JelszÃŗ mÃĄsolÃĄsa" }, + "copyPassphrase": { + "message": "Jelmondat mÃĄsolÃĄsa" + }, "copyNote": { "message": "Jegyzet mÃĄsolÃĄsa" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "BiztonsÃĄgi kÃŗd mÃĄsolÃĄsa" }, + "copyName": { + "message": "NÊv mÃĄsolÃĄsa" + }, + "copyCompany": { + "message": "CÊg mÃĄsolÃĄsa" + }, + "copySSN": { + "message": "TÃĄrsadalombiztosítÃĄsi szÃĄm mÃĄsolÃĄsa" + }, + "copyPassportNumber": { + "message": "ÚtlevÊlszÃĄm mÃĄsolÃĄsa" + }, + "copyLicenseNumber": { + "message": "Licensz szÃĄm mÃĄsolÃĄsa" + }, + "copyPrivateKey": { + "message": "SzemÊlyes kulcs mÃĄsolÃĄsa" + }, + "copyPublicKey": { + "message": "NyilvÃĄnos kulcs mÃĄsolÃĄsa" + }, + "copyFingerprint": { + "message": "Ujjlenyomat mÃĄsolÃĄsa" + }, + "copyCustomField": { + "message": "$FIELD$ mÃĄsolÃĄsa", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Webhely mÃĄsolÃĄsa" + }, + "copyNotes": { + "message": "Jegyzet mÃĄsolÃĄsa" + }, + "fill": { + "message": "KitÃļltÊs", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Automatikus kitÃļltÊs" }, + "autoFillLogin": { + "message": "Automatikus kitÃļltÊs bejelentkezÊs" + }, + "autoFillCard": { + "message": "Automatikus kitÃļltÊs kÃĄrtya" + }, + "autoFillIdentity": { + "message": "Automatikus kitÃļltÊs szemÊlyazonossÃĄg" + }, "generatePasswordCopied": { "message": "JelszÃŗ generÃĄlÃĄs (mÃĄsolt)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Nincsenek egyező bejelentkezÊsek." }, + "noCards": { + "message": "Nincsenek kÃĄrtyÃĄk" + }, + "noIdentities": { + "message": "Nincsenek szemÊlyazonossÃĄgok" + }, + "addLoginMenu": { + "message": "BejelentkezÊs hozzÃĄadÃĄsa" + }, + "addCardMenu": { + "message": "KÃĄrtya hozzÃĄadÃĄsa" + }, + "addIdentityMenu": { + "message": "SzemÊlyazonosssÃĄg hozzÃĄadÃĄsa" + }, "unlockVaultMenu": { "message": "SzÊf kinyitÃĄsa" }, @@ -107,7 +223,7 @@ "message": "BejelentkezÊs a sajÃĄt szÊfbe" }, "autoFillInfo": { - "message": "Nincsenek elÊrhető bejelentkezÊsek ehhez a fÃŧlhÃļz ezÊrt az automatikus kitÃļltÊs nem mÅąkÃļdik." + "message": "Nincsenek elÊrhető bejelentkezÊsek az automatikus kitÃļltÊshez az aktuÃĄlis bÃļngÊszőfÃŧlnÊl." }, "addLogin": { "message": "BejelentkezÊs hozzÃĄadÃĄsa" @@ -115,6 +231,18 @@ "addItem": { "message": "Elem hozzÃĄadÃĄsa" }, + "accountEmail": { + "message": "FiÃŗk email cím" + }, + "requestHint": { + "message": "Tipp kÊrÊse" + }, + "requestPasswordHint": { + "message": "JelszÃŗ emlÊkeztető kÊrÊse" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Adjuk meg fiÃŗk email címÊt Ês elkÃŧldÊsre kerÃŧl a jelszÃŗra vonatkozÃŗ tipp." + }, "passwordHint": { "message": "JelszÃŗ emlÊkeztető" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "A folytatÃĄshoz meg kell erősíteni a szemÊlyazonossÃĄgot." }, - "account": { - "message": "FelhasznÃĄlÃŗ" - }, "changeMasterPassword": { "message": "MesterjelszÃŗ mÃŗdosítÃĄsa" }, + "continueToWebApp": { + "message": "TovÃĄbb a webes alkalmazÃĄshoz?" + }, + "continueToWebAppDesc": { + "message": "FedezzÃŧk fel a Bitwarden-fiÃŗk tovÃĄbbi funkciÃŗit a webalkalmazÃĄsban." + }, + "continueToHelpCenter": { + "message": "TovÃĄbb a SegítsÊg KÃļzponthoz?" + }, + "continueToHelpCenterDesc": { + "message": "TovÃĄbbi informÃĄciÃŗ a Bitwarden hasznÃĄlatÃĄrÃŗl a SegítsÊg KÃļzpontban." + }, + "continueToBrowserExtensionStore": { + "message": "TovÃĄbblÊpÊs a bÃļngÊsző bővítmÊnyek ÃĄruhÃĄzba?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "SegítsÃŧnk mÃĄsoknak megtudni, hogy a Bitwarden megfelelő-e szÃĄmukra. LÃĄtogassunk el a bÃļngÊsző bővítmÊny ÃĄruhÃĄzba Ês ÊrtÊkeljÃŧk most." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "A mesterjelszÃŗ a Bitwarden webalkalmazÃĄsban mÃŗdosíthatÃŗ." + }, "fingerprintPhrase": { "message": "Ujjlenyomat kifejezÊs", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "KijelentkezÊs" }, + "aboutBitwarden": { + "message": "Bitwarden nÊvjegy" + }, "about": { "message": "NÊvjegy" }, + "moreFromBitwarden": { + "message": "TovÃĄbbi infÃŗ a Bitwardenről" + }, + "continueToBitwardenDotCom": { + "message": "FolytatÃĄs a bitwarden.com webhelyen?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "A Bitwarden Authenticator lehetővÊ teszi hitelesítő kulcsok tÃĄrolÃĄsÃĄt Ês TOTP-kÃŗdok generÃĄlÃĄsÃĄt a kÊtlÊpcsős ellenőrzÊsi folyamatokhoz. Tudjunk meg tÃļbbet a bitwarden.com webhelyen." + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "BiztonsÃĄgosan tÃĄrolhatjuk, kezelhetjÃŧk Ês megoszthatjuk a fejlesztői titkos adatokat a Bitwarden Secrets Manager segítsÊgÊvel. Tudjunk meg tÃļbbet a bitwarden.com webhelyen." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Hozzunk lÊtre zÃļkkenőmentes Ês biztonsÃĄgos bejelentkezÊsi ÊlmÊnyt hagyomÃĄnyos jelszavak nÊlkÃŧl a Passwordless.dev segítsÊgÊvel. Tudjunk meg tÃļbbet a bitwarden.com webhelyen." + }, + "freeBitwardenFamilies": { + "message": "Ingyenes Bitwarden Families csomag" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Jogosult vagyunk az ingyenes Bitwarden Families csomagra. VÃĄltsuk be ezt az ajÃĄnlatot mÊg ma az internetes alkalmazÃĄsban." + }, "version": { "message": "VerziÃŗ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Mappa szerkesztÊse" }, + "newFolder": { + "message": "Új mappa" + }, + "folderName": { + "message": "MappanÊv" + }, + "folderHintText": { + "message": "Mappa beÃĄgyazÃĄsa a szÃŧlőmappa nevÊnek hozzÃĄadÃĄsÃĄval, majd egy “/” karakterrel. PÊlda: KÃļzÃļssÊgi/FÃŗrumok" + }, + "noFoldersAdded": { + "message": "Nem lett mappa hozzÃĄadva." + }, + "createFoldersToOrganize": { + "message": "Hozzunk lÊtre mappÃĄkat a szÊfelemek rendszerezÊsÊhez" + }, + "deleteFolderPermanently": { + "message": "Biztosan vÊglegesen tÃļrlÊsre kerÃŧljÃļn ez a mappa?" + }, "deleteFolder": { "message": "Mappa tÃļrlÊse" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "GenerÃĄtor", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatikusan lÊtrehoz erős, egyedi jelszavakat a bejelentkezÊseidhez." }, - "bitWebVault": { - "message": "Bitwarden webes szÊf" + "bitWebVaultApp": { + "message": "Bitwarden webes alkalmazÃĄs" }, "importItems": { "message": "Elemek importÃĄlÃĄsa" @@ -235,6 +435,9 @@ "generatePassword": { "message": "JelszÃŗ generÃĄlÃĄsa" }, + "generatePassphrase": { + "message": "Jelmondat generÃĄlÃĄs" + }, "regeneratePassword": { "message": "JelszÃŗ ÃējragenerÃĄlÃĄsa" }, @@ -244,17 +447,60 @@ "length": { "message": "Hossz" }, + "passwordMinLength": { + "message": "Minimum jelszÃŗ hosszÃēsÃĄg" + }, "uppercase": { - "message": "NagybetÅąs (A-Z)" + "message": "NagybetÅąs (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "KisbetÅąs (a-z)" + "message": "KisbetÅąs (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "SzÃĄmok (0-9)" + "message": "SzÃĄmok (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "SpeciÃĄlis karakterek (!@#$%^&*)" + "message": "SpeciÃĄlis karakterek (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "BevonÃĄs", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "NagybetÅąs karakterek bevonÃĄsa", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "KisbetÅąs karakterek bevonÃĄsa", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "SzÃĄmok bevonÃĄsa", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "SpeciÃĄlis karakterek bevonÃĄsa", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Szavak szÃĄma" @@ -276,7 +522,16 @@ "message": "MinimÃĄlis speciÃĄlis" }, "avoidAmbChar": { - "message": "FÊlreÊrthető karakterek mellőzÊse" + "message": "FÊlreÊrthető karakterek mellőzÊse", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "FÊlreÊrthető karakterek mellőzÊse", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "A vÃĄllalati hÃĄzirend kÃļvetelmÊnyei kerÃŧlnek alkalmazÃĄsra a generÃĄtor beÃĄllítÃĄsaira.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "KeresÊs a szÊfben" @@ -299,15 +554,30 @@ "password": { "message": "JelszÃŗ" }, + "totp": { + "message": "Hitelesítő titkos kulcs" + }, "passphrase": { "message": "KulcskifejezÊs" }, "favorite": { "message": "Kedvenc" }, + "unfavorite": { + "message": "Nem kedvenc" + }, + "itemAddedToFavorites": { + "message": "Az elem bekerÃŧlt a kedvencekhez." + }, + "itemRemovedFromFavorites": { + "message": "Az elem kikerÃŧlt a kedvencekből." + }, "notes": { "message": "Jegyzetek" }, + "privateNote": { + "message": "SzemÊlyes jegyzet" + }, "note": { "message": "Jegyzet" }, @@ -326,6 +596,18 @@ "launch": { "message": "IndítÃĄs" }, + "launchWebsite": { + "message": "Webhely indítÃĄsa" + }, + "launchWebsiteName": { + "message": "$ITEMNAME$ webhely elindítÃĄsa", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Weboldal" }, @@ -338,9 +620,24 @@ "other": { "message": "EgyÊb" }, + "unlockMethods": { + "message": "FeloldÃĄsi opciÃŗk" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Állítsunk be egy feloldÃĄsi mÃŗdot a szÊf időkifutÃĄsi mÅąveletÊnek mÃŗdosítÃĄsÃĄhoz." }, + "unlockMethodNeeded": { + "message": "FeloldÃĄsi mÃŗd beÃĄllítÃĄsa a BeÃĄllítÃĄsokban" + }, + "sessionTimeoutHeader": { + "message": "Munkamenet időkifutÃĄs" + }, + "vaultTimeoutHeader": { + "message": "SzÊf időkifutÃĄs" + }, + "otherOptions": { + "message": "EgyÊb opciÃŗk" + }, "rateExtension": { "message": "BővítmÊny ÊrtÊkelÊse" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "A szÊf zÃĄrolÃĄsra kerÃŧlt. A folytatÃĄshoz meg kell adni a mesterjelszÃŗt." }, + "yourVaultIsLockedV2": { + "message": "A szÊf zÃĄrolva van." + }, + "yourAccountIsLocked": { + "message": "A fiÃŗk zÃĄrolva van." + }, + "or": { + "message": "vagy" + }, "unlock": { "message": "FeloldÃĄs" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "SzÊf időkifutÃĄs" }, + "vaultTimeout1": { + "message": "IdőkifutÃĄs" + }, "lockNow": { "message": "ZÃĄrolÃĄs most" }, + "lockAll": { + "message": "Összes zÃĄrolÃĄsa" + }, "immediately": { "message": "Azonnal" }, @@ -426,6 +738,18 @@ "security": { "message": "BiztonsÃĄg" }, + "confirmMasterPassword": { + "message": "MesterjelszÃŗ megerősítÊse" + }, + "masterPassword": { + "message": "MesterjelszÃŗ" + }, + "masterPassImportant": { + "message": "A mesterjelszÃŗ nem ÃĄllíthatÃŗ helyre, ha elfelejtik!" + }, + "masterPassHintLabel": { + "message": "MesterjelszÃŗ emlÊkeztető" + }, "errorOccurred": { "message": "Hiba tÃļrtÊnt." }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "FelhasznÃĄlÃŗdat lÊtrehoztuk. Most mÃĄr be tudsz jelentkezni." }, + "newAccountCreated2": { + "message": "Az Ãēj fiÃŗk lÊtrrejÃļtt." + }, + "youHaveBeenLoggedIn": { + "message": "MegtÃļrtÊnt a bejelentkezÊs!" + }, + "youSuccessfullyLoggedIn": { + "message": "A bejelentkezÊs sikeres volt." + }, + "youMayCloseThisWindow": { + "message": "Most mÃĄr bezÃĄrhatÃŗ ez az ablak." + }, "masterPassSent": { "message": "ElkÃŧldtÃŧnk neked egy mesterjelszÃŗ emlÊkeztetődet tartalmazÃŗ E-mailt." }, "verificationCodeRequired": { "message": "Ellenőrző kÃŗd szÃŧksÊges." }, + "webauthnCancelOrTimeout": { + "message": "A hitelesítÊs megszakítÃĄsra kerÃŧlt vagy tÃēl sokÃĄig tartott. PrÃŗbÃĄljuk Ãējra." + }, "invalidVerificationCode": { "message": "ÉrvÊnytelen ellenőrző kÃŗd" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Nem sikerÃŧlt automatikusan kitÃļlteni a bejelentkezÊst ezen a weboldalon. Helyette mÃĄsold/illeszt be a felhasznÃĄlÃŗneved Ês/vagy a jelszavadat." + "message": "Nem sikerÃŧlt automatikusan kitÃļlteni a kivÃĄlasztott elemet ezen az oldalon. Helyette vÃĄgÃŗlapon keresztÃŧl kell bemÃĄsolni." + }, + "totpCaptureError": { + "message": "Az aktuÃĄlis weboldalÃŗl nem lehet szkennelni a QR kÃŗdot." + }, + "totpCaptureSuccess": { + "message": "A hitelesítő kulcs hozzÃĄadÃĄsra kerÃŧlt." + }, + "totpCapture": { + "message": "Hitelesítő QR kÃŗd szkennelÊse az aktuÃĄlis weboldalrÃŗl" + }, + "totpHelperTitle": { + "message": "TegyÃŧk zÃļkkenőmentessÊ a kÊtlÊpcsős azonosítÃĄst." + }, + "totpHelper": { + "message": "A Bitwarden kÊpes tÃĄrolni Ês kitÃļlteni a kÊtlÊpcsős ellenőrző kÃŗdokat. MÃĄsoljuk ki Ês illesszÃŧk be a kulcsot ebbe a mezőbe." + }, + "totpHelperWithCapture": { + "message": "A Bitwarden kÊpes tÃĄrolni Ês kitÃļlteni a kÊtlÊpcsős ellenőrző kÃŗdokat. VÃĄlasszuk a kamera ikont, hogy kÊpernyőkÊpet kÊszítsÃŧnk a webhely hitelesítő QR kÃŗdjÃĄrÃŗl vagy mÃĄsoljuk ki Ês illesszÃŧk be a kulcsot ebbe a mezőbe." + }, + "learnMoreAboutAuthenticators": { + "message": "TovÃĄbbi informÃĄciÃŗ a hitelesítőkről" + }, + "copyTOTP": { + "message": "Hitelesítő kÃŗd mÃĄsolÃĄsa (TOTP)" }, "loggedOut": { "message": "Kijelentkezett" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "BejelentkezÊsi munkamenete lejÃĄrt." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "BejelentkezÊs a Bitwardenbe" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Biztos benne, hogy ki szeretnÊl jelentkezni?" }, @@ -503,17 +887,17 @@ "addedFolder": { "message": "A mappa hozzÃĄadÃĄsra kerÃŧlt." }, - "changeMasterPass": { - "message": "MesterjelszÃŗ mÃŗdosítÃĄsa" - }, - "changeMasterPasswordConfirmation": { - "message": "Mesterjelszavadat a bitwarden.com webes szÊfÊn tudod megvÃĄltoztatni. SzeretnÊd meglÃĄtogatni a most a weboldalt?" - }, "twoStepLoginConfirmation": { "message": "A kÊtlÊpcsős bejelentkezÊs biztonsÃĄgosabbÃĄ teszi a fiÃŗkot azÃĄltal, hogy ellenőrizni kell a bejelentkezÊst egy mÃĄsik olyan eszkÃļzzel mint pÊldÃĄul biztonsÃĄgi kulcs, hitelesítő alkalmazÃĄs, SMS, telefon hívÃĄs vagy email. A kÊtlÊpcsős bejelentkezÊst a bitwarden.com webes szÊfben lehet engedÊlyezni. FelkeressÃŧk a webhelyet most?" }, + "twoStepLoginConfirmationContent": { + "message": "TegyÃŧk biztonsÃĄgosabbÃĄ a fiÃŗkot a kÊtlÊpcsős bejelentkezÊs beÃĄllítÃĄsÃĄval a Bitwarden webalkalmazÃĄsban." + }, + "twoStepLoginConfirmationTitle": { + "message": "TovÃĄbb a webes alkalmazÃĄshoz?" + }, "editedFolder": { - "message": "A mappa mÃŗdosítÃĄsra kerÃŧlt." + "message": "A mappa mentÊsre kerÃŧlt." }, "deleteFolderConfirmation": { "message": "Biztos, hogy tÃļrÃļlni akarod ezt a mappÃĄt?" @@ -552,6 +936,10 @@ "newUri": { "message": "Új URI" }, + "addDomain": { + "message": "TartomÃĄny hozzÃĄadÃĄsa", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Az elem hozzÃĄadÃĄsra kerÃŧlt." }, @@ -562,7 +950,7 @@ "message": "Biztosan tÃļrlÊsre kerÃŧljÃļn ezt az elem?" }, "deletedItem": { - "message": "Az elem tÃļrlÊsre kerÃŧlt." + "message": "Az elem a lomtÃĄrba kerÃŧlt." }, "overwritePassword": { "message": "JelszÃŗ felÃŧlírÃĄsa" @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "BejelentkezÊs hozzÃĄadÃĄs kÊrÊse" }, + "vaultSaveOptionsTitle": { + "message": "MentÊs szÊf opciÃŗkba" + }, "addLoginNotificationDesc": { "message": "A \"BejelentkezÊs ÊrtesítÊs hozzÃĄadÃĄsa\" automatikusan felajÃĄnlja a bejelentkezÊs szÊfbe mentÊsÊt az első bejelentkezÊskor." }, + "addLoginNotificationDescAlt": { + "message": "Egy elem hozzÃĄadÃĄsÃĄnak kÊrÊse, ha az nem talÃĄlhatÃŗ a szÊfben. Minden bejelentkezett fiÃŗkra vonatkozik." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "KÃĄrtyÃĄk megjelenítÊse a FÃŧl oldalon" }, "showCardsCurrentTabDesc": { "message": "KÃĄrtyaelemek listÃĄzÃĄsa a FÃŧl oldalon a kÃļnnyÅą automatikus kitÃļltÊshez." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "AzonosítÃĄsok megjelenítÊse a FÃŧl oldalon" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "A bejelentkezÊsi jelszÃŗ frissítÊsÊnek kÊrÊse a webhelyen tÃļrtÊnő vÃĄltozÃĄs ÊrzÊkelÊsekor." }, + "changedPasswordNotificationDescAlt": { + "message": "A bejelentkezÊsi jelszÃŗ frissítÊsÊnek kÊrÊse, ha vÃĄltozÃĄst lett ÊrzÊkelve egy webhelyen. Minden bejelentkezett fiÃŗkra vonatkozik." + }, + "enableUsePasskeys": { + "message": "KÊrÊs a hozzÃĄfÊrÊsi kulcs mentÊsÊre Ês hasznÃĄlatÃĄra" + }, + "usePasskeysDesc": { + "message": "KÊrÊs az Ãēj hozzÃĄfÊrÊi kulcsok mentÊsÊre vagy bejelentkezÊs a szÊfben tÃĄrolt hozzÃĄfÊrÊsi kulcsokkal. Minden bejelentkezett fiÃŗkra vonatkozik." + }, "notificationChangeDesc": { "message": "FrissítÊsre kerÃŧljÃļn a jelszÃŗ a Bitwardenben?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "FeloldÃĄs" }, + "additionalOptions": { + "message": "KiegÊszítő opciÃŗk" + }, "enableContextMenuItem": { "message": "Helyi menÃŧ opciÃŗk megjelenítÊse" }, "contextMenuItemDesc": { "message": "MÃĄsodlagos kattintÃĄssal fÊrhetÃŧnk hozzÃĄ a webhely jelszÃŗ-generÃĄlÃĄsÃĄhoz Ês a egyező bejelentkezÊsekhez." }, + "contextMenuItemDescAlt": { + "message": "MÃĄsodlagos kattintÃĄssal elÊÊrhető a jelszÃŗgenerÃĄlÃĄs Ês a megfelelő bejelentkezÊsi adatok a webhelyhez. Minden bejelentkezett fiÃŗkra vonatkozik." + }, "defaultUriMatchDetection": { "message": "AlapÊrtelmezett URI egyezÊs ÊrzÊkelÊs", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Az URI egyezÊs ÊrzÊkelÊs alapÊrtelmezett mÃŗdjÃĄnak kivÃĄlasztÃĄsa a bejelentkezÊseknÊl olyan mÅąveletek esetÊben mint az automatikus kitÃļltÊs." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Az alkalmazÃĄs színtÊmÃĄjÃĄnak megvÃĄltoztatÃĄsa." }, + "themeDescAlt": { + "message": "Az alkalmazÃĄs színtÊma mÃŗdosítÃĄsa. Minden bejelentkezett fiÃŗkra vonatkozik." + }, "dark": { "message": "SÃļtÊt", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "SzolarizÃĄlt sÃļtÊt", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "ExportÃĄlÃĄs innen:" + }, "exportVault": { "message": "SzÊf exportÃĄlÃĄsa" }, "fileFormat": { "message": "FÃĄjlformÃĄtum" }, + "fileEncryptedExportWarningDesc": { + "message": "Ez a fÃĄjl exportÃĄlÃĄs jelszÃŗval vÊdett Ês a visszafejtÊshez a fÃĄjl jelszÃŗ megadÃĄsa szÃŧksÊges." + }, + "filePassword": { + "message": "FÃĄjl jelszÃŗ" + }, + "exportPasswordDescription": { + "message": "Ezt a jelszÃŗ kerÃŧl hasznÃĄlatba a fÃĄjl exportÃĄlÃĄsÃĄra Ês importÃĄlÃĄsÃĄra." + }, + "accountRestrictedOptionDescription": { + "message": "HasznÃĄljuk a fiÃŗk felhasznÃĄlÃŗnevÊből Ês mesterjelszavÃĄbÃŗl szÃĄrmazÃŗ fiÃŗktitkosítÃĄsi kulcsot az exportÃĄlÃĄs titkosítÃĄsÃĄhoz Ês az importÃĄlÃĄst csak az aktuÃĄlis Bitwarden fiÃŗkra korlÃĄtozzuk." + }, + "passwordProtectedOptionDescription": { + "message": "Állítsunk be egy fÃĄjl jelszÃŗt az exportÃĄlÃĄs titkosítÃĄsÃĄhoz Ês importÃĄljuk azt bÃĄrmely Bitwarden fiÃŗkba a visszafejtÊshez hasznÃĄlt jelszÃŗ hasznÃĄlatÃĄval." + }, + "exportTypeHeading": { + "message": "ExportÃĄlÃĄsi típus" + }, + "accountRestricted": { + "message": "KorlÃĄtozott fiÃŗk" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "A “FÃĄjl jelszÃŗâ€ Ês a “FÃĄjl jelszÃŗ megerősítÊs“ nem egyezik." + }, "warning": { "message": "FIGYELEM", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Megosztott" }, - "learnOrg": { - "message": "InformÃĄciÃŗ szervezetekről" - }, - "learnOrgConfirmation": { - "message": "A Bitwarden lehetővÊ teszi a tÃĄrolÃŗ elemeinek megosztÃĄsÃĄt mÃĄsokkal egy szervezet hasznÃĄlatÃĄval. SzeretnÊnk ellÃĄtogatni a bitwarden.com webhelyre tovÃĄbbi informÃĄciÃŗkÊt?" + "bitwardenForBusinessPageDesc": { + "message": "A Bitwarden for Business lehetővÊ teszi a szÊf elemeinek megosztÃĄsÃĄt mÃĄsokkal egy szervezet hasznÃĄlatÃĄval. TovÃĄbbi informÃĄciÃŗ a bitwarden.com webhelyen." }, "moveToOrganization": { "message": "ÁthelyezÊs szervezethez" @@ -762,6 +1204,9 @@ "file": { "message": "FÃĄjl" }, + "fileToShare": { + "message": "MegosztandÃŗ fÃĄjl" + }, "selectFile": { "message": "VÃĄlasszunk egy fÃĄjlt." }, @@ -769,7 +1214,7 @@ "message": "A naximÃĄlis fÃĄjlmÊret 500 MB." }, "featureUnavailable": { - "message": "Ez a funkciÃŗ nem Êrhető el." + "message": "A funkciÃŗ nem Êrhető el." }, "encryptionKeyMigrationRequired": { "message": "TitkosítÃĄsi kulcs migrÃĄciÃŗ szÃŧksÊges. JelentkezzÃŧnk be a webes szÊfen keresztÃŧl a titkosítÃĄsi kulcs frissítÊsÊhez." @@ -787,7 +1232,7 @@ "message": "TagsÃĄg frissítÊse" }, "premiumNotCurrentMember": { - "message": "Jelenleg nincs prÊmium tagsÃĄg." + "message": "Jelenleg nem vagyunk prÊmium tag." }, "premiumSignUpAndGet": { "message": "RegisztrÃĄciÃŗ a prÊmium tagsÃĄgra az alÃĄbbi funkciÃŗkÊrt:" @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "1 GB titkosított tÃĄrhely a fÃĄjlmellÊkleteknek." }, + "premiumSignUpEmergency": { + "message": "SÃŧrgőssÊgi hozzÃĄfÊrÊs" + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "SajÃĄt kÊtlÊpcsős bejelentkezÊsi lehetősÊgek mint a YubiKey Ês a Duo." }, "ppremiumSignUpReports": { "message": "JelszÃŗ higiÊnia, fiÃŗk biztonsÃĄg Ês adatszivÃĄrgÃĄsi jelentÊsek a szÊf biztonsÃĄga ÊrdekÊben." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "A prÊmium tagsÃĄg megvÃĄsÃĄrolhatÃŗ a bitwarden.com webes szÊfben. SzeretnÊnk felkeresni a webhelyet most?" }, + "premiumPurchaseAlertV2": { + "message": "PrÊmium szolgÃĄltatÃĄst vÃĄsÃĄrolhatunk a Bitwarden webalkalmazÃĄs fiÃŗkbeÃĄllítÃĄsai kÃļzÃļtt." + }, "premiumCurrentMember": { - "message": "Jelenleg a prÊmium tagsÃĄg ÊrvÊnyben van." + "message": "PrÊmium tag vagyunk!" }, "premiumCurrentMemberThanks": { "message": "KÃļszÃļnjÃŧk a Bitwarden tÃĄmogatÃĄsÃĄt." }, + "premiumFeatures": { + "message": "ÁttÊrÊs prÊmium verziÃŗra Ês fogadÃĄs:" + }, "premiumPrice": { "message": "Mindez csak $PRICE$ /Êv.", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Mindez csak $PRICE$ /Êv!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "FrissítÊs megtÃļrtÊnt" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Hitelesítő alkalmazÃĄs" }, - "authenticatorAppDesc": { - "message": "HasznÃĄlj egy mÃĄsik alkalmazÃĄst (mint pÊldÃĄul az Authy vagy a Google Authenticator) idő alapÃē ellenőrzőkÃŗd generÃĄlÃĄsÃĄhoz.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Adjunk meg egy hitelesítő alkalmazÃĄs, pÊldÃĄul a Bitwarden Authenticator ÃĄltal generÃĄlt kÃŗdot.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { + "yubiKeyTitleV2": { "message": "YubiKey OTP biztonsÃĄgi kulcs" }, "yubiKeyDesc": { "message": "HasznÃĄlj egy YubiKey-t, hogy hozzÃĄ fÊrhess a felhasznÃĄlÃŗdhoz. MÅąkÃļdik a YubiKey 4, 4 Nano, 4C, Ês NEO eszkÃļzÃļkkel." }, - "duoDesc": { - "message": "Ellenőrizd Duo Security-val a Duo Mobile alkalmazÃĄs, SMS, telefon hívÃĄs vagy U2F biztonsÃĄgi kulcs segítsÊgÊvel.", + "duoDescV2": { + "message": "Adjuk meg a Duo Security ÃĄltal generÃĄlt kÃŗdot.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-mail" }, - "emailDesc": { - "message": "Ellenőrző kÃŗdok el lesznek e-mailbe kÃŧldve neked." + "emailDescV2": { + "message": "Adjuk meg az email címre elkÃŧldÃļtt kÃŗdot." }, "selfHostedEnvironment": { "message": "SajÃĄt ÃŧzemeltetÊsÅą kÃļrnyezet" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "A helyileg mÅąkÃļdtetett Bitwarden telepítÊs alap webcímÊnek megadÃĄsa." }, + "selfHostedBaseUrlHint": { + "message": "Adjuk meg a helyileg tÃĄrolt Bitwarden telepítÊs alap webcímÊt. PÊlda: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "SpeciÃĄlis konfigurÃĄciÃŗhoz kÃŧlÃļn-kÃŧlÃļn megadhatjuk az egyes szolgÃĄltatÃĄsok alap webcímÊt." + }, + "selfHostedEnvFormInvalid": { + "message": "HozzÃĄ kell adni az alapszerver webcímÊt vagy legalÃĄbb egy egyedi kÃļrnyezetet." + }, "customEnvironment": { "message": "Egyedi kÃļrnyezet" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Szerver URL" }, + "selfHostBaseUrl": { + "message": "SajÃĄt ÃŧzemeltetÊsÅą szerver webcím", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API szerver webcím" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "A kÃļrnyezeti webcímek mentÊsre kerÃŧltek." }, + "showAutoFillMenuOnFormFields": { + "message": "Automatikus kitÃļltÊs menÃŧ megjelenítÊse az ÅąrlapmezőkÃļn", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Az identitÃĄsok megjelenítÊse javaslatkÊnt" + }, + "showInlineMenuCardsLabel": { + "message": "A kÃĄrtyÃĄk megjelenítÊse javaslatkÊnt" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Az ÃŧtkÃļzÊsek elkerÃŧlÊse ÊrdekÊben kapcsoljuk ki a bÃļngÊsző beÊpített jelszÃŗkezelő beÃĄllítÃĄsait." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "A bÃļngÊsző beÃĄllítÃĄsok szerkesztÊse." + }, + "autofillOverlayVisibilityOff": { + "message": "Ki", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Ha az automatikus kitÃļltÊs menÃŧ kerÃŧlt kivÃĄlasztÃĄsra", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Automatikus kitÃļltÊs oldalbetÃļltÊsnÊl" + "message": "Automatikus kitÃļltÊs engedÊlyezÊse oldal betÃļltÊskor" }, "enableAutoFillOnPageLoadDesc": { "message": "Ha egy bejelentkezÊsi Åąrlap ÊszlelÊsre kerÃŧlt, az adatok automatikus kitÃļltÊse az oldal betÃļltÊsekor." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Az oldalbetÃļltÊsnÊl automatikus kitÃļltÊst a feltÃļrt vagy nem megbízhatatÃŗ weboldalak kihasznÃĄlhatjÃĄk." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "TovÃĄbbi informÃĄciÃŗk az automatikus kitÃļltÊsről" }, @@ -994,7 +1529,7 @@ "message": "AlapÊrtelmezett beÃĄllítÃĄsok bejelentkezÊsi elemekhez" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Az Automatikus kitÃļltÊs engedÊlyezÊse az oldalbetÃļltÊskor engedÊlyezheti vagy letilthatja a funkciÃŗt az egyes bejelentkezÊsi elemeknÊl. Ez az alapÊrtelmezett beÃĄllítÃĄs a bejelentkezÊsi elemeknÊll, amelyek nincsenek kÃŧlÃļn konfigurÃĄlva." + "message": "Az egyes bejelentkezÊsi elemeknÊl kikapcsolhatjuk oldalbetÃļltÊskor az automatikus kitÃļltÊst az elem SzerkesztÊs nÊzetÊben." }, "itemAutoFillOnPageLoad": { "message": "Automatikus kitÃļltÊs oldal betÃļltÊsnÊl (Ha engedÊlyezett az opciÃŗknÃĄl)" @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "SzÊf megnyitÃĄsa oldalsÃĄvon" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "Az aktuÃĄlis webhelynÊl az utoljÃĄra hasznÃĄlt bejelentkezÊs automatikus kitÃļltÊse." }, + "commandAutofillCardDesc": { + "message": "Az aktuÃĄlis webhelynÊl az utoljÃĄra hasznÃĄlt kÃĄrtya." + }, + "commandAutofillIdentityDesc": { + "message": "Az aktuÃĄlis webhelynÊl az utoljÃĄra hasznÃĄlt szemÊlyazonosítÃŗ." + }, "commandGeneratePasswordDesc": { "message": "Új vÊletlenszerÅą jelszÃŗ generÃĄlÃĄsa ÃĄs mÃĄsolÃĄsa a vÃĄgÃŗlapra." }, "commandLockVaultDesc": { "message": "A szÊf zÃĄrolÃĄsa" }, - "privateModeWarning": { - "message": "A privÃĄt mÃŗd tÃĄmogatÃĄsa kísÊrleti Ês nÊhÃĄny funkciÃŗ korlÃĄtozott." - }, "customFields": { "message": "Egyedi mezők" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean (Logikai)" }, + "cfTypeCheckbox": { + "message": "JelÃļlődoboz" + }, "cfTypeLinked": { "message": "Csatolva", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Felismerhető kÊp megjelenítÊse minden bejelentkezÊs mellett." }, + "faviconDescAlt": { + "message": "Minden bejelentkezÊs mellett egy felismerhető kÊp megjelenítÊse. Minden bejelentkezett fiÃŗkra vonatkozik." + }, "enableBadgeCounter": { "message": "SzÃĄmlÃĄlÃŗ jelvÊny megjelenítÊse" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "SzemÊlyazonossÃĄg" }, + "typeSshKey": { + "message": "SSH kulcs" + }, + "newItemHeader": { + "message": "Új $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ szerkesztÊse", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "$TYPE$ megtekintÊse", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "JelszÃŗ előzmÊnyek" }, + "generatorHistory": { + "message": "GenerÃĄtor előzmÊnyek" + }, + "clearGeneratorHistoryTitle": { + "message": "BeenerÃĄtor előzmÊnyek kiÃŧrítÊse" + }, + "cleargGeneratorHistoryDescription": { + "message": "Ha folytatjuk, az Ãļsszes bejegyzÊs vÊglegesen tÃļrlődik a generÃĄtor előzmÊnyeiből. Biztosan folytatjuk?" + }, "back": { "message": "Vissza" }, "collections": { "message": "GyÅąjtemÊnyek" }, + "nCollections": { + "message": "$COUNT$ gyÅąjtemÊny", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Kedvencek" }, @@ -1282,6 +1874,10 @@ "message": "Alap domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Alap domain (ajÃĄnlott)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "TartomÃĄnynÊv", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "TalÃĄlat ÊrzÊkelÊs", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "AlapÊrtelmezett talÃĄlat ÊrzÊkelÊs", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "OpciÃŗk vÃĄltÃĄsa" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Nincsenek listÃĄzhatÃŗ jelszavak." }, + "clearHistory": { + "message": "ElőzmÊnyek tÃļrlÊse" + }, + "nothingToShow": { + "message": "Nincs megjeleníthető elem" + }, + "nothingGeneratedRecently": { + "message": "MostanÃĄban nem lett semmi generÃĄlva." + }, "remove": { "message": "EltÃĄvolítÃĄs" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "FelnyitÃĄs pinkÃŗddal" }, + "setYourPinTitle": { + "message": "PIN kÃŗd beÃĄllítÃĄsa" + }, + "setYourPinButton": { + "message": "PIN kÃŗd beÃĄllítÃĄsa" + }, "setYourPinCode": { "message": "A pinkÃŗd beÃĄllítÃĄsa a Bitwarden feloldÃĄsÃĄhoz. A pinkÃŗd beÃĄllítÃĄs alaphelyzetbe kerÃŧl, ha teljesen kijelentkezÃŧnk az alkalmazÃĄsbÃŗl." }, + "setYourPinCode1": { + "message": "A Bitwarden feloldÃĄsÃĄhoz a PIN kÃŗdot hasznÃĄljuk a mesterjelszÃŗ helyett. A PIN kÃŗd alaphelyzetbe kerÃŧl, ha teljesen kijelentkezÃŧnk a Bitwardenből." + }, "pinRequired": { "message": "A pinkÃŗd szÃŧksÊges." }, "invalidPin": { "message": "A pinkÃŗd ÊrvÊnytelen." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "TÃēl sok az ÊrvÊnytelen PIN beviteli kísÊrlet. KijelentkezÊs tÃļrtÊnik." + }, "unlockWithBiometrics": { "message": "Biometrikus feloldÃĄs" }, + "unlockWithMasterPassword": { + "message": "FeloldÃĄs mesterjelszÃŗval" + }, "awaitDesktop": { "message": "VÃĄrakozÃĄs megerősítÊsre az asztali alkalmazÃĄsbÃŗl" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "LezÃĄrÃĄs mesterjelszÃŗval a bÃļngÊsző ÃējraindítÃĄsakor" }, + "lockWithMasterPassOnRestart1": { + "message": "LezÃĄrÃĄs mesterjelszÃŗval a bÃļngÊsző ÃējraindítÃĄsakor" + }, "selectOneCollection": { "message": "LegalÃĄbb egy gyÅąjtemÊnyt ki kell vÃĄlasztani." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Egy vagy tÃļbb szervezeti szabÃĄly Êrinti a generÃĄtor beÃĄllítÃĄsokat." }, + "passwordGenerator": { + "message": "JelszÃŗ generÃĄtor" + }, + "usernameGenerator": { + "message": "FelhasznÃĄlÃŗnÊv generÃĄtor" + }, + "useThisPassword": { + "message": "JelszÃŗ hasznÃĄlata" + }, + "useThisUsername": { + "message": "FelhasznÃĄlÃŗnÊv hasznÃĄlata" + }, + "securePasswordGenerated": { + "message": "A biztonsÃĄgos jelszÃŗ generÃĄlÃĄsra kerÃŧlt! Ne felejtsÃŧk el frissíteni a jelszÃŗt a webhelyen is." + }, + "useGeneratorHelpTextPartOne": { + "message": "GenerÃĄtor hasznÃĄlata", + "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": "erős egyedi jelszÃŗ lÊtrehozÃĄsÃĄhoz", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "SzÊf időkifutÃĄs mÅąvelet" }, + "vaultTimeoutAction1": { + "message": "IdőkifutÃĄsi mÅąvelet" + }, "lock": { "message": "LezÃĄrÃĄs", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "LomtÃĄr", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "VisszaÃĄllított elem" }, + "alreadyHaveAccount": { + "message": "Van mÃĄr sajÃĄt fiÃŗk?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Kijelentkezve az Ãļsszes szÊf elÊrÊs eltÃĄvolítÃĄsra kerÃŧl Ês webes hitelesítÊsre van szÃŧksÊg az időkifutÃĄs utÃĄn. Biztosan szeretnÊnk hasznÃĄlni ezt a beÃĄllítÃĄst?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Automatikus kitÃļltÊs Ês mentÊs" }, + "fillAndSave": { + "message": "KitÃļltÊs Ês mentÊs" + }, "autoFillSuccessAndSavedUri": { "message": "Automatikusan kitÃļltÃļtt elem Ês mentett URI" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Az Ãēj mesterjelszÃŗ nem felel meg a szabÃĄly kÃļvetelmÊnyeknek." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "LeiratkozÃĄs" + }, + "atAnyTime": { + "message": "bÃĄrmikor." + }, + "byContinuingYouAgreeToThe": { + "message": "A folytatÃĄssal elfogadjuk" + }, + "and": { + "message": "Ês" + }, "acceptPolicies": { "message": "A doboz bejelÃļlÊsÊvel elfogadjuk a kÃļvetkezőket:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Asztali szinkronizÃĄlÃĄs ellenőrzÊs" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "A fiÃŗk nem egyezik." }, + "nativeMessagingWrongUserKeyTitle": { + "message": "A biometrikus kulcs nem egyezik." + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "A biometrikus feloldÃĄs nem sikerÃŧlt. A biometrikus titkos kulcs nem tudta feloldani a szÊfet. PrÃŗbÃĄljuk Ãējra beÃĄllítani a biometrikus adatokat." + }, "biometricsNotEnabledTitle": { "message": "A biometrikus adatok nincsenek beÃŧzemelve." }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "A bÃļngÊsző biometrikus adatait ez az eszkÃļz nem tÃĄmogatja." }, + "biometricsNotUnlockedTitle": { + "message": "A felhasznÃĄlÃŗ zÃĄrolva van vagy kijelentkezett." + }, + "biometricsNotUnlockedDesc": { + "message": "Oldjuk fel a felhasznÃĄlÃŗ zÃĄrolÃĄsÃĄt az asztali alkalmazÃĄsban Ês prÃŗbÃĄljuk Ãējra." + }, + "biometricsNotAvailableTitle": { + "message": "A biometrikus feloldÃĄs nem Êrhető el." + }, + "biometricsNotAvailableDesc": { + "message": "A biometrikus feloldÃĄs jelenleg nem Êrhető el. PrÃŗbÃĄljuk Ãējra kÊsőbb." + }, "biometricsFailedTitle": { "message": "A biometria nem sikerÃŧlt." }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "A szervezeti hÃĄzirend befolyÃĄsolja a tulajdonosi opciÃŗkat." }, + "personalOwnershipPolicyInEffectImports": { + "message": "A szervezeti politika blokkolta az elemek importÃĄlÃĄsÃĄt az egyedi szÊfbe." + }, + "domainsTitle": { + "message": "TartomÃĄny", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "KizÃĄrt domainek" }, "excludedDomainsDesc": { "message": "A Bitwarden nem fogja kÊrni a domainek bejelentkezÊsi adatainak mentÊsÊt. A vÃĄltozÃĄsok Êletbe lÊpÊsÊhez frissíteni kell az oldalt." }, + "excludedDomainsDescAlt": { + "message": "A Bitwarden nem kÊri a bejelentkezÊsi adatok mentÊsÊt ezeknÊl a tartomÃĄnyoknÃĄl az Ãļsszes bejelentkezÊsi fiÃŗkra vonatkozva. A vÃĄltoztatÃĄsok Êletbe lÊpÊsÊhez frissíteni kell az oldalt." + }, + "websiteItemLabel": { + "message": "Webhely $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nem ÊrvÊnyes domain.", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "A kizÃĄrt tartomÃĄny mÃŗdosítÃĄsok mentÊsre kerÃŧltek." + }, + "limitSendViews": { + "message": "MegtekintÊsek korlÃĄtozÃĄsa" + }, + "limitSendViewsHint": { + "message": "Senki sem tudja megtekinteni ezt a Send elemet a korlÃĄt elÊrÊse utÃĄn.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ megtekintÊs maradt", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send rÊszletek", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send keresÊse", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "SzÃļveg" }, + "sendTypeTextToShare": { + "message": "MegosztandÃŗ szÃļveg" + }, "sendTypeFile": { "message": "FÃĄjl" }, @@ -1666,6 +2406,9 @@ "message": "Összes Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "SzÃļveg elrejtÊse alapÊrtelmezetten" + }, "maxAccessCountReached": { "message": "A maximÃĄlis hozzÃĄfÊrÊsek szÃĄma elÊrÊsre kerÃŧlt.", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "JelszÃŗval vÊdett" }, + "copyLink": { + "message": "HivatkozÃĄs mÃĄsolÃĄsa" + }, "copySendLink": { "message": "Send hivatkozÃĄs mÃĄsolÃĄsa", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Biztosan tÃļrlÊsre kerÃŧljÃļn ez a Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Biztosan vÊglegesen tÃļrlÊsre kerÃŧljÃļn ez a Send elem?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Send szerkesztÊse", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "A Send vÊglegesen tÃļrÃļlve lesz a meghatÃĄrozott időpontban.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "A Send vÊglegesen tÃļrÃļlve lesz ebben az időpontban.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "LejÃĄrati dÃĄtum" }, @@ -1769,6 +2523,10 @@ "message": "OpcionÃĄlisan megadhatunk egy jelszÃŗt a felhasznÃĄlÃŗk szÃĄmÃĄra a KÃŧldÊs elÊrÊsÊhez. ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Adjunk meg egy opcionÃĄlis jelszÃŗt a címzetteknek a Send elÊrÊsÊhez.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "SzemÊlyes megjegyzÊsek erről a KÃŧldÊsről.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "A Send lÊtrejÃļtt.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "A Send sikeresen lÊtrejÃļtt!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "A Send bÃĄrki szÃĄmÃĄra elÊrhető a hivatkozÃĄssal a kÃļvetkező 1 ÃŗrÃĄban.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "A Send bÃĄrki szÃĄmÃĄra elÊrhető a hivatkozÃĄssal a kÃļvetkező $HOURS$ ÃŗrÃĄban.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "A Send bÃĄrki szÃĄmÃĄra elÊrhető a hivatkozÃĄssal a kÃļvetkező 1 napban.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "A Send bÃĄrki szÃĄmÃĄra elÊrhető a hivatkozÃĄssal a kÃļvetkező $DAYS$ napban.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "A Send hivatkozÃĄs mÃĄsolÃĄsra kerÃŧlt.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "A Send mentÊsre kerÃŧlt.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "BővítmÊny ÃĄtthelyezÊse?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "A Send fÃĄjl lÊtrehozÃĄsÃĄhoz ÃĄt kell helyezni a bővítmÊnyt egy Ãēj ablakba.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "A fÃĄjl kivÃĄlasztÃĄsÃĄhoz nyissuk meg a kiterjesztÊst az oldalsÃĄvon (ha lehetsÊges) vagy kattintsunk erre a sÃĄvra Ãēj ablak felbukkanÃĄsÃĄhoz." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "A fÃĄjl kivÃĄlasztÃĄsÃĄhoz Safariban kattintsunk erre a hirdetőtÃĄblÃĄra kattintva Ãēj ablak nyílik meg." }, + "popOut": { + "message": "ÁthelyezÊs" + }, "sendFileCalloutHeader": { "message": "Mielőtt belevÃĄgnÃĄnk" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "SajÃĄt email cím elrejtÊse a címzettek elől." }, + "hideYourEmail": { + "message": "SajÃĄt email cím elrejtÊse a megtekintÊsek elől." + }, "sendOptionsPolicyInEffect": { "message": "Egy vagy tÃļbb szervezeti szabÃĄly Êrinti a Send opciÃŗkat." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email hitelesítÊs szÃŧksÊges" }, + "emailVerifiedV2": { + "message": "Az email cím ellenőrzÊsre kerÃŧlt." + }, "emailVerificationRequiredDesc": { "message": "A funkciÃŗ hasznÃĄlatÃĄhoz igazolni kell email címet. Az email cím a webtÃĄrban ellenőrizhető." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "A mesterjelszÃŗ nem felel meg egy vagy tÃļbb szervezeti szabÃĄlyzatnak. A szÊf elÊrÊsÊhez frissíteni kell a meszerjelszÃŗt. A tovÃĄbblÊpÊs kijelentkeztet az aktuÃĄlis munkamenetből Ês Ãējra be kell jelentkezni. A tÃļbbi eszkÃļzÃļn lÊvő aktív munkamenetek akÃĄr egy ÃŗrÃĄig is aktívak maradhatnak." }, + "tdeDisabledMasterPasswordRequired": { + "message": "A szervezete letiltotta a megbízhatÃŗ eszkÃļzÃļk titkosítÃĄsÃĄt. Állítsunk be egy mesterjelszÃŗt a szÊf elÊrÊsÊhez." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatikus regisztrÃĄciÃŗ" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Mappa vÃĄlasztÃĄsa..." }, - "ssoCompleteRegistration": { - "message": "Az SSO-val tÃļrtÊnő bejelentkezÊs befejezÊsÊhez mesterjelszÃŗt kell beÃĄllítani a szÊf elÊrÊsÊhez Ês vÊdelmÊhez." + "noFoldersFound": { + "message": "Nem talÃĄlhatÃŗk mappÃĄk.", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "A szervezeti engedÊlyek frissítÊsre kerÃŧltek, ezÊrt be kell ÃĄllítani egy mesterjelszÃŗt.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "A szervezet megkÃļveteli egy mesterjelszÃŗ beÃĄllítÃĄsÃĄt.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "/ $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "EllenőrzÊs szÃŧksÊges", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Óra" @@ -1904,8 +2740,37 @@ "minutes": { "message": "Perc" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Erre a beÃĄllítÃĄsra a vÃĄllalkozÃĄs rendszabÃĄly kÃļvetelmÊnyek lettek alkalmazva." + }, "vaultTimeoutPolicyInEffect": { - "message": "A szervezeti hÃĄzirendek hatÃĄssal vannak a szÊf időkorlÃĄtjÃĄra. A szÊf időkorlÃĄtja legfeljebb $HOURS$ Ãŗra Ês $MINUTES$ perc lehet.", + "message": "A szervezeti szabÃĄlyzata $HOURS$ ÃŗrÃĄra Ês $MINUTES$ percre ÃĄllította be a maximÃĄlisan megengedett szÊf időtÃēllÊpÊst.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ Ãŗra Ês $MINUTES$ perc maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Az időkifutÃĄs meghaladja a szervezet ÃĄltal beÃĄllított korlÃĄtozÃĄst: $HOURS$ Ãŗra Ês $MINUTES$ perc maxximum.", "placeholders": { "hours": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Szervezeti szÊf exportÃĄlÃĄsa" + }, + "exportingOrganizationVaultDesc": { + "message": "Csak $ORGANIZATION$ nÊvvel tÃĄrsított szervezeti szÊf kerÃŧl exportÃĄlÃĄsra. Ebbe nem kerÃŧlnek be a szemÊlyes Ês mÃĄs szervezeti szÊf elemek.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Hiba" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "FelhasznÃĄlÃŗnÊv generÃĄlÃĄsa" }, + "generateEmail": { + "message": "Email generÃĄlÃĄsa" + }, + "generatorBoundariesHint": { + "message": "Az ÊrtÊk legyen $MIN$ Ês $MAX$ kÃļzÃļtt.", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "FelhasznÃĄlÃŗnÊv típusa" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Email ÃĄlnÊv generÃĄlÃĄsa kÃŧlső tovÃĄbbítÃŗ szolgÃĄltatÃĄssal." }, + "forwarderDomainName": { + "message": "Email tartomÃĄny", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "VÃĄlasszunk a kivÃĄlasztott szolgÃĄltatÃĄs ÃĄltal tÃĄmogatott tartomÃĄnyt.", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ hiba: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "GenerÃĄlta: Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webhely: $WEBSITE$. GenerÃĄlta: Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "$SERVICENAME$ API vezÊrjel ÊrvÊnytelen.", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "$SERVICENAME$ API vezÊrjel ÊrvÊnytelen: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nem lehet beolvasni $SERVICENAME$ maszkolt email fiÃŗk azonosítÃŗt.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "$SERVICENAME$ domain ÊrvÊnytelen.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "$SERVICENAME$ webcím ÊrvÊnytelen.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ismeretlen $SERVICENAME$ hiba tÃļrtÊnt.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Ismeretlen tovÃĄbbítÃŗ: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "KiszolglÃŗnÊv", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Az automatikus kitÃļltÊs mÅąkÃļdÊse" }, "autofillSelectInfoWithCommand": { - "message": "VÃĄlasszunk egy elemet ezen az oldalon vagy hasznÃĄljuk a parancsikont: $COMMAND$.", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "VÃĄlasszunk egy elemet ezen az oldalon vagy ÃĄllítsunk be parancsikont a beÃĄllítÃĄsokban." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Rendben" @@ -2209,13 +3213,22 @@ "autofillSettings": { "message": "Automatikus kitÃļltÊs beÃĄllítÃĄsok" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "BullenytÅąparancsok kezelÊse" + }, "autofillShortcut": { "message": "Automatikus kitÃļltÊs billentyÅąparancs" }, - "autofillShortcutNotSet": { + "autofillLoginShortcutNotSet": { "message": "Az automatikus kitÃļltÊs billentyÅązetparancs nincs beÃĄllítva. MÃŗdosítsuk ezt a bÃļngÊsző beÃĄllítÃĄsaiban." }, - "autofillShortcutText": { + "autofillLoginShortcutText": { "message": "Az automatikus kitÃļltÊs billentyÅąparancsa: $COMMAND$. MÃŗdosítsuk ezt a bÃļngÊsző beÃĄllítÃĄsaiban.", "placeholders": { "command": { @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "BejelentkezÊs:" - }, "opensInANewWindow": { "message": "MegnyitÃĄs Ãēj ablakban" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "A szervezeti SSO azonosítÃŗ megadÃĄsa szÃŧksÊges." }, + "creatingAccountOn": { + "message": "FiÃŗk lÊtrehozÃĄsa:" + }, + "checkYourEmail": { + "message": "Email cím postalÃĄda ellenőrzÊse" + }, + "followTheLinkInTheEmailSentTo": { + "message": "KÃļvessÃŧk a hivatkozÃĄst az elkÃŧldÃļtt emailben" + }, + "andContinueCreatingYourAccount": { + "message": "Ês folytassuk a fiÃŗk lÊtrehozÃĄsÃĄt." + }, + "noEmail": { + "message": "Nem Êrkezett email?" + }, + "goBack": { + "message": "Vissza" + }, + "toEditYourEmailAddress": { + "message": "az email cím szerkesztÊsÊhez." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "A hozzÃĄfÊrÊs megtagadÃĄsra kerÃŧlt. Nincs jogosultsÃĄg az oldal megtekintÊsÊre." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Az eszkÃļz megbízhatÃŗ." }, + "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." + }, + "sendsNoItemsMessage": { + "message": "A Send hasznÃĄlatÃĄval biztonsÃĄgosan megoszthatjuk a titkosított informÃĄciÃŗkat bÃĄrkivel.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Az adatbevitel kÃļtelező." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 mező igÊnyel figyelmet.." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ mező igÊnyel figyelmet.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- VÃĄlasztÃĄs --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "ÖsszezÃĄrÃĄs vÃĄltÃĄs", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Adatok importÃĄlÃĄsa a Bitwardenbe?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "A LastPass adatok megvÊdÊse Ês importÃĄlÃĄsa a Bitwardenbe?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "MentÊs titkosítatlan fÃĄjlkÊnt", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "ImportÃĄlÃĄs a Bitwardenbe", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ImportÃĄlÃĄs...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Az adatok sikeresen importÃĄlÃĄsra kerÃŧltek.", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Hiba tÃļrtÊnt az importÃĄlÃĄs sorÃĄn. A rÊszletekÊrt ellenőrizzÃŧk a konzolt.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "HÃĄlÃŗzati hiba tÃļrtÊnt az importÃĄlÃĄs sorÃĄn.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Áldomain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "A mesterjelszÃŗt Ãējra bekÊrő elemeket nem lehet automatikusan kitÃļlteni az oldal betÃļltÊsekor. Az automatikus kitÃļltÊs az oldal betÃļltÊsekor kikapcsolÃĄsra kerÃŧl.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Az automatikus kitÃļltÊs az oldal betÃļltÊsekor az alapÊrtelmezett beÃĄllítÃĄs hasznÃĄlatÃĄra lett beÃĄllítva.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Kapcsoljuk ki a mesterjelszÃŗ ÃējbÃŗli bekÊrÊsÊt a mező szerkesztÊsÊhez.", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "UgrÃĄs a tartalomra" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden automatikus kitÃļltÊsi menÃŧ", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Oldjuk fel a fiÃŗk zÃĄrolÃĄsÃĄt az automatikus kitÃļltÊsi javaslatok megtekintÊsÊhez.", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "FiÃŗk feloldÃĄsa", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Oldjuk fel a fiÃŗk zÃĄrolÃĄsÃĄt, Ãēj ablakban nyílik meg.", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "TÃļltse kia hitelesítő adatokat", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "RÊszleges felhasznÃĄlÃŗnÊv", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Nincsenek megjeleníthető elemek", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Új elem", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Elem hozzÃĄadÃĄsa", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Új bejelentkezÊs", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Új szÊf bejelentkezÊsi elem hozzÃĄadÃĄsa, Ãēj ablakban nyílik meg.", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Új kÃĄrtya", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Új szÊf kÃĄrtyaelem hozzÃĄadÃĄsa, Ãēj ablakban nyílik meg.", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Új szemÊlyazonossÃĄg", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Új szÊf szemÊlyazonossÃĄg elem hozzÃĄadÃĄsa, Ãēj ablakban nyílik meg.", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "BekapcsolÃĄs" + }, + "ignore": { + "message": "Mellőz" + }, + "importData": { + "message": "Adatok importÃĄlÃĄsa", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "ImportÃĄlÃĄsi hiba" + }, + "importErrorDesc": { + "message": "ProblÊma merÃŧlt fel az importÃĄlni prÃŗbÃĄlt adatokkal. Oldjuk fel a forrÃĄsfÃĄjlban alÃĄbb felsorolt hibÃĄkat Ês prÃŗbÃĄljuk Ãējra." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Oldjuk fel a hibÃĄkat lentebb Ês prÃŗbÃĄljuk Ãējra." + }, + "description": { + "message": "LeírÃĄs" + }, + "importSuccess": { + "message": "Az adatok sikeresen importÃĄlÃĄsra kerÃŧltek." + }, + "importSuccessNumberOfItems": { + "message": "Összesen $AMOUNT$ elem lett importÃĄlva.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "PrÃŗbÃĄluk Ãējra" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Ehhez a mÅąvelethez ellenőrzÊs szÃŧksÊges. A folytatÃĄshoz ÃĄllítsunk be egy PIN kÃŗdot." + }, + "setPin": { + "message": "PIN kÃŗd beÃĄllítÃĄsa" + }, + "verifyWithBiometrics": { + "message": "EllenőrzÊs biometrikusan" + }, + "awaitingConfirmation": { + "message": "VÃĄrakozÃĄs megerősítÊsre" + }, + "couldNotCompleteBiometrics": { + "message": "Nem sikerÃŧlt kitÃļlteni a biometrikus adatokat." + }, + "needADifferentMethod": { + "message": "MÃĄs mÃŗdszerre van szÃŧksÊg?" + }, + "useMasterPassword": { + "message": "MesterjelszÃŗ hasznÃĄlata" + }, + "usePin": { + "message": "PIN kÃŗd hasznÃĄlata" + }, + "useBiometrics": { + "message": "Biometria hasznÃĄlata" + }, + "enterVerificationCodeSentToEmail": { + "message": "Az emailben elkÃŧldÃļtt ellenőrző kÃŗd megadÃĄsa." + }, + "resendCode": { + "message": "KÃŗd ÃējrakÃŧldÊse" + }, + "total": { + "message": "Összesen" + }, + "importWarning": { + "message": "Adatokat importÃĄlunk $ORGANIZATION$ fÃĄjlba. Az adatok megosztÃĄsra kerÃŧlhetnek a szervezet tagjaival. Folytatni akarjuk?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Indítsuk el a DUO-t Ês kÃļvessÃŧk a lÊpÊseket a bejelentkezÊs befejezÊsÊhez." + }, + "duoRequiredForAccount": { + "message": "A fiÃŗkhoz kÊtlÊpcsős DUO bejelentkezÊs szÃŧksÊges." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "A bejelentkezÊs befejezÊsÊhez nyissuk meg a kiterjesztÊst." + }, + "popoutExtension": { + "message": "FelugrÃŗ bővítmÊny" + }, + "launchDuo": { + "message": "DUO indítÃĄsa" + }, + "importFormatError": { + "message": "Az adatok nincsenek megfelelően formÃĄzva. EllenőrizzÃŧk az importÃĄlÃĄs fÃĄjlt Ês prÃŗbÃĄljuk Ãējra." + }, + "importNothingError": { + "message": "Semmi nem lett importÃĄlva." + }, + "importEncKeyError": { + "message": "Hiba tÃļrtÊnt az exportÃĄlt fÃĄjl visszafejtÊse sorÃĄn. A titkosítÃĄsi kulcs nem egyezik meg az adatok exportÃĄlÃĄsÃĄhoz hasznÃĄlt titkosítÃĄsi kulccsal." + }, + "invalidFilePassword": { + "message": "A fÃĄjl jelszÃŗ ÊrvÊnytelen. HasznÃĄljuk az exportfÃĄjl lÊtrehozÃĄsakor megadott jelszÃŗt." + }, + "destination": { + "message": "CÊl" + }, + "learnAboutImportOptions": { + "message": "InformÃĄciÃŗ az importÃĄlÃĄsi opciÃŗkrÃŗl" + }, + "selectImportFolder": { + "message": "Mappa kivÃĄlasztÃĄsa" + }, + "selectImportCollection": { + "message": "GyÅąjtemÊny kivÃĄlasztÃĄsa" + }, + "importTargetHint": { + "message": "VÃĄlasszuk ezt a lehetősÊget, ha azt akarjuk, hogy az importÃĄlt fÃĄjl tartalma $DESTINATION$ helyre kerÃŧljÃļn", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "A fÃĄjl hozzÃĄ nem rendelt elemeket tartalmaz." + }, + "selectFormat": { + "message": "VÃĄlasszuk ki az importÃĄlÃŗ fÃĄjl formÃĄtumÃĄt" + }, + "selectImportFile": { + "message": "VÃĄlasszuk ki az import fÃĄjlt" + }, + "chooseFile": { + "message": "FÃĄjl kivÃĄlasztÃĄsa" + }, + "noFileChosen": { + "message": "Nincs kivÃĄlasztott fÃĄjl." + }, + "orCopyPasteFileContents": { + "message": "vagy vÃĄgÃŗlapon vigyÃŧk be fÃĄjl tartalmat" + }, + "instructionsFor": { + "message": "$NAME$ utasítÃĄsok", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "SzÊf importÃĄlÃĄs megerősítÊse" + }, + "confirmVaultImportDesc": { + "message": "Ez a fÃĄjl jelszÃŗval vÊdett. Adjuk meg a fÃĄjl jelszÃŗt az adatok importÃĄlÃĄsÃĄhoz." + }, + "confirmFilePassword": { + "message": "FÃĄjl jelszÃŗ megerősítÊs" + }, + "exportSuccess": { + "message": "A szÊfadatok exportÃĄlÃĄsra kerÃŧltek." + }, + "typePasskey": { + "message": "HozzÃĄfÊrÊsi kulcs" + }, + "accessing": { + "message": "ElÊrÊs" + }, + "passkeyNotCopied": { + "message": "A hozzÃĄfÊrÊsi kulcs nem kerÃŧl mÃĄsolÃĄsra." + }, + "passkeyNotCopiedAlert": { + "message": "A hozzÃĄfÊrÊsi kulcs nem kerÃŧl mÃĄsolÃĄsra a klÃŗnozott elembe. Folytatjuk ennek az elemnek a klÃŗnozÃĄsÃĄt?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "A kezdemÊnyező hely ÃĄltal megkÃļvetelt ellenőrzÊs. Ez a szolgÃĄltatÃĄs mÊg nincs megvalÃŗsítva mesterjelszÃŗ nÊlkÃŧli fiÃŗkok esetÊn." + }, + "logInWithPasskeyQuestion": { + "message": "BejelentkezÊs hozzÃĄfÊrÊsi kulccsal?" + }, + "passkeyAlreadyExists": { + "message": "Az alkalmazÃĄshoz mÃĄr lÊtezik hozzÃĄfÊrÊsi kulcs." + }, + "noPasskeysFoundForThisApplication": { + "message": "Az alkalmazÃĄshoz nem talÃĄlhatÃŗ hozzÃĄfÊrÊsi kulcs." + }, + "noMatchingPasskeyLogin": { + "message": "Nincs megfelelő bejelentkezÊs ehhez a webhelyhez." + }, + "noMatchingLoginsForSite": { + "message": "Nincsenek egyező bejelentkezÊsek ehhez a webhelyhez." + }, + "searchSavePasskeyNewLogin": { + "message": "KeressÊs vagy a belÊpőkulcs mentÊse bejelentkezÊskÊnt." + }, + "confirm": { + "message": "MegerősítÊs" + }, + "savePasskey": { + "message": "HozzÃĄfÊrÊsi kulcs mentÊse" + }, + "savePasskeyNewLogin": { + "message": "HozzÃĄfÊrÊsi kulcs mentÊse Ãēj bejelentkezÊskÊnt" + }, + "chooseCipherForPasskeySave": { + "message": "BejelentkezÊs vÃĄlasztÃĄs a hozzÃĄfÊrÊsi kulcs mentÊsÊhez" + }, + "chooseCipherForPasskeyAuth": { + "message": "HozzÃĄfÊrÊsi kulcs vÃĄlasztÃĄs a bejelentkezÊshez" + }, + "passkeyItem": { + "message": "HozzÃĄfÊrÊsi kulcs elem" + }, + "overwritePasskey": { + "message": "BejelentkezÊsi kulcs felÃŧlírÃĄsa?" + }, + "overwritePasskeyAlert": { + "message": "Ez az elem mÃĄr tartalmaz egy hozzÃĄfÊrÊsi kulcsot. Biztosan felÃŧlírÃĄsra kerÃŧljÃļn az aktuÃĄlis hozzÃĄfÊrÊsi kulcs?" + }, + "featureNotSupported": { + "message": "Nem tÃĄmogatott funkciÃŗ" + }, + "yourPasskeyIsLocked": { + "message": "A hozzÃĄfÊrÊsi kulcs hasznÃĄlatÃĄhoz hitelesítÊs szÃŧksÊges. A szemÊlyazonossÃĄg ellenőrzÊse szÃŧksÊges a folytatÃĄshoz." + }, + "multifactorAuthenticationCancelled": { + "message": "A tÃļbbtÊnyezős hitelesítÊs megszakítÃĄsra kerÃŧlt." + }, + "noLastPassDataFound": { + "message": "Nem talÃĄlhatÃŗ LastPass adat." + }, + "incorrectUsernameOrPassword": { + "message": "Helytelen felhasznÃĄlÃŗnÊv vagy jelszÃŗ" + }, + "incorrectPassword": { + "message": "Helytelen jelszÃŗ" + }, + "incorrectCode": { + "message": "Helytelen kÃŗd" + }, + "incorrectPin": { + "message": "Helytelen PIN kÃŗd" + }, + "multifactorAuthenticationFailed": { + "message": "A tÃļbbtÊnyezős hitelesítÊs sikertelen volt." + }, + "includeSharedFolders": { + "message": "Megosztott mappÃĄk is" + }, + "lastPassEmail": { + "message": "LastPass email cím" + }, + "importingYourAccount": { + "message": "A iÃŗk importÃĄlÃĄsa folyamatban van..." + }, + "lastPassMFARequired": { + "message": "LastPass tÃļbbtÊnyezős hitelesítÊs szÃŧksÊges" + }, + "lastPassMFADesc": { + "message": "Adjuk meg az egyszeri jelszÃŗt a hitelesítő alkalmazÃĄsbÃŗl" + }, + "lastPassOOBDesc": { + "message": "Hagyjuk jÃŗvÃĄ a bejelentkezÊsi kÊrÊst a hitelesítő alkalmazÃĄsban vagy írjunk be egy egyszeri jelszÃŗt." + }, + "passcode": { + "message": "JelszÃŗ" + }, + "lastPassMasterPassword": { + "message": "LastPass mesterjelszÃŗ" + }, + "lastPassAuthRequired": { + "message": "LastPass hitelesítÊs szÃŧksÊges" + }, + "awaitingSSO": { + "message": "VÃĄrakozÃĄs SSO hitelesítÊsre" + }, + "awaitingSSODesc": { + "message": "Folytassuk a bejelentkezÊst a cÊg hitelesítő adataival." + }, + "seeDetailedInstructions": { + "message": "TekintsÃŧk meg a rÊszletes utasítÃĄsokat a sÃēgÃŗ oldalon:", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "ImportÃĄlÃĄs kÃļzvetlenÃŧl a LastPassbÃŗl" + }, + "importFromCSV": { + "message": "ImportÃĄlÃĄs CSV-ből" + }, + "lastPassTryAgainCheckEmail": { + "message": "PrÃŗbÃĄljuk Ãējra,vagy keressÃŧnk egy emailt a LastPasstÃŗl a szemÊlyazonossÃĄg igazolÃĄsÃĄhoz." + }, + "collection": { + "message": "GyÅąjtemÊny" + }, + "lastPassYubikeyDesc": { + "message": "IllesszÃŧk be a LastPass-fiÃŗkhoz tÃĄrsított YubiKey eszkÃļzt a szÃĄmítÃŗgÊp USB portjÃĄba, majd ÊrintsÃŧk meg annak gombjÃĄt." + }, + "switchAccount": { + "message": "FiÃŗk vÃĄltÃĄsa" + }, + "switchAccounts": { + "message": "FiÃŗkok vÃĄltÃĄsa" + }, + "switchToAccount": { + "message": "VÃĄltÃĄs fiÃŗkra" + }, + "activeAccount": { + "message": "Aktív fiÃŗk" + }, + "availableAccounts": { + "message": "ElÊrhető fiÃŗkok" + }, + "accountLimitReached": { + "message": "A fiÃŗk korlÃĄt elÊrÊsre kerÃŧlt. JelentkezzÃŧnk ki egy fiÃŗkbÃŗl egy mÃĄsik hozzÃĄadÃĄsÃĄhoz." + }, + "active": { + "message": "aktív" + }, + "locked": { + "message": "zÃĄrolt" + }, + "unlocked": { + "message": "feloldott" + }, + "server": { + "message": "szerver" + }, + "hostedAt": { + "message": "tÃĄrolva:" + }, + "useDeviceOrHardwareKey": { + "message": "SajÃĄt eszkÃļz vagy hardverkulcs hasznÃĄlata" + }, + "justOnce": { + "message": "Csak egyszer" + }, + "alwaysForThisSite": { + "message": "EnnÊl a webhelynÊl mindig" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ bekerÃŧlt a kizÃĄrt tartomÃĄnyokba.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "ÁltalÃĄnos formÃĄtumok", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Legyen a Bitwarden az alapÊrtelmezett jelszÃŗkezelő?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ennek az opciÃŗnak a figyelmen kívÃŧl hagyÃĄsa ÃŧtkÃļzÊst okozhat a Bitwarden automatikus kitÃļltÊsi menÃŧ Ês a bÃļngÊsző kÃļzÃļtt.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Legyen a Bitwarden az alapÊrtelmezett jelszÃŗkezelő", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "A Bitwarden nem ÃĄllíthatÃŗ be alapÊrtelmezett jelszÃŗkezelőkÊnt.", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Ki kell osztani a bÃļngÊsző adatvÊdelmi jogosultsÃĄgait a Bitwardennek az alapÊrtelmezett jelszÃŗkezelőkÊnt tÃļrtÊnő beÃĄllítÃĄshoz.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Legyen alapÊrtelmezett", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "A hitelesítÊsek sikeresen mentÊsre kerÃŧltek.", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "A jelszÃŗ mentÊsre kerÃŧlt!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "A hitelesítÊsek sikeresen frissítÊsre kerÃŧltek.", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "A jelszÃŗ frissítÊsre kerÃŧlt!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Hiba tÃļrtÊnt a hitelesítÊsek mentÊsekor. A rÊszletekÊrt ellenőrizzÃŧk a konzolt.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Sikeres" + }, + "removePasskey": { + "message": "JelszÃŗ eltÃĄvolítÃĄsa" + }, + "passkeyRemoved": { + "message": "A jelszÃŗ eltÃĄvolítÃĄsra kerÃŧlt." + }, + "autofillSuggestions": { + "message": "Automatikus kitÃļltÊs javaslatok" + }, + "autofillSuggestionsTip": { + "message": "A bejelentkezÊsi elem mentÊse ehhez a webhelyhez az automatikus kitÃļltÊshez" + }, + "yourVaultIsEmpty": { + "message": "A szÊf Ãŧres." + }, + "noItemsMatchSearch": { + "message": "Nincsenek a keresÊsnek megfelelő elemek." + }, + "clearFiltersOrTryAnother": { + "message": "TÃļrÃļljÃŧk a szÅąrőket vagy prÃŗbÃĄlkozzunk mÃĄsik keresÊsi kifejezÊssel." + }, + "copyInfoTitle": { + "message": "InfÃŗ mÃĄsolÃĄsa - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Jegyzet mÃĄsolÃĄsa - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "TovÃĄbbi opciÃŗk, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "TovÃĄbbi opciÃŗk - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Elem megtekkintÊse - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Automatikus kitÃļltÊs - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Nincsenek mÃĄsolandÃŗ ÊrtÊkek." + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Email cím mÃĄsolÃĄsa" + }, + "copyPhone": { + "message": "TelefonszÃĄm mÃĄsolÃĄsa" + }, + "copyAddress": { + "message": "Cím mÃĄsolÃĄsa" + }, + "adminConsole": { + "message": "AdminisztrÃĄtori konzol" + }, + "accountSecurity": { + "message": "FiÃŗkbiztonsÃĄg" + }, + "notifications": { + "message": "ÉrtesítÊsek" + }, + "appearance": { + "message": "MegjelenÊs" + }, + "errorAssigningTargetCollection": { + "message": "Hiba tÃļrtÊnt a cÊlgyÅąjtemÊny hozzÃĄrendelÊse sorÃĄn." + }, + "errorAssigningTargetFolder": { + "message": "Hiba tÃļrtÊnt a cÊlmappa hozzÃĄrendelÊse sorÃĄn." + }, + "viewItemsIn": { + "message": "$NAME$ elemek megtekintÊse", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Vissza: $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Új" + }, + "removeItem": { + "message": "$NAME$ eltÃĄvolítÃĄsa", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Elem rÊszletek" + }, + "itemName": { + "message": "Elem neve" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Nem tÃĄvolíthatÃŗk el a csak megtekintÊsi engedÊllyel bírÃŗ gyÅąjtemÊnyek: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Tulajdonos" + }, + "selfOwnershipLabel": { + "message": "SajÃĄt magam", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "TovÃĄbbi informÃĄciÃŗ" + }, + "itemHistory": { + "message": "Elem előzmÊny" + }, + "lastEdited": { + "message": "UtoljÃĄra szerkesztve" + }, + "ownerYou": { + "message": "Tulajdonos: Én" + }, + "linked": { + "message": "Csatolva" + }, + "copySuccessful": { + "message": "A mÃĄsolÃĄs sikeres volt." + }, + "upload": { + "message": "FeltÃļltÊs" + }, + "addAttachment": { + "message": "MellÊklet hozzÃĄadÃĄsa" + }, + "maxFileSizeSansPunctuation": { + "message": "A naximÃĄlis fÃĄjlmÊret 500 MB." + }, + "deleteAttachmentName": { + "message": "$NAME$ mellÊklet tÃļrlÊse", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "$NAME$ letÃļltÊse", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Biztosan vÊglegesen tÃļrlÊsre kerÃŧljÃļn ez a mellÊklet?" + }, + "premium": { + "message": "PrÊmium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Az ingyenes szervezetek nem hasznÃĄlhatnak mellÊkleteket." + }, + "filters": { + "message": "SzÅąrők" + }, + "personalDetails": { + "message": "SzemÊlyes adatok" + }, + "identification": { + "message": "AzonosítÃĄs" + }, + "contactInfo": { + "message": "Kapcsolat infÃŗ" + }, + "downloadAttachment": { + "message": "LetÃļltÊs - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "kÃĄrtyaszÃĄm vÊgződÊs:", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "BejelentkezÊsi hitelesítÊsek" + }, + "authenticatorKey": { + "message": "Hitelesítő kulcs" + }, + "autofillOptions": { + "message": "Automatikus kitÃļltÊs opciÃŗk" + }, + "websiteUri": { + "message": "Webhely (URI)" + }, + "websiteUriCount": { + "message": "Webhely (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "A webhely hozzÃĄadÃĄsra kerÃŧlt." + }, + "addWebsite": { + "message": "Webhely hozzÃĄadÃĄsa" + }, + "deleteWebsite": { + "message": "Webhely tÃļrlÊse" + }, + "defaultLabel": { + "message": "AlapÊrtelmezÊs ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "$WEBSITE$ egyező ÊrzÊkelÊs megjelenítÊse", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "$WEBSITE$ egyező ÊrzÊkelÊs elrejtÊse", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Automatikus kitÃļltÊs oldalbetÃļltÊsnÊl?" + }, + "cardExpiredTitle": { + "message": "LejÃĄrt kÃĄrtya" + }, + "cardExpiredMessage": { + "message": "Ha megÃējítottuk, frissítsÃŧk a kÃĄrtya adatait." + }, + "cardDetails": { + "message": "KÃĄrtyaadatok" + }, + "cardBrandDetails": { + "message": "$BRAND$ adatok", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "AnimÃĄciÃŗk engedÊlyezÊse" + }, + "showAnimations": { + "message": "AnimÃĄciÃŗk megjelenítÊse" + }, + "addAccount": { + "message": "FiÃŗk hozzÃĄadÃĄsa" + }, + "loading": { + "message": "A betÃļltÊs folyamatban van." + }, + "data": { + "message": "Adat" + }, + "passkeys": { + "message": "HozzÃĄfÊrÊsi kulcsok", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Jelszavak", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "BejelentkezÊs hozzÃĄfÊrÊsi kulccsal", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Csak az ezekhez a gyÅąjtemÊnyekhez hozzÃĄfÊrÊssel rendelkező szervezeti tagok lÃĄthatjÃĄk az elemet." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Csak az ezekhez a gyÅąjtemÊnyekhez hozzÃĄfÊrÊssel rendelkező szervezeti tagok lÃĄthatjÃĄk az elemeket." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Mező hozzÃĄadÃĄsa" + }, + "add": { + "message": "HozzÃĄadÃĄs" + }, + "fieldType": { + "message": "Mezőtípus" + }, + "fieldLabel": { + "message": "Mezőfelirat" + }, + "textHelpText": { + "message": "SzÃļvegmezők hasznÃĄlata olyan adatokhoz mint a biztonsÃĄgi kÊrdÊsek" + }, + "hiddenHelpText": { + "message": "Rejtett mezők hasznÃĄlata olyan ÊrzÊkeny adatokhoz mint a jelszÃŗ" + }, + "checkBoxHelpText": { + "message": "JelÃļlődobozok hasznÃĄlata, ha automatikusan ki szeretnÊnk tÃļlteni olyan Åąrlap jelÃļlődobozt mint az email cím megjegyzÊse" + }, + "linkedHelpText": { + "message": "Csatolt mező hasznÃĄlata, ha egy adott webhely automatikus kitÃļltÊsÊvel kapcsolatos problÊmÃĄkat tapasztalunk." + }, + "linkedLabelHelpText": { + "message": "Adjuk meg a mező html azonosítÃŗjÃĄt, nevÊt, aria címkÊjÊt vagy helyőrÊt." + }, + "editField": { + "message": "Mező szerkesztÊse" + }, + "editFieldLabel": { + "message": "$LABEL$ szerkesztÊse", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "$LABEL$ tÃļrlÊse", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ hozzÃĄadÃĄsra kerÃŧlt.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "$LABEL$ ÃĄtrendezÊse. A nyílbillentyÅąkkel mozgassuk az elemet felfelÊ vagy lefelÊ.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ feljebb kerÃŧlt, $INDEX$/$LENGTH$ pozíciÃŗba", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ lejjebb kerÃŧlt, $INDEX$/$LENGTH$ pozíciÃŗba", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Elem helyek" + }, + "fileSend": { + "message": "FÃĄjl típusÃē Send" + }, + "fileSends": { + "message": "FÃĄjl kÃŧldÊs" + }, + "textSend": { + "message": "SzÃļveg típusÃē Send" + }, + "textSends": { + "message": "SzÃļveg kÃŧldÊs" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "FiÃŗkmÅąveletek" + }, + "showNumberOfAutofillSuggestions": { + "message": "Az automatikus bejelentkezÊsi kitÃļltÊsi javaslatok szÃĄmÃĄnak megjelenítÊse a bővítmÊny ikonjÃĄn" + }, + "systemDefault": { + "message": "Rendszer alapÊrtelmezett" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Erre a beÃĄllítÃĄsra a vÃĄllalkozÃĄs rendszabÃĄly kÃļvetelmÊnyek lettek alkalmazva." + }, + "sshPrivateKey": { + "message": "SzemÊlyes kulcs" + }, + "sshPublicKey": { + "message": "NyilvÃĄnos kulcs" + }, + "sshFingerprint": { + "message": "Ujjlenyomat" + }, + "sshKeyAlgorithm": { + "message": "Kulcs típusa" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Újra" + }, + "vaultCustomTimeoutMinimum": { + "message": "A minimÃĄlis egyedi időkifutÃĄs 1 perc." + }, + "additionalContentAvailable": { + "message": "KiegÊszítő tartalom Êrhető el." + }, + "fileSavedToDevice": { + "message": "A fÃĄjl mentÊsre kerÃŧlt az eszkÃļzre. KezeljÃŧk az eszkÃļzről a letÃļltÊseket." + }, + "showCharacterCount": { + "message": "KarakterszÃĄmlÃĄlÃŗ megjelenítÊse" + }, + "hideCharacterCount": { + "message": "KarakterszÃĄmlÃĄlÃŗ elrejtÊse" + }, + "itemsInTrash": { + "message": "elem van a lomtÃĄrban." + }, + "noItemsInTrash": { + "message": "Nincs elem a lomtÃĄrban." + }, + "noItemsInTrashDesc": { + "message": "A tÃļrÃļlt elemek itt jelennek meg Ês 30 nap elteltÊvel vÊglegesen tÃļrlődnek." + }, + "trashWarning": { + "message": "A 30 napnÃĄl rÊgebben lomtÃĄrba kerÃŧlt elemek automatikusan tÃļrlÊsre kerÃŧlnek." + }, + "restore": { + "message": "VisszaÃĄllítÃĄs" + }, + "deleteForever": { + "message": "VÊgleges tÃļrlÊs" + }, + "noEditPermissions": { + "message": "Nincs jogosulltsÃĄg ezen elem szerkesztÊsÊheu." + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "GenerÃĄlt jelszÃŗ kitÃļltÊs", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "A jelszÃŗ generÃĄlÃĄsra kerÃŧlt.", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "BejelentkezÊs mentÊse a Bitwardenbe?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "SzÃŗkÃļz", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "HullÃĄm karakter", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick karakter", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "FelkiÃĄltÃŗjel", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "@ karakter", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "# karakter", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "$ karakter", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "% karakter", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "^ karakter", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "& karakter", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "* karakter", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "( karakter", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": ") karakter", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "_ karakter", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "- karakter", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "+ karakter", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "= karakter", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "{ karakter", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "} karakter", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "[ karakter", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "] karakter", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "| karakter", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "\\ karakter", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": ": karakter", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "; karakter", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "\" karakter", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "' karakter", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "< karakter", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "> karakter", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": ", karakter", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": ". karakter", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "? karakter", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "/ karakter", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "KisbetÅą" + }, + "uppercaseAriaLabel": { + "message": "NagybetÅą" + }, + "generatedPassword": { + "message": "GenerÃĄlt jelszÃŗ" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 3891b1ddc37..fbfc369ad05 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -3,24 +3,42 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Pengelola Sandi Gratis", + "message": "Bitwarden Pengelola Sandi", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden adalah sebuah pengelola sandi yang aman dan gratis untuk semua perangkat Anda.", - "description": "Extension description" + "message": "Bitwarden memudahkan Anda menyimpan kata sandi, kata kunci, dan informasi sensitif dimanapun Anda berada", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Masuk atau buat akun baru untuk mengakses brankas Anda." }, + "inviteAccepted": { + "message": "Undangan diterima" + }, "createAccount": { "message": "Buat Akun" }, - "login": { - "message": "Masuk" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Atur sebuah kata sandi yang kuat" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Selesaikan membuat akun Anda dengan mengatur sebuah kata sandi" }, "enterpriseSingleSignOn": { - "message": "Sistem Masuk Tunggal Perusahaan" + "message": "SSO Perusahaan" }, "cancel": { "message": "Batal" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Petunjuk kata sandi utama dapat membantu Anda mengingat kata sandi Anda jika Anda melupakannya." }, + "masterPassHintText": { + "message": "Jika Anda lupa kata sandi Anda, petunjuk kata sandi dapat dikirim ke surel Anda. Maksimal $CURRENT$/$MAXIMUM$ karakter.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Ketik ulang Kata Sandi Utama" }, "masterPassHint": { "message": "Petunjuk Kata Sandi Utama (opsional)" }, + "joinOrganization": { + "message": "Bergabung ke organisasi" + }, + "joinOrganizationName": { + "message": "Bergabung ke $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Selesaikan penggabungan ke organisasi ini dengan mengatur sebuah kata sandi utama." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Salin Kata Sandi" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Salin Catatan" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Salin Kode Keamanan" }, + "copyName": { + "message": "Salin nama" + }, + "copyCompany": { + "message": "Salin perusahaan" + }, + "copySSN": { + "message": "Salin nomor Keamanan Sosial" + }, + "copyPassportNumber": { + "message": "Salin nomor paspor" + }, + "copyLicenseNumber": { + "message": "Salin nomor lisensi" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Salin $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Salin situs web" + }, + "copyNotes": { + "message": "Salin catatan" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Isi otomatis" }, + "autoFillLogin": { + "message": "Autofill masuk" + }, + "autoFillCard": { + "message": "Autofill kartu" + }, + "autoFillIdentity": { + "message": "Autofill identitas" + }, "generatePasswordCopied": { "message": "Membuat Kata Sandi (tersalin)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Tidak ada info masuk yang cocok." }, + "noCards": { + "message": "Tanpa kartu" + }, + "noIdentities": { + "message": "Tanpa identitas" + }, + "addLoginMenu": { + "message": "Tambahkan Info Masuk" + }, + "addCardMenu": { + "message": "Tambahkan kartu" + }, + "addIdentityMenu": { + "message": "Tambahkan identitas" + }, "unlockVaultMenu": { "message": "Buka brankas Anda" }, @@ -107,7 +223,7 @@ "message": "Masuk ke brankas Anda" }, "autoFillInfo": { - "message": "Tidak ada info masuk yang tersedia untuk mengisi secara otomatis tab peramban saat ini." + "message": "Tidak ada info masuk yang tersedia untuk mengisi sexara otomatis tab peramban saat ini." }, "addLogin": { "message": "Tambah Info Masuk" @@ -115,6 +231,18 @@ "addItem": { "message": "Tambah Item" }, + "accountEmail": { + "message": "Akun surel" + }, + "requestHint": { + "message": "Minta petunjuk" + }, + "requestPasswordHint": { + "message": "Minta petunjuk kata sandi" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Masukkan alamat surel akun Anda dan petunjuk kata sandi Anda akan dikirimkan kepada Anda" + }, "passwordHint": { "message": "Petunjuk Kata Sandi" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Konfirmasi identitas Anda untuk melanjutkan." }, - "account": { - "message": "Akun" - }, "changeMasterPassword": { "message": "Ubah Kata Sandi Utama" }, + "continueToWebApp": { + "message": "Lanjut ke aplikasi web?" + }, + "continueToWebAppDesc": { + "message": "Temukan fitur Bitwarden lebih melalui aplikasi web." + }, + "continueToHelpCenter": { + "message": "Lanjutkan ke Pusat Bantuan?" + }, + "continueToHelpCenterDesc": { + "message": "Pelajari lebih lanjut penggunaan Bitwarden di Pusat Bantuan." + }, + "continueToBrowserExtensionStore": { + "message": "Lanjut ke pasar ekstensi peramban?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Bantu orang lain menemukan apakah Bitwarden sesuai untuk mereka. Kunjungi toko ekstensi peramban Anda dan tinggalkan sebuah ulasan sekarang." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Anda dapat merubah sandi utama di aplikasi Bitwarden web." + }, "fingerprintPhrase": { "message": "Frasa Sidik Jari", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Keluar" }, + "aboutBitwarden": { + "message": "Tentang Bitwarden" + }, "about": { "message": "Tentang" }, + "moreFromBitwarden": { + "message": "Selebihnya dari Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Lanjutkan ke bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden untuk Bisnis" + }, + "bitwardenAuthenticator": { + "message": "Pengotentikasi Bitwarden" + }, + "continueToAuthenticatorPageDesc": { + "message": "Pengotentikasi Bitwarden membolehkan Anda untuk menyimpan kunci pengotentikasi dan menghasilkan kode TOTP untuk alur verifikasi dua-langkah. Pelajari lebih lanjut di situs web bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Pengelola Rahasia Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Simpan, kelola, dan bagikan secara aman rahasia pengembang dengan Pengelola Rahasia Bitwarden. Pelajari lebih lanjut di situs web bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Buat pengalaman masuk yang lancar dan aman dari kata sandi tradisional dengan Passwordless.dev. Pelajari lebih lanjut di situs web bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Keluarga Gratis" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Anda berhak untuk Bitwarden Keluarga Gratis. Tukarkan penawaran ini hari ini di aplikasi web." + }, "version": { "message": "Versi" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Sunting Folder" }, + "newFolder": { + "message": "Folder baru" + }, + "folderName": { + "message": "Nama folder" + }, + "folderHintText": { + "message": "Sarangkan sebuah folder dengan menambahkan nama folder induk diikuti dengan sebuah \"/\". Contoh: Sosial/Forum" + }, + "noFoldersAdded": { + "message": "Tidak ada folder yang ditambahkan" + }, + "createFoldersToOrganize": { + "message": "Buat folder untuk mengorganisasi benda-benda di brankas Anda" + }, + "deleteFolderPermanently": { + "message": "Apakah Anda yakin akan menghapus folder ini selamanya?" + }, "deleteFolder": { "message": "Hapus Folder" }, @@ -196,13 +396,13 @@ "message": "Bantuan & Umpan Balik" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "Pusat Bantuan Bitwarden" }, "communityForums": { - "message": "Explore Bitwarden community forums" + "message": "Telusuri forum Bitwarden" }, "contactSupport": { - "message": "Contact Bitwarden support" + "message": "Kontak dukungan Bitwarden" }, "sync": { "message": "Sinkronisasi" @@ -218,13 +418,13 @@ }, "generator": { "message": "Pembuat Sandi", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Secara otomatis membuat sandi yang kuat dan unik untuk info masuk Anda." }, - "bitWebVault": { - "message": "Brankas Web Bitwarden" + "bitWebVaultApp": { + "message": "Aplikasi web Bitwarden" }, "importItems": { "message": "Impor Item" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Buat Kata Sandi" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Buat Ulang Kata Sandi" }, @@ -244,17 +447,60 @@ "length": { "message": "Panjang" }, + "passwordMinLength": { + "message": "Panjang kata sandi minimum" + }, "uppercase": { - "message": "Huruf besar (A-Z)" + "message": "Huruf besar (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Huruf kecil (a-z)" + "message": "Huruf kecil (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Angka (0-9)" + "message": "Angka (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "karakter khusus (contoh.! @#$%^&*)" + "message": "karakter khusus (contoh.! @#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Sertakan", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Sertakan karakter huruf kapital", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Sertakan karakter huruf kecil", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Sertakan angka", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Sertakan karakter khusus", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Jumlah Kata" @@ -276,7 +522,16 @@ "message": "Spesial Minimum" }, "avoidAmbChar": { - "message": "Hindari Karakter Ambigu" + "message": "Hindari Karakter Ambigu", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Hindari karakter ambigu", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Persyaratan kebijakan perusahaan telah diterapkan ke pilihan penghasil Anda.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Cari brankas" @@ -299,15 +554,30 @@ "password": { "message": "Kata Sandi" }, + "totp": { + "message": "Kode Autentikator" + }, "passphrase": { "message": "Frasa Sandi" }, "favorite": { "message": "Favorit" }, + "unfavorite": { + "message": "Batalkan favorit" + }, + "itemAddedToFavorites": { + "message": "Benda telah ditambahkan ke kesukaan" + }, + "itemRemovedFromFavorites": { + "message": "Benda telah dihapus dari kesukaan" + }, "notes": { "message": "Catatan" }, + "privateNote": { + "message": "Catatan pribadi" + }, "note": { "message": "Catatan" }, @@ -326,6 +596,18 @@ "launch": { "message": "Luncurkan" }, + "launchWebsite": { + "message": "Buka situs web" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Situs Web" }, @@ -338,8 +620,23 @@ "other": { "message": "Lainnya" }, + "unlockMethods": { + "message": "Pilihan Penguncian" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Mengatur metode pembukaan kunci untuk mengubah tindakan batas waktu brankas Anda." + }, + "unlockMethodNeeded": { + "message": "Mengatur metode penguncian di Pengaturan" + }, + "sessionTimeoutHeader": { + "message": "Batas waktu sesi" + }, + "vaultTimeoutHeader": { + "message": "Batas waktu brankas" + }, + "otherOptions": { + "message": "Opsi lainnya" }, "rateExtension": { "message": "Nilai Ekstensi" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Brankas Anda terkunci. Verifikasi kata sandi utama Anda untuk melanjutkan." }, + "yourVaultIsLockedV2": { + "message": "Brankas Anda terkunci" + }, + "yourAccountIsLocked": { + "message": "Akun Anda terkunci" + }, + "or": { + "message": "atau" + }, "unlock": { "message": "Buka Kunci" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Batas Waktu Brankas" }, + "vaultTimeout1": { + "message": "Batas waktu" + }, "lockNow": { "message": "Kunci Sekarang" }, + "lockAll": { + "message": "Kunci semua" + }, "immediately": { "message": "Segera" }, @@ -426,6 +738,18 @@ "security": { "message": "Keamanan" }, + "confirmMasterPassword": { + "message": "Konfirmasi kata sandi utama" + }, + "masterPassword": { + "message": "Kata sandi utama" + }, + "masterPassImportant": { + "message": "Kata sandi utama Anda tidak dapat dipulihkan jika Anda melupakannya!" + }, + "masterPassHintLabel": { + "message": "Petunjuk kata sandi utama" + }, "errorOccurred": { "message": "Terjadi kesalahan" }, @@ -439,10 +763,10 @@ "message": "Kata sandi utama diperlukan." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "Sandi utama diperlukan." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Kata sandi utama harus $VALUE$ karakter.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Akun baru Anda telah dibuat! Sekarang Anda bisa masuk." }, + "newAccountCreated2": { + "message": "Akun baru Anda telah dibuat!" + }, + "youHaveBeenLoggedIn": { + "message": "Anda telah masuk!" + }, + "youSuccessfullyLoggedIn": { + "message": "Anda berhasil masuk" + }, + "youMayCloseThisWindow": { + "message": "Anda dapat menutup jendela ini" + }, "masterPassSent": { "message": "Kami telah mengirimi Anda email dengan petunjuk sandi utama Anda." }, "verificationCodeRequired": { "message": "Kode verifikasi diperlukan." }, + "webauthnCancelOrTimeout": { + "message": "Otentikasi dibatalkan atau terlalu lama. Mohon coba kembali." + }, "invalidVerificationCode": { "message": "Kode verifikasi tidak valid" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Tidak dapat mengisi otomatis item yang dipilih pada laman ini. Salin dan tempel informasinya sebagai gantinya." }, + "totpCaptureError": { + "message": "Tidak dapat memindai kode QR dari laman ini" + }, + "totpCaptureSuccess": { + "message": "Kunci Autentikator ditambahkan" + }, + "totpCapture": { + "message": "Pindai kode QR autentikator dari laman ini" + }, + "totpHelperTitle": { + "message": "Buat verifikasi dua-langkah lancar" + }, + "totpHelper": { + "message": "Bitwarden dapat menyimpan dan mengisikan kode verifikasi dua-langkah. Salin dan tempel kunci ke kolom ini." + }, + "totpHelperWithCapture": { + "message": "Bitwarden dapat menyimpan dan mengisikan kode verifikasi dua-langkah. Pilih ikon kamera untuk mengambil tangkapan layar dari kode QR otentikasi dari situs web ini, atau salin dan tempel kunci ke kolom ini." + }, + "learnMoreAboutAuthenticators": { + "message": "Pelajari lebih lanjut tentang pengotentikasi" + }, + "copyTOTP": { + "message": "Salin kunci Autentikator (TOTP)" + }, "loggedOut": { "message": "Keluar" }, + "loggedOutDesc": { + "message": "Anda telah keluar dari akun Anda." + }, "loginExpired": { "message": "Sesi masuk Anda telah berakhir." }, + "logIn": { + "message": "Masuk" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Mulai ulang pendaftaran" + }, + "expiredLink": { + "message": "Tautan telah kadaluwarsa" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Mohon mulai ulang pendaftaran atau coba masuk." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Anda mungkin telah memiliki sebuah akun" + }, "logOutConfirmation": { "message": "Anda yakin ingin keluar?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Tambah Folder" }, - "changeMasterPass": { - "message": "Ubah Kata Sandi Utama" - }, - "changeMasterPasswordConfirmation": { - "message": "Anda dapat mengubah kata sandi utama Anda di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?" - }, "twoStepLoginConfirmation": { "message": "Info masuk dua langkah membuat akun Anda lebih aman dengan mengharuskan Anda memverifikasi info masuk Anda dengan peranti lain seperti kode keamanan, aplikasi autentikasi, SMK, panggilan telepon, atau email. Info masuk dua langkah dapat diaktifkan di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?" }, + "twoStepLoginConfirmationContent": { + "message": "Buat akun Anda lebih aman dengan mengatur masuk dua-langkah pada aplikasi web Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Lanjutkan ke aplikasi web?" + }, "editedFolder": { "message": "Folder yang disunting" }, @@ -552,6 +936,10 @@ "newUri": { "message": "URl Baru" }, + "addDomain": { + "message": "Tambah domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item yang Ditambahkan" }, @@ -590,22 +978,34 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Tanya untuk penambahan login" + }, + "vaultSaveOptionsTitle": { + "message": "Simpan ke pilihan brankas" }, "addLoginNotificationDesc": { "message": "\"Notifikasi Penambahan Info Masuk\" secara otomatis akan meminta Anda untuk menyimpan info masuk baru ke brankas Anda saat Anda masuk untuk pertama kalinya." }, + "addLoginNotificationDescAlt": { + "message": "Tanyakan untuk menambah sebuah benda jika benda itu tidak ditemukan di brankas Anda. Diterapkan ke seluruh akun yang telah masuk." + }, + "showCardsInVaultView": { + "message": "Tampilkan kartu sebagai saran isi otomatis pada tampilan Brankas" + }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Tamplikan kartu pada halaman Tab" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Buat tampilan daftar benda dari kartu pada halaman Tab untuk isi otomatis yang mudah." + }, + "showIdentitiesInVaultView": { + "message": "Tampilkan identitas sebagai saran isi otomatis pada tampilan Brankas" }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Tampilkan identitas pada halaman Tab" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Buat tampilan daftar benda dari identitas pada halaman Tab untuk isi otomatis yang mudah." }, "clearClipboard": { "message": "Hapus Papan Klip", @@ -622,10 +1022,19 @@ "message": "Iya, Simpan Sekarang" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Tanyakan untuk memperbarui masuk yang sudah ada" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Tanyakan untuk memperbarui kata sandi masuk ketika mendeteksi perubahan pada situs web." + }, + "changedPasswordNotificationDescAlt": { + "message": "Tanyakan untuk memperbarui kata sandi masuk ketika mendeteksi perubahan pada situs web. Diterapkan ke semua akun yang telah masuk." + }, + "enableUsePasskeys": { + "message": "Tanyakan untuk menyimpan dan menggunakan kunci sandi" + }, + "usePasskeysDesc": { + "message": "Tanyakan untuk menyimpan kunci sandi baru atau masuk dengan kunci sandi yang tersimpan di brankas Anda. Diterapkan ke semua akun yang telah masuk." }, "notificationChangeDesc": { "message": "Apakah Anda ingin memperbarui kata sandi ini di Bitwarden?" @@ -634,20 +1043,26 @@ "message": "Iya, Perbarui Sekarang" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Buka brankan Bitwarden Anda untuk melengkapi permintaan isi otomatis." }, "notificationUnlock": { - "message": "Unlock" + "message": "Buka" + }, + "additionalOptions": { + "message": "Pilihan tambahan" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Tampilkan pilihan menu konteks" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Gunakan tombol sekunder untuk mengakses pembuat kata sandi dan mencocokkan login untuk situs web." + }, + "contextMenuItemDescAlt": { + "message": "Gunakan tombol sekunder untuk mengakses pembuat kata sandi dan mencocokkan login untuk situs web. Diterapkan ke semua akun yang telah masuk." }, "defaultUriMatchDetection": { "message": "Deteksi Kecocokan URI Bawaan", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Pilih cara bawaan penanganan pencocokan URI untuk masuk saat melakukan tindakan seperti isi-otomatis." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Ubah tema warna aplikasi." }, + "themeDescAlt": { + "message": "Ubah warna tema aplikasi. Diterapkan ke semua akun yang telah masuk." + }, "dark": { "message": "Gelap", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Gelap Solarized", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Ekspor dari" + }, "exportVault": { "message": "Ekspor Brankas" }, "fileFormat": { "message": "Format Berkas" }, + "fileEncryptedExportWarningDesc": { + "message": "Ekpor berkas ini akan akan dilindungi oleh kata sandi dan membutuhkan kata sandi berkas untuk mendekripsikannya." + }, + "filePassword": { + "message": "Kata sandi berkas" + }, + "exportPasswordDescription": { + "message": "Kata sandi ini akan digunakan untuk mengekspor dan mengimpor berkas ini" + }, + "accountRestrictedOptionDescription": { + "message": "Gunakan kunci enkripsi akun Anda, diturunkan dari nama pengguna akun Anda dan kata sandi utama, untuk mengenkripsi ekspor dan membatasi impor menjadi hanya akun Bitwarden saat ini." + }, + "passwordProtectedOptionDescription": { + "message": "Atur kata sandi berkas untuk mengenkripsi ekspor dan mengimpornya ke sebarang akun Bitwarden menggunakan kata sandi untuk dekripsi." + }, + "exportTypeHeading": { + "message": "Jenis ekspor" + }, + "accountRestricted": { + "message": "Akun dibatasi" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Kata sandi berkas\" dan \"Konfirmasi kata sandi berkas\" tidak cocok." + }, "warning": { "message": "PERINGATAN", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Dibagikan" }, - "learnOrg": { - "message": "Pelajari tentang Organisasi" - }, - "learnOrgConfirmation": { - "message": "Bitwarden memungkinkan Anda berbagi item brankas Anda dengan orang lain menggunakan organisasi. Maukah Anda mengunjungi laman bitwarden.com untuk mempelajari lebih lanjut?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden untuk Bisnis membolehkan Anda untuk membagikan benda-benda di brankas Anda dengan orang lain dengan menggunakan sebuah organisasi. Pelajari lebih lanjut pada situs web bitwarden.com." }, "moveToOrganization": { "message": "Pindah ke Organisasi" @@ -762,6 +1204,9 @@ "file": { "message": "Berkas" }, + "fileToShare": { + "message": "Berkas untuk dibagikan" + }, "selectFile": { "message": "Pilih berkas." }, @@ -772,7 +1217,7 @@ "message": "Fitur Tidak Tersedia" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Kunci enkripsi migrasi dibutuhkan. Silakan masuk melalui brankas web untuk memperbarui kunci enkripsi Anda." }, "premiumMembership": { "message": "Keanggotaan Premium" @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "1 GB penyimpanan berkas yang dienkripsi." }, + "premiumSignUpEmergency": { + "message": "Akses darurat." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "Pilihan masuk dua-langkah yang dipatenkan seperti YubiKey dan Duo." }, "ppremiumSignUpReports": { "message": "Kebersihan kata sandi, kesehatan akun, dan laporan kebocoran data untuk tetap menjaga keamanan brankas Anda." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Anda dapat membeli keanggotaan premium di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?" }, + "premiumPurchaseAlertV2": { + "message": "Anda dapat membeli Premium dari pilihan akun Anda pada aplikasi web Bitwarden." + }, "premiumCurrentMember": { "message": "Anda adalah anggota premium!" }, "premiumCurrentMemberThanks": { "message": "Terima kasih telah mendukung Bitwarden." }, + "premiumFeatures": { + "message": "Tingkatkan ke Premium dan dapatkan:" + }, "premiumPrice": { "message": "Semua itu hanya $PRICE$ /tahun!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Semua itu hanya $PRICE$ tiap tahun!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Penyegaran selesai" }, @@ -841,7 +1304,7 @@ "message": "Jika info masuk Anda memiliki kunci autentikasi yang menyertainya, kode verifikasi TOTP akan disalin secara otomatis ke clipboard Anda setiap kali Anda mengisi info masuk secara otomatis." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Tanyakan untuk biometrik pada saat diluncurkan" }, "premiumRequired": { "message": "Membutuhkan Keanggotaan Premium" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Aplikasi Otentikasi" }, - "authenticatorAppDesc": { - "message": "Gunakan aplikasi autentikasi (seperti Authy atau Google Authenticator) untuk menghasilkan kode verifikasi berbasis waktu.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Masukkan kode yang dihasilkan dari aplikasi pengotentikasi seperti Pengotentikasi Bitwarden.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "Kunci Keamanan OTP YubiKey" + "yubiKeyTitleV2": { + "message": "Kunci Keamanan OTP Yubico" }, "yubiKeyDesc": { "message": "Gunakan YubiKey untuk mengakses akun Anda. Bekerja dengan YubiKey 4, 4 Nano, 4C, dan peranti NEO." }, - "duoDesc": { - "message": "Verifikasi dengan Duo Security menggunakan aplikasi Duo Mobile, SMS, panggilan telepon, atau kunci keamanan U2F.", + "duoDescV2": { + "message": "Masukkan kode yang dihasilkan oleh Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Kode verifikasi akan dikirim via email kepada Anda." + "emailDescV2": { + "message": "Masukkan kode yang dikirim ke surel Anda." }, "selfHostedEnvironment": { "message": "Lingkungan Penyedia Personal" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Tetapkan URL dasar penyedia personal pemasangan Bitwarden Anda." }, + "selfHostedBaseUrlHint": { + "message": "Tentukan URL dasar dari pemasangan Bitwarden di server Anda. Contoh: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Untuk pengaturan tingkat lanjut, Anda dapat menentukan URL dasar dari setiap layanan secara terpisah." + }, + "selfHostedEnvFormInvalid": { + "message": "Anda harus menambahkan antara URL dasar server atau paling tidak satu lingkungan ubahsuai." + }, "customEnvironment": { "message": "Lingkungan Khusus" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL Server" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL Server API" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "URL dari semua lingkungan telah disimpan." }, + "showAutoFillMenuOnFormFields": { + "message": "Tampilkan menu isi otomatis pada kolom formulir", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Saran isi otomatis" + }, + "showInlineMenuLabel": { + "message": "Tampilkan saran isi otomatis pada kolom formulir" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Tampilkan identitas sebagai saran" + }, + "showInlineMenuCardsLabel": { + "message": "Tampilkan kartu sebagai saran" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Tampilkan saran ketika ikon dipilih" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Diterapkan ke semua akun yang telah masuk." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Matikan pengaturan pengelola kata sandi bawaan peramban Anda untuk menghindari benturan." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Sunting pengaturan peramban." + }, + "autofillOverlayVisibilityOff": { + "message": "Mati", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Ketika kolom dipilih (ketika difokuskan)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Ketika ikon isi otomatis dipilih", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Isi otomatis ketika halaman dimuat" + }, "enableAutoFillOnPageLoad": { "message": "Aktifkan Isi-Otomatis Saat Memuat Laman" }, "enableAutoFillOnPageLoadDesc": { "message": "Jika formulir info masuk terdeteksi, secara otomatis melakukan pengisian otomatis ketika memuat laman web." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Peringatan:$CLOSETAG$ Situs web yang disusupi atau tidak terpercaya dapat memanfaatkan isi otomatis ketika halaman dimuat.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Situs web yang disusupi atau tidak terpercaya dapat memanfaatkan isi otomatis ketika halaman dimuat." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Pelajari lebih lanjut tentang risiko" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Pelajari lebih lanjut tentang isi otomatis" }, "defaultAutoFillOnPageLoad": { "message": "Konfigurasi autofill standard untuk item login." @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Buka brankas di bilah samping" }, - "commandAutofillDesc": { - "message": "Isi otomatis info masuk yang digunakan terakhir untuk situs ini" + "commandAutofillLoginDesc": { + "message": "Isi otomatis login yang terakhir digunakan untuk situs web saat ini" + }, + "commandAutofillCardDesc": { + "message": "Isi otomatis kartu yang terakhir digunakan untuk situs web saat ini" + }, + "commandAutofillIdentityDesc": { + "message": "Isi otomatis identitas yang terakhir digunakan untuk situs web saat ini" }, "commandGeneratePasswordDesc": { "message": "Buat dan salin kata sandi acak baru ke papan klip." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Kunci brankas" }, - "privateModeWarning": { - "message": "Dukungan mode pribadi bersifat eksperimental dan beberapa fitur terbatas." - }, "customFields": { "message": "Ruas Khusus" }, @@ -1050,12 +1588,15 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Kotak centang" + }, "cfTypeLinked": { "message": "Terhubung", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Linked value", + "message": "Nilai terkait", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { @@ -1065,16 +1606,19 @@ "message": "Peramban ini tidak bisa memproses permintaan U2F di jendela popup ini. Apakah Anda ingin membuka popup ini di jendela baru sehingga Anda dapat masuk menggunakan U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Tampilkan ikon situs web" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Tampilkan sebuah gambar yang dapat dikenali di setiap masuk." + }, + "faviconDescAlt": { + "message": "Tampilkan sebuah gambar yang dapat dikenali di sebelah tiap login. Diterapkan ke semua akun yang telah masuk." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Tampilkan hitungan di lencana" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Tunjukkan seberapa banyak login yang Anda miliki untuk halaman web saat ini." }, "cardholderName": { "message": "Nama Pemegang Kartu" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitas" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Riwayat Kata Sandi" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Kembali" }, "collections": { "message": "Koleksi" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorit" }, @@ -1282,6 +1874,10 @@ "message": "Domain basis", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Nama Domain", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Deteksi Kecocokan", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Deteksi kecocokan standar", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Ubah Opsi" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Tidak ada sandi yang dapat dicantumkan." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Hapus" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Buka kunci dengan PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Setel kode PIN Anda untuk membuka kunci Bitwarden. Pengaturan PIN Anda akan diatur ulang jika Anda pernah keluar sepenuhnya dari aplikasi." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Membutuhkan kode PIN." }, "invalidPin": { "message": "Kode PIN tidak valid." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Buka kunci dengan biometrik" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Menunggu konfirmasi dari desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Kunci dengan kata sandi utama saat peramban dimulai ulang" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Anda harus memilih setidaknya satu koleksi." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Satu atau lebih kebijakan organisasi mempengaruhi pengaturan pembuat sandi Anda." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Tindakan Batas Waktu Brankas" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Kunci", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Sampah", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item Yang Dipulihkan" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Keluar akan menghapus semua akses ke brankas Anda dan membutuhkan otentikasi daring setelah periode batas waktu tertentu. Apakah Anda yakin ingin menggunakan pengaturan ini?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Isi Otomatis dan Simpan" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Item yang Diisi Otomatis dan URI Tersimpan" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Kata sandi utama Anda yang baru tidak memenuhi persyaratan kebijakan." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "Dengan mencentang kotak ini, Anda menyetujui yang berikut:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Oke" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Verifikasi sinkronisasi desktop" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Akun tidak cocok" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrik tidak diaktifkan" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "Biometrik peramban tidak didukung di perangkat ini." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Buka dengan biometrik tidak tersedia" + }, + "biometricsNotAvailableDesc": { + "message": "Buka dengan biometrik tidak tersedia untuk saat ini. Mohon coba kembali nanti." + }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "Biometrik gagal" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "Biometrik tidak dapat diselesaikan, pertimbangkan untuk menggunakan sebuah kata sandi utama atau keluar. Jika hal ini tetap berlangsung, mohon hubungi dukungan Bitwarden." }, "nativeMessaginPermissionErrorTitle": { "message": "Izin tidak diberikan" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Kebijakan organisasi memengaruhi opsi kepemilikan Anda." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Sebuah kebijakan organisasi telah menghalangi mengimpor benda-benda ke brankas pribadi Anda." + }, + "domainsTitle": { + "message": "Domain", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Domain yang Dikecualikan" }, "excludedDomainsDesc": { "message": "Bitwarden tidak akan meminta untuk menyimpan detail login untuk domain ini. Anda harus menyegarkan halaman agar perubahan diterapkan." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden tidak akan meminta untuk menyimpan rincian login untuk domain tersebut. Anda harus menyegarkan halaman agar perubahan diterapkan." + }, + "websiteItemLabel": { + "message": "Situs web $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ bukan domain yang valid", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Perubahan domain yang diabaikan telah disimpan" + }, + "limitSendViews": { + "message": "Batasi tampilan" + }, + "limitSendViewsHint": { + "message": "Tidak ada yang dapat melihat Kiriman ini setelah mencapai batasan.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ tampilan tersisa", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Rincian Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Pencarian Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Teks" }, + "sendTypeTextToShare": { + "message": "Teks untuk dibagikan" + }, "sendTypeFile": { "message": "Berkas" }, @@ -1666,6 +2406,9 @@ "message": "Semua Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Sembunyikan teks secara bawaan" + }, "maxAccessCountReached": { "message": "Jumlah akses maksimum tercapai", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Dilindungi kata sandi" }, + "copyLink": { + "message": "Salin tautan" + }, "copySendLink": { "message": "Salin tautan Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Anda yakin ingin menghapus Send ini?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Apakah Anda yakin ingin menghapus Send ini selamanya?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send akan dihapus secara permanen pada tanggal dan waktu yang ditentukan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send akan dihapus selamanya pada tanggal ini.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Tanggal habis tempo" }, @@ -1769,6 +2523,10 @@ "message": "Secara opsional, minta kata sandi bagi pengguna untuk mengakses Send ini.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Catatan pribadi tentang Send ini.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send Dibuat ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send berhasil dibuat!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send akan tersedia ke setiap orang yang memiliki tautan untuk 1 jam ke depan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Send akan tersedia ke setiap orang yang memiliki tautan untuk $HOURS$ jam ke depan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send akan tersedia ke setiap orang yang memiliki tautan untuk 1 hari ke depan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Send akan tersedia ke setiap orang yang memiliki tautan untuk $DAYS$ hari ke depan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Tautan Send disalin", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send diedit", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Sembulkan ekstensi?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Untuk membuat sebuah berkas Send, Anda perlu menyembulkan ekstensi ke sebuah jendela baru.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Untuk memilih file ini, buka Extension di sidebar (jika memungkinkan) atau keluarkan menjadi window baru dengan menekan gambar ini." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Untuk memilih file menggunakan Safari, keluar ke jendela baru dengan mengklik spanduk ini." }, + "popOut": { + "message": "Sembulkan" + }, "sendFileCalloutHeader": { "message": "Sebelum kamu memulai" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Sembunyikan alamat surel dari penerima." }, + "hideYourEmail": { + "message": "Sembunyikan alamat surel Anda dari penonton." + }, "sendOptionsPolicyInEffect": { "message": "Satu atau lebih kebijakan organisasi mempengaruhi pengaturan feature Send anda." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Verifikasi Email Diperlukan" }, + "emailVerifiedV2": { + "message": "Surel telah diverifikasi" + }, "emailVerificationRequiredDesc": { "message": "Anda harus memverifikasi email Anda untuk menggunakan fitur ini. Anda dapat memverifikasi email Anda di brankas web." }, @@ -1884,7 +2695,10 @@ "message": "Kata Sandi Utama Anda baru-baru ini diubah oleh administrator organisasi Anda. Untuk mengakses brankas tersebut, Anda diharuskan memperbarui Kata Sandi Utama Anda sekarang. Jika Anda melanjutkan, Anda akan keluar dari sesi saat ini, yang mana mengharuskan Anda untuk login kembali. Sesi yang aktif di perangkat lain akan tetap aktif selama satu jam kedepan." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Kata sandi utama Anda tidak memenuhi satu atau lebih dari kebijakan organisasi Anda. Untuk dapat mengakses brankas, Anda harus memperbarui kata sandi utama Anda sekarang. Melanjutkan akan mengeluarkan Anda dari sesi saat ini, memerlukan Anda untuk masuk kembali. Sesi aktif pada perangkat lainnya dapat tetap aktif hingga satu jam." + }, + "tdeDisabledMasterPasswordRequired": { + "message": "Organisasi Anda telah mematikan enkripsi perangkat terpercaya. Mohon mengatur kata sandi utama untuk mengakses brankas Anda." }, "resetPasswordPolicyAutoEnroll": { "message": "Pendaftaran Otomatis" @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Pilih Folder..." }, - "ssoCompleteRegistration": { - "message": "Untuk menyelesaikan masuk dengan SSO, harap setel kata sandi utama untuk mengakses dan melindungi brankas Anda." + "noFoldersFound": { + "message": "Tidak ada folder yang ditemukan", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Perizinan organisasi Anda telah diperbarui, memerlukan Anda untuk mengatur kata sandi utama.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Organisasi Anda memerlukan Anda untuk mengatur sebuah kata sandi utama.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "dari $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Memerlukan verifikasi", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Jam" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Menit" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Persyaratan kebijakan perusahaan telah diterapkan ke pilihan batas waktu Anda" + }, "vaultTimeoutPolicyInEffect": { "message": "Kebijakan organisasi Anda memengaruhi waktu tunggu brankas Anda. Batas maksimal Waktu Tunggu Brankas yang diizinkan adalah $HOURS$ jam dan $MINUTES$ menit", "placeholders": { @@ -1917,8 +2756,34 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maksimal $HOURS$ jam dan $MINUTES$ menit.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Batas waktu melebihi dari batasan yang telah ditetapkan oleh organisasi Anda: maksimal $HOURS$ jam dan $MINUTES$ menit", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "Kebijakan organisasi Anda mempengaruhi batas waktu brankas Anda. Batas waktu maksimum yang dibolehkan adalah $HOURS$ jam dan $MINUTES$ menit. Batas waktu tindakan brankas Anda diatur ke $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1935,7 +2800,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "Kebijakan organisasi Anda telah mengatur batas waktu tindakan brankas Anda ke $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -1944,7 +2809,7 @@ } }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Batas waktu brankas Anda melebihi batasan yang telah ditetapkan oleh organisasi Anda." }, "vaultExportDisabled": { "message": "Ekspor Brankas Dinonaktifkan" @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Galat" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Buat nama pengguna baru" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Jenis nama pengguna" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 9af1f04b8e2..2f42e12a0ee 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Gestore di Password Gratis", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Un gestore di password sicuro e gratis per tutti i tuoi dispositivi.", - "description": "Extension description" + "message": "A casa, al lavoro, o in viaggio, Bitwarden protegge tutte le tue password, passkey, e informazioni sensibili", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "Accedi o crea un nuovo account per accedere alla tua cassaforte." + "message": "Entra o crea un nuovo account per accedere alla tua cassaforte." + }, + "inviteAccepted": { + "message": "Invito accettato" }, "createAccount": { "message": "Crea account" }, - "login": { - "message": "Accedi" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Imposta una password robusta" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Termina la creazione del tuo account impostando una password" }, "enterpriseSingleSignOn": { "message": "Single Sign-On aziendale" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Un suggerimento per la password principale puÃ˛ aiutarti a ricordarla se la dimentichi." }, + "masterPassHintText": { + "message": "Se dimentichi la password, il suggerimento password puÃ˛ essere inviato alla tua email. $CURRENT$/$MAXIMUM$ massimo carattere.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Inserisci password principale di nuovo" }, "masterPassHint": { "message": "Suggerimento per la password principale (facoltativo)" }, + "joinOrganization": { + "message": "Unisciti all'organizzazione" + }, + "joinOrganizationName": { + "message": "Unisciti a $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Termina l'adesione a questa organizzazione impostando una password principale." + }, "tab": { "message": "Scheda" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copia password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copia nota" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copia codice di sicurezza" }, + "copyName": { + "message": "Copia nome" + }, + "copyCompany": { + "message": "Copia azienda" + }, + "copySSN": { + "message": "Copia Codice fiscale/Previdenza sociale" + }, + "copyPassportNumber": { + "message": "Copia numero passaporto" + }, + "copyLicenseNumber": { + "message": "Copia numero licenza" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copia $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copia sito web" + }, + "copyNotes": { + "message": "Copia note" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Riempimento automatico" }, + "autoFillLogin": { + "message": "Riempi automaticamente login" + }, + "autoFillCard": { + "message": "Riempi automaticamente carta" + }, + "autoFillIdentity": { + "message": "Riempi automaticamente identità" + }, "generatePasswordCopied": { "message": "Genera password e copiala" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Nessun login corrispondente" }, + "noCards": { + "message": "Nessuna carta" + }, + "noIdentities": { + "message": "Nessuna identità" + }, + "addLoginMenu": { + "message": "Aggiungi login" + }, + "addCardMenu": { + "message": "Aggiungi carta" + }, + "addIdentityMenu": { + "message": "Aggiungi identità" + }, "unlockVaultMenu": { "message": "Sblocca la tua cassaforte" }, @@ -115,8 +231,20 @@ "addItem": { "message": "Aggiungi elemento" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Richiedi suggerimento" + }, + "requestPasswordHint": { + "message": "Richiedi il suggerimento per la password" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Inserisci l'indirizzo email dell'account e ti invieremo il tuo suggerimento per la password" + }, "passwordHint": { - "message": "Suggerimento password" + "message": "Suggerimento per la password" }, "enterEmailToGetHint": { "message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento per la password principale." @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Conferma la tua identità per continuare." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Cambia password principale" }, + "continueToWebApp": { + "message": "Passa al sito web?" + }, + "continueToWebAppDesc": { + "message": "Esplora altre funzionalità del tuo account Bitwarden sul sito web." + }, + "continueToHelpCenter": { + "message": "Continua sul centro assistenza?" + }, + "continueToHelpCenterDesc": { + "message": "Scopri di piÚ su come usare Bitwarden nel centro assistenza." + }, + "continueToBrowserExtensionStore": { + "message": "Continua sullo store delle estensioni per il browser?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Aiuta gli altri a scoprire se Bitwarden è adatto a loro. Visita lo store delle estensioni del tuo browser e lascia una recensione." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Puoi modificare la tua password principale sul sito web di Bitwarden." + }, "fingerprintPhrase": { "message": "Frase impronta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Esci" }, + "aboutBitwarden": { + "message": "Informazioni su Bitwarden" + }, "about": { "message": "Informazioni" }, + "moreFromBitwarden": { + "message": "Altro da Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continua su bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator ti consente di memorizzare le chiavi di autenticazione e generare codici TOTP per la verifica in due passaggi. Scopri di piÚ su bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Archivia, gestisci e condividi in modo sicuro i segreti degli sviluppatori con Bitwarden Secrets Manager. Scopri di piÚ su bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Crea esperienze di accesso fluide e sicure, libere dalle password tradizionali con Passwordless.dev. Scopri di piÚ su bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Families gratis" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Sei idoneo a ricevere Bitwarden Families gratis. Riscatta questa offerta nella web app." + }, "version": { "message": "Versione" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Modifica cartella" }, + "newFolder": { + "message": "Nuova cartella" + }, + "folderName": { + "message": "Nome cartella" + }, + "folderHintText": { + "message": "Annida una cartella aggiungendo il nome della cartella superiore seguito da un “/”. Esempio: Social/Forums" + }, + "noFoldersAdded": { + "message": "Nessuna cartella aggiunta" + }, + "createFoldersToOrganize": { + "message": "Crea cartelle per organizzare gli elementi della cassaforte" + }, + "deleteFolderPermanently": { + "message": "Sei sicuro di voler eliminare definitivamente questo cartella?" + }, "deleteFolder": { "message": "Elimina cartella" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generatore", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Genera automaticamente password complesse e uniche per i tuoi login." }, - "bitWebVault": { - "message": "Cassaforte web di Bitwarden" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importa elementi" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Genera password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Rigenera password" }, @@ -244,17 +447,60 @@ "length": { "message": "Lunghezza" }, + "passwordMinLength": { + "message": "Lunghezza minima della password" + }, "uppercase": { - "message": "Maiuscole (A-Z)" + "message": "Maiuscole (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minuscole (a-z)" + "message": "Minuscole (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numeri (0-9)" + "message": "Numeri (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caratteri speciali (!@#$%^&*)" + "message": "Caratteri speciali (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Includi", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Includi caratteri maiuscoli", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Includi caratteri minuscoli", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Includi numeri", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Includi caratteri speciali", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Numero di parole" @@ -276,7 +522,16 @@ "message": "Minimo caratteri speciali" }, "avoidAmbChar": { - "message": "Evita caratteri ambigui" + "message": "Evita caratteri ambigui", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Evita caratteri ambigui", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Cerca nella cassaforte" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Segreto di autenticazione" + }, "passphrase": { "message": "Frase segreta" }, "favorite": { "message": "Preferito" }, + "unfavorite": { + "message": "Rimuovi dai preferiti" + }, + "itemAddedToFavorites": { + "message": "Elementi aggiunti ai preferiti" + }, + "itemRemovedFromFavorites": { + "message": "Elementi rimossi dai preferiti" + }, "notes": { "message": "Note" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -326,6 +596,18 @@ "launch": { "message": "Avvia" }, + "launchWebsite": { + "message": "Avvia il sito web" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Sito web" }, @@ -338,9 +620,24 @@ "other": { "message": "Altro" }, + "unlockMethods": { + "message": "Opzioni di sblocco" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Imposta un metodo di sblocco per modificare l'azione timeout cassaforte." }, + "unlockMethodNeeded": { + "message": "Imposta un metodo di sblocco in Impostazioni" + }, + "sessionTimeoutHeader": { + "message": "Timeout della sessione" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Altre opzioni" + }, "rateExtension": { "message": "Valuta l'estensione" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "La tua cassaforte è bloccata. Verifica la tua identità per continuare." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Sblocca" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Timeout cassaforte" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Blocca ora" }, + "lockAll": { + "message": "Blocca tutto" + }, "immediately": { "message": "Immediatamente" }, @@ -426,6 +738,18 @@ "security": { "message": "Sicurezza" }, + "confirmMasterPassword": { + "message": "Conferma password principale" + }, + "masterPassword": { + "message": "Password principale" + }, + "masterPassImportant": { + "message": "La tua password principale non puÃ˛ essere recuperata se la dimentichi!" + }, + "masterPassHintLabel": { + "message": "Suggerimento per la password principale" + }, "errorOccurred": { "message": "Si è verificato un errore" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Il tuo nuovo account è stato creato! Ora puoi eseguire l'accesso." }, + "newAccountCreated2": { + "message": "Il tuo nuovo account è stato creato!" + }, + "youHaveBeenLoggedIn": { + "message": "Hai effettuato l'accesso!" + }, + "youSuccessfullyLoggedIn": { + "message": "Hai effettuato l'accesso" + }, + "youMayCloseThisWindow": { + "message": "Puoi chiudere questa finestra" + }, "masterPassSent": { "message": "Ti abbiamo inviato una email con il tuo suggerimento per la password principale." }, "verificationCodeRequired": { "message": "Il codice di verifica è obbligatorio." }, + "webauthnCancelOrTimeout": { + "message": "L'autenticazione è stata annullata o ha richiesto troppo tempo. Per favore riprova." + }, "invalidVerificationCode": { "message": "Codice di verifica non valido" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Impossibile riempire automaticamente questo elemento nella pagina. Copia e incolla le credenziali." }, + "totpCaptureError": { + "message": "Impossibile scansionare il codice QR da questa pagina web" + }, + "totpCaptureSuccess": { + "message": "Chiave di autenticazione aggiunta" + }, + "totpCapture": { + "message": "Scansiona il codice QR dell'autenticatore da questa pagina web" + }, + "totpHelperTitle": { + "message": "Rendi la 2FA facile" + }, + "totpHelper": { + "message": "Bitwarden puÃ˛ memorizzare e riempire automaticamente i codici di verifica 2FA. Copia e incolla la chiave in questo campo." + }, + "totpHelperWithCapture": { + "message": "Bitwarden puÃ˛ memorizzare e riempire automaticamente i codici di verifica 2FA. Selezionare l'icona della fotocamera per creare uno screenshot del codice QR dell'autenticatore di questo sito web, oppure copia e incolla la chiave in questo campo." + }, + "learnMoreAboutAuthenticators": { + "message": "Ulteriori informazioni sugli autenticatori" + }, + "copyTOTP": { + "message": "Copia la chiave di autenticazione (TOTP)" + }, "loggedOut": { "message": "Disconnesso" }, + "loggedOutDesc": { + "message": "Sei stato fatto uscire dal tuo account." + }, "loginExpired": { "message": "La tua sessione è scaduta." }, + "logIn": { + "message": "Accedi" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Riprova la registrazione" + }, + "expiredLink": { + "message": "Link scaduto" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Riavvia la registrazione o prova ad accedere." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Potresti già avere un account" + }, "logOutConfirmation": { "message": "Sei sicuro di volerti disconnettere?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Cartella aggiunta" }, - "changeMasterPass": { - "message": "Cambia password principale" - }, - "changeMasterPasswordConfirmation": { - "message": "Puoi cambiare la tua password principale sulla cassaforte online di bitwarden.com. Vuoi visitare ora il sito?" - }, "twoStepLoginConfirmation": { "message": "La verifica in due passaggi rende il tuo account piÚ sicuro richiedendoti di verificare il tuo login usando un altro dispositivo come una chiave di sicurezza, app di autenticazione, SMS, telefonata, o email. PuÃ˛ essere abilitata nella cassaforte web su bitwarden.com. Vuoi visitare il sito?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Cartella salvata" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Nuovo URI" }, + "addDomain": { + "message": "Aggiungi dominio", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Elemento aggiunto" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Chiedi di aggiungere nuovi login" }, + "vaultSaveOptionsTitle": { + "message": "Salva nelle opzioni della cassaforte" + }, "addLoginNotificationDesc": { "message": "Chiedi di aggiungere un nuovo elemento se non ce n'è uno nella tua cassaforte." }, + "addLoginNotificationDescAlt": { + "message": "Chiedi di creare un nuovo elemento se non ce n'è uno nella tua cassaforte. Si applica a tutti gli account sul dispositivo." + }, + "showCardsInVaultView": { + "message": "Mostra le carte come suggerimenti di riempimento automatico nella vista cassaforte" + }, "showCardsCurrentTab": { "message": "Mostra le carte nella sezione Scheda" }, "showCardsCurrentTabDesc": { "message": "Mostra le carte nella sezione Scheda per riempirle automaticamente." }, + "showIdentitiesInVaultView": { + "message": "Mostra le identità come suggerimenti di riempimento automatico nella vista cassaforte" + }, "showIdentitiesCurrentTab": { "message": "Mostra le identità nella sezione Scheda" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Chiedi di aggiornare la password di un login quando rileviamo che è cambiata su un sito web." }, + "changedPasswordNotificationDescAlt": { + "message": "Chiedi di aggiornare la password salvata quando viene modificata su un sito web. Si applica a tutti gli account sul dispositivo." + }, + "enableUsePasskeys": { + "message": "Chiedi di salvare e usare le passkey" + }, + "usePasskeysDesc": { + "message": "Chiedi di salvare nuove passkey o accedere con passkey salvate nella tua cassaforte. Si applica a tutti gli account connessi." + }, "notificationChangeDesc": { "message": "Vuoi aggiornare questa password in Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Sblocca" }, + "additionalOptions": { + "message": "Opzioni aggiuntive" + }, "enableContextMenuItem": { "message": "Mostra opzioni nel menu contestuale" }, "contextMenuItemDesc": { - "message": "Utilizza un secondo clic per accedere alla generazione di password e login corrispondenti per il sito web. " + "message": "Usa un clic secondario per generare nuove password e riempire automaticamente i login nei siti web." + }, + "contextMenuItemDescAlt": { + "message": "Chiedi di aggiornare la password salvata quando viene modificata su un sito web. Si applica a tutti gli account sul dispositivo. Si applica a tutti gli account sul dispositivo." }, "defaultUriMatchDetection": { "message": "Rilevamento corrispondenza URI predefinito", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Scegli il modo predefinito in cui il rilevamento della corrispondenza URI è gestito per i login quando si eseguono azioni come il riempimento automatico." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Cambia lo schema di colori dell'app." }, + "themeDescAlt": { + "message": "Cambia il colore del tema dell'estensione. Si applica a tutti gli account sul dispositivo." + }, "dark": { "message": "Scuro", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Scuro solarizzato", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Esporta da" + }, "exportVault": { "message": "Esporta cassaforte" }, "fileFormat": { "message": "Formato file" }, + "fileEncryptedExportWarningDesc": { + "message": "Questo file esportato sarà protetto e richiederà la password del file per decifrarlo." + }, + "filePassword": { + "message": "Password del file" + }, + "exportPasswordDescription": { + "message": "La password sarà utilizzata per importare ed esportare questo file" + }, + "accountRestrictedOptionDescription": { + "message": "Usa la chiave di crittografia dell'account, derivata dal nome utente e dalla password principale del tuo account, per crittografare il file di esportazione e limitare l'importazione solo all'account Bitwarden corrente." + }, + "passwordProtectedOptionDescription": { + "message": "Imposta una password del file per crittografare il file esportato e importarlo in qualsiasi account Bitwarden usando la password per decrittografarlo." + }, + "exportTypeHeading": { + "message": "Tipo di esportazione" + }, + "accountRestricted": { + "message": "Account limitato" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "Le due password del file non corrispondono." + }, "warning": { "message": "ATTENZIONE", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -684,13 +1129,13 @@ "message": "Conferma esportazione della cassaforte" }, "exportWarningDesc": { - "message": "Questa esportazione contiene i dati della tua cassaforte in un formato non criptato. Non salvare o inviare il file esportato attraverso canali non protetti (come le email). Eliminalo immediatamente dopo l'utilizzo." + "message": "Questa esportazione contiene i dati della tua cassaforte in un formato non crittografato. Non salvare o inviare il file esportato attraverso canali non protetti (come le email). Eliminalo immediatamente dopo l'utilizzo." }, "encExportKeyWarningDesc": { - "message": "Questa esportazione cripta i tuoi dati usando la chiave di criptografia del tuo account. Se cambi la chiave di criptografia del tuo account, non potrai piÚ decifrare il file esportato e dovrai eseguire una nuova esportazione." + "message": "Questa esportazione crittografa i tuoi dati usando la chiave di crittografia del tuo account. Se cambi la chiave di crittografia del tuo account, non potrai piÚ decifrare il file esportato e dovrai eseguire una nuova esportazione." }, "encExportAccountWarningDesc": { - "message": "Le chiavi di criptografia dell'account sono uniche per ogni account Bitwarden, quindi non puoi importare un file di esportazione criptato in un account diverso." + "message": "Le chiavi di crittografia dell'account sono uniche per ogni account Bitwarden, quindi non puoi importare un file di esportazione crittato in un account diverso." }, "exportMasterPassword": { "message": "Inserisci la tua password principale per esportare i dati della tua cassaforte." @@ -698,11 +1143,8 @@ "shared": { "message": "Condiviso" }, - "learnOrg": { - "message": "Ulteriori informazioni sulle organizzazioni" - }, - "learnOrgConfirmation": { - "message": "Bitwarden ti permette di condividere gli elementi della tua cassaforte con altri usando un'organizzazione. Vuoi visitare il sito bitwarden.com per saperne di piÚ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business ti consente di condividere gli elementi della tua cassaforte con altri usando un'organizzazione. Scopri di piÚ su bitwarden.com." }, "moveToOrganization": { "message": "Sposta in organizzazione" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Seleziona un file" }, @@ -772,7 +1217,7 @@ "message": "Funzionalità non disponibile" }, "encryptionKeyMigrationRequired": { - "message": "Migrazione della chiave di criptografia obbligatoria. Accedi tramite la cassaforte web per aggiornare la tua chiave di criptografia." + "message": "Migrazione della chiave di crittografia obbligatoria. Accedi tramite la cassaforte web per aggiornare la tua chiave di crittografia." }, "premiumMembership": { "message": "Abbonamento Premium" @@ -793,7 +1238,10 @@ "message": "Passa a Premium e ottieni:" }, "ppremiumSignUpStorage": { - "message": "1 GB di spazio di archiviazione criptato per gli allegati." + "message": "1 GB di spazio di archiviazione crittografato per gli allegati." + }, + "premiumSignUpEmergency": { + "message": "Accesso di emergenza." }, "premiumSignUpTwoStepOptions": { "message": "Opzioni di verifica in due passaggi proprietarie come YubiKey e Duo." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Puoi acquistare il un abbonamento Premium dalla cassaforte web su bitwarden.com. Vuoi visitare il sito?" }, + "premiumPurchaseAlertV2": { + "message": "Puoi acquistare Premium dalle impostazioni del tuo account sull'app web Bitwarden." + }, "premiumCurrentMember": { "message": "Sei un membro Premium!" }, "premiumCurrentMemberThanks": { "message": "Grazie per il tuo supporto a Bitwarden." }, + "premiumFeatures": { + "message": "Passa a Premium e ricevi:" + }, "premiumPrice": { "message": "Il tutto per soli $PRICE$ all'anno!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Il tutto per solo $PRICE$ all'anno!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Aggiornamento completato" }, @@ -874,7 +1337,7 @@ "message": "Ricordami" }, "sendVerificationCodeEmailAgain": { - "message": "Invia email con codice di verifica di nuovo" + "message": "Invia di nuovo l'email con codice di verifica" }, "useAnotherTwoStepMethod": { "message": "Usa un altro metodo di verifica in due passaggi" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "App di autenticazione" }, - "authenticatorAppDesc": { - "message": "Usa un'app di autenticazione (come Authy o Google Authenticator) per generare codici di verifica basati sul tempo.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Inserisci un codice generato da un'app di autenticazione come Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { + "yubiKeyTitleV2": { "message": "Chiave di sicurezza YubiKey OTP" }, "yubiKeyDesc": { "message": "Usa YubiKey per accedere al tuo account. Funziona con YubiKey 4, 4 Nano, 4C, e dispositivi NEO." }, - "duoDesc": { - "message": "Verifica con Duo Security usando l'app Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.", + "duoDescV2": { + "message": "Inserisci un codice generato da Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "I codici di verifica ti saranno inviati per email." + "emailDescV2": { + "message": "Inserisci il codice inviato alla tua email." }, "selfHostedEnvironment": { "message": "Ambiente self-hosted" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specifica l'URL principale della tua installazione self-hosted di Bitwarden." }, + "selfHostedBaseUrlHint": { + "message": "Specifica lo URL principale della tua installazione self-hosted di Bitwarden. Esempio: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Per la configurazione avanzata, puoi specificare lo URL di base di ciascun servizio in modo indipendente." + }, + "selfHostedEnvFormInvalid": { + "message": "Devi aggiungere lo URL del server di base o almeno un ambiente personalizzato." + }, "customEnvironment": { "message": "Ambiente personalizzato" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL del server" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL del server API" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "URL dell'ambiente salvati" }, + "showAutoFillMenuOnFormFields": { + "message": "Mostra il menu di riempimento automatico nei campi di modulo", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Suggerimenti per il riempimento automatico" + }, + "showInlineMenuLabel": { + "message": "Mostra suggerimenti di riempimento automatico nei campi del modulo" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Mostra suggerimenti quando l'icona è selezionata" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Si applica a tutti gli account sul dispositivo." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Disattiva il password manager del tuo browser per evitare conflitti con Bitwarden." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Modifica le impostazioni del browser." + }, + "autofillOverlayVisibilityOff": { + "message": "No", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Quando il campo è selezionato", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Quando l'icona di riempimento automatico è selezionata", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Riempi automaticamente al caricamento della pagina" + }, "enableAutoFillOnPageLoad": { "message": "Riempi automaticamente al caricamento della pagina" }, "enableAutoFillOnPageLoadDesc": { "message": "Se sono rilevati campi di login, riempili automaticamente quando la pagina si carica." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Attenzione:$CLOSETAG$ Siti Web compromessi o non attendibili possono sfruttare il riempimento automatico al caricamento della pagina.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Siti compromessi potrebbero sfruttare il riempimento automatico al caricamento della pagina." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Scopri di piÚ sui rischi" + }, "learnMoreAboutAutofill": { "message": "Ulteriori informazioni" }, @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "Apri cassaforte nella barra laterale" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "Riempi automaticamente con l'ultimo login utilizzato sul sito corrente" }, + "commandAutofillCardDesc": { + "message": "Riempi automaticamente con l'ultima carta utilizzata sul sito corrente" + }, + "commandAutofillIdentityDesc": { + "message": "Riempi automaticamente con l'ultima identità utilizzata sul sito corrente" + }, "commandGeneratePasswordDesc": { "message": "Genera e copia una nuova password casuale negli appunti" }, "commandLockVaultDesc": { "message": "Blocca la cassaforte" }, - "privateModeWarning": { - "message": "Il supporto della modalità privata è sperimentale e alcune funzionalità sono limitate." - }, "customFields": { "message": "Campi personalizzati" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeCheckbox": { + "message": "Casella di controllo" + }, "cfTypeLinked": { "message": "Collegato", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Mostra un piccolo logo riconoscibile accanto a ogni login." }, + "faviconDescAlt": { + "message": "Mostra un piccolo logo riconoscibile accanto a ogni login. Si applica a tutti gli account connessi." + }, "enableBadgeCounter": { "message": "Mostra badge contatore" }, @@ -1149,7 +1693,7 @@ "message": "Sig.ra" }, "dr": { - "message": "Dott" + "message": "Dr" }, "mx": { "message": "Mx" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identità" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "Nuovo $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Modifica $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Visualizza $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Cronologia delle password" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Indietro" }, "collections": { "message": "Raccolte" }, + "nCollections": { + "message": "$COUNT$ raccolte", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Preferiti" }, @@ -1282,6 +1874,10 @@ "message": "Dominio di base", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Dominio di base (raccomandato)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Nome dominio", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Rilevamento di corrispondenza", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Rilevamento di corrispondenza predefinito", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Mostra/nascondi" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Non ci sono password da mostrare." }, + "clearHistory": { + "message": "Cancella cronologia" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Rimuovi" }, @@ -1351,7 +1956,7 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Sei sicuro di voler usare l'opzione \"Mai\"? Impostare le opzioni di blocco su \"Mai\" salverà la chiave di criptografia della cassaforte sul tuo dispositivo. Se utilizzi questa opzione, assicurati di mantenere il tuo dispositivo adeguatamente protetto." + "message": "Sei sicuro di voler usare l'opzione \"Mai\"? Impostare le opzioni di blocco su \"Mai\" salverà la chiave di crittografia della cassaforte sul tuo dispositivo. Se usi questa opzione, assicurati di mantenere il tuo dispositivo adeguatamente protetto." }, "noOrganizationsList": { "message": "Non appartieni a nessuna organizzazione. Le organizzazioni ti consentono di condividere elementi con altri in modo sicuro." @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Sblocca con PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le tue impostazioni PIN saranno resettate se esci completamente dall'app." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Codice PIN obbligatorio." }, "invalidPin": { "message": "Codice PIN non valido." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Troppi tentativi di inserimento del PIN falliti. Uscendo dall'account..." + }, "unlockWithBiometrics": { "message": "Sblocca con i dati biometrici" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "In attesa di conferma dal desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Blocca con la password principale al riavvio del browser" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Devi selezionare almeno una raccolta." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Una o piÚ politiche dell'organizzazione stanno influenzando le impostazioni del tuo generatore." }, + "passwordGenerator": { + "message": "Generatore di password" + }, + "usernameGenerator": { + "message": "Generatore di nomi utente" + }, + "useThisPassword": { + "message": "Usa questa password" + }, + "useThisUsername": { + "message": "Usa questo nome utente" + }, + "securePasswordGenerated": { + "message": "Password sicura generata! Non dimenticare di aggiornare la tua password anche sul sito web." + }, + "useGeneratorHelpTextPartOne": { + "message": "Usa il generatore", + "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": "per creare una password univoca robusta", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Azione timeout cassaforte" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Blocca", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Cestino", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Elemento ripristinato" }, + "alreadyHaveAccount": { + "message": "Hai già un account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Uscire rimuoverà tutti gli accessi alla tua cassaforte e richiede l'autenticazione online dopo il periodo di timeout. Sei sicuro di voler usare questa opzione?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Riempi automaticamente e salva" }, + "fillAndSave": { + "message": "Riempi e salva" + }, "autoFillSuccessAndSavedUri": { "message": "Elemento riempito automaticamente e URI salvato" }, @@ -1501,7 +2156,7 @@ "message": "Una o piÚ politiche dell'organizzazione richiedono che la tua password principale soddisfi questi requisiti:" }, "policyInEffectMinComplexity": { - "message": "Punteggio minimo di complessità di $SCORE$", + "message": "Punteggio di complessità minimo di $SCORE$", "placeholders": { "score": { "content": "$1", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "La tua nuova password principale non soddisfa i requisiti di sicurezza." }, + "receiveMarketingEmailsV2": { + "message": "Ottieni consigli, annunci e opportunità di ricerca da Bitwarden nella tua casella di posta." + }, + "unsubscribe": { + "message": "Annulla iscrizione" + }, + "atAnyTime": { + "message": "in qualsiasi momento." + }, + "byContinuingYouAgreeToThe": { + "message": "Continuando accetti le" + }, + "and": { + "message": "e" + }, "acceptPolicies": { "message": "Selezionando questa casella accetti quanto segue:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Errore di aggiornamento del token di accesso" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Nessun token di aggiornamento o chiave API trovati. Prova ad uscire ed entrare di nuovo." + }, "desktopSyncVerificationTitle": { "message": "Verifica sincronizzazione desktop" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account non corrispondono" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Chiave biometrica non corrispondente" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Sblocco biometrico non riuscito. La chiave segreta biometrica non è riuscita a sbloccare la cassaforte. Riprova a configurare nuovamente la biometria." + }, "biometricsNotEnabledTitle": { "message": "Autenticazione biometrica non abilitata" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "L'autenticazione biometrica del browser non è supportata su questo dispositivo." }, + "biometricsNotUnlockedTitle": { + "message": "Utente bloccato o uscito" + }, + "biometricsNotUnlockedDesc": { + "message": "Sblocca questo utente nell'applicazione desktop e riprova." + }, + "biometricsNotAvailableTitle": { + "message": "Sblocco biometrico non disponibile" + }, + "biometricsNotAvailableDesc": { + "message": "Lo sblocco biometrico non è attualmente disponibile. Riprova piÚ tardi." + }, "biometricsFailedTitle": { "message": "Autenticazione biometrica fallita" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Una politica dell'organizzazione sta influenzando le tue opzioni di proprietà." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Una politica dell'organizzazione ti impedisce di importare elementi nella tua cassaforte individuale." + }, + "domainsTitle": { + "message": "Domini", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Domini esclusi" }, "excludedDomainsDesc": { "message": "Bitwarden non ti chiederà di aggiungere nuovi login per questi domini. Ricorda di ricaricare la pagina perchÊ le modifiche abbiano effetto." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden non chiederà di salvare le credenziali di accesso per questi domini per tutti gli account sul dispositivo. Ricarica la pagina affinchÊ le modifiche abbiano effetto." + }, + "websiteItemLabel": { + "message": "Sito $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ non è un dominio valido", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Modifiche del dominio escluso salvate" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Cerca Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Testo" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "Tutti i Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Numero massimo di accessi raggiunto", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Protetto da password" }, + "copyLink": { + "message": "Copia link" + }, "copySendLink": { "message": "Copia link del Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Sei sicuro di voler eliminare questo Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Modifica Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Il Send sarà eliminato definitivamente alla data e ora specificate.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data di scadenza" }, @@ -1769,6 +2523,10 @@ "message": "Richiedi una password agli utenti per accedere a questo Send (facoltativo).", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Note private sul Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send creato", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send creato con successo!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Link del Send copiato", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send salvato", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Per scegliere un file, apri l'estensione nella barra laterale (se possibile) o apri una nuova finestra cliccando questo banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Per scegliere un file usando Safari, apri una nuova finestra cliccando questo banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Prima di iniziare" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Nascondi il mio indirizzo email dai destinatari." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Una o piÚ politiche dell'organizzazione stanno influenzando le tue opzioni di Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Verifica email obbligatoria" }, + "emailVerifiedV2": { + "message": "Email verificata" + }, "emailVerificationRequiredDesc": { "message": "Devi verificare la tua email per usare questa funzionalità. Puoi verificare la tua email nella cassaforte web." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "La tua password principale non soddisfa uno o piÚ politiche della tua organizzazione. Per accedere alla cassaforte, aggiornala ora. Procedere ti farà uscire dalla sessione corrente, richiedendoti di accedere di nuovo. Le sessioni attive su altri dispositivi potrebbero continuare a rimanere attive per un massimo di un'ora." }, + "tdeDisabledMasterPasswordRequired": { + "message": "La tua organizzazione ha disabilitato la crittografia affidabile del dispositivo. Per favore imposta una password principale per accedere alla tua cassaforte." + }, "resetPasswordPolicyAutoEnroll": { "message": "Iscrizione automatica" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Seleziona cartella..." }, - "ssoCompleteRegistration": { - "message": "Per completare l'accesso con SSO, imposta una password principale per accedere e proteggere la cassaforte." + "noFoldersFound": { + "message": "Nessuna cartella trovata", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Le autorizzazioni della tua organizzazione sono state aggiornate, obbligandoti a impostare una password principale.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "La tua organizzazione ti obbliga di impostare di una password principale.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verifica necessaria", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Ore" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minuti" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Le politiche della tua organizzazione hanno impostato il timeout massimo consentito della tua cassaforte su $HOURS$ ore e $MINUTES$ minuti.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Le politiche della tua organizzazione stanno influenzando il timeout della tua cassaforte. Il tempo massimo consentito è di $HOURS$ ore e $MINUTES$ minuti. La tua azione di timeout della cassaforte è impostata su $ACTION$.", "placeholders": { @@ -1989,7 +2854,7 @@ "message": "La tua sessione è scaduta. Torna indietro e prova ad accedere di nuovo." }, "exportingPersonalVaultTitle": { - "message": "Esportazione cassaforte personale" + "message": "Esportando cassaforte individuale" }, "exportingIndividualVaultDescription": { "message": "Solo gli elementi della cassaforte personale associati a $EMAIL$ saranno esportati. Gli elementi della cassaforte dell'organizzazione non saranno inclusi. Solo le informazioni sugli elementi della cassaforte saranno esportate e non includeranno gli allegati.", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Esportando cassaforte dell'organizzazione" + }, + "exportingOrganizationVaultDesc": { + "message": "Solo la cassaforte dell'organizzazione associata a $ORGANIZATION$ sarà esportata. Elementi nelle casseforti individuali o in altre organizzazioni non saranno inclusi.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Errore" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Genera nome utente" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Tipo di nome utente" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Genera un alias email con un servizio di inoltro esterno." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Errore $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generato da Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Sito web: $WEBSITE$. Generato da Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token API $SERVICENAME$ non valido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token API $SERVICENAME$ non valido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Impossibile ottenere l'ID dell'account email mascherato di $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Dominio $SERVICENAME$ non valido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ non valido.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Errore di $SERVICENAME$ sconosciuto.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Mittente sconosciuto: \"$SERVICENAME$\".", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome host", "description": "Part of a URL." @@ -2090,7 +3094,7 @@ "message": "per ritornare alle impostazioni preconfigurate" }, "serverVersion": { - "message": "Versione Server" + "message": "Versione server" }, "selfHostedServer": { "message": "self-hosted" @@ -2165,7 +3169,7 @@ "message": "Password principale debole e violata" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Password debole e trovata una violazione dei dati. Usa una password forte e unica per proteggere il tuo account. Sei sicuro di voler usare questa password?" + "message": "Password debole e trovata in una violazione dei dati. Usa una password forte e unica per proteggere il tuo account. Sei sicuro di voler usare questa password?" }, "checkForBreaches": { "message": "Controlla se la tua password è presente in una violazione dei dati" @@ -2192,7 +3196,7 @@ "message": "Come riempire automaticamente" }, "autofillSelectInfoWithCommand": { - "message": "Seleziona un elemento da questa pagina o usa la scorciatoia: $COMMAND$", + "message": "Seleziona un elemento da questa schermata, usa la scorciatoia $COMMAND$, o esplora altre opzioni nelle impostazioni.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Seleziona un elemento da questa pagina o imposta una scorciatoia nelle impostazioni." + "message": "Seleziona un elemento da questa schermata o esplora altre opzioni nelle impostazioni." }, "gotIt": { "message": "Ok" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Impostazioni di riempimento automatico" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Scorciatoia del riempimento automatico" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Cambia scorciatoia" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Gestisci scorciatoie" + }, "autofillShortcut": { "message": "Scorciatoia da tastiera per riempire automaticamente" }, - "autofillShortcutNotSet": { - "message": "Non è stata impostata nessuna scorciatoia da tastiera per riempire automaticamente. Impostala nelle impostazioni del browser." + "autofillLoginShortcutNotSet": { + "message": "Non è stata impostata nessuna scorciatoia per il riempimento automatico. Aggiungila dalle impostazioni del browser." }, - "autofillShortcutText": { - "message": "La scorciatoia da tastiera per riempire automaticamente è: $COMMAND$. Cambiala nelle impostazioni del browser.", + "autofillLoginShortcutText": { + "message": "La scorciatoia per il riempimento automatico è $COMMAND$. Gestisci tutte le scorciatoie dalle impostazioni del browser.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Accedendo su" - }, "opensInANewWindow": { "message": "Si apre in una nuova finestra" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Identificatore SSO dell'organizzazione obbligatorio." }, + "creatingAccountOn": { + "message": "Creazione account su" + }, + "checkYourEmail": { + "message": "Controlli la tua email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Segui il link nell'email inviata a" + }, + "andContinueCreatingYourAccount": { + "message": "e continua a creare il tuo account." + }, + "noEmail": { + "message": "Nessuna email?" + }, + "goBack": { + "message": "Torna indietro" + }, + "toEditYourEmailAddress": { + "message": "per modificare il tuo indirizzo email." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Accesso negato. Non hai i permessi necessari per visualizzare questa pagina." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Dispositivo fidato" }, + "sendsNoItemsTitle": { + "message": "Nessun Send attivo", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Utilizza un Send per condividere in modo sicuro le informazioni con qualsiasi utente.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input obbligatorio." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 campo richiede tua attenzione." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ campi richiedono la tua attenzione.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Seleziona --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Comprimi/espandi", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Importare i tuoi dati su Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Proteggere i tuoi dati LastPass e importarli su Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Salva come file non crittografato", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importa su Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importazione in corso...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Dati importati!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Errore durante l'importazione. Controlla la console per i dettagli.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Errore di connessione durante l'importazione.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Dominio alias" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Gli elementi che richiedono di inserire di nuovo la password principale non possono essere riempiti automaticamente al caricamento della pagina.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Riempimento automatico al caricamento della pagina impostato con l'impostazione predefinita.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Disattiva l'inserimento della password principale di nuovo per modificare questo campo", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Attiva/Disattiva navigazione laterale" + }, + "skipToContent": { + "message": "Vai al contenuto" + }, + "bitwardenOverlayButton": { + "message": "Pulsante del menu di riempimento automatico di Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Attiva/disattiva il menu di riempimento automatico di Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Menu di riempimento automatico di Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Sblocca il tuo account per visualizzare i login corrispondenti", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Sblocca il tuo account per visualizzare i suggerimenti di riempimento automatico", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Sblocca account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Sblocca il tuo account, apri in una nuova finestra", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Riempi le credenziali per", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Nome utente parziale", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Nessun elemento trovato", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nuovo elemento", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Aggiungi un nuovo elemento alla cassaforte", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Nuovo login", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Aggiungi un nuovo elemento \"login\" alla cassaforte, apri in una nuova finestra", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Nuova carta", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Aggiungi un nuovo elemento \"carta\" alla cassaforte, apri in una nuova finestra", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Nuova identità", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Aggiungi un nuovo elemento \"identità\" alla cassaforte, apri in una nuova finestra", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Il menu di riempimento automatico di Bitwarden è disponibile. Premi il tasto freccia giÚ per selezionare.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Attiva" + }, + "ignore": { + "message": "Ignora" + }, + "importData": { + "message": "Importa dati", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Errore di importazione" + }, + "importErrorDesc": { + "message": "Si è verificato un problema con i dati che hai provato a importare. Risolvi questi errori nel file e riprova." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Correggi gli errori qui sotto e riprova." + }, + "description": { + "message": "Descrizione" + }, + "importSuccess": { + "message": "Dati importati" + }, + "importSuccessNumberOfItems": { + "message": "$AMOUNT$ elementi sono stati importati.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Riprova" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verifica necessaria per questa azione. Imposta un PIN per continuare." + }, + "setPin": { + "message": "Imposta PIN" + }, + "verifyWithBiometrics": { + "message": "Verifica con i dati biometrici" + }, + "awaitingConfirmation": { + "message": "In attesa di conferma" + }, + "couldNotCompleteBiometrics": { + "message": "Impossibile completare i dati biometrici." + }, + "needADifferentMethod": { + "message": "Usa un altro metodo?" + }, + "useMasterPassword": { + "message": "Usa password principale" + }, + "usePin": { + "message": "Usa PIN" + }, + "useBiometrics": { + "message": "Usa dati biometrici" + }, + "enterVerificationCodeSentToEmail": { + "message": "Inserisci il codice di verifica che è stato inviato alla tua email." + }, + "resendCode": { + "message": "Invia codice di nuovo" + }, + "total": { + "message": "Totale" + }, + "importWarning": { + "message": "Stai importando dati in $ORGANIZATION$. I tuoi dati potrebbero essere condivisi con i membri di questa organizzazione. Vuoi procedere?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Errore di connessione con il servizio Duo. Utilizza un metodo di login in due passaggi diverso o contatta Duo per assistenza." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Avvia DUO e segui i passaggi per finire di accedere." + }, + "duoRequiredForAccount": { + "message": "Per il tuo account è richiesta la verifica in due passaggi DUO." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Apri l'estensione in un popup per completare l'accesso." + }, + "popoutExtension": { + "message": "Estrai estensione" + }, + "launchDuo": { + "message": "Avvia DUO" + }, + "importFormatError": { + "message": "I dati non sono formattati correttamente. Controlla il file di importazione e riprova." + }, + "importNothingError": { + "message": "Non è stato importato niente." + }, + "importEncKeyError": { + "message": "Errore durante la decrittografia del file esportato. La chiave di crittografia non corrisponde alla chiave di crittografia usata per esportare i dati." + }, + "invalidFilePassword": { + "message": "Password errata, usa la password che hai inserito alla creazione del file di esportazione." + }, + "destination": { + "message": "Destinazione" + }, + "learnAboutImportOptions": { + "message": "Ulteriori informazioni sulle tue opzioni di importazione" + }, + "selectImportFolder": { + "message": "Seleziona una cartella" + }, + "selectImportCollection": { + "message": "Seleziona una raccolta" + }, + "importTargetHint": { + "message": "Seleziona questa opzione se vuoi che i contenuti del file di importazione siano spostati in una $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Il file contiene elementi non assegnati." + }, + "selectFormat": { + "message": "Seleziona il formato del file da importare" + }, + "selectImportFile": { + "message": "Seleziona il file da importare" + }, + "chooseFile": { + "message": "Seleziona file" + }, + "noFileChosen": { + "message": "Nessun file selezionato" + }, + "orCopyPasteFileContents": { + "message": "oppure copia e incolla il contenuto del file da importare" + }, + "instructionsFor": { + "message": "Istruzioni per $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Conferma importazione della cassaforte" + }, + "confirmVaultImportDesc": { + "message": "Questo file è protetto da password. Inserisci la password del file per importare i dati." + }, + "confirmFilePassword": { + "message": "Conferma password del file" + }, + "exportSuccess": { + "message": "Dati della cassaforte esportati" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "La passkey non sarà copiata" + }, + "passkeyNotCopiedAlert": { + "message": "La passkey non sarà copiata nell'elemento clonato. Vuoi continuare a clonare questo elemento?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verifica richiesta dal sito web. Questa funzionalità non è ancora implementata per gli account senza password principale." + }, + "logInWithPasskeyQuestion": { + "message": "Accedi con passkey?" + }, + "passkeyAlreadyExists": { + "message": "Esiste già una passkey per questa applicazione." + }, + "noPasskeysFoundForThisApplication": { + "message": "Nessuna passkey trovata per questa applicazione." + }, + "noMatchingPasskeyLogin": { + "message": "Non hai un elemento corrispondente per questo sito." + }, + "noMatchingLoginsForSite": { + "message": "Nessun login corrispondente per questo sito" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Conferma" + }, + "savePasskey": { + "message": "Salva passkey" + }, + "savePasskeyNewLogin": { + "message": "Salva la passkey come nuovo elemento" + }, + "chooseCipherForPasskeySave": { + "message": "Scegli un elemento in cui salvare questa passkey" + }, + "chooseCipherForPasskeyAuth": { + "message": "Scegli una password con cui accedere" + }, + "passkeyItem": { + "message": "Passkey" + }, + "overwritePasskey": { + "message": "Sovrascrivi passkey?" + }, + "overwritePasskeyAlert": { + "message": "Questo elemento contiene già una passkey. Sei sicuro di voler sovrascrivere la passkey corrente?" + }, + "featureNotSupported": { + "message": "Funzionalità non ancora supportata" + }, + "yourPasskeyIsLocked": { + "message": "Autenticazione obbligatoria per usare una passkey. Verifica la tua identità per continuare." + }, + "multifactorAuthenticationCancelled": { + "message": "Verifica in due passaggi annullata" + }, + "noLastPassDataFound": { + "message": "Nessun dato di LastPass trovato" + }, + "incorrectUsernameOrPassword": { + "message": "Nome utente o password errati" + }, + "incorrectPassword": { + "message": "Password errata" + }, + "incorrectCode": { + "message": "Codice errato" + }, + "incorrectPin": { + "message": "PIN errato" + }, + "multifactorAuthenticationFailed": { + "message": "Verifica in due passaggi non riuscita" + }, + "includeSharedFolders": { + "message": "Includi cartelle condivise" + }, + "lastPassEmail": { + "message": "Email di LastPass" + }, + "importingYourAccount": { + "message": "Importazione del tuo account..." + }, + "lastPassMFARequired": { + "message": "Verifica in due passaggi di LastPass obbligatoria" + }, + "lastPassMFADesc": { + "message": "Inserisci il codice di verifica dalla tua app di autenticazione" + }, + "lastPassOOBDesc": { + "message": "Approva la richiesta di accesso nella tua app di autenticazione o inserisci un codice di accesso una tantum." + }, + "passcode": { + "message": "Codice di verifica" + }, + "lastPassMasterPassword": { + "message": "Password principale di LastPass" + }, + "lastPassAuthRequired": { + "message": "Autenticazione di LastPass obbligatoria" + }, + "awaitingSSO": { + "message": "In attesa di autenticazione SSO" + }, + "awaitingSSODesc": { + "message": "Continua ad accedere utilizzando le tue credenziali aziendali." + }, + "seeDetailedInstructions": { + "message": "Consulta le istruzioni dettagliate sul nostro sito di assistenza su", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importa direttamente da LastPass" + }, + "importFromCSV": { + "message": "Importa da CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Riprova o cerca un'email di LastPass per verificare la tua identità." + }, + "collection": { + "message": "Raccolta" + }, + "lastPassYubikeyDesc": { + "message": "Inserisci la tua YubiKey associata al tuo account LastPass nella porta USB del computer, poi premi il suo bottone." + }, + "switchAccount": { + "message": "Cambia account" + }, + "switchAccounts": { + "message": "Cambia account" + }, + "switchToAccount": { + "message": "Passa all'account" + }, + "activeAccount": { + "message": "Account attivo" + }, + "availableAccounts": { + "message": "Account disponibili" + }, + "accountLimitReached": { + "message": "Limite di account raggiunto. Esci da un account per aggiungerne un altro." + }, + "active": { + "message": "attivo" + }, + "locked": { + "message": "bloccato" + }, + "unlocked": { + "message": "sbloccato" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted in" + }, + "useDeviceOrHardwareKey": { + "message": "Usa il tuo dispositivo o la chiave hardware" + }, + "justOnce": { + "message": "Solo una volta" + }, + "alwaysForThisSite": { + "message": "Sempre per questo sito" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ aggiunto ai domini esclusi.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Formati comuni", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continua sulle impostazioni del browser?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continua sul centro assistenza?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Modifica le impostazioni di riempimento automatico e di gestione delle password del browser.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "È possibile visualizzare e impostare le scorciatoie per l'estensione nelle impostazioni del browser.", + "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": "Modifica le impostazioni di riempimento automatico e di gestione delle password del browser.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "È possibile visualizzare e impostare le scorciatoie per l'estensione nelle impostazioni del browser.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Rendere Bitwarden il tuo password manager predefinito?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Se questa opzione è disattivata potrebbe causare conflitti tra il menu di riempimento automatico di Bitwarden e quello del tuo browser.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Rendi Bitwarden il tuo password manager predefinito", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Impossibile impostare Bitwarden come password manager predefinito", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Concedi le autorizzazioni sulla privacy del browser a Bitwarden per impostarlo come password manager predefinito.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Rendi predefinito", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credenziali salvate!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password salvata!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credenziali aggiornate!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password aggiornata!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Errore durante il salvataggio delle credenziali. Controlla la console per piÚ dettagli.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Successo" + }, + "removePasskey": { + "message": "Rimuovi passkey" + }, + "passkeyRemoved": { + "message": "Passkey rimossa" + }, + "autofillSuggestions": { + "message": "Suggerimenti per il riempimento automatico" + }, + "autofillSuggestionsTip": { + "message": "Salva un elemento di accesso per questo sito da riempire automaticamente" + }, + "yourVaultIsEmpty": { + "message": "La tua cassaforte è vuota" + }, + "noItemsMatchSearch": { + "message": "Nessun risultato corrisponde alla tua ricerca" + }, + "clearFiltersOrTryAnother": { + "message": "Cancella i filtri o prova un altro termine di ricerca" + }, + "copyInfoTitle": { + "message": "Copia informazioni - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copia nota - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "PiÚ opzioni, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "PiÚ opzioni - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Visualizza elemento - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Riempi automaticamente - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Nessun valore da copiare" + }, + "assignToCollections": { + "message": "Assegna alle raccolte" + }, + "copyEmail": { + "message": "Copia email" + }, + "copyPhone": { + "message": "Copia telefono" + }, + "copyAddress": { + "message": "Copia indirizzo" + }, + "adminConsole": { + "message": "Console di amministrazione" + }, + "accountSecurity": { + "message": "Sicurezza dell'account" + }, + "notifications": { + "message": "Notifiche" + }, + "appearance": { + "message": "Aspetto" + }, + "errorAssigningTargetCollection": { + "message": "Errore nell'assegnazione della raccolta di destinazione." + }, + "errorAssigningTargetFolder": { + "message": "Errore nell'assegnazione della cartella di destinazione." + }, + "viewItemsIn": { + "message": "Visualizza gli elementi in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Torna a $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nuovo" + }, + "removeItem": { + "message": "Rimuovi $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Elementi senza cartella" + }, + "itemDetails": { + "message": "Dettagli elemento" + }, + "itemName": { + "message": "Nome elemento" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "L'organizzazione è disattivata" + }, + "owner": { + "message": "Proprietario" + }, + "selfOwnershipLabel": { + "message": "Tu", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Non puoi accedere agli elementi nelle organizzazioni disattivate. Contatta il proprietario della tua organizzazione per ricevere assistenza." + }, + "additionalInformation": { + "message": "Informazioni aggiuntive" + }, + "itemHistory": { + "message": "Cronologia elemento" + }, + "lastEdited": { + "message": "Ultima modifica" + }, + "ownerYou": { + "message": "Proprietario: Tu" + }, + "linked": { + "message": "Collegato" + }, + "copySuccessful": { + "message": "Copia riuscita" + }, + "upload": { + "message": "Carica" + }, + "addAttachment": { + "message": "Aggiungi allegato" + }, + "maxFileSizeSansPunctuation": { + "message": "La dimensione massima del file è 500 MB" + }, + "deleteAttachmentName": { + "message": "Elimina allegato $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Scarica $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Sei sicuro di voler eliminare definitivamente questo allegato?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Le organizzazioni gratis non possono utilizzare gli allegati" + }, + "filters": { + "message": "Filtri" + }, + "personalDetails": { + "message": "Dati personali" + }, + "identification": { + "message": "Identificativo" + }, + "contactInfo": { + "message": "Info di contatto" + }, + "downloadAttachment": { + "message": "Scarica - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "il numero di carta termina con", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Credenziali di accesso" + }, + "authenticatorKey": { + "message": "Chiave di autenticazione" + }, + "autofillOptions": { + "message": "Opzioni di riempimento automatico" + }, + "websiteUri": { + "message": "Sito Web (URI)" + }, + "websiteUriCount": { + "message": "Sito Web (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Sito web aggiunto" + }, + "addWebsite": { + "message": "Aggiungi sito web" + }, + "deleteWebsite": { + "message": "Elimina sito web" + }, + "defaultLabel": { + "message": "Predefinito ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Mostra corrispondenza $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Nascondi corrispondenza $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Riempi automaticamente al caricamento della pagina?" + }, + "cardExpiredTitle": { + "message": "Carta scaduta" + }, + "cardExpiredMessage": { + "message": "Se hai rinnovato la carta, aggiorna le informazioni" + }, + "cardDetails": { + "message": "Dati della carta" + }, + "cardBrandDetails": { + "message": "Dati del $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Abilita animazioni" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Aggiungi account" + }, + "loading": { + "message": "Caricamento in corso..." + }, + "data": { + "message": "Dati" + }, + "passkeys": { + "message": "Passkey", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Password", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Accedi con passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assegna" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Solo i membri dell'organizzazione con accesso a queste raccolte saranno in grado di vedere l'elemento." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Solo i membri dell'organizzazione con accesso a queste raccolte saranno in grado di vedere gli elementi." + }, + "bulkCollectionAssignmentWarning": { + "message": "Hai selezionato $TOTAL_COUNT$ elementi. Non puoi aggiornare $READONLY_COUNT$ elementi perchÊ non hai l'autorizzazione per modificarli.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Aggiungi campo" + }, + "add": { + "message": "Aggiungi" + }, + "fieldType": { + "message": "Tipo campo" + }, + "fieldLabel": { + "message": "Etichetta campo" + }, + "textHelpText": { + "message": "Usa campi di testo per dati come domande di sicurezza" + }, + "hiddenHelpText": { + "message": "Usa i campi nascosti per dati sensibili come una password" + }, + "checkBoxHelpText": { + "message": "Usa le caselle di controllo se vuoi riempire automaticamente la casella di controllo di un modulo, come una email da ricordare" + }, + "linkedHelpText": { + "message": "Usa un campo collegato quando si verificano problemi di riempimento automatico per un sito web specifico." + }, + "linkedLabelHelpText": { + "message": "Inserisci l'id html del campo, il nome, l'aria-label o il segnaposto." + }, + "editField": { + "message": "Modifica campo" + }, + "editFieldLabel": { + "message": "Modifica $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Elimina $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ aggiunto", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Riordina $LABEL$. Utilizza i tasti freccia per spostare l'elemento sopra o sotto.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ spostato su, in posizione $INDEX$ di $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Seleziona le raccolte da assegnare" + }, + "personalItemTransferWarningSingular": { + "message": "1 elemento verrà trasferito definitivamente all'organizzazione selezionata. Non possiederai piÚ questo elemento." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ verranno trasferiti definitivamente all'organizzazione selezionata. Non possiederai piÚ questi elementi.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 elemento verrà trasferito definitivamente a $ORG$. Non possiederai piÚ questo elemento.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ verranno trasferiti definitivamente a $ORG$. Non possiederai piÚ questi elementi.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Raccolte assegnate con successo" + }, + "nothingSelected": { + "message": "Non hai selezionato nulla." + }, + "movedItemsToOrg": { + "message": "Elementi selezionati spostati in $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Elementi spostati su $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Elemento spostato su $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ spostato giÚ, in posizione $INDEX$ di $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Posizione elemento" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "Send File" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Send Testo" + }, + "bitwardenNewLook": { + "message": "Bitwarden ha un nuovo look!" + }, + "bitwardenNewLookDesc": { + "message": "È piÚ facile e intuitivo che mai utilizzare il riempimento automatico e cercare dalla scheda Cassaforte. Dai un'occhiata!" + }, + "accountActions": { + "message": "Azioni dell'account" + }, + "showNumberOfAutofillSuggestions": { + "message": "Mostra il numero di suggerimenti di riempimento automatico sull'icona dell'estensione" + }, + "systemDefault": { + "message": "Predefinito del sistema" + }, + "enterprisePolicyRequirementsApplied": { + "message": "I requisiti della policy aziendale sono stati applicati a questa impostazione" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File salvato sul dispositivo. Gestisci dai download del dispositivo." + }, + "showCharacterCount": { + "message": "Mostra conteggio caratteri" + }, + "hideCharacterCount": { + "message": "Nascondi conteggio caratteri" + }, + "itemsInTrash": { + "message": "Elementi nel cestino" + }, + "noItemsInTrash": { + "message": "Nessun elemento nel cestino" + }, + "noItemsInTrashDesc": { + "message": "Gli elementi cancellati appariranno qui e saranno eliminati definitivamente dopo 30 giorni" + }, + "trashWarning": { + "message": "Gli elementi nel cestino saranno eliminati automaticamente dopo 30 giorni" + }, + "restore": { + "message": "Ripristina" + }, + "deleteForever": { + "message": "Elimina definitivamente" + }, + "noEditPermissions": { + "message": "Non hai i permessi per modificare questo elemento" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index e02207a0051..6e9c58e2efe 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - į„Ąæ–™ãƒ‘ã‚šãƒ¯ãƒŧドマネãƒŧã‚¸ãƒŖãƒŧ", + "message": "Bitwarden パ゚ワãƒŧドマネãƒŧã‚¸ãƒŖãƒŧ", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden はあらゆるį̝æœĢでäŊŋえる、厉全ãĒį„Ąæ–™ãƒ‘ã‚šãƒ¯ãƒŧドマネãƒŧã‚¸ãƒŖãƒŧです。", - "description": "Extension description" + "message": "č‡ĒåŽ…ã€čˇå ´ã€ãžãŸã¯å¤–å‡ē先でも、Bitwarden はすずãĻぎパ゚ワãƒŧド、パ゚キãƒŧã€æŠŸå¯†æƒ…å ąã‚’į°Ąå˜ãĢäŋč­ˇã—ぞす。", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "厉全ãĒデãƒŧã‚ŋäŋįŽĄåēĢへã‚ĸクã‚ģ゚するためãĢãƒ­ã‚°ã‚¤ãƒŗãžãŸã¯ã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’äŊœæˆã—ãĻください。" }, + "inviteAccepted": { + "message": "招垅がæ‰ŋčĒã•ã‚Œãžã—ãŸ" + }, "createAccount": { "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽäŊœæˆ" }, - "login": { - "message": "ãƒ­ã‚°ã‚¤ãƒŗ" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "åŧˇåŠ›ãĒパ゚ワãƒŧãƒ‰ã‚’č¨­åŽšã™ã‚‹" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "パ゚ワãƒŧãƒ‰ã‚’č¨­åŽšã—ãĻã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽäŊœæˆã‚’åތäē†ã—ãĻください" }, "enterpriseSingleSignOn": { "message": "įĩ„įš”ãŽã‚ˇãƒŗã‚°ãƒĢã‚ĩã‚¤ãƒŗã‚Ēãƒŗ" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧãƒ‰ãŽãƒ’ãƒŗãƒˆã¯ã€ãƒ‘ã‚šãƒ¯ãƒŧドをåŋ˜ã‚ŒãŸå ´åˆãĢåŊšįĢ‹ãĄãžã™ã€‚" }, + "masterPassHintText": { + "message": "パ゚ワãƒŧドをåŋ˜ã‚ŒãŸå ´åˆã€ãƒ‘゚ワãƒŧãƒ‰ãŽãƒ’ãƒŗãƒˆã‚’ãƒĄãƒŧãƒĢãĢ送äŋĄã§ããžã™ã€‚ 最大文字数īŧš$CURRENT$/$MAXIMUM$", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "新しいパ゚ワãƒŧドを再å…Ĩ力" }, "masterPassHint": { "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧãƒ‰ãŽãƒ’ãƒŗãƒˆ (ᜁį•Ĩ可čƒŊ)" }, + "joinOrganization": { + "message": "įĩ„įš”ãĢ参加" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧãƒ‰ã‚’č¨­åŽšã—ãĻ、こぎįĩ„įš”ã¸ãŽå‚åŠ ã‚’åތäē†ã—ぞす。" + }, "tab": { "message": "ã‚ŋブ" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "パ゚ワãƒŧãƒ‰ã‚’ã‚ŗãƒ”ãƒŧ" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "ãƒĄãƒĸã‚’ã‚ŗãƒ”ãƒŧ" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "ã‚ģキãƒĨãƒĒãƒ†ã‚Ŗã‚ŗãƒŧãƒ‰ã‚’ã‚ŗãƒ”ãƒŧ" }, + "copyName": { + "message": "åå‰ã‚’ã‚ŗãƒ”ãƒŧ" + }, + "copyCompany": { + "message": "äŧšį¤žåã‚’ã‚ŗãƒ”ãƒŧ" + }, + "copySSN": { + "message": "į¤žäŧšäŋéšœį•Ēåˇã‚’ã‚ŗãƒ”ãƒŧ" + }, + "copyPassportNumber": { + "message": "パ゚ポãƒŧトį•Ēåˇã‚’ã‚ŗãƒ”ãƒŧ" + }, + "copyLicenseNumber": { + "message": "å…č¨ąč¨ŧį•Ēåˇã‚’ã‚ŗãƒ”ãƒŧ" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "$FIELD$ ã‚’ã‚ŗãƒ”ãƒŧ", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "ã‚Ļェブã‚ĩã‚¤ãƒˆã‚’ã‚ŗãƒ”ãƒŧ" + }, + "copyNotes": { + "message": "ãƒĄãƒĸã‚’ã‚ŗãƒ”ãƒŧ" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "č‡Ē動å…Ĩ力" }, + "autoFillLogin": { + "message": "č‡Ē動å…ĨåŠ›ãƒ­ã‚°ã‚¤ãƒŗ" + }, + "autoFillCard": { + "message": "č‡Ē動å…Ĩ力ã‚Ģãƒŧド" + }, + "autoFillIdentity": { + "message": "č‡Ē動å…Ĩ力 ID" + }, "generatePasswordCopied": { "message": "パ゚ワãƒŧãƒ‰ã‚’į”Ÿæˆ (ã‚ŗãƒ”ãƒŧ)" }, @@ -98,7 +199,22 @@ "message": "ã‚Ģ゚ã‚ŋãƒ ãƒ•ã‚ŖãƒŧãƒĢãƒ‰åã‚’ã‚ŗãƒ”ãƒŧ" }, "noMatchingLogins": { - "message": "ä¸€č‡´ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗãŒã‚ã‚Šãžã›ã‚“ã€‚" + "message": "ä¸€č‡´ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗčĒč¨ŧæƒ…å ąãŒã‚ã‚Šãžã›ã‚“ã€‚" + }, + "noCards": { + "message": "ã‚ĢãƒŧドãĒし" + }, + "noIdentities": { + "message": "ID ãĒし" + }, + "addLoginMenu": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’čŋŊ加" + }, + "addCardMenu": { + "message": "ã‚ĢãƒŧドをčŋŊ加" + }, + "addIdentityMenu": { + "message": "ID をčŋŊ加" }, "unlockVaultMenu": { "message": "äŋįŽĄåēĢãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤" @@ -107,7 +223,7 @@ "message": "äŋįŽĄåēĢãĢãƒ­ã‚°ã‚¤ãƒŗ" }, "autoFillInfo": { - "message": "įžåœ¨ãŽãƒ–ãƒŠã‚Ļã‚ļã‚ŋブãĢč‡Ē動å…ĨåŠ›ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã¯ã‚ã‚Šãžã›ã‚“ã€‚" + "message": "įžåœ¨ãŽãƒ–ãƒŠã‚Ļã‚ļã‚ŋブãĢč‡Ē動å…ĨåŠ›ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗã¯ã‚ã‚Šãžã›ã‚“ã€‚" }, "addLogin": { "message": "ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’čŋŊ加" @@ -115,6 +231,18 @@ "addItem": { "message": "ã‚ĸイテムぎčŋŊ加" }, + "accountEmail": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚" + }, + "requestHint": { + "message": "ãƒ’ãƒŗãƒˆã‚’čĻæą‚" + }, + "requestPasswordHint": { + "message": "パ゚ワãƒŧãƒ‰ãŽãƒ’ãƒŗãƒˆã‚’čĻæą‚ã™ã‚‹" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚をå…Ĩ力すると、パ゚ワãƒŧãƒ‰ãŽãƒ’ãƒŗãƒˆãŒé€äŋĄã•れぞす" + }, "passwordHint": { "message": "パ゚ワãƒŧãƒ‰ãŽãƒ’ãƒŗãƒˆ" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "įļščĄŒã™ã‚‹ãĢはæœŦäēēįĸēčĒã‚’čĄŒãŖãĻください。" }, - "account": { - "message": "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆ" - }, "changeMasterPassword": { "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧドぎ変更" }, + "continueToWebApp": { + "message": "ã‚Ļェブã‚ĸプãƒĒãĢ進ãŋぞすか?" + }, + "continueToWebAppDesc": { + "message": "Bitwarden ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽæŠŸčƒŊをã‚Ļェブã‚ĸプãƒĒでごįĸēčĒãã ã•ã„ã€‚" + }, + "continueToHelpCenter": { + "message": "ヘãƒĢプã‚ģãƒŗã‚ŋãƒŧãĢ進ãŋぞすか?" + }, + "continueToHelpCenterDesc": { + "message": "Bitwarden ぎヘãƒĢプã‚ģãƒŗã‚ŋãƒŧでäŊŋį”¨æ–šæŗ•ãŽčŠŗį´°ã‚’ã”čĻ§ãã ã•ã„ã€‚" + }, + "continueToBrowserExtensionStore": { + "message": "ブナã‚Ļã‚ļãŽæ‹Ąåŧĩ抟čƒŊ゚トã‚ĸãĢ進ãŋぞすかīŧŸ" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Bitwarden をäģ–ぎãƒĻãƒŧã‚ļãƒŧãĢもおすすめしぞしょう。ブナã‚Ļã‚ļãƒŧãŽæ‹Ąåŧĩ抟čƒŊ゚トã‚ĸãĢã‚ĸクã‚ģ゚しãĻ、ãƒŦビãƒĨãƒŧをしãĻください。" + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Bitwarden ã‚Ļェブã‚ĸプãƒĒでマ゚ã‚ŋãƒŧパ゚ワãƒŧドを変更できぞす。" + }, "fingerprintPhrase": { "message": "パ゚フãƒŦãƒŧã‚ē", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ログã‚ĸã‚Ļト" }, + "aboutBitwarden": { + "message": "Bitwarden ãĢついãĻ" + }, "about": { "message": "ã‚ĸプãƒĒãĢついãĻ" }, + "moreFromBitwarden": { + "message": "Bitwarden ãŽčŠŗį´°" + }, + "continueToBitwardenDotCom": { + "message": "bitwarden.com ãĢ進ãŋぞすかīŧŸ" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator ではčĒč¨ŧキãƒŧをäŋå­˜ã—、2æŽĩ階čĒč¨ŧフロãƒŧį”¨ãŽ TOTP ã‚ŗãƒŧãƒ‰ã‚’į”Ÿæˆã§ããžã™ã€‚čŠŗį´°ã¯ bitwarden.com ã‚Ļェブã‚ĩイトをごčĻ§ãã ã•ã„ã€‚" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden ã‚ˇãƒŧクãƒŦットマネãƒŧã‚¸ãƒŖãƒŧ" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bitwarden ã‚ˇãƒŧクãƒŦットマネãƒŧã‚¸ãƒŖãƒŧで開į™ēč€…å‘ã‘ã‚ˇãƒŧクãƒŦットを厉全ãĢäŋįŽĄã€įŽĄį†ã€å…ąæœ‰ã§ããžã™ã€‚čŠŗį´°ã¯ bitwarden.com ã‚Ļェブã‚ĩイトをごčĻ§ãã ã•ã„ã€‚" + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Passwordless.dev で゚ムãƒŧã‚ēで厉全ãĒãƒ­ã‚°ã‚¤ãƒŗäŊ“é¨“ã‚’į„Ąæ–™ã§æäž›ã—ãžã™ã€‚bitwarden.com ぎã‚Ļェブã‚ĩã‚¤ãƒˆã§čŠŗį´°ã‚’ã”čĻ§ãã ã•ã„ã€‚" + }, + "freeBitwardenFamilies": { + "message": "į„Ąæ–™ Bitwarden ãƒ•ã‚ĄãƒŸãƒĒãƒŧ" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "į„Ąæ–™ Bitwarden ãƒ•ã‚ĄãƒŸãƒĒãƒŧį‰šå…¸ã‚’å—ã‘å–ã‚‹čŗ‡æ ŧがありぞす。ã‚Ļェブã‚ĸプãƒĒで受け取りできぞす。" + }, "version": { "message": "バãƒŧã‚¸ãƒ§ãƒŗ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "フりãƒĢダãƒŧã‚’įˇ¨é›†" }, + "newFolder": { + "message": "新しいフりãƒĢダãƒŧ" + }, + "folderName": { + "message": "フりãƒĢダãƒŧ名" + }, + "folderHintText": { + "message": "čĻĒフりãƒĢダãƒŧぎ名前ぎ垌ãĢ「/」をčŋŊ加するとフりãƒĢダをネ゚トしぞす。䞋: ã‚Ŋãƒŧã‚ˇãƒŖãƒĢ/フりãƒŧナム" + }, + "noFoldersAdded": { + "message": "フりãƒĢダãƒŧがčŋŊ加されãĻいぞせん" + }, + "createFoldersToOrganize": { + "message": "äŋįŽĄåēĢぎã‚ĸã‚¤ãƒ†ãƒ ã‚’æ•´į†ã™ã‚‹ãƒ•ã‚ŠãƒĢダãƒŧをäŊœæˆã—ぞす" + }, + "deleteFolderPermanently": { + "message": "こぎフりãƒĢダãƒŧを厌全ãĢ削除しぞすかīŧŸ" + }, "deleteFolder": { "message": "フりãƒĢダãƒŧを削除" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ãƒ‘ã‚šį”Ÿæˆ", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ãƒ­ã‚°ã‚¤ãƒŗãŽãŸã‚ãĢåŧˇå›ēãĒãƒĻニãƒŧクパ゚ワãƒŧドをč‡Ēå‹•įš„ãĢį”Ÿæˆã—ãžã™ã€‚" }, - "bitWebVault": { - "message": "Bitwarden ã‚ĻェブäŋįŽĄåēĢ" + "bitWebVaultApp": { + "message": "Bitwarden ã‚Ļェブã‚ĸプãƒĒ" }, "importItems": { "message": "ã‚ĸã‚¤ãƒ†ãƒ ãŽã‚¤ãƒŗãƒãƒŧト" @@ -235,6 +435,9 @@ "generatePassword": { "message": "パ゚ワãƒŧドぎč‡Ēå‹•į”Ÿæˆ" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "パ゚ワãƒŧãƒ‰ãŽå†į”Ÿæˆ" }, @@ -244,17 +447,60 @@ "length": { "message": "é•ˇã•" }, + "passwordMinLength": { + "message": "パ゚ワãƒŧドぎ最äŊŽæ–‡å­—æ•°" + }, "uppercase": { - "message": "大文字īŧˆA-Zīŧ‰" + "message": "大文字īŧˆA-Zīŧ‰", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "小文字īŧˆa-zīŧ‰" + "message": "小文字īŧˆa-zīŧ‰", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "数字 (0īŊž9)" + "message": "数字 (0īŊž9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "į‰šæŽŠæ–‡å­—īŧˆ!@#$%^&*)" + "message": "į‰šæŽŠæ–‡å­—īŧˆ!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "åĢむ文字", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "大文字をåĢめる", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "AīŊžZ", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "小文字をåĢめる", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "数字をåĢめる", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0īŊž9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "į‰šæŽŠč¨˜åˇã‚’åĢめる", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "単čĒžæ•°" @@ -276,7 +522,16 @@ "message": "č¨˜åˇãŽæœ€å°æ•°" }, "avoidAmbChar": { - "message": "あいぞいãĒæ–‡å­—ã‚’įœã" + "message": "あいぞいãĒæ–‡å­—ã‚’įœã", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "あいぞいãĒ文字をéŋける", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "į”Ÿæˆã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢã‚¨ãƒŗã‚ŋãƒŧプナイã‚ēポãƒĒã‚ˇãƒŧčρäģļã‚’éŠį”¨ã—ãžã—ãŸ", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "äŋįŽĄåēĢを検į´ĸ" @@ -299,15 +554,30 @@ "password": { "message": "パ゚ワãƒŧド" }, + "totp": { + "message": "čĒč¨ŧã‚ˇãƒŧクãƒŦット" + }, "passphrase": { "message": "パ゚フãƒŦãƒŧã‚ē" }, "favorite": { "message": "お気ãĢå…Ĩり" }, + "unfavorite": { + "message": "お気ãĢå…Ĩã‚Šč§Ŗé™¤" + }, + "itemAddedToFavorites": { + "message": "ã‚ĸイテムをお気ãĢå…ĨりãĢčŋŊ加しぞした" + }, + "itemRemovedFromFavorites": { + "message": "ã‚ĸイテムをお気ãĢå…Ĩりから削除しぞした" + }, "notes": { "message": "ãƒĄãƒĸ" }, + "privateNote": { + "message": "非å…Ŧé–‹ãƒĄãƒĸ" + }, "note": { "message": "ãƒĄãƒĸ" }, @@ -326,6 +596,18 @@ "launch": { "message": "開く" }, + "launchWebsite": { + "message": "ã‚Ļェブã‚ĩイトを開く" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ã‚Ļェブã‚ĩイト" }, @@ -338,9 +620,24 @@ "other": { "message": "そぎäģ–" }, + "unlockMethods": { + "message": "ãƒ­ãƒƒã‚¯č§Ŗé™¤ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "äŋįŽĄåēĢぎã‚ŋイムã‚ĸã‚Ļト動äŊœã‚’変更するãĢã¯ã€ãƒ­ãƒƒã‚¯č§Ŗé™¤æ–šæŗ•ã‚’č¨­åŽšã—ãĻください。" }, + "unlockMethodNeeded": { + "message": "č¨­åŽšã§ãƒ­ãƒƒã‚¯č§Ŗé™¤æ–šæŗ•ã‚’ã‚ģットã‚ĸップ" + }, + "sessionTimeoutHeader": { + "message": "ã‚ģãƒƒã‚ˇãƒ§ãƒŗã‚ŋイムã‚ĸã‚Ļト" + }, + "vaultTimeoutHeader": { + "message": "äŋįŽĄåēĢぎã‚ŋイムã‚ĸã‚Ļト" + }, + "otherOptions": { + "message": "そぎäģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ" + }, "rateExtension": { "message": "æ‹Ąåŧĩ抟čƒŊãŽčŠ•äžĄ" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "äŋįŽĄåēĢがロックされãĻいぞす。įļščĄŒã™ã‚‹ãĢはæœŦäēēįĸēčĒã‚’čĄŒãŖãĻください。" }, + "yourVaultIsLockedV2": { + "message": "äŋįŽĄåēĢがロックされãĻいぞす" + }, + "yourAccountIsLocked": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŒãƒ­ãƒƒã‚¯ã•ã‚ŒãĻいぞす" + }, + "or": { + "message": "ぞたは" + }, "unlock": { "message": "ãƒ­ãƒƒã‚¯č§Ŗé™¤" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "äŋįŽĄåēĢぎã‚ŋイムã‚ĸã‚Ļト" }, + "vaultTimeout1": { + "message": "ã‚ŋイムã‚ĸã‚Ļト" + }, "lockNow": { "message": "äģŠã™ããƒ­ãƒƒã‚¯" }, + "lockAll": { + "message": "すずãĻロック" + }, "immediately": { "message": "すぐãĢ" }, @@ -426,6 +738,18 @@ "security": { "message": "ã‚ģキãƒĨãƒĒãƒ†ã‚Ŗ" }, + "confirmMasterPassword": { + "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧドぎįĸēčĒ" + }, + "masterPassword": { + "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧド" + }, + "masterPassImportant": { + "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧドをåŋ˜ã‚ŒãŸå ´åˆã¯åžŠå…ƒã§ããžã›ã‚“īŧ" + }, + "masterPassHintLabel": { + "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧãƒ‰ãŽãƒ’ãƒŗãƒˆ" + }, "errorOccurred": { "message": "エナãƒŧがį™ēį”Ÿã—ãžã—ãŸ" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "新しいã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’äŊœæˆã—ぞしたīŧäģŠã™ããƒ­ã‚°ã‚¤ãƒŗã§ããžã™ã€‚" }, + "newAccountCreated2": { + "message": "新しいã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’äŊœæˆã—ぞしたīŧ" + }, + "youHaveBeenLoggedIn": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗã—ãžã—ãŸīŧ" + }, + "youSuccessfullyLoggedIn": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗãĢ成功しぞした" + }, + "youMayCloseThisWindow": { + "message": "ã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļを閉じãĻ大丈å¤Ģです" + }, "masterPassSent": { "message": "あãĒたぎマ゚ã‚ŋãƒŧパ゚ワãƒŧãƒ‰ãŽãƒ’ãƒŗãƒˆã‚’č¨˜čŧ‰ã—ãŸãƒĄãƒŧãƒĢを送äŋĄã—ぞした。" }, "verificationCodeRequired": { "message": "čĒč¨ŧã‚ŗãƒŧドはåŋ…é ˆé …į›Žã§ã™ã€‚" }, + "webauthnCancelOrTimeout": { + "message": "čĒč¨ŧãŒã‚­ãƒŖãƒŗã‚ģãƒĢされたか、時間がかかりすぎぞした。もう一åēĻã‚„ã‚Šį›´ã—ãĻください。" + }, "invalidVerificationCode": { "message": "čĒč¨ŧã‚ŗãƒŧãƒ‰ãŒé–“é•ãŖãĻいぞす" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "選択したã‚ĸイテムをこぎペãƒŧジでč‡Ē動å…ĨåŠ›ã§ããžã›ã‚“ã§ã—ãŸã€‚ã‚ŗãƒ”ãƒŧしãĻč˛ŧりäģ˜ã‘ãĻください。" }, + "totpCaptureError": { + "message": "įžåœ¨ãŽã‚Ļェブペãƒŧジから QR ã‚ŗãƒŧãƒ‰ã‚’ã‚šã‚­ãƒŖãƒŗã§ããžã›ã‚“" + }, + "totpCaptureSuccess": { + "message": "čĒč¨ŧキãƒŧをčŋŊ加しぞした" + }, + "totpCapture": { + "message": "įžåœ¨ãŽã‚ĻェブペãƒŧジからčĒč¨ŧ QR ã‚ŗãƒŧãƒ‰ã‚’ã‚šã‚­ãƒŖãƒŗã™ã‚‹" + }, + "totpHelperTitle": { + "message": "2æŽĩ階čĒč¨ŧã‚’ã‚ˇãƒŧムãƒŦ゚ãĢする" + }, + "totpHelper": { + "message": "Bitwarden は2æŽĩ階čĒč¨ŧã‚ŗãƒŧドをäŋå­˜ãƒģå…Ĩ力できぞす。こぎæŦ„ãĢキãƒŧã‚’ã‚ŗãƒ”ãƒŧしãĻč˛ŧりäģ˜ã‘ãĻください。" + }, + "totpHelperWithCapture": { + "message": "Bitwarden は2æŽĩ階čĒč¨ŧã‚ŗãƒŧドをäŋå­˜ãƒģå…Ĩ力できぞす。 ã‚ĢãƒĄãƒŠã‚ĸã‚¤ã‚ŗãƒŗã‚’é¸æŠžã—ãĻ、こぎã‚Ļェブã‚ĩイトぎčĒč¨ŧ QR ã‚ŗãƒŧドぎ゚クãƒĒãƒŧãƒŗã‚ˇãƒ§ãƒƒãƒˆã‚’æ’Žã‚‹ã‹ã€ã‚­ãƒŧã‚’ã‚ŗãƒ”ãƒŧしãĻã“ãŽãƒ•ã‚ŖãƒŧãƒĢドãĢč˛ŧりäģ˜ã‘ãĻください。" + }, + "learnMoreAboutAuthenticators": { + "message": "čĒč¨ŧæ–šæŗ•ãŽčŠŗį´°" + }, + "copyTOTP": { + "message": "čĒč¨ŧキãƒŧãŽã‚ŗãƒ”ãƒŧ (TOTP)" + }, "loggedOut": { "message": "ログã‚ĸã‚Ļトしぞした" }, + "loggedOutDesc": { + "message": "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‹ã‚‰ãƒ­ã‚°ã‚ĸã‚Ļトしぞした。" + }, "loginExpired": { "message": "ãƒ­ã‚°ã‚¤ãƒŗã‚ģãƒƒã‚ˇãƒ§ãƒŗãŽæœ‰åŠšæœŸé™ãŒåˆ‡ã‚ŒãĻいぞす。" }, + "logIn": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗ" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "į™ģéŒ˛ã‚’å†åēĻ始める" + }, + "expiredLink": { + "message": "期限切れぎãƒĒãƒŗã‚¯" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "į™ģéŒ˛ã‚’å†åēĻå§‹ã‚ã‚‹ã‹ã€ãƒ­ã‚°ã‚¤ãƒŗã—ãĻください。" + }, + "youMayAlreadyHaveAnAccount": { + "message": "すでãĢã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’æŒãŖãĻいる可čƒŊ性がありぞす" + }, "logOutConfirmation": { "message": "ログã‚ĸã‚ĻトしãĻもよろしいですかīŧŸ" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "フりãƒĢダをčŋŊ加しぞした" }, - "changeMasterPass": { - "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧドぎ変更" - }, - "changeMasterPasswordConfirmation": { - "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧドは bitwarden.com ã‚ĻェブäŋįŽĄåēĢで変更できぞす。ã‚Ļェブã‚ĩイトを開きぞすかīŧŸ" - }, "twoStepLoginConfirmation": { "message": "2æŽĩ階čĒč¨ŧをäŊŋã†ã¨ã€ãƒ­ã‚°ã‚¤ãƒŗæ™‚ãĢã‚ģキãƒĨãƒĒãƒ†ã‚Ŗã‚­ãƒŧやčĒč¨ŧã‚ĸプãƒĒ、SMS、é›ģčŠąã‚„ãƒĄãƒŧãƒĢでぎčĒč¨ŧをåŋ…čρãĢすることでã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’ã•ã‚‰ãĢ厉全ãĢå‡ēæĨぞす。2æŽĩ階čĒč¨ŧは bitwarden.com ã‚ĻェブäŋįŽĄåēĢで有劚化できぞす。ã‚Ļェブã‚ĩイトを開きぞすかīŧŸ" }, + "twoStepLoginConfirmationContent": { + "message": "Bitwarden ã‚Ļェブã‚ĸプãƒĒで2æŽĩ階čĒč¨ŧã‚’č¨­åŽšã™ã‚‹ã¨ã€ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŒã‚ˆã‚ŠåŽ‰å…¨ãĢãĒりぞす。" + }, + "twoStepLoginConfirmationTitle": { + "message": "ã‚Ļェブã‚ĸプãƒĒãĢ進ãŋぞすかīŧŸ" + }, "editedFolder": { "message": "フりãƒĢダãƒŧã‚’įˇ¨é›†ã—ãžã—ãŸ" }, @@ -552,6 +936,10 @@ "newUri": { "message": "新しい URI" }, + "addDomain": { + "message": "ãƒ‰ãƒĄã‚¤ãƒŗãŽčŋŊ加", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "čŋŊ加されたã‚ĸイテム" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąãŽčŋŊ加を尋ねる" }, + "vaultSaveOptionsTitle": { + "message": "äŋįŽĄåēĢぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢäŋå­˜" + }, "addLoginNotificationDesc": { "message": "初めãĻãƒ­ã‚°ã‚¤ãƒŗã—ãŸã¨ãäŋįŽĄåēĢãĢãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ã‚ˆã†ã€Œãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’čŋŊ加」通įŸĨをč‡Ēå‹•įš„ãĢ襨į¤ēしぞす。" }, + "addLoginNotificationDescAlt": { + "message": "äŋįŽĄåēĢãĢã‚ĸイテムがčĻ‹ã¤ã‹ã‚‰ãĒい場合は、ã‚ĸイテムをčŋŊ加するようčĻæą‚ã—ãžã™ã€‚ãƒ­ã‚°ã‚¤ãƒŗã—ãĻいるすずãĻぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢéŠį”¨ã•ã‚Œãžã™ã€‚" + }, + "showCardsInVaultView": { + "message": "äŋįŽĄåēĢビãƒĨãƒŧãĢč‡Ē動å…ĨåŠ›ãŽå€™čŖœã¨ã—ãĻã‚Ģãƒŧãƒ‰ã‚’čĄ¨į¤ēする" + }, "showCardsCurrentTab": { "message": "ã‚ŋブペãƒŧジãĢã‚Ģãƒŧãƒ‰ã‚’čĄ¨į¤ē" }, "showCardsCurrentTabDesc": { "message": "č‡Ē動å…ĨåŠ›ã‚’į°Ąå˜ãĢするためãĢ、ã‚ŋブペãƒŧジãĢã‚Ģãƒŧドã‚ĸã‚¤ãƒ†ãƒ ã‚’čĄ¨į¤ēしぞす" }, + "showIdentitiesInVaultView": { + "message": "äŋįŽĄåēĢビãƒĨãƒŧãĢč‡Ē動å…ĨåŠ›ãŽå€™čŖœã¨ã—ãĻ ID ã‚’čĄ¨į¤ēする" + }, "showIdentitiesCurrentTab": { "message": "ã‚ŋブペãƒŧジãĢ ID ã‚’čĄ¨į¤ē" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "ã‚Ļェブã‚ĩã‚¤ãƒˆã§å¤‰æ›´ãŒã‚ãŖãŸã¨ãã€ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąãŽãƒ‘ã‚šãƒ¯ãƒŧドを更新するか尋ねぞす" }, + "changedPasswordNotificationDescAlt": { + "message": "ã‚Ļェブã‚ĩイトで変更が検å‡ēã•ã‚ŒãŸå ´åˆã€ãƒ­ã‚°ã‚¤ãƒŗãƒ‘ã‚šãƒ¯ãƒŧドを更新するようãĢæą‚ã‚ãžã™ã€‚ãƒ­ã‚°ã‚¤ãƒŗã—ãĻいるすずãĻぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢéŠį”¨ã•ã‚Œãžã™ã€‚" + }, + "enableUsePasskeys": { + "message": "パ゚キãƒŧぎäŋå­˜ã¨äŊŋį”¨ã‚’å°‹ã­ã‚‹" + }, + "usePasskeysDesc": { + "message": "新しいパ゚キãƒŧをäŋå­˜ã™ã‚‹ã‹ã€äŋįŽĄåēĢãĢäŋå­˜ã•れãĻいるパ゚キãƒŧã§ãƒ­ã‚°ã‚¤ãƒŗã™ã‚‹ã‚ˆã†čĻæą‚ã—ãžã™ã€‚ãƒ­ã‚°ã‚¤ãƒŗã—ãĻいるすずãĻぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢéŠį”¨ã•ã‚Œãžã™ã€‚" + }, "notificationChangeDesc": { "message": "Bitwarden でこぎパ゚ワãƒŧドを更新しぞすかīŧŸ" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "ãƒ­ãƒƒã‚¯č§Ŗé™¤" }, + "additionalOptions": { + "message": "čŋŊ加ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ" + }, "enableContextMenuItem": { "message": "ã‚ŗãƒŗãƒ†ã‚­ã‚šãƒˆãƒĄãƒ‹ãƒĨãƒŧã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’čĄ¨į¤ē" }, "contextMenuItemDesc": { "message": "ã‚ŗãƒŗãƒ†ã‚­ã‚šãƒˆãƒĄãƒ‹ãƒĨãƒŧでパ゚ワãƒŧãƒ‰į”Ÿæˆã‚„ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąãŽå…Ĩ力をできるようãĢしぞす" }, + "contextMenuItemDescAlt": { + "message": "ã‚ŗãƒŗãƒ†ã‚­ã‚šãƒˆãƒĄãƒ‹ãƒĨãƒŧをäŊŋį”¨ã—ãĻ、ã‚Ļェブã‚ĩイトぎパ゚ワãƒŧãƒ‰į”Ÿæˆã¨ä¸€č‡´ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗãĢã‚ĸクã‚ģã‚šã—ãžã™ã€‚ãƒ­ã‚°ã‚¤ãƒŗã—ãĻいるすずãĻぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢéŠį”¨ã•ã‚Œãžã™ã€‚" + }, "defaultUriMatchDetection": { "message": "デフりãƒĢトぎ URI ä¸€č‡´æ¤œå‡ēæ–šæŗ•", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "č‡Ē動å…Ĩ力ãĒおぎã‚ĸã‚¯ã‚ˇãƒ§ãƒŗã‚’ã™ã‚‹æ™‚ãĢ、デフりãƒĢãƒˆã§ãŠãŽæ–šæŗ•ã§ URI ãŽä¸€č‡´ã‚’æ¤œå‡ēするか選択しぞす。" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ã‚ĸプãƒĒぎテãƒŧマã‚Ģナãƒŧを変更しぞす。" }, + "themeDescAlt": { + "message": "ã‚ĸプãƒĒぎã‚Ģナãƒŧテãƒŧãƒžã‚’å¤‰æ›´ã—ãžã™ã€‚ãƒ­ã‚°ã‚¤ãƒŗã—ãĻいるすずãĻぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢéŠį”¨ã•ã‚Œãžã™ã€‚" + }, "dark": { "message": "ダãƒŧク", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized ダãƒŧク", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "エク゚ポãƒŧト元" + }, "exportVault": { "message": "äŋįŽĄåēĢぎエク゚ポãƒŧト" }, "fileFormat": { "message": "ãƒ•ã‚Ąã‚¤ãƒĢåŊĸåŧ" }, + "fileEncryptedExportWarningDesc": { + "message": "エク゚ポãƒŧãƒˆã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢはパ゚ワãƒŧドでäŋč­ˇã•ã‚Œã€åžŠåˇã™ã‚‹ãĢã¯ãƒ•ã‚Ąã‚¤ãƒĢパ゚ワãƒŧドがåŋ…čρãĢãĒりぞす。" + }, + "filePassword": { + "message": "ãƒ•ã‚Ąã‚¤ãƒĢパ゚ワãƒŧド" + }, + "exportPasswordDescription": { + "message": "こぎパ゚ワãƒŧãƒ‰ã¯ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢぎエク゚ポãƒŧãƒˆã¨ã‚¤ãƒŗãƒãƒŧト時ãĢäŊŋį”¨ã—ãžã™" + }, + "accountRestrictedOptionDescription": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽãƒĻãƒŧã‚ļãƒŧ名とマ゚ã‚ŋãƒŧパ゚ワãƒŧãƒ‰ã‹ã‚‰åž—ã‚‰ã‚Œã‚‹æš—åˇåŒ–ã‚­ãƒŧをäŊŋį”¨ã—ãĻエク゚ポãƒŧトするデãƒŧã‚ŋã‚’æš—åˇåŒ–ã—ã€įžåœ¨ãŽ Bitwarden ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽãŋãŒã‚¤ãƒŗãƒãƒŧトできるようåˆļ限しぞす。" + }, + "passwordProtectedOptionDescription": { + "message": "エク゚ポãƒŧãƒˆã‚’æš—åˇåŒ–ã™ã‚‹ãŸã‚ãŽãƒ•ã‚Ąã‚¤ãƒĢパ゚ワãƒŧãƒ‰ã‚’č¨­åŽšã—ãžã™ã€‚ããŽãƒ‘ã‚šãƒ¯ãƒŧドをäŊŋį”¨ã—ãĻ、äģģæ„ãŽ Bitwarden ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢã‚¤ãƒŗãƒãƒŧトしぞす。" + }, + "exportTypeHeading": { + "message": "エク゚ポãƒŧãƒˆãŽį¨ŽéĄž" + }, + "accountRestricted": { + "message": "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆåˆļ限" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "ã€Œãƒ•ã‚Ąã‚¤ãƒĢパ゚ワãƒŧãƒ‰ã€ã¨ã€Œãƒ•ã‚Ąã‚¤ãƒĢパ゚ワãƒŧドぎįĸēčĒã€ãŒä¸€č‡´ã—ãžã›ã‚“ã€‚" + }, "warning": { "message": "č­Ļ告", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "å…ąæœ‰" }, - "learnOrg": { - "message": "įĩ„įš”ãĢついãĻå­Ļãļ" - }, - "learnOrgConfirmation": { - "message": "Bitwarden はįĩ„įš”ã‚’äŊŋãŖãĻäŋįŽĄåēĢã‚ĸイテムをäģ–ぎäēēã¨å…ąæœ‰ã™ã‚‹ã“ã¨ãŒã§ããžã™ã€‚čŠŗį´°ã¯ bitwarden.com ã‚Ļェブã‚ĩイトをごčĻ§ãã ã•ã„ã€‚" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business はįĩ„įš”ã‚’äŊŋãŖãĻäŋįŽĄåēĢã‚ĸイテムをäģ–ぎäēēã¨å…ąæœ‰ã™ã‚‹ã“ã¨ãŒã§ããžã™ã€‚čŠŗį´°ã¯ bitwarden.com ã‚Ļェブã‚ĩイトをごčĻ§ãã ã•ã„ã€‚" }, "moveToOrganization": { "message": "įĩ„įš”ãĢį§ģ動" @@ -762,6 +1204,9 @@ "file": { "message": "ãƒ•ã‚Ąã‚¤ãƒĢ" }, + "fileToShare": { + "message": "å…ąæœ‰ã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢ" + }, "selectFile": { "message": "ãƒ•ã‚Ąã‚¤ãƒĢを選択しãĻください。" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1GB ãŽæš—åˇåŒ–ã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ゚トãƒŦãƒŧジ" }, + "premiumSignUpEmergency": { + "message": "ᎊæ€Ĩã‚ĸクã‚ģ゚" + }, "premiumSignUpTwoStepOptions": { "message": "YubiKey、Duo ãĒおぎプロプナイエã‚ŋãƒĒãĒ2æŽĩ階čĒč¨ŧã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã€‚" }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "プãƒŦミã‚ĸムäŧšå“Ąæ¨Šã¯ bitwarden.com ã‚ĻェブäŋįŽĄåēĢでčŗŧå…Ĩできぞす。ã‚Ļェブã‚ĩイトを開きぞすかīŧŸ" }, + "premiumPurchaseAlertV2": { + "message": "Bitwarden ã‚Ļェブã‚ĸプãƒĒでã‚ĸã‚Ģã‚Ļãƒŗãƒˆč¨­åŽšã‹ã‚‰ãƒ—ãƒŦミã‚ĸムをčŗŧå…Ĩできぞす。" + }, "premiumCurrentMember": { "message": "あãĒたはプãƒŦミã‚ĸムäŧšå“Ąã§ã™īŧ" }, "premiumCurrentMemberThanks": { "message": "Bitwarden を支援いただき、ありがとうございぞす。" }, + "premiumFeatures": { + "message": "プãƒŦミã‚ĸムãĢã‚ĸップグãƒŦãƒŧドしãĻ受け取るīŧš" + }, "premiumPrice": { "message": "全部でãĒんと$PRICE$/嚴だけīŧ", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "すずãĻčžŧãŋã§åš´é–“ãŸãŖãŸãŽ$PRICE$īŧ", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "更新厌äē†" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "čĒč¨ŧã‚ĸプãƒĒ" }, - "authenticatorAppDesc": { - "message": "Authy や Google čĒč¨ŧã‚ˇã‚šãƒ†ãƒ ãĒおぎčĒč¨ŧã‚ĸプãƒĒで時限åŧãŽčĒč¨ŧã‚ŗãƒŧãƒ‰ã‚’į”Ÿæˆã—ãĻください。", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Bitwarden Authenticator ぎようãĒčĒč¨ŧã‚ĸプãƒĒãĢã‚ˆãŖãĻį”Ÿæˆã•ã‚ŒãŸã‚ŗãƒŧドをå…Ĩ力しãĻください。", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP ã‚ģキãƒĨãƒĒãƒ†ã‚Ŗã‚­ãƒŧ" + "yubiKeyTitleV2": { + "message": "Yubico OTP ã‚ģキãƒĨãƒĒãƒ†ã‚Ŗã‚­ãƒŧ" }, "yubiKeyDesc": { "message": "YubiKey をäŊŋãŖãĻã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢã‚ĸクã‚ģ゚できぞす。 YubiKey 4、4 Nano、4C、NEOãĢ寞åŋœã—ãĻいぞす。" }, - "duoDesc": { - "message": "Duo Mobile ã‚ĸプãƒĒや SMS、é›ģčŠąã‚„ U2F ã‚ģキãƒĨãƒĒãƒ†ã‚Ŗã‚­ãƒŧをäŊŋãŖãĻ Duo Security でčĒč¨ŧしぞす。", + "duoDescV2": { + "message": "Duo Security ãĢã‚ˆãŖãĻį”Ÿæˆã•ã‚ŒãŸã‚ŗãƒŧドをå…Ĩ力しãĻください。", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚" }, - "emailDesc": { - "message": "įĸēčĒã‚ŗãƒŧãƒ‰ã‚’ãƒĄãƒŧãƒĢãĢお送りしぞす。" + "emailDescV2": { + "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚ãĢ送äŋĄã•ã‚ŒãŸã‚ŗãƒŧドをå…Ĩ力しãĻください。" }, "selfHostedEnvironment": { "message": "ã‚ģãƒĢãƒ•ãƒ›ã‚šãƒ†ã‚Ŗãƒŗã‚°į’°åĸƒ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "ã‚ģãƒĢãƒ•ãƒ›ã‚šãƒ†ã‚Ŗãƒŗã‚°ã—ãĻいる Bitwarden ぎベãƒŧ゚ URL を指厚しãĻください。" }, + "selfHostedBaseUrlHint": { + "message": "ã‚Ēãƒŗãƒ—ãƒŦミ゚ポトした Bitwarden ぎベãƒŧ゚ URL を指厚しãĻください。䞋: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "é̘åēĻãĒč¨­åŽšã§ã¯ã€å„ã‚ĩãƒŧビ゚ぎベãƒŧ゚ URL を個åˆĨãĢ指厚できぞす。" + }, + "selfHostedEnvFormInvalid": { + "message": "ベãƒŧ゚ ã‚ĩãƒŧバãƒŧ URL ぞたは少ãĒくとも 1 つぎã‚Ģ゚ã‚ŋãƒ į’°åĸƒã‚’čŋŊ加するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + }, "customEnvironment": { "message": "ã‚Ģ゚ã‚ŋãƒ į’°åĸƒ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "ã‚ĩãƒŧバãƒŧ URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API ã‚ĩãƒŧバãƒŧ URL" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "į’°åĸƒ URL をäŋå­˜ã—ぞした。" }, + "showAutoFillMenuOnFormFields": { + "message": "フりãƒŧãƒ é …į›ŽãĢč‡Ē動å…ĨåŠ›ãƒĄãƒ‹ãƒĨãƒŧã‚’čĄ¨į¤ē", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "č‡Ē動å…ĨåŠ›ãŽå€™čŖœ" + }, + "showInlineMenuLabel": { + "message": "フりãƒŧãƒ ãƒ•ã‚ŖãƒŧãƒĢドãĢč‡Ē動å…ĨåŠ›ãŽå€™čŖœã‚’čĄ¨į¤ēする" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "ã‚ĸã‚¤ã‚ŗãƒŗãŒé¸æŠžã•ã‚ŒãĻいるときãĢå€™čŖœã‚’čĄ¨į¤ēする" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗã—ãĻいるすずãĻぎã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢéŠį”¨ã•ã‚Œãžã™ã€‚" + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "įĢļ合をéŋけるためãĢ、ブナã‚Ļã‚ļãƒŧぎパ゚ワãƒŧãƒ‰įŽĄį†č¨­åŽšã‚’ã‚ĒフãĢしãĻください。" + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "ブナã‚Ļã‚ļãƒŧãŽč¨­åŽšã‚’įˇ¨é›†ã—ãĻください。" + }, + "autofillOverlayVisibilityOff": { + "message": "ã‚Ēフ", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "é …į›Žã‚’é¸æŠžã—ãĻいるとき (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "č‡Ē動å…Ĩ力ã‚ĸã‚¤ã‚ŗãƒŗã‚’é¸æŠžã—ãĻいるとき", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "ペãƒŧジčĒ­ãŋčžŧãŋ時ãĢč‡Ē動å…Ĩ力する" + }, "enableAutoFillOnPageLoad": { "message": "ペãƒŧジčĒ­ãŋčžŧãŋ時ぎč‡Ē動å…Ĩ力を有劚化" }, "enableAutoFillOnPageLoadDesc": { "message": "ペãƒŧジčĒ­ãŋčžŧãŋ時ãĢãƒ­ã‚°ã‚¤ãƒŗãƒ•ã‚Šãƒŧムを検å‡ēã—ãŸã¨ãã€ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’č‡Ē動å…Ĩ力しぞす。" }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$č­Ļ告:$CLOSETAG$ äžĩåŽŗã•ã‚ŒãŸã€ãžãŸã¯äŋĄé ŧできãĒいã‚Ļェブã‚ĩイトは、ペãƒŧジčĒ­ãŋčžŧãŋ時ぎč‡Ē動å…Ĩ力をæ‚Ēį”¨ã™ã‚‹å¯čƒŊ性がありぞす。", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "ã‚ĻイãƒĢ゚感染したりäŋĄé ŧできãĒいã‚Ļェブã‚ĩイトは、ペãƒŧジぎčĒ­ãŋčžŧãŋ時ぎč‡Ē動å…Ĩ力をæ‚Ēį”¨ã§ããĻしぞいぞす。" }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "ãƒĒ゚クãĢついãĻãŽčŠŗį´°" + }, "learnMoreAboutAutofill": { "message": "č‡Ē動å…Ĩ力ãĢついãĻãŽčŠŗį´°" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "ã‚ĩイドバãƒŧでäŋįŽĄåēĢを開く" }, - "commandAutofillDesc": { - "message": "įžåœ¨ãŽã‚Ļェブã‚ĩイトで前回äŊŋį”¨ã•ã‚ŒãŸãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’č‡Ē動å…Ĩ力しぞす。" + "commandAutofillLoginDesc": { + "message": "įžåœ¨ãŽã‚Ļェブã‚ĩイトで前回äŊŋį”¨ã•ã‚ŒãŸãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’č‡Ē動å…Ĩ力しぞす" + }, + "commandAutofillCardDesc": { + "message": "įžåœ¨ãŽã‚Ļェブã‚ĩイトで最垌ãĢäŊŋį”¨ã•ã‚ŒãŸã‚Ģãƒŧãƒ‰æƒ…å ąã‚’č‡Ē動å…Ĩ力する" + }, + "commandAutofillIdentityDesc": { + "message": "įžåœ¨ãŽã‚Ļェブã‚ĩイトで最垌ãĢäŊŋį”¨ã•ã‚ŒãŸ ID をč‡Ē動å…Ĩ力する" }, "commandGeneratePasswordDesc": { "message": "ãƒŠãƒŗãƒ€ãƒ ãĒパ゚ワãƒŧãƒ‰ã‚’į”Ÿæˆã—ãĻクãƒĒップボãƒŧドãĢã‚ŗãƒ”ãƒŧしぞす。" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "äŋįŽĄåēĢをロック" }, - "privateModeWarning": { - "message": "プナイベãƒŧトãƒĸãƒŧドぎã‚ĩポãƒŧãƒˆã¯åŽŸé¨“įš„ã§ã‚ã‚Šã€ä¸€éƒ¨æŠŸčƒŊはåˆļ限されãĻいぞす。" - }, "customFields": { "message": "ã‚Ģ゚ã‚ŋãƒ ãƒ•ã‚ŖãƒŧãƒĢド" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "ᜟåŊ値" }, + "cfTypeCheckbox": { + "message": "チェックボック゚" + }, "cfTypeLinked": { "message": "ãƒĒãƒŗã‚¯æ¸ˆ", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąãŽéšŖãĢã‚ĸã‚¤ã‚ŗãƒŗį”ģåƒã‚’čĄ¨į¤ēしぞす" }, + "faviconDescAlt": { + "message": "å„ãƒ­ã‚°ã‚¤ãƒŗãŽæ¨ĒãĢčĒč­˜å¯čƒŊãĒį”ģåƒã‚’čĄ¨į¤ēしぞす。すずãĻãŽãƒ­ã‚°ã‚¤ãƒŗæ¸ˆãŋã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢéŠį”¨ã•ã‚Œãžã™ã€‚" + }, "enableBadgeCounter": { "message": "バッジã‚Ģã‚Ļãƒŗã‚ŋãƒŧã‚’čĄ¨į¤ē" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "ID" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "$TYPE$ を新čĻäŊœæˆ", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ ã‚’įˇ¨é›†", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "$TYPE$ ã‚’čĄ¨į¤ē", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "パ゚ワãƒŧドぎåąĨæ­´" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "æˆģる" }, "collections": { "message": "ã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗ" }, + "nCollections": { + "message": "$COUNT$ å€‹ãŽã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗ", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "お気ãĢå…Ĩり" }, @@ -1282,6 +1874,10 @@ "message": "ベãƒŧã‚šãƒ‰ãƒĄã‚¤ãƒŗ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "ベãƒŧã‚šãƒ‰ãƒĄã‚¤ãƒŗ (推åĨ¨)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ãƒ‰ãƒĄã‚¤ãƒŗå", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ä¸€č‡´æ¤œå‡ēæ–šæŗ•", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "デフりãƒĢãƒˆãŽä¸€č‡´æ¤œå‡ēæ–šæŗ•", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŽåˆ‡ã‚Šæ›ŋえ" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "襨į¤ēするパ゚ワãƒŧドがありぞせん" }, + "clearHistory": { + "message": "åąĨ歴をæļˆåŽģ" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "削除" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "PIN ã§ãƒ­ãƒƒã‚¯č§Ŗé™¤" }, + "setYourPinTitle": { + "message": "PIN ã‚’č¨­åŽš" + }, + "setYourPinButton": { + "message": "PIN ã‚’č¨­åŽš" + }, "setYourPinCode": { "message": "Bitwarden ãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤ã™ã‚‹ãŸã‚ãŽ PIN ã‚ŗãƒŧãƒ‰ã‚’č¨­åŽšã—ãžã™ã€‚ã‚ĸプãƒĒから厌全ãĢログã‚ĸã‚Ļトすると、PIN č¨­åŽšã¯ãƒĒã‚ģットされぞす。" }, + "setYourPinCode1": { + "message": "あãĒたぎ PIN はマ゚ã‚ŋãƒŧパ゚ワãƒŧドぎäģŖã‚ã‚ŠãĢ Bitwarden ãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤ã™ã‚‹ãŸã‚ãĢäŊŋį”¨ã•ã‚Œãžã™ã€‚Bitwarden から厌全ãĢログã‚ĸã‚Ļトすると PIN がãƒĒã‚ģットされぞす。" + }, "pinRequired": { "message": "PIN ã‚ŗãƒŧドがåŋ…čĻã§ã™ã€‚" }, "invalidPin": { "message": "PIN ã‚ŗãƒŧãƒ‰ãŒé–“é•ãŖãĻいぞす。" }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "į„ĄåŠšãĒ PIN å…Ĩ力ぎčŠĻčĄŒå›žæ•°ãŒå¤šã™ãŽãžã™ã€‚ãƒ­ã‚°ã‚ĸã‚Ļトしぞす。" + }, "unlockWithBiometrics": { "message": "į”ŸäŊ“čĒč¨ŧã§ãƒ­ãƒƒã‚¯č§Ŗé™¤" }, + "unlockWithMasterPassword": { + "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧãƒ‰ã§ãƒ­ãƒƒã‚¯č§Ŗé™¤" + }, "awaitDesktop": { "message": "デ゚クトップからぎįĸēčĒåž…ãĄ" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "ブナã‚Ļã‚ļãƒŧ再čĩˇå‹•時ãĢマ゚ã‚ŋãƒŧパ゚ワãƒŧドでロック" }, + "lockWithMasterPassOnRestart1": { + "message": "ブナã‚Ļã‚ļぎ再čĩˇå‹•時ãĢマ゚ã‚ŋãƒŧパ゚ワãƒŧドをčĻæą‚" + }, "selectOneCollection": { "message": "最äŊŽã§ã‚‚ä¸€ã¤ãŽã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗã‚’é¸ã‚“ã§ãã ã•ã„ã€‚" }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "一つäģĨ上ぎįĩ„įš”ãŽãƒãƒĒã‚ˇãƒŧがパ゚ワãƒŧãƒ‰į”ŸæˆãŽč¨­åŽšãĢåŊąéŸŋしãĻいぞす。" }, + "passwordGenerator": { + "message": "パ゚ワãƒŧãƒ‰į”Ÿæˆãƒ„ãƒŧãƒĢ" + }, + "usernameGenerator": { + "message": "ãƒĻãƒŧã‚ļãƒŧåį”Ÿæˆãƒ„ãƒŧãƒĢ" + }, + "useThisPassword": { + "message": "こぎパ゚ワãƒŧドをäŊŋį”¨ã™ã‚‹" + }, + "useThisUsername": { + "message": "こぎãƒĻãƒŧã‚ļãƒŧ名をäŊŋį”¨ã™ã‚‹" + }, + "securePasswordGenerated": { + "message": "厉全ãĒパ゚ワãƒŧãƒ‰ã‚’į”Ÿæˆã—ãžã—ãŸ! ã‚Ļェブã‚ĩイト上でパ゚ワãƒŧドを更新することをåŋ˜ã‚ŒãĒいでください。" + }, + "useGeneratorHelpTextPartOne": { + "message": "į”ŸæˆæŠŸčƒŊ", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "をäŊŋうとåŧˇåŠ›ã§ä¸€æ„ãĒパ゚ワãƒŧドをäŊœã‚Œãžã™", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "äŋįŽĄåēĢã‚ŋイムã‚ĸã‚Ļト時ぎã‚ĸã‚¯ã‚ˇãƒ§ãƒŗ" }, + "vaultTimeoutAction1": { + "message": "ã‚ŋイムã‚ĸã‚Ļト時ぎã‚ĸã‚¯ã‚ˇãƒ§ãƒŗ" + }, "lock": { "message": "ロック", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ごãŋįŽą", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ãƒĒ゚トã‚ĸされたã‚ĸイテム" }, + "alreadyHaveAccount": { + "message": "すでãĢã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’ãŠæŒãĄã§ã™ã‹īŧŸ" + }, "vaultTimeoutLogOutConfirmation": { "message": "ログã‚ĸã‚ĻトするとäŋįŽĄåēĢへぎすずãĻぎã‚ĸクã‚ģ゚がåˆļ限され、ã‚ŋイムã‚ĸã‚Ļト期間垌ãĢã‚ĒãƒŗãƒŠã‚¤ãƒŗčĒč¨ŧがåŋ…čρãĢãĒりぞす。 ã“ãŽč¨­åŽšã‚’äŊŋį”¨ã—ãĻもよろしいですかīŧŸ" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "č‡Ē動å…Ĩ力しãĻäŋå­˜" }, + "fillAndSave": { + "message": "å…Ĩ力しãĻäŋå­˜" + }, "autoFillSuccessAndSavedUri": { "message": "ã‚ĸイテムをč‡Ē動å…Ĩ力しãĻ URI をäŋå­˜ã—ぞした" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "新しいマ゚ã‚ŋãƒŧパ゚ワãƒŧドは最äŊŽčρäģļをæē€ãŸã—ãĻいぞせん。" }, + "receiveMarketingEmailsV2": { + "message": "Bitwarden ã‹ã‚‰ãƒĄãƒŧãƒĢでã‚ĸドバイ゚やおįŸĨらせ、ãƒĒã‚ĩãƒŧチぎ抟äŧšã‚’受け取りぞしょう。" + }, + "unsubscribe": { + "message": "配äŋĄåœæ­ĸ" + }, + "atAnyTime": { + "message": "はいつでもできぞす。" + }, + "byContinuingYouAgreeToThe": { + "message": "įļščĄŒã™ã‚‹ã¨äģĨ下ãĢ同意したもぎとãŋãĒしぞすīŧš" + }, + "and": { + "message": "と" + }, "acceptPolicies": { "message": "äģĨ下ãĢ同意しチェックしぞす:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "OK" }, + "errorRefreshingAccessToken": { + "message": "ã‚ĸクã‚ģ゚トãƒŧã‚¯ãƒŗãŽæ›´æ–°ã‚¨ãƒŠãƒŧ" + }, + "errorRefreshingAccessTokenDesc": { + "message": "ãƒĒフãƒŦãƒƒã‚ˇãƒĨトãƒŧã‚¯ãƒŗã‚„ API キãƒŧがčĻ‹ã¤ã‹ã‚Šãžã›ã‚“ã§ã—ãŸã€‚ãƒ­ã‚°ã‚ĸã‚ĻトしãĻ再åēĻãƒ­ã‚°ã‚¤ãƒŗã—ãĻください。" + }, "desktopSyncVerificationTitle": { "message": "デ゚クトップ同期ぎ検č¨ŧ" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŒä¸€č‡´ã—ãžã›ã‚“" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "į”ŸäŊ“čĒč¨ŧキãƒŧãŒä¸€č‡´ã—ãžã›ã‚“" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "į”ŸäŊ“čĒč¨ŧãŽãƒ­ãƒƒã‚¯č§Ŗé™¤ãĢå¤ąæ•—ã—ãžã—ãŸã€‚į”ŸäŊ“čĒč¨ŧキãƒŧでぎäŋįŽĄåēĢãŽãƒ­ãƒƒã‚¯č§Ŗé™¤ãĢå¤ąæ•—ã—ãžã—ãŸã€‚į”ŸäŊ“čĒč¨ŧを再åēĻč¨­åŽšã—ãĻください。" + }, "biometricsNotEnabledTitle": { "message": "į”ŸäŊ“čĒč¨ŧが有劚ãĢãĒãŖãĻいぞせん" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "こぎデバイ゚ではブナã‚Ļã‚ļãŽį”ŸäŊ“čĒč¨ŧãĢ寞åŋœã—ãĻいぞせん。" }, + "biometricsNotUnlockedTitle": { + "message": "ãƒĻãƒŧã‚ļãƒŧがロックぞたはログã‚ĸã‚Ļトしぞした" + }, + "biometricsNotUnlockedDesc": { + "message": "デ゚クトップã‚ĸプãƒĒでこぎãƒĻãƒŧã‚ļãƒŧãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤ã—ãĻ、もう一åēĻã‚„ã‚Šį›´ã—ãĻください。" + }, + "biometricsNotAvailableTitle": { + "message": "į”ŸäŊ“čĒč¨ŧãƒ­ãƒƒã‚¯č§Ŗé™¤ãŒåˆŠį”¨ã§ããžã›ã‚“" + }, + "biometricsNotAvailableDesc": { + "message": "į”ŸäŊ“čĒč¨ŧãƒ­ãƒƒã‚¯č§Ŗé™¤ã¯įžåœ¨åˆŠį”¨ã§ããžã›ã‚“ã€‚ã—ã°ã‚‰ãã—ãĻからもう一åēĻおčŠĻしください。" + }, "biometricsFailedTitle": { "message": "į”ŸäŊ“čĒč¨ŧãĢå¤ąæ•—ã—ãžã—ãŸ" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "įĩ„įš”ãŽãƒãƒĒã‚ˇãƒŧãŒæ‰€æœ‰č€…ãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢåŊąéŸŋを与えãĻいぞす。" }, + "personalOwnershipPolicyInEffectImports": { + "message": "įĩ„įš”ãŽãƒãƒĒã‚ˇãƒŧãĢより、個々ぎäŋįŽĄåēĢへぎã‚ĸã‚¤ãƒ†ãƒ ãŽã‚¤ãƒŗãƒãƒŧトがブロックされぞした。" + }, + "domainsTitle": { + "message": "ãƒ‰ãƒĄã‚¤ãƒŗ", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "é™¤å¤–ã™ã‚‹ãƒ‰ãƒĄã‚¤ãƒŗ" }, "excludedDomainsDesc": { "message": "Bitwarden ã¯ã“ã‚Œã‚‰ãŽãƒ‰ãƒĄã‚¤ãƒŗãŽãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ã‚ˆã†å°‹ã­ãžã›ã‚“。変更を有劚ãĢするãĢはペãƒŧジを更新するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" }, + "excludedDomainsDescAlt": { + "message": "Bitwarden ã¯ãƒ­ã‚°ã‚¤ãƒŗã—ãĻいるすずãĻぎã‚ĸã‚Ģã‚Ļãƒŗãƒˆã§ã€ã“ã‚Œã‚‰ãŽãƒ‰ãƒĄã‚¤ãƒŗãŽãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’äŋå­˜ã™ã‚‹ã‚ˆã†čĻæą‚ã—ãžã›ã‚“ã€‚ 変更を有劚ãĢするãĢはペãƒŧジを更新するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + }, + "websiteItemLabel": { + "message": "ã‚Ļェブã‚ĩイト $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ は有劚ãĒãƒ‰ãƒĄã‚¤ãƒŗã§ã¯ã‚ã‚Šãžã›ã‚“", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "é™¤å¤–ãƒ‰ãƒĄã‚¤ãƒŗãŽå¤‰æ›´ã‚’äŋå­˜ã—ぞした" + }, + "limitSendViews": { + "message": "襨į¤ēぎåˆļ限" + }, + "limitSendViewsHint": { + "message": "上限ãĢ達した垌、čĒ°ã‚‚ã“ãŽ Send ã‚’čĄ¨į¤ēできãĒくãĒりぞす。", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "掋り $ACCESSCOUNT$ 回", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send ãŽčŠŗį´°", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send を検į´ĸ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "テキ゚ト" }, + "sendTypeTextToShare": { + "message": "å…ąæœ‰ã™ã‚‹ãƒ†ã‚­ã‚šãƒˆ" + }, "sendTypeFile": { "message": "ãƒ•ã‚Ąã‚¤ãƒĢ" }, @@ -1666,6 +2406,9 @@ "message": "すずãĻぎ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "デフりãƒĢトでテキ゚トを隠す" + }, "maxAccessCountReached": { "message": "最大ã‚ĸクã‚ģ゚数ãĢ達しぞした", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "パ゚ワãƒŧドäŋč­ˇã‚り" }, + "copyLink": { + "message": "ãƒĒãƒŗã‚¯ã‚’ã‚ŗãƒ”ãƒŧ" + }, "copySendLink": { "message": "Send ãƒĒãƒŗã‚¯ã‚’ã‚ŗãƒ”ãƒŧ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "こぎ Send を削除しãĻもよろしいですか?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "こぎ Send を厌全ãĢ削除しãĻもよろしいですかīŧŸ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Send ã‚’įˇ¨é›†", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send は指厚されたæ—Ĩ時ãĢ厌全ãĢ削除されぞす。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send はこぎæ—Ĩäģ˜ã§åŽŒå…¨ãĢ削除されぞす。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "有劚期限" }, @@ -1769,6 +2523,10 @@ "message": "åŋ…čρãĢåŋœã˜ãĻ、ãƒĻãƒŧã‚ļãƒŧがこぎ Send ãĢã‚ĸクã‚ģ゚するためぎパ゚ワãƒŧドをčĻæą‚ã—ãžã™ã€‚", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "こぎ Send ãĢé–ĸするプナイベãƒŧãƒˆãƒĄãƒĸ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "äŊœæˆã—た Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send をäŊœæˆã—ぞしたīŧ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send は、æŦĄãŽ1時間はãƒĒãƒŗã‚¯ã‚’įŸĨãŖãĻã„ã‚‹å…¨å“ĄãŒåˆŠį”¨ã§ããžã™ã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Send は、æŦĄãŽ$HOURS$時間はãƒĒãƒŗã‚¯ã‚’įŸĨãŖãĻいるäēēå…¨å“ĄãŒåˆŠį”¨ã§ããžã™ã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send は、æŦĄãŽ1æ—Ĩ間はãƒĒãƒŗã‚¯ã‚’įŸĨãŖãĻã„ã‚‹å…¨å“ĄãŒåˆŠį”¨ã§ããžã™ã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Send は、æŦĄãŽ$DAYS$æ—Ĩ間はãƒĒãƒŗã‚¯ã‚’įŸĨãŖãĻいるäēēå…¨å“ĄãŒåˆŠį”¨ã§ããžã™ã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send ãƒĒãƒŗã‚¯ã‚’ã‚ŗãƒ”ãƒŧしぞした", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "įˇ¨é›†æ¸ˆãŋぎ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "æ‹Ąåŧĩ抟čƒŊをポップã‚ĸã‚ĻトしぞすかīŧŸ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "ãƒ•ã‚Ąã‚¤ãƒĢ Send をäŊœæˆã™ã‚‹ãĢã¯ã€æ‹Ąåŧĩ抟čƒŊを新しいã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļでポップã‚ĸã‚ĻãƒˆčĄ¨į¤ēするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "ãƒ•ã‚Ąã‚¤ãƒĢを選択するãĢは、可čƒŊãĒ場合ã‚ĩイドバãƒŧã§æ‹Ąåŧĩ子を開くか、こぎバナãƒŧをクãƒĒックしãĻ新しいã‚Ļã‚Ŗãƒŗãƒ‰ã‚ĻãĢポップã‚ĸップしãĻください。" }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Safari をäŊŋį”¨ã—ãĻãƒ•ã‚Ąã‚¤ãƒĢを選択するãĢは、こぎバナãƒŧをクãƒĒックしãĻ新しいã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļで開いãĻください。" }, + "popOut": { + "message": "ポップã‚ĸã‚Ļト" + }, "sendFileCalloutHeader": { "message": "はじめる前ãĢ" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚を受äŋĄč€…ãĢ襨į¤ēしãĒい" }, + "hideYourEmail": { + "message": "閲čϧ者ãĢãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚をčĻ‹ã›ãĒいようãĢしぞす。" + }, "sendOptionsPolicyInEffect": { "message": "一つäģĨ上ぎįĩ„įš”ãƒãƒĒã‚ˇãƒŧが Send ãŽč¨­åŽšãĢåŊąéŸŋしãĻいぞす。" }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚ぎįĸēčĒãŒåŋ…čĻã§ã™" }, + "emailVerifiedV2": { + "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚をčĒč¨ŧしぞした" + }, "emailVerificationRequiredDesc": { "message": "こぎ抟čƒŊをäŊŋį”¨ã™ã‚‹ãĢã¯ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚をįĸēčĒã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ã‚ĻェブäŋįŽĄåēĢã§ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚をįĸēčĒã§ããžã™ã€‚" }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "あãĒたぎマ゚ã‚ŋãƒŧパ゚ワãƒŧドは、įĩ„įš”ãŽãƒãƒĒã‚ˇãƒŧをæē€ãŸã—ãĻいぞせん。äŋįŽĄåēĢãĢã‚ĸクã‚ģ゚するãĢは、äģŠã™ããƒžã‚šã‚ŋãƒŧパ゚ワãƒŧドを更新するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ã“ãŽæ“äŊœã‚’įļšã‘ã‚‹ã¨ã€įžåœ¨ãŽã‚ģãƒƒã‚ˇãƒ§ãƒŗãŒãƒ­ã‚°ã‚ĸã‚Ļãƒˆã•ã‚Œã€å†ãƒ­ã‚°ã‚¤ãƒŗã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚äģ–ぎデバイ゚でぎã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãĒã‚ģãƒƒã‚ˇãƒ§ãƒŗã¯æœ€å¤§1時間įļ™įļšã™ã‚‹å ´åˆãŒã‚りぞす。" }, + "tdeDisabledMasterPasswordRequired": { + "message": "あãĒたぎįĩ„įš”ã¯äŋĄé ŧã§ãã‚‹ãƒ‡ãƒã‚¤ã‚šãŽæš—åˇåŒ–ã‚’į„ĄåŠšåŒ–ã—ãžã—ãŸã€‚äŋįŽĄåēĢãĢã‚ĸクã‚ģ゚するãĢはマ゚ã‚ŋãƒŧパ゚ワãƒŧãƒ‰ã‚’č¨­åŽšã—ãĻください。" + }, "resetPasswordPolicyAutoEnroll": { "message": "č‡Ē動į™ģ錞" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "フりãƒĢダãƒŧを選択..." }, - "ssoCompleteRegistration": { - "message": "SSO ãƒ­ã‚°ã‚¤ãƒŗã‚’åŽŒäē†ã™ã‚‹ãĢは、äŋįŽĄåēĢãĢã‚ĸクã‚ģ゚ãƒģäŋč­ˇã™ã‚‹ãŸã‚ãŽãƒžã‚šã‚ŋãƒŧパ゚ワãƒŧãƒ‰ã‚’č¨­åŽšã—ãĻください。" + "noFoldersFound": { + "message": "フりãƒĢダãƒŧがčĻ‹ã¤ã‹ã‚Šãžã›ã‚“", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "įĩ„įš”ãŽæ¨Šé™ãŒæ›´æ–°ã•ã‚Œã€ãƒžã‚šã‚ŋãƒŧパ゚ワãƒŧãƒ‰ãŽč¨­åŽšãŒåŋ…čρãĢãĒりぞした。", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "あãĒたぎįĩ„įš”ã§ã¯ã€ãƒžã‚šã‚ŋãƒŧパ゚ワãƒŧãƒ‰ãŽč¨­åŽšã‚’įžŠå‹™äģ˜ã‘ãĻいぞす。", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": " / $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "čĒč¨ŧがåŋ…čĻã§ã™", + "description": "Default title for the user verification dialog." }, "hours": { "message": "時間" @@ -1904,6 +2740,9 @@ "minutes": { "message": "分" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "ã‚ŋイムã‚ĸã‚Ļトã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãĢã‚¨ãƒŗã‚ŋãƒŧプナイã‚ēポãƒĒã‚ˇãƒŧčρäģļã‚’éŠį”¨ã—ãžã—ãŸ" + }, "vaultTimeoutPolicyInEffect": { "message": "あãĒたぎįĩ„įš”ãƒãƒĒã‚ˇãƒŧはäŋįŽĄåēĢぎã‚ŋイムã‚ĸã‚ĻトãĢåŊąéŸŋを与えãĻいぞす。最大äŋįŽĄåēĢぎã‚ŋイムã‚ĸã‚Ļト時間は $HOURS$ 時間 $MINUTES$ 分です。", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ 時間と $MINUTES$ 分が最大です。", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "ã‚ŋイムã‚ĸã‚Ļトがįĩ„įš”ãĢã‚ˆãŖãĻč¨­åŽšã•ã‚ŒãŸåˆļ限をčļ…えãĻいぞす: 上限 $HOURS$ 時間と $MINUTES$ 分間", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "įĩ„įš”ãŽãƒãƒĒã‚ˇãƒŧがあãĒたぎäŋįŽĄåēĢぎã‚ŋイムã‚ĸã‚ĻトãĢåŊąéŸŋしす。äŋįŽĄåēĢãŽæœ€å¤§č¨ąåŽšã‚ŋイムã‚ĸã‚Ļトは$HOURS$時間$MINUTES$分です。äŋįŽĄåēĢぎã‚ŋイムã‚ĸã‚Ļãƒˆč¨­åŽšã¯$ACTION$ãĢありぞす。", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "įĩ„įš”äŋįŽĄåēĢぎエク゚ポãƒŧト" + }, + "exportingOrganizationVaultDesc": { + "message": "$ORGANIZATION$ ãĢé–ĸ逪äģ˜ã‘られたįĩ„įš”äŋįŽĄåēĢぎãŋがエク゚ポãƒŧトされぞす。個々ぎäŋįŽĄåēĢぞたはäģ–ぎįĩ„įš”ãĢあるã‚ĸイテムはåĢぞれぞせん。", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "エナãƒŧ" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ãƒĻãƒŧã‚ļãƒŧåã‚’į”Ÿæˆ" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "ãƒĻãƒŧã‚ļãƒŧåãŽį¨ŽéĄž" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "外部čģĸ送ã‚ĩãƒŧビ゚をäŊŋį”¨ã—ãĻãƒĄãƒŧãƒĢエイãƒĒã‚ĸã‚šã‚’į”Ÿæˆã—ãžã™ã€‚" }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ エナãƒŧ: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden ãĢã‚ˆãŖãĻį”Ÿæˆã•ã‚Œãžã—ãŸã€‚", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "ã‚Ļェブã‚ĩイト: $WEBSITE$ Bitwarden ãĢã‚ˆãŖãĻį”Ÿæˆã•ã‚Œãžã—ãŸã€‚", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "ä¸æ­ŖãĒ$SERVICENAME$ API トãƒŧã‚¯ãƒŗ", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "ä¸æ­ŖãĒ$SERVICENAME$ API トãƒŧã‚¯ãƒŗ: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "$SERVICENAME$ マ゚ク済ãŋãƒĄãƒŧãƒĢã‚ĸã‚Ģã‚Ļãƒŗãƒˆ ID を取垗できぞせんでした。", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "ä¸æ­ŖãĒ $SERVICENAME$ ãƒ‰ãƒĄã‚¤ãƒŗã§ã™ã€‚", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "ä¸æ­ŖãĒ $SERVICENAME$ URL です。", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "不明ãĒ $SERVICENAME$ エナãƒŧがčĩˇããžã—た。", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "不明ãĒčģĸ送先: '$SERVICENAME$'", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ポト名", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "č‡Ē動å…ĨåŠ›ã™ã‚‹æ–šæŗ•" }, "autofillSelectInfoWithCommand": { - "message": "こぎペãƒŧジからã‚ĸã‚¤ãƒ†ãƒ ã‚’é¸æŠžã™ã‚‹ã‹ã€ã‚ˇãƒ§ãƒŧトã‚ĢットをäŊŋį”¨ã—ãĻください: $COMMAND$", + "message": "こぎį”ģéĸからã‚ĸã‚¤ãƒ†ãƒ ã‚’é¸æŠžã™ã‚‹ã‹ã€ã‚ˇãƒ§ãƒŧトã‚Ģット $COMMAND$をäŊŋį”¨ã™ã‚‹ã‹ã€č¨­åŽšã§äģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’įĸēčĒã—ãĻください。", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "こぎペãƒŧジからã‚ĸã‚¤ãƒ†ãƒ ã‚’é¸æŠžã™ã‚‹ã‹ã€č¨­åŽšã§ã‚ˇãƒ§ãƒŧトã‚Ģãƒƒãƒˆã‚’č¨­åŽšã—ãĻください。" + "message": "こぎį”ģéĸからã‚ĸã‚¤ãƒ†ãƒ ã‚’é¸æŠžã™ã‚‹ã‹ã€č¨­åŽšã§äģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’įĸēčĒã—ãĻください。" }, "gotIt": { "message": "äē†č§Ŗ" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "č‡Ē動å…ĨåŠ›ãŽč¨­åŽš" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "č‡Ē動å…ĨåŠ›ãŽã‚ˇãƒ§ãƒŧトã‚Ģット" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "ã‚ˇãƒ§ãƒŧトã‚Ģットぎ変更" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "ã‚ˇãƒ§ãƒŧトã‚Ģãƒƒãƒˆã‚’įŽĄį†" + }, "autofillShortcut": { "message": "č‡Ē動å…Ĩ力キãƒŧボãƒŧãƒ‰ã‚ˇãƒ§ãƒŧトã‚Ģット" }, - "autofillShortcutNotSet": { + "autofillLoginShortcutNotSet": { "message": "č‡Ē動å…ĨåŠ›ãŽã‚ˇãƒ§ãƒŧトã‚ĢãƒƒãƒˆãŒč¨­åŽšã•ã‚ŒãĻいぞせん。ブナã‚Ļã‚ļãŽč¨­åŽšã§å¤‰æ›´ã—ãĻください。" }, - "autofillShortcutText": { - "message": "č‡Ē動å…ĨåŠ›ãŽã‚ˇãƒ§ãƒŧトã‚Ģットは $COMMAND$ です。ブナã‚Ļã‚ļãŽč¨­åŽšã§ã“ã‚Œã‚’å¤‰æ›´ã—ãĻください。", + "autofillLoginShortcutText": { + "message": "č‡Ē動å…ĨåŠ›ãŽã‚ˇãƒ§ãƒŧトã‚Ģットは $COMMAND$ です。ブナã‚Ļã‚ļãŽč¨­åŽšã§ã™ãšãĻãŽã‚ˇãƒ§ãƒŧトã‚Ģãƒƒãƒˆã‚’įŽĄį†ã§ããžã™ã€‚", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "ãƒ­ã‚°ã‚¤ãƒŗå…ˆ" - }, "opensInANewWindow": { "message": "新しいã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļで開く" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "įĩ„įš”ãŽ SSO ID がåŋ…čĻã§ã™ã€‚" }, + "creatingAccountOn": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆäŊœæˆīŧš" + }, + "checkYourEmail": { + "message": "ãƒĄãƒŧãƒĢをごįĸēčĒãã ã•ã„" + }, + "followTheLinkInTheEmailSentTo": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽäŊœæˆã‚’įļšã‘ã‚‹ãĢは" + }, + "andContinueCreatingYourAccount": { + "message": "ãĢé€ã‚‰ã‚ŒãŸãƒĄãƒŧãƒĢぎãƒĒãƒŗã‚¯ã‚’é–‹ã„ãĻください。" + }, + "noEmail": { + "message": "ãƒĄãƒŧãƒĢがありぞせんか?" + }, + "goBack": { + "message": "æˆģãŖãĻ" + }, + "toEditYourEmailAddress": { + "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦã‚šã‚’įˇ¨é›†ã—ãĻください。" + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "ã‚ĸクã‚ģ゚が拒åĻされぞした。こぎペãƒŧã‚¸ã‚’čĄ¨į¤ēする樊限がありぞせん。" }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "äŋĄé ŧされたデバイ゚" }, + "sendsNoItemsTitle": { + "message": "ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãĒ Send ãĒし", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Send をäŊŋį”¨ã™ã‚‹ã¨æš—åˇåŒ–ã•ã‚ŒãŸæƒ…å ąã‚’čĒ°ã¨ã§ã‚‚åŽ‰å…¨ãĢå…ąæœ‰ã§ããžã™ã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "å…Ĩ力がåŋ…čĻã§ã™ã€‚" }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1ãƒ•ã‚ŖãƒŧãƒĢãƒ‰ã¯æŗ¨æ„ãŒåŋ…čĻã§ã™ã€‚" + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ ãƒ•ã‚ŖãƒŧãƒĢãƒ‰ã¯æŗ¨æ„ãŒåŋ…čĻã§ã™ã€‚", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- 選択 --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "開く/閉じる", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Bitwarden ãĢデãƒŧã‚ŋã‚’ã‚¤ãƒŗãƒãƒŧトしぞすかīŧŸ", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "LastPass デãƒŧã‚ŋを Bitwarden ãĢã‚¤ãƒŗãƒãƒŧトしぞすかīŧŸ", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "æš—åˇåŒ–ã•ã‚ŒãĻいãĒã„ãƒ•ã‚Ąã‚¤ãƒĢとしãĻäŋå­˜", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Bitwarden ãĢã‚¤ãƒŗãƒãƒŧト", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ã‚¤ãƒŗãƒãƒŧト中...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "デãƒŧã‚ŋã‚’ã‚¤ãƒŗãƒãƒŧトしぞしたīŧ", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "ã‚¤ãƒŗãƒãƒŧト中ãĢエナãƒŧがį™ēį”Ÿã—ãžã—ãŸã€‚čŠŗį´°ã¯ã‚ŗãƒŗã‚ŊãƒŧãƒĢをįĸēčĒã—ãĻください。", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "ã‚¤ãƒŗãƒãƒŧト中ãĢネットワãƒŧクエナãƒŧがį™ēį”Ÿã—ãžã—ãŸã€‚", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "エイãƒĒã‚ĸã‚šãƒ‰ãƒĄã‚¤ãƒŗ" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧドぎ再å…Ĩ力をäŋƒã™ã‚ĸイテムは、ペãƒŧジčĒ­ãŋčžŧãŋ時ãĢč‡Ē動å…Ĩ力できぞせん。ペãƒŧジčĒ­ãŋčžŧãŋ時ぎč‡Ē動å…Ĩ力をã‚ĒフãĢしぞした。", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "ペãƒŧジčĒ­ãŋčžŧãŋ時ぎč‡Ē動å…Ĩ力はデフりãƒĢãƒˆãŽč¨­åŽšã‚’äŊŋã†ã‚ˆã†č¨­åŽšã—ãžã—ãŸã€‚", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "ã“ãŽãƒ•ã‚ŖãƒŧãƒĢãƒ‰ã‚’įˇ¨é›†ã™ã‚‹ãĢは、マ゚ã‚ŋãƒŧパ゚ワãƒŧドぎ再å…Ĩ力をã‚ĒフãĢしãĻください", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "ã‚ĩã‚¤ãƒ‰ãƒŠãƒ“ã‚˛ãƒŧã‚ˇãƒ§ãƒŗãŽåˆ‡ã‚Šæ›ŋえ" + }, + "skipToContent": { + "message": "ã‚ŗãƒŗãƒ†ãƒŗãƒ„ã¸į§ģ動" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden č‡Ē動å…ĨåŠ›ãƒĄãƒ‹ãƒĨãƒŧボã‚ŋãƒŗ", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Bitwarden č‡Ē動å…ĨåŠ›ãƒĄãƒ‹ãƒĨãƒŧぎ切りæ›ŋえ", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden č‡Ē動å…ĨåŠ›ãƒĄãƒ‹ãƒĨãƒŧ", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "ä¸€č‡´ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’čĄ¨į¤ēするãĢは、ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤ã—ãĻください", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "č‡Ē動å…ĨåŠ›å€™čŖœã‚’čĄ¨į¤ēするãĢはã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤ã—ãĻください", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤ã—ã€æ–°ã—ã„ã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļで開く", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "čŗ‡æ ŧæƒ…å ąã‚’å…Ĩ力īŧš", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "éƒ¨åˆ†įš„ãĒãƒĻãƒŧã‚ļãƒŧ名", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "襨į¤ēするã‚ĸイテムがありぞせん", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "新しいã‚ĸイテム", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "新しいäŋįŽĄåēĢã‚ĸイテムをčŋŊ加", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "新čĻãƒ­ã‚°ã‚¤ãƒŗ", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "新しいäŋįŽĄåēĢãŽãƒ­ã‚°ã‚¤ãƒŗã‚ĸイテムをčŋŊ加し、新しいã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļで開く", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "新しいã‚Ģãƒŧド", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "新しいäŋįŽĄåēĢぎã‚Ģãƒŧドã‚ĸイテムをčŋŊ加し、新しいã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļで開く", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "新しい ID", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "新しいäŋįŽĄåēĢ ID ã‚ĸイテムをčŋŊ加し、新しいã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļで開く", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden č‡Ē動å…ĨåŠ›ãƒĄãƒ‹ãƒĨãƒŧがありぞす。下įŸĸ印キãƒŧをæŠŧすと選択できぞす。", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ã‚ĒãƒŗãĢする" + }, + "ignore": { + "message": "į„ĄčĻ–" + }, + "importData": { + "message": "デãƒŧã‚ŋãŽã‚¤ãƒŗãƒãƒŧト", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "ã‚¤ãƒŗãƒãƒŧト エナãƒŧ" + }, + "importErrorDesc": { + "message": "ã‚¤ãƒŗãƒãƒŧトしようとしたデãƒŧã‚ŋãĢå•éĄŒãŒã‚ã‚Šãžã—ãŸã€‚äģĨ下ぎエナãƒŧをã‚Ŋãƒŧã‚šãƒ•ã‚Ąã‚¤ãƒĢã§č§Ŗæąēし、もう一åēĻã‚„ã‚Šį›´ã—ãĻください。" + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "äģĨ下ぎエナãƒŧã‚’č§ŖæąēしãĻã‚„ã‚Šį›´ã—ãĻください。" + }, + "description": { + "message": "čĒŦ明" + }, + "importSuccess": { + "message": "デãƒŧã‚ŋã‚’ã‚¤ãƒŗãƒãƒŧトしぞした" + }, + "importSuccessNumberOfItems": { + "message": "合荈 $AMOUNT$ äģļぎã‚ĸã‚¤ãƒ†ãƒ ã‚’ã‚¤ãƒŗãƒãƒŧトしぞした。", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "再čŠĻ行" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "こぎ操äŊœãĢはčĒč¨ŧがåŋ…čĻã§ã™ã€‚įļščĄŒã™ã‚‹ãĢは PIN ã‚’č¨­åŽšã—ãĻください。" + }, + "setPin": { + "message": "PIN ã‚’č¨­åŽš" + }, + "verifyWithBiometrics": { + "message": "į”ŸäŊ“čĒč¨ŧãĢよるįĸēčĒ" + }, + "awaitingConfirmation": { + "message": "įĸēčĒä¸­" + }, + "couldNotCompleteBiometrics": { + "message": "į”ŸäŊ“čĒč¨ŧを厌äē†ã§ããžã›ã‚“でした。" + }, + "needADifferentMethod": { + "message": "åˆĨãŽæ–šæŗ•ãŒåŋ…čĻã§ã™ã‹īŧŸ" + }, + "useMasterPassword": { + "message": "マ゚ã‚ŋãƒŧパ゚ワãƒŧドをäŊŋᔍ" + }, + "usePin": { + "message": "PIN をäŊŋᔍ" + }, + "useBiometrics": { + "message": "į”ŸäŊ“čĒč¨ŧをäŊŋᔍ" + }, + "enterVerificationCodeSentToEmail": { + "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚ãĢ送äŋĄã•れたčĒč¨ŧã‚ŗãƒŧドをå…Ĩ力しãĻください。" + }, + "resendCode": { + "message": "ã‚ŗãƒŧドを再送äŋĄã™ã‚‹" + }, + "total": { + "message": "合荈" + }, + "importWarning": { + "message": "$ORGANIZATION$ãĢデãƒŧã‚ŋã‚’ã‚¤ãƒŗãƒãƒŧトしãĻいぞす。デãƒŧã‚ŋはこぎįĩ„įš”ãŽãƒĄãƒŗãƒãƒŧã¨å…ąæœ‰ã•ã‚Œã‚‹å¯čƒŊ性がありぞす。įļščĄŒã—ぞすかīŧŸ", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Duo ã‚ĩãƒŧビ゚へぎæŽĨįļšä¸­ãĢエナãƒŧがį™ēį”Ÿã—ãžã—ãŸã€‚į•°ãĒるä猿ŽĩéšŽãƒ­ã‚°ã‚¤ãƒŗæ–šæŗ•ã‚’äŊŋį”¨ã™ã‚‹ã‹ã€Duo ãĢ逪įĩĄã—ãĻください。" + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗã‚’åŽŒäē†ã™ã‚‹ãĢは DUO をčĩˇå‹•し手順ãĢåž“ãŖãĻください。" + }, + "duoRequiredForAccount": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢは Duo ä猿Žĩ階čĒč¨ŧがåŋ…čĻã§ã™ã€‚" + }, + "popoutTheExtensionToCompleteLogin": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗã‚’åŽŒäē†ã™ã‚‹ãŸã‚ãĢæ‹Ąåŧĩ抟čƒŊを開きぞす。" + }, + "popoutExtension": { + "message": "æ‹Ąåŧĩ抟čƒŊぎポップã‚ĸップ" + }, + "launchDuo": { + "message": "DUO をčĩˇå‹•" + }, + "importFormatError": { + "message": "デãƒŧã‚ŋãŒæ­Ŗã—ã„åŊĸåŧã§ã¯ã‚ã‚Šãžã›ã‚“ã€‚ã‚¤ãƒŗãƒãƒŧãƒˆã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢをįĸēčĒã—ãĻã‚„ã‚Šį›´ã—ãĻください。" + }, + "importNothingError": { + "message": "äŊ•ã‚‚ã‚¤ãƒŗãƒãƒŧトされぞせんでした。" + }, + "importEncKeyError": { + "message": "エク゚ポãƒŧãƒˆã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢãŽåžŠåˇã§ã‚¨ãƒŠãƒŧがį™ēį”Ÿã—ãžã—ãŸã€‚æš—åˇåŒ–ã‚­ãƒŧが、デãƒŧã‚ŋをエク゚ポãƒŧトするためãĢäŊŋį”¨ã•ã‚ŒãŸæš—åˇåŒ–ã‚­ãƒŧã¨ä¸€č‡´ã—ãžã›ã‚“ã€‚" + }, + "invalidFilePassword": { + "message": "į„ĄåŠšãĒãƒ•ã‚Ąã‚¤ãƒĢパ゚ワãƒŧドです。エク゚ポãƒŧãƒˆãƒ•ã‚Ąã‚¤ãƒĢをäŊœæˆã—たときãĢå…Ĩ力したパ゚ワãƒŧドをäŊŋį”¨ã—ãĻください。" + }, + "destination": { + "message": "äŋå­˜å…ˆ" + }, + "learnAboutImportOptions": { + "message": "ã‚¤ãƒŗãƒãƒŧトã‚Ēãƒ—ã‚ˇãƒ§ãƒŗãŽčŠŗį´°" + }, + "selectImportFolder": { + "message": "フりãƒĢダãƒŧを選択" + }, + "selectImportCollection": { + "message": "ã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗã‚’é¸æŠž" + }, + "importTargetHint": { + "message": "ã‚¤ãƒŗãƒãƒŧãƒˆã—ãŸãƒ•ã‚Ąã‚¤ãƒĢã‚ŗãƒŗãƒ†ãƒŗãƒ„ã‚’ $DESTINATION$ ãĢį§ģ動したい場合は、こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’é¸æŠžã—ãĻください。", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "å‰˛ã‚ŠåŊ“ãĻられãĻいãĒいã‚ĸã‚¤ãƒ†ãƒ ãŒãƒ•ã‚Ąã‚¤ãƒĢãĢåĢぞれãĻいぞす。" + }, + "selectFormat": { + "message": "ã‚¤ãƒŗãƒãƒŧãƒˆã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎåŊĸåŧã‚’選択" + }, + "selectImportFile": { + "message": "ã‚¤ãƒŗãƒãƒŧãƒˆã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢを選択" + }, + "chooseFile": { + "message": "ãƒ•ã‚Ąã‚¤ãƒĢを選択" + }, + "noFileChosen": { + "message": "ãƒ•ã‚Ąã‚¤ãƒĢが選択されãĻいぞせん" + }, + "orCopyPasteFileContents": { + "message": "ãžãŸã¯ã‚¤ãƒŗãƒãƒŧãƒˆã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎ中čēĢã‚’ã‚ŗãƒ”ãƒŧしãĻč˛ŧりäģ˜ã‘" + }, + "instructionsFor": { + "message": "$NAME$ 向けぎčĒŦ明", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "äŋįŽĄåēĢãŽã‚¤ãƒŗãƒãƒŧトぎįĸēčĒ" + }, + "confirmVaultImportDesc": { + "message": "ã“ãŽãƒ•ã‚Ąã‚¤ãƒĢはパ゚ワãƒŧドでäŋč­ˇã•れãĻã„ãžã™ã€‚ã‚¤ãƒŗãƒãƒŧãƒˆã™ã‚‹ãƒ•ã‚Ąã‚¤ãƒĢぎパ゚ワãƒŧドをå…Ĩ力しãĻください。" + }, + "confirmFilePassword": { + "message": "ãƒ•ã‚Ąã‚¤ãƒĢパ゚ワãƒŧドぎįĸēčĒ" + }, + "exportSuccess": { + "message": "äŋįŽĄåēĢデãƒŧã‚ŋをエク゚ポãƒŧトしぞした" + }, + "typePasskey": { + "message": "パ゚キãƒŧ" + }, + "accessing": { + "message": "ã‚ĸクã‚ģ゚中" + }, + "passkeyNotCopied": { + "message": "パ゚キãƒŧã¯ã‚ŗãƒ”ãƒŧされぞせん" + }, + "passkeyNotCopiedAlert": { + "message": "パ゚キãƒŧã¯č¤‡čŖŊされたã‚ĸイテムãĢã‚ŗãƒ”ãƒŧされぞせん。こぎã‚ĸã‚¤ãƒ†ãƒ ã‚’č¤‡čŖŊしぞすかīŧŸ" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "開始ã‚ĩイトでぎčĒč¨ŧがåŋ…čĻã§ã™ã€‚ã“ãŽæŠŸčƒŊはマ゚ã‚ŋãƒŧパ゚ワãƒŧドぎãĒいã‚ĸã‚Ģã‚Ļãƒŗãƒˆã§ã¯ãžã å¯žåŋœã—ãĻいぞせん。" + }, + "logInWithPasskeyQuestion": { + "message": "パ゚キãƒŧã§ãƒ­ã‚°ã‚¤ãƒŗã—ãžã™ã‹?" + }, + "passkeyAlreadyExists": { + "message": "こぎã‚ĸプãƒĒãĢはすでãĢパ゚キãƒŧが存在しぞす。" + }, + "noPasskeysFoundForThisApplication": { + "message": "こぎã‚ĸプãƒĒãĢはパ゚キãƒŧがありぞせん。" + }, + "noMatchingPasskeyLogin": { + "message": "こぎã‚ĩイトãĢä¸€č‡´ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąãŒã‚ã‚Šãžã›ã‚“ã€‚" + }, + "noMatchingLoginsForSite": { + "message": "こぎã‚ĩイトãĢä¸€č‡´ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąãŒã‚ã‚Šãžã›ã‚“" + }, + "searchSavePasskeyNewLogin": { + "message": "パ゚キãƒŧを検į´ĸãžãŸã¯æ–°ã—ã„ãƒ­ã‚°ã‚¤ãƒŗã¨ã—ãĻäŋå­˜" + }, + "confirm": { + "message": "įĸēčĒ" + }, + "savePasskey": { + "message": "パ゚キãƒŧをäŋå­˜" + }, + "savePasskeyNewLogin": { + "message": "パ゚キãƒŧã‚’æ–°ã—ã„ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã¨ã—ãĻäŋå­˜" + }, + "chooseCipherForPasskeySave": { + "message": "こぎパ゚キãƒŧをäŋå­˜ã™ã‚‹ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ąã‚’é¸æŠžã—ãĻください" + }, + "chooseCipherForPasskeyAuth": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗãĢäŊŋうパ゚キãƒŧを選択しãĻください" + }, + "passkeyItem": { + "message": "パ゚キãƒŧã‚ĸイテム" + }, + "overwritePasskey": { + "message": "パ゚キãƒŧを上書きしぞすか?" + }, + "overwritePasskeyAlert": { + "message": "こぎã‚ĸイテムãĢはすでãĢパ゚キãƒŧがåĢぞれãĻã„ãžã™ã€‚įžåœ¨ãŽãƒ‘ã‚šã‚­ãƒŧを上書きしãĻもよろしいですか?" + }, + "featureNotSupported": { + "message": "抟čƒŊはæœĒ寞åŋœã§ã™" + }, + "yourPasskeyIsLocked": { + "message": "パ゚キãƒŧをäŊŋį”¨ã™ã‚‹ãĢはčĒč¨ŧがåŋ…čĻã§ã™ã€‚įļščĄŒã™ã‚‹ãĢはæœŦäēēįĸēčĒã‚’čĄŒãŖãĻください。" + }, + "multifactorAuthenticationCancelled": { + "message": "多čρᴠčĒč¨ŧãŒã‚­ãƒŖãƒŗã‚ģãƒĢされぞした" + }, + "noLastPassDataFound": { + "message": "LastPass デãƒŧã‚ŋがčĻ‹ã¤ã‹ã‚Šãžã›ã‚“" + }, + "incorrectUsernameOrPassword": { + "message": "ãƒĻãƒŧã‚ļãƒŧ名ぞたはパ゚ワãƒŧãƒ‰ãŒé–“é•ãŖãĻいぞす" + }, + "incorrectPassword": { + "message": "パ゚ワãƒŧドが違いぞす" + }, + "incorrectCode": { + "message": "ã‚ŗãƒŧドが違いぞす" + }, + "incorrectPin": { + "message": "PIN ãŒæ­Ŗã—ãã‚ã‚Šãžã›ã‚“" + }, + "multifactorAuthenticationFailed": { + "message": "多čρᴠčĒč¨ŧãĢå¤ąæ•—ã—ãžã—ãŸ" + }, + "includeSharedFolders": { + "message": "å…ąæœ‰ãƒ•ã‚ŠãƒĢダãƒŧをåĢめる" + }, + "lastPassEmail": { + "message": "LastPass ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚" + }, + "importingYourAccount": { + "message": "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’ã‚¤ãƒŗãƒãƒŧトしãĻいぞす..." + }, + "lastPassMFARequired": { + "message": "LastPass ぎ多čρᴠčĒč¨ŧがåŋ…čĻã§ã™" + }, + "lastPassMFADesc": { + "message": "čĒč¨ŧã‚ĸプãƒĒãĢ襨į¤ēされãĻã„ã‚‹ãƒ¯ãƒŗã‚ŋã‚¤ãƒ ãƒ‘ã‚šã‚ŗãƒŧドをå…Ĩ力しãĻください" + }, + "lastPassOOBDesc": { + "message": "čĒč¨ŧã‚ĸプãƒĒã§ãƒ­ã‚°ã‚¤ãƒŗčĻæą‚ã‚’æ‰ŋčĒã™ã‚‹ã‹ã€ãƒ¯ãƒŗã‚ŋã‚¤ãƒ ãƒ‘ã‚šã‚ŗãƒŧドをå…Ĩ力しãĻください。" + }, + "passcode": { + "message": "ãƒ‘ã‚šã‚ŗãƒŧド" + }, + "lastPassMasterPassword": { + "message": "LastPass マ゚ã‚ŋãƒŧパ゚ワãƒŧド" + }, + "lastPassAuthRequired": { + "message": "LastPass čĒč¨ŧがåŋ…čĻã§ã™" + }, + "awaitingSSO": { + "message": "SSO čĒč¨ŧを垅抟中" + }, + "awaitingSSODesc": { + "message": "äŧšį¤žãŽčŗ‡æ ŧæƒ…å ąã‚’äŊŋį”¨ã—ãĻãƒ­ã‚°ã‚¤ãƒŗã‚’įļšã‘ãĻください。" + }, + "seeDetailedInstructions": { + "message": "čŠŗį´°ãĒæ‰‹é †ã¯ã“ãĄã‚‰ã‚’ã”čĻ§ãã ã•ã„īŧš", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "LastPass ã‹ã‚‰į›´æŽĨã‚¤ãƒŗãƒãƒŧト" + }, + "importFromCSV": { + "message": "CSV ã‹ã‚‰ã‚¤ãƒŗãƒãƒŧト" + }, + "lastPassTryAgainCheckEmail": { + "message": "もう一åēĻおčŠĻしいただくか、LastPass ã‹ã‚‰ãŽãƒĄãƒŧãƒĢをæŽĸしãĻčĒč¨ŧしãĻください。" + }, + "collection": { + "message": "ã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗ" + }, + "lastPassYubikeyDesc": { + "message": "LastPass ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢé–ĸ逪äģ˜ã‘られた YubiKey を USB ポãƒŧトãĢæŒŋå…Ĩし、ボã‚ŋãƒŗã‚’ã‚ŋッチしãĻください。" + }, + "switchAccount": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽåˆ‡ã‚Šæ›ŋえ" + }, + "switchAccounts": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽåˆ‡ã‚Šæ›ŋえ" + }, + "switchToAccount": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢ切りæ›ŋえ" + }, + "activeAccount": { + "message": "ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–ãĒã‚ĸã‚Ģã‚Ļãƒŗãƒˆ" + }, + "availableAccounts": { + "message": "åˆŠį”¨å¯čƒŊãĒã‚ĸã‚Ģã‚Ļãƒŗãƒˆ" + }, + "accountLimitReached": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽåˆļ限ãĢ達しぞした。åˆĨぎã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’čŋŊ加するãĢはぞずログã‚ĸã‚ĻトしãĻください。" + }, + "active": { + "message": "ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–" + }, + "locked": { + "message": "ロック中" + }, + "unlocked": { + "message": "ãƒ­ãƒƒã‚¯č§Ŗé™¤æ¸ˆãŋ" + }, + "server": { + "message": "ã‚ĩãƒŧバãƒŧ" + }, + "hostedAt": { + "message": "ポト" + }, + "useDeviceOrHardwareKey": { + "message": "デバイ゚ぞたはハãƒŧドã‚Ļェã‚ĸキãƒŧをäŊŋį”¨ã—ãĻください" + }, + "justOnce": { + "message": "äģŠå›žã ã‘" + }, + "alwaysForThisSite": { + "message": "こぎã‚ĩイトでは常ãĢ" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ ã‚’é™¤å¤–ãƒ‰ãƒĄã‚¤ãƒŗãĢčŋŊ加しぞした。", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "一čˆŦįš„ãĒåŊĸåŧ", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "ブナã‚Ļã‚ļãŽč¨­åŽšãĢ進ãŋぞすかīŧŸ", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "ヘãƒĢプã‚ģãƒŗã‚ŋãƒŧãĢ進ãŋぞすか?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "ブナã‚Ļã‚ļぎč‡Ē動å…Ĩ力とパ゚ワãƒŧãƒ‰įŽĄį†č¨­åŽšã‚’å¤‰æ›´ã—ãžã™ã€‚", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "æ‹Ąåŧĩ抟čƒŊãŽã‚ˇãƒ§ãƒŧトã‚Ģットはブナã‚Ļã‚ļãŽč¨­åŽšã§čĄ¨į¤ēãŠã‚ˆãŗč¨­åŽšã§ããžã™ã€‚", + "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": "ブナã‚Ļã‚ļぎč‡Ē動å…Ĩ力とパ゚ワãƒŧãƒ‰įŽĄį†č¨­åŽšã‚’å¤‰æ›´ã—ãžã™ã€‚", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "æ‹Ąåŧĩ抟čƒŊãŽã‚ˇãƒ§ãƒŧトã‚Ģットはブナã‚Ļã‚ļãŽč¨­åŽšã§čĄ¨į¤ēãŠã‚ˆãŗč¨­åŽšã§ããžã™ã€‚", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Bitwarden をデフりãƒĢトぎパ゚ワãƒŧドマネãƒŧã‚¸ãƒŖãƒŧãĢしぞすかīŧŸ", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’į„ĄčĻ–ã™ã‚‹ã¨ã€Bitwarden ぎč‡Ē動å…ĨåŠ›ãƒĄãƒ‹ãƒĨãƒŧとブナã‚Ļã‚ļぎč‡Ē動å…ĨåŠ›ãƒĄãƒ‹ãƒĨãƒŧがįĢļ合する可čƒŊ性がありぞす。", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Bitwarden をデフりãƒĢトぎパ゚ワãƒŧドマネãƒŧã‚¸ãƒŖãƒŧãĢする", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Bitwarden をデフりãƒĢトぎパ゚ワãƒŧドマネãƒŧã‚¸ãƒŖãƒŧとしãĻč¨­åŽšã§ããžã›ã‚“", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Bitwarden をデフりãƒĢトぎパ゚ワãƒŧドマネãƒŧã‚¸ãƒŖãƒŧとしãĻč¨­åŽšã™ã‚‹ãĢは、ブナã‚Ļã‚ļãŽãƒ—ãƒŠã‚¤ãƒã‚ˇãƒŧ樊限をäģ˜ä¸Žã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "デフりãƒĢトãĢする", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "čĒč¨ŧæƒ…å ąã‚’äŋå­˜ã—ぞしたīŧ", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "パ゚ワãƒŧドをäŋå­˜ã—ぞした!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "čĒč¨ŧæƒ…å ąã‚’æ›´æ–°ã—ãžã—ãŸīŧ", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "パ゚ワãƒŧドを更新しぞした!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "čŗ‡æ ŧæƒ…å ąãŽäŋå­˜ä¸­ãĢエナãƒŧがį™ēį”Ÿã—ãžã—ãŸã€‚čŠŗį´°ã¯ã‚ŗãƒŗã‚ŊãƒŧãƒĢをįĸēčĒã—ãĻください。", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "成功" + }, + "removePasskey": { + "message": "パ゚キãƒŧを削除" + }, + "passkeyRemoved": { + "message": "パ゚キãƒŧを削除しぞした" + }, + "autofillSuggestions": { + "message": "å€™čŖœã‚’č‡Ē動å…Ĩ力する" + }, + "autofillSuggestionsTip": { + "message": "č‡Ē動å…Ĩ力するためãĢこぎã‚ĩã‚¤ãƒˆãŽãƒ­ã‚°ã‚¤ãƒŗã‚ĸイテムをäŋå­˜ã—ぞす" + }, + "yourVaultIsEmpty": { + "message": "äŋįŽĄåēĢがįŠēです" + }, + "noItemsMatchSearch": { + "message": "検į´ĸæĄäģļãĢä¸€č‡´ã™ã‚‹ã‚ĸイテムがありぞせん" + }, + "clearFiltersOrTryAnother": { + "message": "ãƒ•ã‚ŖãƒĢã‚ŋをクãƒĒã‚ĸするか、åˆĨぎ検į´ĸワãƒŧドをおčŠĻしください" + }, + "copyInfoTitle": { + "message": "æƒ…å ąã‚’ã‚ŗãƒ”ãƒŧ - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "ãƒĄãƒĸã‚’ã‚ŗãƒ”ãƒŧ - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "$ITEMNAME$ ぎそぎäģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "そぎäģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "ã‚ĸã‚¤ãƒ†ãƒ ã‚’čĄ¨į¤ē - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "č‡Ē動å…Ĩ力 - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "ã‚ŗãƒ”ãƒŧする値がありぞせん" + }, + "assignToCollections": { + "message": "ã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗãĢå‰˛ã‚ŠåŊ“ãĻ" + }, + "copyEmail": { + "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦã‚šã‚’ã‚ŗãƒ”ãƒŧ" + }, + "copyPhone": { + "message": "é›ģ芹į•Ēåˇã‚’ã‚ŗãƒ”ãƒŧ" + }, + "copyAddress": { + "message": "äŊæ‰€ã‚’ã‚ŗãƒ”ãƒŧ" + }, + "adminConsole": { + "message": "įŽĄį†ã‚ŗãƒŗã‚ŊãƒŧãƒĢ" + }, + "accountSecurity": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽã‚ģキãƒĨãƒĒãƒ†ã‚Ŗ" + }, + "notifications": { + "message": "通įŸĨ" + }, + "appearance": { + "message": "外čĻŗ" + }, + "errorAssigningTargetCollection": { + "message": "ã‚ŋãƒŧã‚˛ãƒƒãƒˆã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗãŽå‰˛ã‚ŠåŊ“ãĻãĢå¤ąæ•—ã—ãžã—ãŸã€‚" + }, + "errorAssigningTargetFolder": { + "message": "ã‚ŋãƒŧã‚˛ãƒƒãƒˆãƒ•ã‚ŠãƒĢダãƒŧãŽå‰˛ã‚ŠåŊ“ãĻãĢå¤ąæ•—ã—ãžã—ãŸã€‚" + }, + "viewItemsIn": { + "message": "$NAME$ ぎã‚ĸã‚¤ãƒ†ãƒ ã‚’čĄ¨į¤ē", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "$NAME$ ãĢæˆģる", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "新čĻäŊœæˆ" + }, + "removeItem": { + "message": "$NAME$ を削除", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "フりãƒĢダãƒŧがãĒいã‚ĸイテム" + }, + "itemDetails": { + "message": "ã‚ĸã‚¤ãƒ†ãƒ ãŽčŠŗį´°" + }, + "itemName": { + "message": "ã‚ĸイテム名" + }, + "cannotRemoveViewOnlyCollections": { + "message": "襨į¤ēぎãŋぎ樊限が与えられãĻã„ã‚‹ã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗã‚’å‰Šé™¤ã™ã‚‹ã“ã¨ã¯ã§ããžã›ã‚“: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "įĩ„įš”ã¯į„ĄåŠšåŒ–ã•ã‚ŒãĻいぞす" + }, + "owner": { + "message": "æ‰€æœ‰č€…" + }, + "selfOwnershipLabel": { + "message": "あãĒた", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "į„ĄåŠšåŒ–ã•ã‚ŒãŸįĩ„įš”ãŽã‚ĸイテムãĢã‚ĸクã‚ģ゚することはできぞせん。įĩ„įš”ãŽæ‰€æœ‰č€…ãĢ逪įĩĄã—ãĻください。" + }, + "additionalInformation": { + "message": "そぎäģ–ãŽæƒ…å ą" + }, + "itemHistory": { + "message": "ã‚ĸイテムåąĨæ­´" + }, + "lastEdited": { + "message": "最įĩ‚æ›´æ–°æ—Ĩ" + }, + "ownerYou": { + "message": "æ‰€æœ‰č€…: あãĒた" + }, + "linked": { + "message": "ãƒĒãƒŗã‚¯æ¸ˆ" + }, + "copySuccessful": { + "message": "ã‚ŗãƒ”ãƒŧしぞした" + }, + "upload": { + "message": "ã‚ĸップロãƒŧド" + }, + "addAttachment": { + "message": "æˇģäģ˜ãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加" + }, + "maxFileSizeSansPunctuation": { + "message": "ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēぎ上限は 500MB です" + }, + "deleteAttachmentName": { + "message": "æˇģäģ˜ãƒ•ã‚Ąã‚¤ãƒĢ $NAME$ を削除", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "$NAME$ をダã‚Ļãƒŗãƒ­ãƒŧド", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "こぎæˇģäģ˜ãƒ•ã‚Ąã‚¤ãƒĢを厌全ãĢ削除しãĻもよろしいですかīŧŸ" + }, + "premium": { + "message": "プãƒŦミã‚ĸム" + }, + "freeOrgsCannotUseAttachments": { + "message": "į„Ąæ–™ãŽįĩ„įš”ã¯æˇģäģ˜ãƒ•ã‚Ąã‚¤ãƒĢをäŊŋį”¨ã§ããžã›ã‚“" + }, + "filters": { + "message": "ãƒ•ã‚ŖãƒĢã‚ŋãƒŧ" + }, + "personalDetails": { + "message": "個äē翃…å ą" + }, + "identification": { + "message": "ID" + }, + "contactInfo": { + "message": "逪įĩĄå…ˆæƒ…å ą" + }, + "downloadAttachment": { + "message": "ダã‚Ļãƒŗãƒ­ãƒŧド - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "ã‚Ģãƒŧドį•ĒåˇãŽæœĢå°ž", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "ãƒ­ã‚°ã‚¤ãƒŗæƒ…å ą" + }, + "authenticatorKey": { + "message": "čĒč¨ŧキãƒŧ" + }, + "autofillOptions": { + "message": "č‡Ē動å…Ĩ力ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ" + }, + "websiteUri": { + "message": "ã‚Ļェブã‚ĩイト (URI)" + }, + "websiteUriCount": { + "message": "ã‚Ļェブã‚ĩイト (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "ã‚Ļェブã‚ĩイトをčŋŊ加しぞした" + }, + "addWebsite": { + "message": "ã‚Ļェブã‚ĩイトをčŋŊ加" + }, + "deleteWebsite": { + "message": "ã‚Ļェブã‚ĩイトを削除" + }, + "defaultLabel": { + "message": "デフりãƒĢト ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "ä¸€č‡´æ¤œå‡ē $WEBSITE$ã‚’čĄ¨į¤ē", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "ä¸€č‡´æ¤œå‡ē $WEBSITE$ã‚’éžčĄ¨į¤ē", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "ペãƒŧジčĒ­ãŋčžŧãŋ時ãĢč‡Ē動å…Ĩ力する" + }, + "cardExpiredTitle": { + "message": "期限切れぎã‚Ģãƒŧド" + }, + "cardExpiredMessage": { + "message": "ã‚Ģãƒŧãƒ‰ãŽæ›´æ–°ãŒã‚ãŖãŸå ´åˆã€ã‚Ģãƒŧãƒ‰æƒ…å ąã‚’æ›´æ–°ã—ãĻください" + }, + "cardDetails": { + "message": "ã‚Ģãƒŧãƒ‰æƒ…å ą" + }, + "cardBrandDetails": { + "message": "$BRAND$ ãŽčŠŗį´°", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "ã‚ĸãƒ‹ãƒĄãƒŧã‚ˇãƒ§ãƒŗã‚’æœ‰åŠšåŒ–" + }, + "showAnimations": { + "message": "ã‚ĸãƒ‹ãƒĄãƒŧã‚ˇãƒ§ãƒŗã‚’čĄ¨į¤ē" + }, + "addAccount": { + "message": "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆã‚’čŋŊ加" + }, + "loading": { + "message": "čĒ­ãŋčžŧãŋ中" + }, + "data": { + "message": "デãƒŧã‚ŋ" + }, + "passkeys": { + "message": "パ゚キãƒŧ", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "パ゚ワãƒŧド", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "パ゚キãƒŧã§ãƒ­ã‚°ã‚¤ãƒŗ", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "å‰˛ã‚ŠåŊ“ãĻ" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "ã“ã‚Œã‚‰ãŽã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗãĢã‚ĸクã‚ģ゚できるįĩ„įš”ãƒĄãƒŗãƒãƒŧぎãŋがã‚ĸイテムをčĻ‹ã‚‹ã“ã¨ãŒã§ããžã™ã€‚" + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "ã“ã‚Œã‚‰ãŽã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗãĢã‚ĸクã‚ģ゚できるįĩ„įš”ãƒĄãƒŗãƒãƒŧぎãŋがã‚ĸイテムをčĻ‹ã‚‹ã“ã¨ãŒã§ããžã™ã€‚" + }, + "bulkCollectionAssignmentWarning": { + "message": "$TOTAL_COUNT$ ã‚ĸã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ãžã—ãŸã€‚įˇ¨é›†æ¨Šé™ãŒãĒいため、$READONLY_COUNT$ ã‚ĸイテムを更新できぞせん。", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "ãƒ•ã‚ŖãƒŧãƒĢドをčŋŊ加" + }, + "add": { + "message": "čŋŊ加" + }, + "fieldType": { + "message": "ãƒ•ã‚ŖãƒŧãƒĢドã‚ŋイプ" + }, + "fieldLabel": { + "message": "ãƒ•ã‚ŖãƒŧãƒĢドナベãƒĢ" + }, + "textHelpText": { + "message": "ã‚ģキãƒĨãƒĒãƒ†ã‚ŖãĢé–ĸするčŗĒ問ãĒおぎデãƒŧã‚ŋãĢã¯ãƒ†ã‚­ã‚šãƒˆãƒ•ã‚ŖãƒŧãƒĢドをäŊŋį”¨ã—ãžã™" + }, + "hiddenHelpText": { + "message": "パ゚ワãƒŧドぎようãĒ抟密デãƒŧã‚ŋãĢã¯éžčĄ¨į¤ēãƒ•ã‚ŖãƒŧãƒĢドをäŊŋį”¨ã—ãžã™" + }, + "checkBoxHelpText": { + "message": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦã‚šãŽč¨˜æ†ļãĒおぎフりãƒŧムぎチェックボック゚をč‡Ē動å…Ĩ力する場合はチェックボック゚をäŊŋį”¨ã—ãžã™" + }, + "linkedHelpText": { + "message": "į‰šåŽšãŽã‚Ļェブã‚ĩイトでč‡Ē動å…ĨåŠ›ãŽå•éĄŒãŒį™ēį”Ÿã—ãĻいる場合は、ãƒĒãƒŗã‚¯ã•ã‚ŒãŸãƒ•ã‚ŖãƒŧãƒĢドをäŊŋį”¨ã—ãžã™" + }, + "linkedLabelHelpText": { + "message": "ãƒ•ã‚ŖãƒŧãƒĢドぎ HTML ID、名前、aria-label、ぞたはプãƒŦãƒŧ゚ホãƒĢダをå…Ĩ力しぞす" + }, + "editField": { + "message": "ãƒ•ã‚ŖãƒŧãƒĢãƒ‰ã‚’įˇ¨é›†" + }, + "editFieldLabel": { + "message": "$LABEL$ ã‚’įˇ¨é›†", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "$LABEL$ を削除", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ をčŋŊ加しぞした", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "$LABEL$ ぎ順åēã‚’変更しぞす。įŸĸ印キãƒŧをæŠŧすとã‚ĸイテムを上下ãĢį§ģ動しぞす。", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ を上ãĢį§ģ動しぞした。$INDEX$ / $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "å‰˛ã‚ŠåŊ“ãĻã‚‹ã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗã‚’é¸æŠž" + }, + "personalItemTransferWarningSingular": { + "message": "1個ぎã‚ĸイテムは選択したįĩ„įš”ãĢæ’äš…įš„ãĢį§ģčĄŒã•ã‚Œãžã™ã€‚ã“ãŽã‚ĸイテムはあãĒたぎ所有ではãĒくãĒりぞす。" + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ 個ぎã‚ĸイテムは選択したįĩ„įš”ãĢæ’äš…įš„ãĢį§ģčĄŒã•ã‚Œãžã™ã€‚ã“ã‚Œã‚‰ãŽã‚ĸイテムはあãĒたぎ所有ではãĒくãĒりぞす。", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1個ぎã‚ĸイテムは $ORG$ ãĢæ’äš…įš„ãĢį§ģčĄŒã•ã‚Œãžã™ã€‚ã“ãŽã‚ĸイテムはあãĒたぎ所有ではãĒくãĒりぞす。", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ 個ぎã‚ĸイテムは $ORG$ ãĢæ’äš…įš„ãĢį§ģčĄŒã•ã‚Œãžã™ã€‚ã“ã‚Œã‚‰ãŽã‚ĸイテムはあãĒたぎ所有ではãĒくãĒりぞす。", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "ã‚ŗãƒŦã‚¯ã‚ˇãƒ§ãƒŗãŽå‰˛ã‚ŠåŊ“ãĻãĢ成功しぞした" + }, + "nothingSelected": { + "message": "äŊ•も選択されãĻいぞせん。" + }, + "movedItemsToOrg": { + "message": "選択したã‚ĸイテムを $ORGNAME$ ãĢį§ģ動しぞした", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "ã‚ĸイテムを $ORGNAME$ ãĢį§ģ動しぞした", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "ã‚ĸイテムを $ORGNAME$ ãĢį§ģ動しぞした", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ を下ãĢį§ģ動しぞした。$INDEX$ / $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "ã‚ĸイテムぎ場所" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "ãƒ•ã‚Ąã‚¤ãƒĢ Send" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "テキ゚ト Send" + }, + "bitwardenNewLook": { + "message": "Bitwarden が新しい外čĻŗãĢãĒりぞした。" + }, + "bitwardenNewLookDesc": { + "message": "äŋįŽĄåēĢã‚ŋブからぎč‡Ē動å…Ĩ力と検į´ĸがこれぞでäģĨ上ãĢį°Ąå˜ã§į›´æ„Ÿįš„ãĢãĒりぞした。" + }, + "accountActions": { + "message": "ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãŽæ“äŊœ" + }, + "showNumberOfAutofillSuggestions": { + "message": "æ‹Ąåŧĩ抟čƒŊã‚ĸã‚¤ã‚ŗãƒŗãĢãƒ­ã‚°ã‚¤ãƒŗč‡Ē動å…ĨåŠ›ãŽå€™čŖœãŽæ•°ã‚’čĄ¨į¤ēする" + }, + "systemDefault": { + "message": "ã‚ˇã‚šãƒ†ãƒ ãŽãƒ‡ãƒ•ã‚ŠãƒĢト" + }, + "enterprisePolicyRequirementsApplied": { + "message": "ã‚¨ãƒŗã‚ŋãƒŧプナイã‚ēポãƒĒã‚ˇãƒŧčρäģļãŒã“ãŽč¨­åŽšãĢéŠį”¨ã•ã‚Œãžã—ãŸ" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "再čŠĻ行" + }, + "vaultCustomTimeoutMinimum": { + "message": "ã‚Ģ゚ã‚ŋムã‚ŋイムã‚ĸã‚Ļトぎ最小値は1分です。" + }, + "additionalContentAvailable": { + "message": "čŋŊåŠ ã‚ŗãƒŗãƒ†ãƒŗãƒ„ãŒåˆŠį”¨å¯čƒŊです" + }, + "fileSavedToDevice": { + "message": "ãƒ•ã‚Ąã‚¤ãƒĢをデバイ゚ãĢäŋå­˜ã—ぞした。デバイ゚ぎダã‚Ļãƒŗãƒ­ãƒŧãƒ‰ã§įŽĄį†ã§ããžã™ã€‚" + }, + "showCharacterCount": { + "message": "æ–‡å­—æ•°ã‚’čĄ¨į¤ē" + }, + "hideCharacterCount": { + "message": "文字数を隠す" + }, + "itemsInTrash": { + "message": "ã‚´ãƒŸįŽąãĢあるã‚ĸイテム" + }, + "noItemsInTrash": { + "message": "ã‚´ãƒŸįŽąãĢã‚ĸイテムはありぞせん" + }, + "noItemsInTrashDesc": { + "message": "削除したã‚ĸイテムはここãĢ襨į¤ēされ、30æ—Ĩ垌ãĢ厌全ãĢ削除されぞす" + }, + "trashWarning": { + "message": "30æ—ĨäģĨä¸Šã‚´ãƒŸįŽąãĢã‚ãŖãŸã‚ĸイテムはč‡Ēå‹•įš„ãĢ削除されぞす" + }, + "restore": { + "message": "垊元" + }, + "deleteForever": { + "message": "厌全ãĢ削除" + }, + "noEditPermissions": { + "message": "こぎã‚ĸã‚¤ãƒ†ãƒ ã‚’įˇ¨é›†ã™ã‚‹æ¨Šé™ãŒã‚ã‚Šãžã›ã‚“" + }, + "authenticating": { + "message": "čĒč¨ŧ中" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index c6503b69df3..45d26f402ce 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "ანგარიშის შეáƒĨმნა" }, - "login": { - "message": "ავáƒĸორიზაáƒĒია" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -29,10 +47,10 @@ "message": "áƒ“áƒáƒŽáƒŖáƒ áƒ•áƒ" }, "submit": { - "message": "დადასáƒĸáƒŖáƒ áƒ”áƒ‘áƒ" + "message": "გადაáƒĒემა" }, "emailAddress": { - "message": "ელ-ფოსáƒĸა" + "message": "ელფოსáƒĸიქ მისამართი" }, "masterPass": { "message": "Master password" @@ -43,17 +61,45 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { - "message": "Tab" + "message": "ჩანართი" }, "vault": { - "message": "Vault" + "message": "ქაáƒĒავი" }, "myVault": { "message": "My vault" @@ -65,7 +111,7 @@ "message": "ხელსაáƒŦყოები" }, "settings": { - "message": "პარამეáƒĸრები" + "message": "მორგება" }, "currentTab": { "message": "Current tab" @@ -73,6 +119,9 @@ "copyPassword": { "message": "პაროლის კოპირება" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "áƒŖáƒĄáƒáƒ¤áƒ áƒ—áƒŽáƒáƒ”áƒ‘áƒ˜áƒĄ კოდის კოპირება" }, + "copyName": { + "message": "სახელის კოპირება" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "თვითშევსება" + "message": "ავáƒĸომაáƒĸáƒŖáƒ áƒ˜ შევსება" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,13 +223,25 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "ავáƒĸორიზაáƒĒიიქ დამაáƒĸება" }, "addItem": { - "message": "Add item" + "message": "ელემენáƒĸიქ დამაáƒĸება" + }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" }, "passwordHint": { "message": "Password hint" @@ -137,17 +265,35 @@ "message": "კოდი გაიგზავნა" }, "verificationCode": { - "message": "ერთჯერადი კოდი" + "message": "გადამოáƒŦმების კოდი" }, "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "ანგარიში" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -160,11 +306,47 @@ "message": "áƒáƒ áƒĄáƒáƒ¤áƒ”áƒŽáƒŖáƒ áƒ˜áƒáƒœáƒ˜ ავáƒĸორიზაáƒĒია" }, "logOut": { - "message": "გამოსვლა" + "message": "ქიქáƒĸემიდან გასვლა" + }, + "aboutBitwarden": { + "message": "About Bitwarden" }, "about": { "message": "შესახებ" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "ვერსია" }, @@ -172,7 +354,7 @@ "message": "შენახვა" }, "move": { - "message": "Move" + "message": "გადაáƒĸანა" }, "addFolder": { "message": "ქაáƒĨაáƒĻალდის დამაáƒĸება" @@ -181,7 +363,25 @@ "message": "სახელი" }, "editFolder": { - "message": "ქაáƒĨაáƒĻალდის რედაáƒĨáƒĸირება" + "message": "ქაáƒĨაáƒĻალდის ჊აქáƒŦორება" + }, + "newFolder": { + "message": "ახალი ქაáƒĨაáƒĻალდე" + }, + "folderName": { + "message": "ქაáƒĨაáƒĻალდის სახელი" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" }, "deleteFolder": { "message": "ქაáƒĨაáƒĻალდის áƒŦაშლა" @@ -193,7 +393,7 @@ "message": "There are no folders to list." }, "helpFeedback": { - "message": "დახმარება & áƒ’áƒáƒ›áƒáƒŽáƒ›áƒáƒŖáƒ áƒ”áƒ‘áƒ" + "message": "დახმარება და áƒŖáƒ™áƒŖáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ˜" }, "helpCenter": { "message": "Bitwarden Help center" @@ -211,50 +411,96 @@ "message": "Sync vault now" }, "lastSync": { - "message": "Last sync:" + "message": "ბოლო სინáƒĨი:" }, "passGen": { "message": "Password generator" }, "generator": { - "message": "Generator", - "description": "Short for 'Password Generator'." + "message": "გენერაáƒĸორი", + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" }, "select": { - "message": "მონიშვნა" + "message": "არჩევა" }, "generatePassword": { - "message": "Generate password" + "message": "პაროლის გენერირება" + }, + "generatePassphrase": { + "message": "Generate passphrase" }, "regeneratePassword": { "message": "Regenerate password" }, "options": { - "message": "პარამეáƒĸრები" + "message": "მორგება" }, "length": { "message": "სიგრáƒĢე" }, + "passwordMinLength": { + "message": "პაროლის áƒ›áƒ˜áƒœáƒ˜áƒ›áƒáƒšáƒŖáƒ áƒ˜ სიგრáƒĢე" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "ჩართვა", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "ა-ჰ", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ქიáƒĸყვათა რაოდენობა" @@ -263,7 +509,7 @@ "message": "Word separator" }, "capitalize": { - "message": "დიდი ასოთი აáƒĻნიშვნა", + "message": "მაáƒĻალ რეგისáƒĸრში გადაყვანა", "description": "Make the first letter of a work uppercase." }, "includeNumber": { @@ -276,16 +522,25 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" }, "edit": { - "message": "შეáƒĒვლა" + "message": "჊აქáƒŦორება" }, "view": { - "message": "ნახვა" + "message": "ხედი" }, "noItemsInList": { "message": "There are no items to list." @@ -299,38 +554,65 @@ "password": { "message": "პაროლი" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { - "message": "Passphrase" + "message": "საკვანáƒĢო ქიáƒĸყვა" }, "favorite": { "message": "áƒ áƒŠáƒ”áƒŖáƒšáƒ˜" }, + "unfavorite": { + "message": "áƒ áƒŠáƒ”áƒŖáƒšáƒ”áƒ‘áƒ˜áƒ“áƒáƒœ áƒŦაშლა" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { - "message": "Notes" + "message": "შენიშვნები" + }, + "privateNote": { + "message": "პირადი მინაáƒŦერი" }, "note": { - "message": "Note" + "message": "შენიშვნა" }, "editItem": { - "message": "Edit item" + "message": "ჩანაáƒŦერის ჊აქáƒŦორება" }, "folder": { "message": "ქაáƒĨაáƒĻალდე" }, "deleteItem": { - "message": "Delete item" + "message": "ჩანაáƒŦერის áƒŦაშლა" }, "viewItem": { "message": "View item" }, "launch": { - "message": "Launch" + "message": "გაშვება" + }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } }, "website": { "message": "ვებგვერდი" }, "toggleVisibility": { - "message": "Toggle visibility" + "message": "áƒŽáƒ˜áƒšáƒŖáƒšáƒáƒ‘áƒ˜áƒĄ გადართვა" }, "manage": { "message": "მართვა" @@ -338,9 +620,24 @@ "other": { "message": "სხვა" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "სხვა პარამეáƒĸრები" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,8 +653,17 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { - "message": "გახსნა" + "message": "განბლოკვა" }, "loggedInAsOn": { "message": "Logged in as $EMAIL$ on $HOSTNAME$.", @@ -378,11 +684,17 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "მოლოდინის ვადა" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { - "message": "áƒ“áƒáƒŖáƒ§áƒáƒœáƒ”áƒ‘áƒšáƒ˜áƒ•" + "message": "áƒ“áƒáƒŖáƒ§áƒáƒ•áƒœáƒ”áƒ‘áƒšáƒ˜áƒ•" }, "tenSeconds": { "message": "10 áƒŦამი" @@ -426,14 +738,26 @@ "security": { "message": "áƒŖáƒĄáƒáƒ¤áƒ áƒ—áƒŽáƒáƒ”áƒ‘áƒ" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "დაფიáƒĨსირდა შეáƒĒდომა" }, "emailRequired": { - "message": "ელ-ფოსáƒĸიქ მისამართი áƒáƒŖáƒĒილებელია." + "message": "ელფოსáƒĸიქ მისამართი áƒáƒŖáƒĒილებელია." }, "invalidEmail": { - "message": "არაქáƒŦორი ელ-ფოსáƒĸიქ მისამართი." + "message": "არაქáƒŦორი ელფოსáƒĸიქ მისამართი." }, "masterPasswordRequired": { "message": "Master password is required." @@ -457,14 +781,29 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { - "message": "ერთჯერადი კოდი áƒáƒŖáƒĒილებელია." + "message": "გადამოáƒŦმების კოდი áƒáƒŖáƒĒილებელია." + }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "არაქáƒŦორი გადამოáƒŦმების კოდი" }, "valueCopied": { "message": "$VALUE$ copied", @@ -477,19 +816,64 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { - "message": "Logged out" + "message": "გამოხვედით" + }, + "loggedOutDesc": { + "message": "You have been logged out of your account." }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "შესვლა" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { - "message": "Are you sure you want to log out?" + "message": "დარáƒŦáƒ›áƒŖáƒœáƒ”áƒ‘áƒŖáƒšáƒ˜ ბრáƒĢანდებით, რომ გნებავთ, გახვიდეთ?" }, "yes": { - "message": "Yes" + "message": "კი" }, "no": { "message": "არა" @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -534,7 +918,7 @@ "message": "Syncing failed" }, "passwordCopied": { - "message": "Password copied" + "message": "პაროლი დაკოპირდა" }, "uri": { "message": "URI" @@ -550,7 +934,11 @@ } }, "newUri": { - "message": "New URI" + "message": "ახალი URI" + }, + "addDomain": { + "message": "დომენის დამაáƒĸება", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." }, "addedItem": { "message": "Item added" @@ -580,35 +968,47 @@ "message": "Search folder" }, "searchCollection": { - "message": "Search collection" + "message": "კოლეáƒĨáƒĒიაში áƒĢებნა" }, "searchType": { "message": "Search type" }, "noneFolder": { - "message": "No folder", + "message": "ქაáƒĨაáƒĻალდის გარეშე", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { - "message": "Clear clipboard", + "message": "áƒ‘áƒŖáƒ¤áƒ”áƒ áƒ˜áƒĄ áƒ’áƒáƒĄáƒŖáƒ¤áƒ—áƒáƒ•áƒ”áƒ‘áƒ", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { @@ -619,7 +1019,7 @@ "message": "Should Bitwarden remember this password for you?" }, "notificationAddSave": { - "message": "Save" + "message": "შენახვა" }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" @@ -627,57 +1027,102 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, "notificationChangeSave": { - "message": "Update" + "message": "განახლება" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { - "message": "Unlock" + "message": "განბლოკვა" + }, + "additionalOptions": { + "message": "დამაáƒĸებითი პარამეáƒĸრები" }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { - "message": "Theme" + "message": "თემა" }, "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { - "message": "Dark", + "message": "ბნელი", "description": "Dark color" }, "light": { - "message": "Light", + "message": "áƒĻია", "description": "Light color" }, "solarizedDark": { - "message": "Solarized dark", + "message": "áƒĄáƒáƒšáƒáƒ áƒ˜áƒ–áƒ”áƒ‘áƒŖáƒšáƒ˜ áƒ›áƒŖáƒĨი", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "გაáƒĸანის áƒĸიპი" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { - "message": "WARNING", + "message": "გაფრთხილება", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { @@ -696,19 +1141,16 @@ "message": "Enter your master password to export your vault data." }, "shared": { - "message": "Shared" + "message": "áƒ’áƒáƒ–áƒ˜áƒáƒ áƒ”áƒ‘áƒŖáƒšáƒ˜" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" }, "share": { - "message": "Share" + "message": "გაზიარება" }, "movedItemToOrg": { "message": "$ITEMNAME$ moved to $ORGNAME$", @@ -727,7 +1169,7 @@ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, "learnMore": { - "message": "Learn more" + "message": "გაიგეთ მეáƒĸი" }, "authenticatorKeyTotp": { "message": "Authenticator key (TOTP)" @@ -739,7 +1181,7 @@ "message": "Copy verification code" }, "attachments": { - "message": "Attachments" + "message": "დანართი" }, "deleteAttachment": { "message": "Delete attachment" @@ -760,10 +1202,13 @@ "message": "Attachment saved" }, "file": { - "message": "File" + "message": "ფაილი" + }, + "fileToShare": { + "message": "File to share" }, "selectFile": { - "message": "Select a file" + "message": "აირჩიეთ ფაილი" }, "maxFileSize": { "message": "Maximum file size is 500 MB." @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -871,7 +1334,7 @@ } }, "rememberMe": { - "message": "Remember me" + "message": "დამიმახსოვრე" }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" @@ -889,7 +1352,7 @@ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." }, "webAuthnNewTabOpen": { - "message": "Open new tab" + "message": "ახალი ჩანართის გახსნა" }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" @@ -913,20 +1376,20 @@ "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator app" + "message": "ავთენáƒĸიკაáƒĸორი აპი" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -940,10 +1403,10 @@ "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { - "message": "Email" + "message": "ელ-ფოსáƒĸა" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -958,7 +1430,11 @@ "message": "For advanced users. You can specify the base URL of each service independently." }, "baseUrl": { - "message": "Server URL" + "message": "სერვერის URL" + }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { "message": "API server URL" @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "áƒ’áƒáƒ›áƒáƒ áƒ—áƒŖáƒšáƒ˜", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,17 +1564,14 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, "copyValue": { - "message": "Copy value" + "message": "დააკოპირეთ მნიშვნელობა" }, "value": { - "message": "Value" + "message": "მნიშვნელობა" }, "newCustomField": { "message": "New custom field" @@ -1042,16 +1580,19 @@ "message": "Drag to sort" }, "cfTypeText": { - "message": "Text" + "message": "áƒĸეáƒĨქáƒĸი" }, "cfTypeHidden": { - "message": "Hidden" + "message": "áƒ“áƒáƒ›áƒáƒšáƒŖáƒšáƒ˜" }, "cfTypeBoolean": { - "message": "Boolean" + "message": "áƒ‘áƒŖáƒšáƒ”áƒ•áƒ˜" + }, + "cfTypeCheckbox": { + "message": "ჩასართავი" }, "cfTypeLinked": { - "message": "Linked", + "message": "áƒ›áƒ˜áƒ‘áƒ›áƒŖáƒšáƒ˜", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1080,10 +1624,10 @@ "message": "Cardholder name" }, "number": { - "message": "Number" + "message": "რიáƒĒხვი" }, "brand": { - "message": "Brand" + "message": "სავაჭრო მარკა" }, "expirationMonth": { "message": "Expiration month" @@ -1092,43 +1636,43 @@ "message": "Expiration year" }, "expiration": { - "message": "Expiration" + "message": "ვადა" }, "january": { - "message": "January" + "message": "იანვარი" }, "february": { - "message": "February" + "message": "თებერვალი" }, "march": { - "message": "March" + "message": "მარáƒĸი" }, "april": { - "message": "April" + "message": "აპრილი" }, "may": { - "message": "May" + "message": "მაისი" }, "june": { - "message": "June" + "message": "ივნისი" }, "july": { - "message": "July" + "message": "ივლისი" }, "august": { - "message": "August" + "message": "აგვისáƒĸო" }, "september": { - "message": "September" + "message": "სეáƒĨáƒĸემბერი" }, "october": { - "message": "October" + "message": "ოáƒĨáƒĸომბერი" }, "november": { - "message": "November" + "message": "ნოემბერი" }, "december": { - "message": "December" + "message": "დეკემბერი" }, "securityCode": { "message": "Security code" @@ -1137,40 +1681,40 @@ "message": "ex." }, "title": { - "message": "Title" + "message": "áƒĄáƒáƒ—áƒáƒŖáƒ áƒ˜" }, "mr": { - "message": "Mr" + "message": "ბაáƒĸონი" }, "mrs": { - "message": "Mrs" + "message": "áƒĨალბაáƒĸონი" }, "ms": { - "message": "Ms" + "message": "áƒĨალბაáƒĸონი" }, "dr": { - "message": "Dr" + "message": "დოáƒĨáƒĸორი" }, "mx": { "message": "Mx" }, "firstName": { - "message": "First name" + "message": "სახელი" }, "middleName": { - "message": "Middle name" + "message": "áƒ¨áƒŖáƒ სახელი" }, "lastName": { - "message": "Last name" + "message": "გვარი" }, "fullName": { - "message": "Full name" + "message": "áƒĄáƒ áƒŖáƒšáƒ˜ სახელი" }, "identityName": { "message": "Identity name" }, "company": { - "message": "Company" + "message": "კომპანია" }, "ssn": { "message": "Social Security number" @@ -1182,13 +1726,13 @@ "message": "License number" }, "email": { - "message": "Email" + "message": "ელ-ფოსáƒĸა" }, "phone": { - "message": "Phone" + "message": "áƒĸელეფონი" }, "address": { - "message": "Address" + "message": "მისამართი" }, "address1": { "message": "Address 1" @@ -1203,19 +1747,19 @@ "message": "City / Town" }, "stateProvince": { - "message": "State / Province" + "message": "რეგიონი/მხარე" }, "zipPostalCode": { "message": "Zip / Postal code" }, "country": { - "message": "Country" + "message": "áƒĨვეყანა" }, "type": { - "message": "Type" + "message": "áƒĸიპი" }, "typeLogin": { - "message": "Login" + "message": "შესვლა" }, "typeLogins": { "message": "Logins" @@ -1224,34 +1768,82 @@ "message": "Secure note" }, "typeCard": { - "message": "Card" + "message": "ბარათი" }, "typeIdentity": { - "message": "Identity" + "message": "იდენáƒĸიფიკაáƒĒია" + }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { - "message": "Back" + "message": "áƒŖáƒ™áƒáƒœ" }, "collections": { - "message": "Collections" + "message": "კოლეáƒĨáƒĒიები" + }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } }, "favorites": { - "message": "Favorites" + "message": "სანიშნეები" }, "popOutNewWindow": { "message": "Pop out to a new window" }, "refresh": { - "message": "Refresh" + "message": "განახლება" }, "cards": { - "message": "Cards" + "message": "კარáƒĸი" }, "identities": { - "message": "Identities" + "message": "იდენáƒĸიფიკაáƒĸორები" }, "logins": { "message": "Logins" @@ -1260,7 +1852,7 @@ "message": "Secure notes" }, "clear": { - "message": "Clear", + "message": "გაáƒŦმენდა", "description": "To clear something out. example: To clear browser history." }, "checkPassword": { @@ -1282,31 +1874,35 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { - "message": "Domain name", + "message": "დომენის სახელი", "description": "Domain name. Ex. website.com" }, "host": { - "message": "Host", + "message": "ჰოსáƒĸი", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { - "message": "Exact" + "message": "áƒ–áƒŖáƒĄáƒĸი" }, "startsWith": { - "message": "Starts with" + "message": "იáƒŦყება" }, "regEx": { - "message": "Regular expression", + "message": "áƒ áƒ”áƒ’áƒŖáƒšáƒáƒ áƒŖáƒš áƒ’áƒáƒ›áƒáƒĄáƒáƒŽáƒŖáƒšáƒ”áƒ‘áƒ", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1320,30 +1916,39 @@ "description": "The URI of one of the current open tabs in the browser." }, "organization": { - "message": "Organization", + "message": "ორგანიზაáƒĒია", "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { - "message": "Types" + "message": "áƒĸიპები" }, "allItems": { - "message": "All items" + "message": "ყველა ჩანაáƒŦერი" }, "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "პაროლების იქáƒĸორია" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { - "message": "Remove" + "message": "áƒŦაშლა" }, "default": { - "message": "Default" + "message": "áƒœáƒáƒ’áƒŖáƒšáƒ˜áƒĄáƒŽáƒ›áƒ”áƒ•áƒ˜" }, "dateUpdated": { - "message": "Updated", + "message": "áƒ’áƒáƒœáƒáƒŽáƒšáƒ”áƒ‘áƒŖáƒšáƒ˜áƒ", "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "შეáƒĨმნის თარიáƒĻი", "description": "ex. Date this item was created" }, "datePasswordUpdated": { @@ -1360,21 +1965,21 @@ "message": "There are no collections to list." }, "ownership": { - "message": "Ownership" + "message": "მფლობელობა" }, "whoOwnsThisItem": { "message": "Who owns this item?" }, "strong": { - "message": "Strong", + "message": "áƒĢლიერი", "description": "ex. A strong password. Scale: Weak -> Good -> Strong" }, "good": { - "message": "Good", + "message": "კარგი", "description": "ex. A good password. Scale: Weak -> Good -> Strong" }, "weak": { - "message": "Weak", + "message": "áƒĄáƒŖáƒĄáƒĸი", "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { @@ -1384,24 +1989,39 @@ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" }, "pin": { - "message": "PIN", + "message": "PIN კოდი", "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1418,20 +2041,46 @@ "message": "Clone item" }, "clone": { - "message": "Clone" + "message": "კლონი" }, "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { - "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "message": "ჩაკეáƒĸვა", + "description": "Verb form: to make secure or inaccessible by" }, "trash": { - "message": "Trash", + "message": "ნაგავი", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "áƒŖáƒ™áƒ•áƒ” გაáƒĨვთ ანგარიში?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "გამოáƒŦერის áƒ’áƒáƒŖáƒĨმება" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1546,16 +2216,22 @@ "message": "Terms of Service and Privacy Policy have not been acknowledged." }, "termsOfService": { - "message": "Terms of Service" + "message": "áƒ›áƒáƒ›áƒĄáƒáƒŽáƒŖáƒ áƒ”áƒ‘áƒ˜áƒĄ პირობები" }, "privacyPolicy": { - "message": "Privacy Policy" + "message": "კონფიდენáƒĒიალობის პოლიáƒĸიკა" }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." }, "ok": { - "message": "Ok" + "message": "დიახ" + }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,23 +2323,66 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "დომენები", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, "send": { - "message": "Send", + "message": "გაგზავნა", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDetails": { + "message": "Send details", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { @@ -1657,37 +2394,46 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "áƒĸეáƒĨქáƒĸი" + }, + "sendTypeTextToShare": { + "message": "Text to share" }, "sendTypeFile": { - "message": "File" + "message": "ფაილი" }, "allSends": { "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { - "message": "Expired" + "message": "áƒ•áƒáƒ“áƒáƒ’áƒáƒĄáƒŖáƒšáƒ˜áƒ" }, "pendingDeletion": { - "message": "Pending deletion" + "message": "ელოდება áƒŦაშლას" }, "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "á˛‘áƒ›áƒŖáƒšáƒ˜áƒĄ კოპირება" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remove Password" + "message": "პაროლის áƒŦაშლა" }, "delete": { - "message": "Delete" + "message": "áƒŦაშლა" }, "removedPassword": { "message": "Password removed" @@ -1701,7 +2447,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Disabled" + "message": "áƒ’áƒáƒ›áƒáƒ áƒ—áƒŖáƒšáƒ˜" }, "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,15 +2486,19 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { - "message": "Expiration date" + "message": "ვადა" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { - "message": "1 day" + "message": "1 დáƒĻე" }, "days": { "message": "$DAYS$ days", @@ -1756,7 +2510,7 @@ } }, "custom": { - "message": "Custom" + "message": "áƒ’áƒáƒœáƒĄáƒŽáƒ•áƒáƒ•áƒ”áƒ‘áƒŖáƒšáƒ˜" }, "maximumAccessCount": { "message": "Maximum Access Count" @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1796,7 +2554,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "New password" + "message": "ახალი პაროლი" }, "sendDisabled": { "message": "Send removed", @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "გაáƒĸანა" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1831,7 +2636,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage2": { - "message": "click here", + "message": "აáƒĨ დააáƒŦáƒ™áƒáƒžáƒŖáƒœáƒ”áƒ—", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage3": { @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "ელფოსáƒĸა გადამოáƒŦáƒ›áƒ”áƒ‘áƒŖáƒšáƒ˜áƒ" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1893,16 +2707,41 @@ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." }, "selectFolder": { - "message": "Select folder..." + "message": "აირჩიეთ ქაáƒĨაáƒĻალდე..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { - "message": "Hours" + "message": "საათი" }, "minutes": { - "message": "Minutes" + "message": "áƒŦáƒŖáƒ—áƒ˜" + }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,8 +2865,20 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { - "message": "Error" + "message": "შეáƒĒდომა" }, "regenerateUsername": { "message": "Regenerate username" @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2026,7 +2920,7 @@ "message": "Use your domain's configured catch-all inbox." }, "random": { - "message": "Random" + "message": "შემთხვევითი" }, "randomWord": { "message": "Random word" @@ -2041,7 +2935,7 @@ "message": "Password type" }, "service": { - "message": "Service" + "message": "სერვისი" }, "forwardedEmail": { "message": "Forwarded email alias" @@ -2049,15 +2943,125 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { - "message": "Hostname", + "message": "ჰოსáƒĸიქ სახელი", "description": "Part of a URL." }, "apiAccessToken": { "message": "API Access Token" }, "apiKey": { - "message": "API Key" + "message": "API-იქ გასაáƒĻები" }, "ssoKeyConnectorError": { "message": "Key connector error: make sure key connector is available and working correctly." @@ -2084,19 +3088,19 @@ "message": "Settings have been edited" }, "environmentEditedClick": { - "message": "Click here" + "message": "დააáƒŦáƒ™áƒáƒžáƒŖáƒœáƒ”áƒ— აáƒĨ" }, "environmentEditedReset": { "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server version" + "message": "სერვერის ვერსია" }, "selfHostedServer": { "message": "self-hosted" }, "thirdParty": { - "message": "Third-party" + "message": "მესამე-პირი" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { - "message": "Got it" + "message": "გავიგე" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "მალსახმობების მართვა" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,24 +3270,39 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "შეამოáƒŦმეთ თáƒĨვენი ელფოსáƒĸა" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "áƒŖáƒ™áƒáƒœ áƒ“áƒáƒ‘áƒ áƒŖáƒœáƒ”áƒ‘áƒ" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, "general": { - "message": "General" + "message": "ზოგადი" }, "display": { - "message": "Display" + "message": "ჩვენება" }, "accountSuccessfullyCreated": { "message": "Account successfully created!" @@ -2303,14 +3328,22 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, "required": { - "message": "required" + "message": "áƒáƒŖáƒĒილებელია" }, "search": { - "message": "Search" + "message": "áƒĢებნა" }, "inputMinLength": { "message": "Input must be at least $COUNT$ characters long.", @@ -2376,8 +3409,20 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- არჩევა --" }, "multiSelectPlaceholder": { "message": "-- Type to filter --" @@ -2386,10 +3431,10 @@ "message": "Retrieving options..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "ჩანაáƒŦერები ნაპოვნი არაა" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "ყველას áƒ’áƒáƒĄáƒŖáƒ¤áƒ—áƒáƒ•áƒ”áƒ‘áƒ" }, "plusNMore": { "message": "+ $QUANTITY$ more", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "áƒĨáƒ•áƒ”áƒ›áƒ”áƒœáƒ˜áƒŖ" }, "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "შემოáƒĸანა...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "შემáƒĒველობაზე გადახáƒĸომა" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "ანგარიშის განბლოკვა", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "ახალი ჩანაáƒŦერი", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ჩართვა" + }, + "ignore": { + "message": "იგნორი" + }, + "importData": { + "message": "მონაáƒĒემების შემოáƒĸანა", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "შემოáƒĸანის შეáƒĒდომა" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "აáƒĻáƒŦერა" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "კიდევ ქáƒĒადეთ" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "áƒĄáƒŖáƒš" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "სამიზნე" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "აირჩიეთ ქაáƒĨაáƒĻალდე" + }, + "selectImportCollection": { + "message": "აირჩიეთ კოლეáƒĨáƒĒია" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "ფაილის არჩევა" + }, + "noFileChosen": { + "message": "ფაილი áƒáƒ áƒŠáƒ”áƒŖáƒšáƒ˜ არაა" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "საკვანáƒĢო გასაáƒĻები" + }, + "accessing": { + "message": "áƒŦვდომა" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "დადასáƒĸáƒŖáƒ áƒ”áƒ‘áƒ" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "არაქáƒŦორი მომხმარებელი ან პაროლი" + }, + "incorrectPassword": { + "message": "არაქáƒŦორი პაროლი" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "PIN კოდი არაქáƒŦორია" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "საკვანáƒĢო კოდი" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "CVS-დან შემოáƒĸანა" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "კოლეáƒĨáƒĒია" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "ანგარიშის გადართვა" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "აáƒĨáƒĸáƒ˜áƒŖáƒ áƒ˜" + }, + "locked": { + "message": "დაბლოკილია" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "სერვერი" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "მხოლოდ ერთხელ" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "áƒœáƒáƒ’áƒŖáƒšáƒ˜áƒĄáƒŽáƒ›áƒ”áƒ‘áƒáƒ“ გამოყენება", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "áƒŦარმაáƒĸება" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "მისამართის დაკოპირება" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "ანგარიშის áƒŖáƒĄáƒáƒ¤áƒ áƒ—áƒŽáƒáƒ”áƒ‘áƒ" + }, + "notifications": { + "message": "გაფრთხილებები" + }, + "appearance": { + "message": "გარეგნობა" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "ახალი" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "ჩანაáƒŦერის სახელი" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "მფლობელი" + }, + "selfOwnershipLabel": { + "message": "თáƒĨვენ", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "ბოლოს ჊აქáƒŦáƒáƒ áƒ”áƒ‘áƒŖáƒšáƒ˜" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "áƒ›áƒ˜áƒ‘áƒ›áƒŖáƒšáƒ˜" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "აáƒĸვირთვა" + }, + "addAttachment": { + "message": "áƒ›áƒ˜áƒ›áƒáƒ’áƒ áƒ”áƒ‘áƒŖáƒšáƒ˜ ფაილის დამაáƒĸება" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "áƒžáƒ áƒ”áƒ›áƒ˜áƒŖáƒ›áƒ˜" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "ფილáƒĸრები" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "იდენáƒĸიფიკაáƒĒია" + }, + "contactInfo": { + "message": "საკონáƒĸაáƒĨáƒĸო ინფორმაáƒĒია" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "ბარათის დეáƒĸალები" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "ანიმაáƒĒიების ჩართვა" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "ანგარიშის დამაáƒĸება" + }, + "loading": { + "message": "იáƒĸვირთება" + }, + "data": { + "message": "მონაáƒĒემები" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "პაროლები", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "მინიჭება" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "ველის დამაáƒĸება" + }, + "add": { + "message": "დამაáƒĸება" + }, + "fieldType": { + "message": "ველის áƒĸიპი" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "ქიქáƒĸáƒ”áƒ›áƒŖáƒ áƒáƒ“ áƒœáƒáƒ’áƒŖáƒšáƒ˜áƒĄáƒŽáƒ›áƒ”áƒ•áƒ˜" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "თავიდან áƒĒდა" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "აáƒĻდგენა" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "ავთენáƒĸიკაáƒĒია" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index bf1eedd8261..a4668a65add 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-fill" + "message": "Autofill" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,7 +223,7 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Add a login" @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index c4f5aee4955..4ac769431bf 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -3,21 +3,39 @@ "message": "ā˛Ŧā˛ŋā˛Ÿāŗā˛ĩā˛žā˛°āŗā˛Ąāŗ†ā˛¨āŗ" }, "extName": { - "message": "ā˛Ŧā˛ŋā˛Ÿāŗâ€Œā˛ĩā˛žā˛°āŗā˛Ąāŗ†ā˛¨āŗ - ā˛‰ā˛šā˛ŋ➤ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛•", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Žā˛˛āŗā˛˛ā˛ž ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗā˛ŋ➗⺆ ā˛¸āŗā˛°ā˛•āŗā˛ˇā˛ŋ➤ ā˛Žā˛¤āŗā˛¤āŗ ā˛‰ā˛šā˛ŋ➤ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ➍ā˛ŋā˛°āŗā˛ĩā˛žā˛šā˛•.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛¸āŗā˛°ā˛•āŗā˛ˇā˛ŋ➤ ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ā˛˛ā˛žā˛—āŗ ā˛‡ā˛¨āŗ ā˛Žā˛žā˛Ąā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ā˛šāŗŠā˛¸ ā˛–ā˛žā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "ā˛–ā˛žā˛¤āŗ† ➤⺆➰⺆" }, - "login": { - "message": "ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "ā˛Žā˛‚ā˛Ÿā˛°āŗâ€Œā˛Ēāŗā˛°āŗˆā˛¸āŗ ā˛ā˛• ā˛¸āŗˆā˛¨āŗ-ā˛†ā˛¨āŗ" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ➍⺀ā˛ĩ⺁ ā˛Žā˛°āŗ†ā˛¤ā˛°āŗ† ➅ā˛Ļā˛¨āŗā˛¨āŗ ➍⺆➍ā˛Ēā˛ŋā˛Ÿāŗā˛Ÿāŗā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ➏⺁➺ā˛ŋā˛ĩ⺁ ➍ā˛ŋā˛Žā˛—āŗ† ā˛¸ā˛šā˛žā˛¯ ā˛Žā˛žā˛Ąāŗā˛¤āŗā˛¤ā˛Ļāŗ†." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗ-➟⺈ā˛Ēāŗ ā˛Žā˛žā˛Ąā˛ŋ" }, "masterPassHint": { "message": "ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ➏⺁➺ā˛ŋā˛ĩ⺁ (ā˛ā˛šāŗā˛›ā˛ŋ➕)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "ā˛Ÿāŗā˛¯ā˛žā˛Ŧāŗ" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ➍➕➞ā˛ŋ➏ā˛ŋ" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "➟ā˛ŋā˛Ēāŗā˛Ē➪ā˛ŋ ➍➕➞ā˛ŋ➏ā˛ŋ" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "➭ā˛Ļāŗā˛°ā˛¤ā˛ž ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ➍➕➞ā˛ŋ➏ā˛ŋ" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ā˛¸āŗā˛ĩ➝➂ ā˛­ā˛°āŗā˛¤ā˛ŋ" }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" + }, "generatePasswordCopied": { "message": "ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ➰➚ā˛ŋ➏ā˛ŋ (➍➕➞ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋ➕⺆➝ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗâ€Œā˛—ā˛ŗāŗ ā˛‡ā˛˛āŗā˛˛." }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -115,6 +231,18 @@ "addItem": { "message": "ā˛ā˛Ÿā˛‚ ➏⺇➰ā˛ŋ➏ā˛ŋ" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ➏⺁➺ā˛ŋā˛ĩ⺁" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "ā˛–ā˛žā˛¤āŗ†" - }, "changeMasterPassword": { "message": "ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛ŋ" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "ā˛Ģā˛ŋā˛‚ā˛—ā˛°āŗā˛Ēāŗā˛°ā˛ŋā˛‚ā˛Ÿāŗ ā˛Ģāŗā˛°āŗ‡ā˛¸āŗ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "ā˛Ŧā˛—āŗā˛—āŗ†" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "➆ā˛ĩāŗƒā˛¤āŗā˛¤ā˛ŋ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗ ➏➂ā˛Ēā˛žā˛Ļā˛ŋ➏ā˛ŋ" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗ ➅➺ā˛ŋ➏ā˛ŋ" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ā˛œā˛¨ā˛°āŗ‡ā˛Ÿā˛°āŗ", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗâ€Œā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Ŧ➞ā˛ĩā˛žā˛Ļ, ā˛…ā˛¨ā˛¨āŗā˛¯ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ➰➚ā˛ŋ➏ā˛ŋ." }, - "bitWebVault": { - "message": "ā˛Ŧā˛ŋā˛Ÿāŗā˛ĩā˛žā˛°āŗā˛Ąāŗ†ā˛¨āŗ ā˛ĩāŗ†ā˛Ŧāŗ ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "ā˛ĩā˛¸āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛†ā˛Žā˛Ļ⺁ ā˛Žā˛žā˛Ąā˛ŋ" @@ -235,6 +435,9 @@ "generatePassword": { "message": "ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ➰➚ā˛ŋ➏ā˛ŋ" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛¨ā˛°āŗā˛¤āŗā˛Ēā˛žā˛Ļā˛ŋ➏ā˛ŋ" }, @@ -244,17 +447,60 @@ "length": { "message": "➉ā˛Ļāŗā˛Ļ" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ā˛Ēā˛Ļ➗➺ ā˛¸ā˛‚ā˛–āŗā˛¯āŗ†" @@ -276,7 +522,16 @@ "message": "➕➍ā˛ŋā˛ˇāŗā˛  ā˛ĩā˛ŋā˛ļ⺇➎" }, "avoidAmbChar": { - "message": "ā˛…ā˛¸āŗā˛Ēā˛ˇāŗā˛Ÿ ā˛…ā˛•āŗā˛ˇā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤ā˛Ēāŗā˛Ēā˛ŋ➏ā˛ŋ" + "message": "ā˛…ā˛¸āŗā˛Ēā˛ˇāŗā˛Ÿ ā˛…ā˛•āŗā˛ˇā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➤ā˛Ēāŗā˛Ēā˛ŋ➏ā˛ŋ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ ā˛šāŗā˛Ąāŗā˛•ā˛ŋ" @@ -299,15 +554,30 @@ "password": { "message": "ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "ā˛Ēā˛žā˛¸āŗā˛Ģāŗā˛°āŗ‡ā˛¸āŗ" }, "favorite": { "message": "ā˛Žāŗ†ā˛šāŗā˛šā˛ŋ➍" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "➟ā˛ŋā˛Ēāŗā˛Ē➪ā˛ŋ➗➺⺁" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "➟ā˛ŋā˛Ēāŗā˛Ē➪ā˛ŋ" }, @@ -326,6 +596,18 @@ "launch": { "message": "ā˛ļ⺁➰⺁" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ā˛œā˛žā˛˛ā˛¤ā˛žā˛Ŗ" }, @@ -338,9 +620,24 @@ "other": { "message": "➇➤➰⺆" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "ā˛ĩā˛ŋā˛¸āŗā˛¤ā˛°ā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛°āŗ‡ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋ" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ ā˛˛ā˛žā˛•āŗ ➆➗ā˛ŋā˛Ļāŗ†. ā˛Žāŗā˛‚ā˛Ļ⺁ā˛ĩ➰⺆➝➞⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "ā˛…ā˛¨āŗâ€Œā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ ā˛•ā˛žā˛˛ā˛žā˛ĩ➧ā˛ŋ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "ā˛ˆā˛— ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "ā˛¤ā˛•āŗā˛ˇā˛Ŗ" }, @@ -426,6 +738,18 @@ "security": { "message": "➭ā˛Ļāŗā˛°ā˛¤āŗ†" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "ā˛Ļ⺋➎ ➏➂➭ā˛ĩā˛ŋ➏ā˛ŋā˛Ļāŗ†" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛šāŗŠā˛¸ ā˛–ā˛žā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†! ➍⺀ā˛ĩ⺁ ā˛ˆā˛— ā˛˛ā˛žā˛—āŗ ā˛‡ā˛¨āŗ ā˛Žā˛žā˛Ąā˛Ŧā˛šāŗā˛Ļ⺁." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ➏⺁➺ā˛ŋā˛ĩā˛ŋā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛¨ā˛žā˛ĩ⺁ ➍ā˛ŋā˛Žā˛—āŗ† ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛ŋā˛Ļāŗā˛Ļāŗ‡ā˛ĩāŗ†." }, "verificationCodeRequired": { "message": "ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆ ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "➈ ā˛Ē⺁➟ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛†ā˛¯āŗā˛Ļ ā˛ā˛Ÿā˛‚ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩ➝➂ ā˛­ā˛°āŗā˛¤ā˛ŋ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛ŋā˛˛āŗā˛˛. ā˛Ŧā˛Ļ➞ā˛ŋ➗⺆ ā˛Žā˛žā˛šā˛ŋ➤ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➍➕➞ā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛…ā˛‚ā˛Ÿā˛ŋ➏ā˛ŋ." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛¸āŗ†ā˛ˇā˛¨āŗ ➅ā˛ĩ➧ā˛ŋ ā˛Žāŗ€ā˛°ā˛ŋā˛Ļāŗ†." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "ā˛˛ā˛žā˛—āŗ ā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗ ➏⺆⺕➰ā˛ŋ➏ā˛ŋ" }, - "changeMasterPass": { - "message": "ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛ŋ" - }, - "changeMasterPasswordConfirmation": { - "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ➍⺀ā˛ĩ⺁ bitwarden.com ā˛ĩāŗ†ā˛Ŧāŗ ā˛ĩā˛žā˛˛āŗā˛Ÿāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁. ➍⺀ā˛ĩ⺁ ā˛ˆā˛— ā˛ĩāŗ†ā˛Ŧāŗâ€Œā˛¸āŗˆā˛Ÿāŗâ€Œā˛—āŗ† ā˛­āŗ‡ā˛Ÿā˛ŋ ā˛¨āŗ€ā˛Ąā˛˛āŗ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?" - }, "twoStepLoginConfirmation": { "message": "➭ā˛Ļāŗā˛°ā˛¤ā˛ž ➕⺀, ā˛Ļ⺃ā˛ĸ⺀➕➰➪ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ, ā˛Žā˛¸āŗâ€Œā˛Žā˛‚ā˛Žā˛¸āŗ, ā˛Ģāŗ‹ā˛¨āŗ ➕➰⺆ ➅ā˛Ĩā˛ĩā˛ž ā˛‡ā˛Žāŗ‡ā˛˛āŗâ€Œā˛¨ā˛‚ā˛¤ā˛š ā˛Žā˛¤āŗā˛¤āŗŠā˛‚ā˛Ļ⺁ ā˛¸ā˛žā˛§ā˛¨ā˛ĻāŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ➍ā˛ŋā˛Žāŗā˛Ž ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏⺁ā˛ĩ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋ➰⺁ā˛ĩ ā˛Žā˛°ā˛Ąāŗ ā˛šā˛‚ā˛¤ā˛Ļ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛–ā˛žā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛šāŗ†ā˛šāŗā˛šāŗ ā˛¸āŗā˛°ā˛•āŗā˛ˇā˛ŋā˛¤ā˛—āŗŠā˛ŗā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ā˛Ŧā˛ŋā˛Ÿāŗā˛ĩā˛žā˛°āŗā˛Ąāŗ†ā˛¨āŗ.ā˛•ā˛žā˛Žāŗ ā˛ĩāŗ†ā˛Ŧāŗ ā˛ĩā˛žā˛˛āŗā˛Ÿāŗā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Žā˛°ā˛Ąāŗ-ā˛šā˛‚ā˛¤ā˛Ļ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁. ➍⺀ā˛ĩ⺁ ā˛ˆā˛— ā˛ĩāŗ†ā˛Ŧāŗâ€Œā˛¸āŗˆā˛Ÿāŗâ€Œā˛—āŗ† ā˛­āŗ‡ā˛Ÿā˛ŋ ā˛¨āŗ€ā˛Ąā˛˛āŗ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "ā˛Ģāŗ‹ā˛˛āŗā˛Ąā˛°āŗ ➤ā˛ŋā˛Ļāŗā˛Ļā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†" }, @@ -552,6 +936,10 @@ "newUri": { "message": "ā˛šāŗŠā˛¸ ā˛¯āŗā˛†ā˛°āŗā˛" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "ā˛ā˛Ÿā˛‚ ➏⺇➰ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "\"ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ➅➧ā˛ŋā˛¸āŗ‚ā˛šā˛¨āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ\" ➍⺀ā˛ĩ⺁ ā˛ŽāŗŠā˛Ļ➞ ā˛Ŧā˛žā˛°ā˛ŋ➗⺆ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏ā˛ŋā˛Ļā˛žā˛—ā˛˛āŗ†ā˛˛āŗā˛˛ā˛ž ā˛šāŗŠā˛¸ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛ĩā˛žā˛˛āŗā˛Ÿāŗâ€Œā˛—āŗ† ➉➺ā˛ŋ➏➞⺁ ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛•āŗ‡ā˛ŗāŗā˛¤āŗā˛¤ā˛Ļāŗ†." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "ā˛•āŗā˛˛ā˛ŋā˛Ēāŗâ€Œā˛Ŧāŗ‹ā˛°āŗā˛Ąāŗ ➤⺆➰ā˛ĩāŗā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "➈ ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧā˛ŋā˛Ÿāŗā˛ĩā˛°āŗā˛Ąāŗā˛¨ā˛˛āŗā˛˛ā˛ŋ ➍ā˛ĩ⺀➕➰ā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛Ŧā˛¯ā˛¸āŗā˛¤āŗā˛¤āŗ€ā˛°ā˛ž?" }, @@ -634,20 +1043,26 @@ "message": "ā˛šāŗŒā˛Ļ⺁, ā˛ˆā˛— ➍ā˛ĩ⺀➕➰ā˛ŋ➏ā˛ŋ" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "ā˛Ąāŗ€ā˛Ģā˛žā˛˛āŗā˛Ÿāŗ ā˛¯āŗā˛†ā˛°āŗā˛ ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋ➕⺆ ā˛Ēā˛¤āŗā˛¤āŗ†", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "ā˛¸āŗā˛ĩ➝➂ ā˛­ā˛°āŗā˛¤ā˛ŋā˛¯ā˛‚ā˛¤ā˛š ā˛•āŗā˛°ā˛ŋā˛¯āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏⺁ā˛ĩā˛žā˛— ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗâ€Œā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ URI ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋ➕⺆ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛šā˛šāŗā˛šāŗā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋ➏⺁ā˛ĩ ā˛Ēāŗ‚ā˛°āŗā˛ĩ➍ā˛ŋā˛¯āŗ‹ā˛œā˛ŋ➤ ā˛Žā˛žā˛°āŗā˛—ā˛ĩā˛¨āŗā˛¨āŗ ➆➰ā˛ŋ➏ā˛ŋ." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗâ€Œā˛¨ ā˛Ŧā˛Ŗāŗā˛Ŗ ā˛Ĩāŗ€ā˛Žāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧā˛Ļā˛˛ā˛žā˛¯ā˛ŋ➏ā˛ŋ." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "ā˛Ąā˛žā˛°āŗā˛•āŗ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "ā˛Ąā˛žā˛°āŗā˛•āŗ ➏⺌➰", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "➰ā˛Ģāŗā˛¤āŗ ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ" }, "fileFormat": { "message": "ā˛•ā˛Ąā˛¤ā˛Ļ ā˛Žā˛žā˛Ļ➰ā˛ŋ" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "ā˛Žā˛šāŗā˛šā˛°ā˛ŋ➕⺆", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†" }, - "learnOrg": { - "message": "ā˛¸ā˛‚ā˛˜ā˛Ÿā˛¨āŗ†ā˛—ā˛ŗ ā˛Ŧā˛—āŗā˛—āŗ† ➤ā˛ŋ➺ā˛ŋ➝ā˛ŋ➰ā˛ŋ" - }, - "learnOrgConfirmation": { - "message": "ā˛¸ā˛‚ā˛¸āŗā˛Ĩāŗ†ā˛¯āŗŠā˛‚ā˛Ļā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛šā˛žā˛ĩ➪ā˛ŋ ā˛ĩā˛¸āŗā˛¤āŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛‡ā˛¤ā˛°ā˛°āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛šā˛‚ā˛šā˛ŋā˛•āŗŠā˛ŗāŗā˛ŗā˛˛āŗ ā˛Ŧā˛ŋā˛Ÿāŗā˛ĩā˛°āŗā˛Ąāŗā˛—ā˛ŗāŗ ➍ā˛ŋā˛Žāŗā˛Žā˛¨āŗā˛¨āŗ ā˛…ā˛¨āŗā˛Žā˛¤ā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†. ➍⺀ā˛ĩ⺁ ā˛‡ā˛¨āŗā˛¨ā˛ˇāŗā˛Ÿāŗ ➤ā˛ŋ➺ā˛ŋ➝➞⺁ Bitwarden.com ā˛ĩāŗ†ā˛Ŧāŗā˛¸āŗˆā˛Ÿāŗā˛—āŗ† ā˛­āŗ‡ā˛Ÿā˛ŋ ā˛¨āŗ€ā˛Ąā˛˛āŗ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "ā˛¸ā˛‚ā˛¸āŗā˛Ĩ⺆➗⺆ ➏➰ā˛ŋ➏ā˛ŋ" @@ -762,6 +1204,9 @@ "file": { "message": "ā˛Ģāŗˆā˛˛āŗ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "ā˛•ā˛Ąā˛¤ā˛ĩā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛Žā˛žā˛Ąāŗ." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "ā˛Ģāŗˆā˛˛āŗ ā˛˛ā˛—ā˛¤āŗā˛¤āŗā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ 1 ➜ā˛ŋā˛Ŧā˛ŋ ā˛Žā˛¨āŗâ€Œā˛•āŗā˛°ā˛ŋā˛Ēāŗā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛¸ā˛‚ā˛—āŗā˛°ā˛š." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "➍⺀ā˛ĩ⺁ ā˛Ŧā˛ŋā˛Ÿāŗā˛ĩā˛žā˛°āŗā˛Ąāŗ†ā˛¨āŗ.ā˛•ā˛žā˛Žāŗ ā˛ĩāŗ†ā˛Ŧāŗ ā˛ĩā˛žā˛˛āŗā˛Ÿāŗā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛Ēāŗā˛°āŗ€ā˛Žā˛ŋ➝➂ ➏ā˛Ļā˛¸āŗā˛¯ā˛¤āŗā˛ĩā˛ĩā˛¨āŗā˛¨āŗ ➖➰⺀ā˛Ļā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁. ➍⺀ā˛ĩ⺁ ā˛ˆā˛— ā˛ĩāŗ†ā˛Ŧāŗâ€Œā˛¸āŗˆā˛Ÿāŗâ€Œā˛—āŗ† ā˛­āŗ‡ā˛Ÿā˛ŋ ā˛¨āŗ€ā˛Ąā˛˛āŗ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "➍⺀ā˛ĩ⺁ ā˛Ēāŗā˛°āŗ€ā˛Žā˛ŋ➝➂ ➏ā˛Ļā˛¸āŗā˛¯ā˛°ā˛žā˛—ā˛ŋā˛Ļāŗā˛Ļ⺀➰ā˛ŋ!" }, "premiumCurrentMemberThanks": { "message": "ā˛Ŧā˛ŋā˛Ÿāŗā˛ĩā˛žā˛°āŗā˛Ąāŗ†ā˛¨āŗ ➅ā˛ĩā˛°ā˛¨āŗā˛¨āŗ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏ā˛ŋā˛Ļāŗā˛Ļā˛•āŗā˛•ā˛žā˛—ā˛ŋ ā˛§ā˛¨āŗā˛¯ā˛ĩā˛žā˛Ļ➗➺⺁." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "ā˛Žā˛˛āŗā˛˛ā˛ĩāŗ‚ ➕⺇ā˛ĩ➞ $PRICE$ / ā˛ĩā˛°āŗā˛ˇā˛•āŗā˛•āŗ†!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗ ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛—āŗŠā˛‚ā˛Ąā˛ŋā˛Ļāŗ†" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "ā˛Ļ⺃ā˛ĸ⺀➕➰➪ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ" }, - "authenticatorAppDesc": { - "message": "ā˛¸ā˛Žā˛¯ ā˛†ā˛§ā˛žā˛°ā˛ŋ➤ ā˛Ē➰ā˛ŋā˛ļāŗ€ā˛˛ā˛¨ā˛ž ā˛•āŗ‹ā˛Ąāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏➞⺁ ā˛Ļ⺃ā˛ĸ⺀➕➰➪ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋ (➆ā˛Ĩā˛ŋ ➅ā˛Ĩā˛ĩā˛ž ā˛—āŗ‚ā˛—ā˛˛āŗ ➅ā˛Ĩāŗ†ā˛‚ā˛Ÿā˛ŋā˛•āŗ‡ā˛Ÿā˛°āŗ).", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "➝⺁ā˛Ŧā˛ŋ➕⺆ ā˛’ā˛Ÿā˛ŋā˛Ēā˛ŋ ➭ā˛Ļāŗā˛°ā˛¤ā˛ž ➕⺀" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛–ā˛žā˛¤āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ➝⺁ā˛Ŧā˛ŋ➕⺆ ā˛Ŧ➺➏ā˛ŋ. ➝⺁ā˛Ŧā˛ŋ➕⺆ 4, 4 ā˛¨āŗā˛¯ā˛žā˛¨āŗ‹, 4 ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ā˛Žā˛¨āŗā˛‡ā˛’ ā˛¸ā˛žā˛§ā˛¨ā˛—ā˛ŗāŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛•ā˛žā˛°āŗā˛¯ā˛¨ā˛ŋā˛°āŗā˛ĩā˛šā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†." }, - "duoDesc": { - "message": "ā˛Ąāŗā˛¯āŗā˛¯āŗŠ ā˛ŽāŗŠā˛Ŧāŗˆā˛˛āŗ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗ, ā˛Žā˛¸āŗâ€Œā˛Žā˛‚ā˛Žā˛¸āŗ, ā˛Ģāŗ‹ā˛¨āŗ ➕➰⺆ ➅ā˛Ĩā˛ĩā˛ž ➝⺁ 2 ā˛Žā˛Ģāŗ ➭ā˛Ļāŗā˛°ā˛¤ā˛ž ➕⺀➞ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏ā˛ŋā˛•āŗŠā˛‚ā˛Ąāŗ ā˛Ąāŗā˛¯āŗā˛¯āŗŠ ā˛¸āŗ†ā˛•āŗā˛¯āŗā˛°ā˛ŋ➟ā˛ŋā˛¯āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛ŋ.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ" }, - "emailDesc": { - "message": "ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆ ā˛•āŗ‹ā˛Ąāŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛Žā˛—āŗ† ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛Žā˛žā˛Ąā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "ā˛¸āŗā˛ĩ➝➂ ➆➤ā˛ŋā˛Ĩ⺇➝ ā˛Ē➰ā˛ŋ➏➰" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛†ā˛¨āŗ-ā˛Ēāŗā˛°ā˛Žāŗ‡ā˛¯ ā˛šāŗ‹ā˛¸āŗā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋā˛Ļ ā˛Ŧā˛ŋā˛Ÿāŗâ€Œā˛ĩā˛žā˛°āŗā˛Ąāŗ†ā˛¨āŗ ā˛¸āŗā˛Ĩā˛žā˛Ē➍⺆➝ ā˛Žāŗ‚ā˛˛ URL ā˛…ā˛¨āŗā˛¨āŗ ➍ā˛ŋā˛°āŗā˛Ļā˛ŋā˛ˇāŗā˛Ÿā˛Ēā˛Ąā˛ŋ➏ā˛ŋ." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "ā˛•ā˛¸āŗā˛Ÿā˛Žāŗ ā˛Ē➰ā˛ŋ➏➰" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "ā˛¸ā˛°āŗā˛ĩā˛°āŗ URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API ā˛¸ā˛°āŗā˛ĩā˛°āŗ URL" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "ā˛Ē➰ā˛ŋ➏➰ URL ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➉➺ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†." }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "ā˛Ē⺁➟ ā˛˛āŗ‹ā˛Ąāŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛¸āŗā˛ĩ➝➂ ā˛­ā˛°āŗā˛¤ā˛ŋ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋ➏ā˛ŋ" }, "enableAutoFillOnPageLoadDesc": { "message": "ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛Ģā˛žā˛°āŗā˛Žāŗ ā˛Ēā˛¤āŗā˛¤āŗ†ā˛¯ā˛žā˛Ļā˛˛āŗā˛˛ā˛ŋ, ā˛ĩāŗ†ā˛Ŧāŗ ā˛Ē⺁➟ ā˛˛āŗ‹ā˛Ąāŗ ➆➗⺁ā˛ĩā˛žā˛— ā˛¸āŗā˛ĩā˛¯ā˛‚ā˛šā˛žā˛˛ā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛¸āŗā˛ĩ➝➂ ā˛­ā˛°āŗā˛¤ā˛ŋ ā˛Žā˛žā˛Ąā˛ŋ." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛ā˛Ÿā˛‚ā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛Ąāŗ€ā˛Ģā˛žā˛˛āŗā˛Ÿāŗ ā˛†ā˛Ÿāŗ‹ā˛Ģā˛ŋā˛˛āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗ" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "ā˛¸āŗˆā˛Ąāŗā˛Ŧā˛žā˛°āŗā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ ➤⺆➰⺆➝ā˛ŋ➰ā˛ŋ" }, - "commandAutofillDesc": { - "message": "ā˛Ēāŗā˛°ā˛¸āŗā˛¤āŗā˛¤ ā˛ĩāŗ†ā˛Ŧāŗâ€Œā˛¸āŗˆā˛Ÿāŗâ€Œā˛—ā˛žā˛—ā˛ŋ ā˛•āŗŠā˛¨āŗ†ā˛¯ā˛Ļā˛žā˛—ā˛ŋ ā˛Ŧ➺➏ā˛ŋā˛Ļ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸āŗā˛ĩ➝➂ ā˛­ā˛°āŗā˛¤ā˛ŋ ā˛Žā˛žā˛Ąā˛ŋ" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "ā˛•āŗā˛˛ā˛ŋā˛Ēāŗā˛Ŧāŗ‹ā˛°āŗā˛Ąāŗā˛—āŗ† ā˛šāŗŠā˛¸ ā˛¯ā˛žā˛Ļāŗƒā˛šāŗā˛›ā˛ŋ➕ ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ➰➚ā˛ŋ➏ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➍➕➞ā˛ŋ➏ā˛ŋ" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "ā˛•ā˛¸āŗā˛Ÿā˛Žāŗ ā˛•āŗā˛ˇāŗ‡ā˛¤āŗā˛°ā˛—ā˛ŗāŗ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "ā˛Ŧ⺂➞ā˛ŋā˛¯ā˛¨āŗ" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "➗⺁➰⺁➤ā˛ŋ➏⺁ā˛ĩā˛ŋ➕⺆" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ➇➤ā˛ŋā˛šā˛žā˛¸" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "ā˛šā˛ŋ➂ā˛Ļā˛•āŗā˛•āŗ†" }, "collections": { "message": "ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛Ŗāŗ†ā˛—ā˛ŗāŗ" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "ā˛Žāŗ†ā˛šāŗā˛šāŗā˛—āŗ†ā˛—ā˛ŗāŗ" }, @@ -1282,6 +1874,10 @@ "message": "ā˛Žāŗ‚ā˛˛ ā˛ĄāŗŠā˛Žāŗ‡ā˛¨āŗ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ā˛šāŗŠā˛‚ā˛Ļā˛žā˛Ŗā˛ŋ➕⺆ ā˛Ēā˛¤āŗā˛¤āŗ†", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ā˛Ąāŗ€ā˛Ģā˛žā˛˛āŗā˛Ÿāŗ ā˛Ē➂ā˛Ļāŗā˛¯ ā˛Ēā˛¤āŗā˛¤āŗ†", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ā˛Ÿā˛žā˛—ā˛˛āŗ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗāŗ" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "ā˛Ēā˛Ÿāŗā˛Ÿā˛ŋ ā˛Žā˛žā˛Ąā˛˛āŗ ā˛¯ā˛žā˛ĩ⺁ā˛Ļāŗ‡ ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗā˛—ā˛ŗāŗ ā˛‡ā˛˛āŗā˛˛." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "➤⺆➗⺆" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "ā˛Ēā˛ŋā˛¨āŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛…ā˛¨āŗā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "ā˛Ŧā˛ŋā˛Ÿāŗâ€Œā˛ĩā˛žā˛°āŗā˛Ąāŗ†ā˛¨āŗ ā˛…ā˛¨āŗā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛˛āŗ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛šāŗŠā˛‚ā˛Ļā˛ŋ➏ā˛ŋ. ➍⺀ā˛ĩ⺁ ā˛Žā˛‚ā˛Ļā˛žā˛Ļ➰⺂ ➅ā˛Ēāŗā˛˛ā˛ŋ➕⺇ā˛ļā˛¨āŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ➏➂ā˛Ēāŗ‚ā˛°āŗā˛Ŗā˛ĩā˛žā˛—ā˛ŋ ā˛˛ā˛žā˛—āŗ out ā˛Ÿāŗ ➆➗ā˛ŋā˛Ļāŗā˛Ļ➰⺆ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Ēā˛ŋā˛¨āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†." }, "invalidPin": { "message": "ā˛…ā˛Žā˛žā˛¨āŗā˛¯ ā˛Ēā˛ŋā˛¨āŗ ā˛•āŗ‹ā˛Ąāŗ." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "ā˛Ŧā˛¯āŗ‹ā˛Žāŗ†ā˛Ÿāŗā˛°ā˛ŋā˛•āŗā˛¸āŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛…ā˛¨āŗā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "ā˛Ąāŗ†ā˛¸āŗā˛•āŗâ€Œā˛Ÿā˛žā˛Ēāŗâ€Œā˛¨ā˛ŋ➂ā˛Ļ ā˛Ļ⺃ā˛ĸāŗ€ā˛•ā˛°ā˛Ŗā˛•āŗā˛•ā˛žā˛—ā˛ŋ ā˛•ā˛žā˛¯ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "ā˛Ŧāŗā˛°āŗŒā˛¸ā˛°āŗ ā˛Žā˛°āŗā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗâ€Œā˛¨āŗŠā˛‚ā˛Ļā˛ŋ➗⺆ ā˛˛ā˛žā˛•āŗ ā˛Žā˛žā˛Ąā˛ŋ" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "➍⺀ā˛ĩ⺁ ➕➍ā˛ŋā˛ˇāŗā˛  ➒➂ā˛Ļ⺁ ā˛¸ā˛‚ā˛—āŗā˛°ā˛šā˛ĩā˛¨āŗā˛¨āŗ ➆➰ā˛ŋ➏ā˛Ŧ⺇➕⺁." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "➒➂ā˛Ļ⺁ ➅ā˛Ĩā˛ĩā˛ž ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛¸ā˛‚ā˛¸āŗā˛Ĩāŗ† ➍⺀➤ā˛ŋ➗➺⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛œā˛¨ā˛°āŗ‡ā˛Ÿā˛°āŗ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗ ā˛Žāŗ‡ā˛˛āŗ† ā˛Ē➰ā˛ŋā˛Ŗā˛žā˛Ž ā˛Ŧāŗ€ā˛°āŗā˛¤āŗā˛¤ā˛ĩāŗ†" }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ā˛ĩā˛žā˛˛āŗā˛Ÿāŗ ā˛¸ā˛Žā˛¯ ā˛Žāŗ€ā˛°āŗā˛ĩ ā˛•āŗā˛°ā˛ŋ➝⺆" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "ā˛˛ā˛žā˛•āŗâ€Œ", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "➅➍⺁ā˛Ēā˛¯āŗā˛•āŗā˛¤", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ā˛ā˛Ÿā˛‚ ā˛…ā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗā˛¸āŗā˛Ĩā˛žā˛Ēā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "ā˛˛ā˛žā˛—āŗ out ā˛Ÿāŗ ➆➗⺁ā˛ĩ⺁ā˛Ļ➰ā˛ŋ➂ā˛Ļ ➍ā˛ŋā˛Žāŗā˛Ž ā˛ĩā˛žā˛˛āŗā˛Ÿāŗâ€Œā˛¨ ā˛Žā˛˛āŗā˛˛ā˛ž ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ĩā˛¨āŗā˛¨āŗ ➤⺆➗⺆ā˛Ļāŗā˛šā˛žā˛•āŗā˛¤āŗā˛¤ā˛Ļāŗ† ā˛Žā˛¤āŗā˛¤āŗ ā˛•ā˛žā˛˛ā˛žā˛ĩ➧ā˛ŋ ➅ā˛ĩ➧ā˛ŋ➝ ➍➂➤➰ ā˛†ā˛¨āŗâ€Œā˛˛āŗˆā˛¨āŗ ā˛Ļ⺃ hentic ⺀➕➰➪ā˛Ļ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†. ➈ ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ā˛¸āŗā˛ĩ➝➂ ā˛­ā˛°āŗā˛¤ā˛ŋ ā˛Žā˛¤āŗā˛¤āŗ ➉➺ā˛ŋ➏ā˛ŋ" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "ā˛¸āŗā˛ĩ➝➂ ➤⺁➂ā˛Ŧā˛ŋā˛Ļ ā˛ā˛Ÿā˛‚ ā˛Žā˛¤āŗā˛¤āŗ ➉➺ā˛ŋ➏ā˛ŋā˛Ļ ā˛¯āŗā˛†ā˛°āŗā˛" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "➍ā˛ŋā˛Žāŗā˛Ž ā˛šāŗŠā˛¸ ā˛Žā˛žā˛¸āŗā˛Ÿā˛°āŗ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ➍⺀➤ā˛ŋ➝ ➅ā˛ĩā˛ļāŗā˛¯ā˛•ā˛¤āŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛Ēāŗ‚ā˛°āŗˆā˛¸āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "➈ ā˛Ēāŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛—āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏⺁ā˛ĩ ā˛Žāŗ‚ā˛˛ā˛• ➍⺀ā˛ĩ⺁ ➈ ➕⺆➺➗ā˛ŋ➍ā˛ĩāŗā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➒ā˛Ēāŗā˛Ēāŗā˛¤āŗā˛¤āŗ€ā˛°ā˛ŋ:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "➏➰ā˛ŋ" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "ā˛Ąāŗ†ā˛¸āŗā˛•āŗā˛Ÿā˛žā˛Ēāŗ ➏ā˛ŋā˛‚ā˛•āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "ā˛–ā˛žā˛¤āŗ† ā˛šāŗŠā˛‚ā˛Ļā˛ŋā˛•āŗ†ā˛¯ā˛žā˛—āŗā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "ā˛Ŧā˛¯āŗŠā˛Žā˛ŋā˛Ÿāŗā˛°ā˛ŋā˛•āŗā˛¸āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛¸ā˛•āŗā˛°ā˛ŋā˛¯ā˛—āŗŠā˛ŗā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛˛āŗā˛˛" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "ā˛Ŧāŗā˛°āŗŒā˛¸ā˛°āŗ ā˛Ŧā˛¯āŗ‹ā˛Žāŗ†ā˛Ÿāŗā˛°ā˛ŋā˛•āŗā˛¸āŗ ➈ ā˛¸ā˛žā˛§ā˛¨ā˛Ļā˛˛āŗā˛˛ā˛ŋ ā˛Ŧ⺆➂ā˛Ŧ➞ā˛ŋ➏⺁ā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ā˛¸ā˛‚ā˛¸āŗā˛Ĩ⺆➝ ➍⺀➤ā˛ŋ➝⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛Žā˛žā˛˛āŗ€ā˛•ā˛¤āŗā˛ĩā˛Ļ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗ ā˛Žāŗ‡ā˛˛āŗ† ā˛Ē➰ā˛ŋā˛Ŗā˛žā˛Ž ā˛Ŧāŗ€ā˛°āŗā˛¤āŗā˛¤ā˛ŋā˛Ļāŗ†." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "ā˛šāŗŠā˛°ā˛¤āŗā˛Ēā˛Ąā˛ŋ➏ā˛ŋā˛Ļ ā˛ĄāŗŠā˛Žāŗ‡ā˛¨āŗā˛—ā˛ŗāŗ" }, "excludedDomainsDesc": { "message": "ā˛Ŧā˛ŋā˛Ÿāŗā˛ĩā˛žā˛°āŗā˛Ąāŗ ➈ ā˛ĄāŗŠā˛Žāŗ‡ā˛¨āŗā˛—ā˛ŗā˛ŋā˛—ā˛žā˛—ā˛ŋ ā˛˛ā˛žā˛—ā˛ŋā˛¨āŗ ā˛ĩā˛ŋā˛ĩā˛°ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➉➺ā˛ŋ➏➞⺁ ➕⺇➺⺁ā˛ĩ⺁ā˛Ļā˛ŋā˛˛āŗā˛˛. ā˛Ŧā˛Ļā˛˛ā˛žā˛ĩā˛Ŗāŗ†ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ā˛œā˛žā˛°ā˛ŋ➗⺆ ➤➰➞⺁ ➍⺀ā˛ĩ⺁ ā˛Ē⺁➟ā˛ĩā˛¨āŗā˛¨āŗ ➰ā˛ŋā˛Ģāŗā˛°āŗ†ā˛ļāŗ ā˛Žā˛žā˛Ąā˛Ŧ⺇➕⺁." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ā˛Žā˛žā˛¨āŗā˛¯ā˛ĩā˛žā˛Ļ ā˛ĄāŗŠā˛Žāŗ‡ā˛¨āŗ ā˛…ā˛˛āŗā˛˛", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛ŋ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ā˛šāŗā˛Ąāŗā˛•ā˛žā˛Ÿ ā˛•ā˛ŗāŗā˛šā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ā˛Ēā˛ āŗā˛¯" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ā˛Ģāŗˆā˛˛āŗ" }, @@ -1666,6 +2406,9 @@ "message": "ā˛Žā˛˛āŗā˛˛ā˛ž ā˛•ā˛ŗāŗā˛šā˛ŋā˛¸āŗā˛¤āŗā˛¤ā˛Ļāŗ†", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "➗➰ā˛ŋā˛ˇāŗā˛  ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļ ā˛Žā˛Ŗā˛ŋ➕⺆ ➤➞⺁ā˛Ēā˛ŋā˛Ļāŗ†", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "ā˛Ēā˛žā˛¸āŗā˛ĩā˛°āŗā˛Ąāŗ ā˛°ā˛•āŗā˛ˇā˛ŋ➤" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "➞ā˛ŋā˛‚ā˛•āŗ ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛ŋ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "➈ ā˛•ā˛ŗāŗā˛šā˛ŋ➏⺁ā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➅➺ā˛ŋ➏➞⺁ ➍⺀ā˛ĩ⺁ ā˛–ā˛šā˛ŋ➤ā˛ĩā˛žā˛—ā˛ŋ ā˛Ŧ➝➏⺁ā˛ĩā˛ŋā˛°ā˛ž?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "ā˛•ā˛ŗāŗā˛šā˛ŋ➏⺁ ➏➂ā˛Ēā˛žā˛Ļā˛ŋ➏ā˛ŋ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛ŋā˛Ļ ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛• ā˛Žā˛¤āŗā˛¤āŗ ā˛¸ā˛Žā˛¯ā˛Ļ ā˛Žāŗ‡ā˛˛āŗ† ā˛•ā˛ŗāŗā˛šā˛ŋ➏⺁ā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛ļā˛žā˛ļāŗā˛ĩ➤ā˛ĩā˛žā˛—ā˛ŋ ➅➺ā˛ŋā˛¸ā˛˛ā˛žā˛—āŗā˛¤āŗā˛¤ā˛Ļāŗ†.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "ā˛Žāŗā˛•āŗā˛¤ā˛žā˛¯ ā˛Ļā˛ŋā˛¨ā˛žā˛‚ā˛•" }, @@ -1769,6 +2523,10 @@ "message": "➈ ā˛•ā˛ŗāŗā˛šā˛ŋ➏⺁ā˛ĩā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ā˛Ēāŗā˛°ā˛ĩāŗ‡ā˛ļā˛ŋ➏➞⺁ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛ŋ➗⺆ ā˛Ēā˛žā˛¸āŗâ€Œā˛ĩā˛°āŗā˛Ąāŗ ā˛ā˛šāŗ ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "➈ ā˛•ā˛ŗāŗā˛šā˛ŋ➏⺁ā˛ĩ ā˛Ŧā˛—āŗā˛—āŗ† ā˛–ā˛žā˛¸ā˛—ā˛ŋ ➟ā˛ŋā˛Ēāŗā˛Ē➪ā˛ŋ➗➺⺁.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "ā˛•ā˛ŗāŗā˛šā˛ŋ➏⺁ ➰➚ā˛ŋā˛¸ā˛˛ā˛žā˛—ā˛ŋā˛Ļāŗ†", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "ā˛•ā˛ŗāŗā˛šā˛ŋ➏ā˛ŋā˛Ļ ➏➂ā˛Ēā˛žā˛Ļ➍⺆", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "ā˛Ģāŗˆā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ā˛†ā˛¯āŗā˛•āŗ† ā˛Žā˛žā˛Ąā˛˛āŗ, ā˛¸āŗˆā˛Ąāŗâ€Œā˛Ŧā˛žā˛°āŗâ€Œā˛¨ā˛˛āŗā˛˛ā˛ŋ ā˛ĩā˛ŋā˛¸āŗā˛¤ā˛°ā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➤⺆➰⺆➝ā˛ŋ➰ā˛ŋ (ā˛¸ā˛žā˛§āŗā˛¯ā˛ĩā˛žā˛Ļ➰⺆) ➅ā˛Ĩā˛ĩā˛ž ➈ ā˛Ŧāŗā˛¯ā˛žā˛¨ā˛°āŗ ā˛•āŗā˛˛ā˛ŋā˛•āŗ ā˛Žā˛žā˛Ąāŗā˛ĩ ā˛Žāŗ‚ā˛˛ā˛• ā˛šāŗŠā˛¸ ā˛ĩā˛ŋā˛‚ā˛Ąāŗ‹ā˛—āŗ† ā˛Ēā˛žā˛Ēāŗā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋ." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "➏ā˛Ģā˛žā˛°ā˛ŋ ā˛Ŧ➺➏ā˛ŋ ā˛Ģāŗˆā˛˛āŗ ā˛†ā˛¯āŗā˛•āŗ† ā˛Žā˛žā˛Ąā˛˛āŗ, ➈ ā˛Ŧāŗā˛¯ā˛žā˛¨ā˛°āŗ ā˛•āŗā˛˛ā˛ŋā˛•āŗ ā˛Žā˛žā˛Ąāŗā˛ĩ ā˛Žāŗ‚ā˛˛ā˛• ā˛šāŗŠā˛¸ ā˛ĩā˛ŋā˛‚ā˛Ąāŗ‹ā˛—āŗ† ā˛Ēā˛žā˛Ēāŗā˛”ā˛Ÿāŗ ā˛Žā˛žā˛Ąā˛ŋ." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "➍⺀ā˛ĩ⺁ ā˛Ēāŗā˛°ā˛žā˛°ā˛‚ā˛­ā˛ŋ➏⺁ā˛ĩ ā˛ŽāŗŠā˛Ļ➞⺁" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "ā˛¸āŗā˛ĩ⺀➕➰ā˛ŋ➏⺁ā˛ĩā˛ĩ➰ā˛ŋ➂ā˛Ļ ā˛¨ā˛¨āŗā˛¨ ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛ĩā˛ŋā˛ŗā˛žā˛¸ā˛ĩā˛¨āŗā˛¨āŗ ā˛Žā˛°āŗ†ā˛Žā˛žā˛Ąā˛ŋ." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "➒➂ā˛Ļ⺁ ➅ā˛Ĩā˛ĩā˛ž ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛¸ā˛‚ā˛¸āŗā˛Ĩ⺆➝ ➍⺀➤ā˛ŋ➗➺⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛•ā˛ŗāŗā˛šā˛ŋ➏⺁ā˛ĩ ā˛†ā˛¯āŗā˛•āŗ†ā˛—ā˛ŗ ā˛Žāŗ‡ā˛˛āŗ† ā˛Ē➰ā˛ŋā˛Ŗā˛žā˛Ž ā˛Ŧāŗ€ā˛°āŗā˛¤āŗā˛¤ā˛ĩāŗ†." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛Ē➰ā˛ŋā˛ļ⺀➞➍⺆ ā˛…ā˛—ā˛¤āŗā˛¯ā˛ĩā˛ŋā˛Ļāŗ†" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "➈ ā˛ĩ⺈ā˛ļā˛ŋā˛ˇāŗā˛Ÿāŗā˛¯ā˛ĩā˛¨āŗā˛¨āŗ ā˛Ŧ➺➏➞⺁ ➍ā˛ŋā˛Žāŗā˛Ž ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ➍⺀ā˛ĩ⺁ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛Ŧ⺇➕⺁. ā˛ĩāŗ†ā˛Ŧāŗ ā˛ĩā˛žā˛˛āŗā˛Ÿāŗā˛¨ā˛˛āŗā˛˛ā˛ŋ ➍ā˛ŋā˛Žāŗā˛Ž ā˛‡ā˛Žāŗ‡ā˛˛āŗ ā˛…ā˛¨āŗā˛¨āŗ ➍⺀ā˛ĩ⺁ ā˛Ē➰ā˛ŋā˛ļ⺀➞ā˛ŋ➏ā˛Ŧā˛šāŗā˛Ļ⺁." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 795b47eca83..d86473794a9 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - ëŦ´ëŖŒ 비밀번호 관ëĻŦėž", + "message": "Bitwarden 비밀번호 관ëĻŦėž", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "ë‹šė‹ ė˜ ëĒ¨ë“  ę¸°ę¸°ė—ė„œ ė‚ŦėšŠí•  눘 ėžˆëŠ”, ė•ˆė „í•œ ëŦ´ëŖŒ 비밀번호 관ëĻŦėžėž…ë‹ˆë‹¤.", - "description": "Extension description" + "message": "ė§‘ė—ė„œë„, 링ėžĨė—ė„œë„, ė´ë™ ė¤‘ė—ë„ Bitwardenė€ 비밀번호, íŒ¨ėŠ¤í‚¤, ë¯ŧ감 ė •ëŗ´ëĨŧ ė‰Ŋ枌 ëŗ´í˜¸í•Šë‹ˆë‹¤.", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ė•ˆė „ ëŗ´ę´€í•¨ė— ė ‘ęˇŧ하려면 ëĄœęˇ¸ė¸í•˜ęą°ë‚˜ 냈 ęŗ„ė •ė„ ë§Œë“œė„¸ėš”." }, + "inviteAccepted": { + "message": "ė´ˆëŒ€ ėŠšë‚™" + }, "createAccount": { "message": "ęŗ„ė • 만들기" }, - "login": { - "message": "ëĄœęˇ¸ė¸" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "비밀번호 네렕" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "비밀번호ëĨŧ ė„¤ė •í•˜ė—Ŧ ęŗ„ė • ėƒė„ąė„ ė™„ëŖŒí•Šë‹ˆë‹¤." }, "enterpriseSingleSignOn": { "message": "ė—”í„°í”„ëŧė´ėψ í†ĩ합 ė¸ėĻ (SSO)" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ë§ˆėŠ¤í„° 비밀번호 힌트는 ë§ˆėŠ¤í„° 비밀번호ëĨŧ ėžŠė—ˆė„ 때 ë„ė›€ė´ 될 눘 ėžˆėŠĩ니다." }, + "masterPassHintText": { + "message": "비밀번호ëĨŧ ėžŠė–´ë˛„ëϰ ę˛Ŋ뚰 비밀번호 힌트가 ė´ëŠ”ėŧ로 ė „ė†ĄëŠë‹ˆë‹¤. ėĩœëŒ€ ę¸¸ė´: $CURRENT$/$MAXIMUM$", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "ë§ˆėŠ¤í„° 비밀번호 ë‹¤ė‹œ ėž…ë Ĩ" }, "masterPassHint": { "message": "ë§ˆėŠ¤í„° 비밀번호 힌트 (ė„ íƒ)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "탭" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "비밀번호 ëŗĩė‚Ŧ" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "메ëǍ ëŗĩė‚Ŧ" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "ëŗ´ė•ˆ ėŊ”드 ëŗĩė‚Ŧ" }, + "copyName": { + "message": "ė´ëĻ„ ëŗĩė‚Ŧ" + }, + "copyCompany": { + "message": "회ė‚Ŧ ëŗĩė‚Ŧ" + }, + "copySSN": { + "message": "ėŖŧë¯ŧ등록번호 ëŗĩė‚Ŧ" + }, + "copyPassportNumber": { + "message": "ė—ŦęļŒ ë˛ˆí˜¸ ëŗĩė‚Ŧ" + }, + "copyLicenseNumber": { + "message": "ėš´ė „ëŠ´í—ˆ 번호 ëŗĩė‚Ŧ" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ėžë™ ė™„ė„ą" }, + "autoFillLogin": { + "message": "ëĄœęˇ¸ė¸ ėžë™ ė™„ė„ą" + }, + "autoFillCard": { + "message": "ėš´ë“œ ėžë™ ė™„ė„ą" + }, + "autoFillIdentity": { + "message": "닠뛐 ėžë™ ė™„ė„ą" + }, "generatePasswordCopied": { "message": "비밀번호 ėƒė„ą 및 클ëĻŊëŗ´ë“œė— ëŗĩė‚Ŧ" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "ė‚ŦėšŠí•  눘 ėžˆëŠ” ëĄœęˇ¸ė¸ė´ ė—†ėŠĩ니다." }, + "noCards": { + "message": "ėš´ë“œ ė—†ėŒ" + }, + "noIdentities": { + "message": "닠뛐 ė—†ėŒ" + }, + "addLoginMenu": { + "message": "ëĄœęˇ¸ė¸ ėļ”ę°€" + }, + "addCardMenu": { + "message": "ėš´ë“œ ėļ”ę°€" + }, + "addIdentityMenu": { + "message": "닠뛐 ėļ”ę°€" + }, "unlockVaultMenu": { "message": "ëŗ´ę´€í•¨ ėž ę¸ˆ í•´ė œ" }, @@ -115,6 +231,18 @@ "addItem": { "message": "항ëĒŠ ėļ”ę°€" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "비밀번호 힌트" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "ęŗ„ė†í•˜ë ¤ëŠ´ ė•”í˜¸ëĨŧ í™•ė¸í•˜ė„¸ėš”." }, - "account": { - "message": "ęŗ„ė •" - }, "changeMasterPassword": { "message": "ë§ˆėŠ¤í„° 비밀번호 ëŗ€ę˛Ŋ" }, + "continueToWebApp": { + "message": "ė›š ė•ąė—ė„œ ęŗ„ė†í•˜ė‹œę˛ ėšŠ?" + }, + "continueToWebAppDesc": { + "message": "ė›š ė•ąė—ė„œ Bitwarden ęŗ„ė •ė˜ 더 ë§Žė€ 기ëŠĨė„ íƒėƒ‰í•´ëŗ´ė„¸ėš”." + }, + "continueToHelpCenter": { + "message": "ë„ė›€ë§ ė„ŧ터로 ė´ë™" + }, + "continueToHelpCenterDesc": { + "message": "Bitwardenė˜ ėžė„¸í•œ ė‚ŦėšŠë˛•ė€ ë„ė›€ë§ ė„ŧí„°ė—ė„œ í™•ė¸í•˜ė„¸ėš”." + }, + "continueToBrowserExtensionStore": { + "message": "브ëŧėš°ė € 확ėžĨ ėŠ¤í† ė–´ëĄœ ė´ë™í•˜ė‹œę˛ ėŠĩ니까?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Bitwarden ė›š ė•ąė—ė„œ ë§ˆėŠ¤í„° 비밀번호ëĨŧ ëŗ€ę˛Ŋ할 눘 ėžˆėŠĩ니다." + }, "fingerprintPhrase": { "message": "ė§€ëŦ¸ ęĩŦ레", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ëĄœęˇ¸ė•„ė›ƒ" }, + "aboutBitwarden": { + "message": "Bitwarden 뗐 대하ė—Ŧ" + }, "about": { "message": "ė •ëŗ´" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "bitwarden.com ėœŧ로 ė´ë™í• ęšŒėš”?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "ë˛„ė „" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "폴더 íŽ¸ė§‘" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "폴더 ė‚­ė œ" }, @@ -196,13 +396,13 @@ "message": "ë„ė›€ë§ 및 ė˜ę˛Ŧ" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "Bitwarden ë„ė›€ë§ ė„ŧ터" }, "communityForums": { - "message": "Explore Bitwarden community forums" + "message": "Bitwarden ėģ¤ëŽ¤ë‹ˆí‹° íŦëŸŧ íƒėƒ‰í•˜ę¸°" }, "contactSupport": { - "message": "Contact Bitwarden support" + "message": "Bitwarden 맀뛐뗐 ëŦ¸ė˜í•˜ę¸°" }, "sync": { "message": "동기화" @@ -218,13 +418,13 @@ }, "generator": { "message": "ėƒė„ąę¸°", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "뜠ėŧëŦ´ė´í•˜ęŗ  강ë Ĩ한 비밀번호ëĨŧ ėžë™ėœŧ로 ėƒė„ąí•Šë‹ˆë‹¤." }, - "bitWebVault": { - "message": "Bitwarden ė›š ëŗ´ę´€í•¨" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "항ëĒŠ ę°€ė ¸ė˜¤ę¸°" @@ -235,6 +435,9 @@ "generatePassword": { "message": "비밀번호 ėƒė„ą" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "비밀번호 ėžŦėƒė„ą" }, @@ -244,17 +447,60 @@ "length": { "message": "ę¸¸ė´" }, + "passwordMinLength": { + "message": "ėĩœė†Œ 비밀번호 ę¸¸ė´" + }, "uppercase": { - "message": "대ëŦ¸ėž (A-Z)" + "message": "대ëŦ¸ėž (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "ė†ŒëŦ¸ėž (a-z)" + "message": "ė†ŒëŦ¸ėž (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "ėˆĢėž (0-9)" + "message": "ėˆĢėž (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "íŠšėˆ˜ ëŦ¸ėž (!@#$%^&*)" + "message": "íŠšėˆ˜ ëŦ¸ėž (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ë‹¨ė–´ 눘" @@ -276,7 +522,16 @@ "message": "íŠšėˆ˜ ëŦ¸ėž ėĩœė†Œ 氜눘" }, "avoidAmbChar": { - "message": "ëĒ¨í˜¸í•œ ëŦ¸ėž ė‚ŦėšŠ ė•ˆ 함" + "message": "ëĒ¨í˜¸í•œ ëŦ¸ėž ė‚ŦėšŠ ė•ˆ 함", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ëŗ´ę´€í•¨ ę˛€ėƒ‰" @@ -299,15 +554,30 @@ "password": { "message": "비밀번호" }, + "totp": { + "message": "ė¸ėĻę¸° 비밀 키" + }, "passphrase": { "message": "íŒ¨ėŠ¤í”„ë ˆė´ėψ" }, "favorite": { "message": "ėĻę˛¨ė°žę¸°" }, + "unfavorite": { + "message": "ėĻę˛¨ė°žę¸° í•´ė œ" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "메ëǍ" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "메ëǍ" }, @@ -326,6 +596,18 @@ "launch": { "message": "뗴揰" }, + "launchWebsite": { + "message": "ė›šė‚Ŧė´íŠ¸ 뗴揰" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ė›š ė‚Ŧė´íŠ¸" }, @@ -338,8 +620,23 @@ "other": { "message": "기타" }, + "unlockMethods": { + "message": "ėž ę¸ˆ í•´ė œ ė˜ĩė…˜" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "ėž ę¸ˆ í•´ė œ ë°Šë˛•ė„ ė„¤ė •í•˜ė—Ŧ ëŗ´ę´€í•¨ė˜ ė‹œę°„ 봈ęŗŧ ë™ėž‘ė„ ëŗ€ę˛Ŋí•˜ė„¸ėš”." + }, + "unlockMethodNeeded": { + "message": "ė„¤ė •ė—ė„œ ėž ę¸ˆ í•´ė œ ėˆ˜ë‹¨ ė„¤ė •í•˜ę¸°" + }, + "sessionTimeoutHeader": { + "message": "ė„¸ė…˜ ë§ŒëŖŒ" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "기타 ė˜ĩė…˜" }, "rateExtension": { "message": "확ėžĨ 프로그램 평가" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "ëŗ´ę´€í•¨ė´ ėž ę˛¨ ėžˆėŠĩ니다. ë§ˆėŠ¤í„° 비밀번호ëĨŧ ėž…ë Ĩ하ė—Ŧ ęŗ„ė†í•˜ė„¸ėš”." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "ėž ę¸ˆ í•´ė œ" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "ëŗ´ę´€í•¨ ė‹œę°„ ė œí•œ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "ė§€ę¸ˆ ėž ęˇ¸ę¸°" }, + "lockAll": { + "message": "ëĒ¨ë‘ ėž ęˇ¸ę¸°" + }, "immediately": { "message": "ėĻ‰ė‹œ" }, @@ -421,11 +733,23 @@ "message": "브ëŧėš°ė € ë‹¤ė‹œ ė‹œėž‘ ė‹œ" }, "never": { - "message": "ėž ęˇ¸ė§€ ė•ŠėŒ" + "message": "ė•ˆí•¨" }, "security": { "message": "ëŗ´ė•ˆ" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "똤ëĨ˜ę°€ ë°œėƒí–ˆėŠĩ니다" }, @@ -442,7 +766,7 @@ "message": "ë§ˆėŠ¤í„° 비밀번호ëĨŧ ėžŦėž…ë Ĩ해ė•ŧ 합니다." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "ë§ˆėŠ¤í„° 비밀번호는 ėĩœė†Œ $VALUE$ėž ė´ėƒė´ė–´ė•ŧ 합니다.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "ęŗ„ė • ėƒė„ąė´ ė™„ëŖŒë˜ė—ˆėŠĩ니다! ė´ė œ ëĄœęˇ¸ė¸í•˜ė‹¤ 눘 ėžˆėŠĩ니다." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "ëĄœęˇ¸ė¸ė— ė„ąęŗĩ했ėŠĩ니다." + }, + "youMayCloseThisWindow": { + "message": "ė´ė œ ė°Ŋė„ ë‹Ģėœŧ다 눘 ėžˆėŠĩ니다." + }, "masterPassSent": { "message": "ë§ˆėŠ¤í„° 비밀번호 힌트가 담긴 ė´ëŠ”ėŧė„ ëŗ´ëƒˆėŠĩ니다." }, "verificationCodeRequired": { "message": "ė¸ėĻ ėŊ”드는 ë°˜ë“œė‹œ ėž…ë Ĩ해ė•ŧ 합니다." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "ėœ íš¨í•˜ė§€ ė•Šė€ í™•ė¸ ėŊ”드" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "ė„ íƒí•œ 항ëĒŠė„ ė´ íŽ˜ė´ė§€ė—ė„œ ėžë™ ė™„ė„ąí•  눘 ė—†ėŠĩ니다. ëŒ€ė‹  ė •ëŗ´ëĨŧ 링렑 ëŗĩė‚Ŧ / ëļ™ė—Ŧë„Ŗę¸°í•˜ė—Ŧ ė‚ŦėšŠí•˜ė‹­ė‹œė˜¤." }, + "totpCaptureError": { + "message": "현ėžŦ ė›šíŽ˜ė´ė§€ė—ė„œ QR ėŊ”드ëĨŧ 늤ėē”í•  눘 ė—†ėŠĩ니다" + }, + "totpCaptureSuccess": { + "message": "ė¸ėĻ 키ëĨŧ ėļ”ę°€í–ˆėŠĩ니다" + }, + "totpCapture": { + "message": "현ėžŦ ė›šíŽ˜ė´ė§€ė—ė„œ QR ėŊ”드 늤ėē”í•˜ę¸°" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "ė¸ėĻė„œ 키 (TOTP) ëŗĩė‚Ŧ" + }, "loggedOut": { "message": "ëĄœęˇ¸ė•„ė›ƒë¨" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "ëĄœęˇ¸ė¸ ė„¸ė…˜ė´ ë§ŒëŖŒë˜ė—ˆėŠĩ니다." }, + "logIn": { + "message": "ëĄœęˇ¸ė¸" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "ë§ŒëŖŒëœ 링íŦ" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "ė •ë§ ëĄœęˇ¸ė•„ė›ƒí•˜ė‹œę˛ ėŠĩ니까?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "폴더 ėļ”가함" }, - "changeMasterPass": { - "message": "ë§ˆėŠ¤í„° 비밀번호 ëŗ€ę˛Ŋ" - }, - "changeMasterPasswordConfirmation": { - "message": "bitwarden.com ė›š ëŗ´ę´€í•¨ė—ė„œ ë§ˆėŠ¤í„° 비밀번호ëĨŧ 바ęŋ€ 눘 ėžˆėŠĩ니다. ė§€ę¸ˆ ė›š ė‚Ŧė´íŠ¸ëĨŧ ë°ŠëŦ¸í•˜ė‹œę˛ ėŠĩ니까?" - }, "twoStepLoginConfirmation": { "message": "2ë‹¨ęŗ„ ė¸ėĻė€ ëŗ´ė•ˆ 키, ė¸ėĻ ė•ą, SMS, ė „í™” í†ĩ화 ë“ąė˜ 다ëĨ¸ 기기로 ė‚ŦėšŠėžė˜ ëĄœęˇ¸ė¸ ė‹œë„ëĨŧ 검ėĻí•˜ė—Ŧ ė‚ŦėšŠėžė˜ ęŗ„ė •ė„ ë”ėšą ė•ˆė „í•˜ę˛Œ 만듭니다. 2ë‹¨ęŗ„ ė¸ėĻė€ bitwarden.com ė›š ëŗ´ę´€í•¨ė—ė„œ í™œė„ąí™”í•  눘 ėžˆėŠĩ니다. ė§€ę¸ˆ ė›š ė‚Ŧė´íŠ¸ëĨŧ ë°ŠëŦ¸í•˜ė‹œę˛ ėŠĩ니까?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "폴더 íŽ¸ė§‘í•¨" }, @@ -552,6 +936,10 @@ "newUri": { "message": "냈 URI" }, + "addDomain": { + "message": "ë„ëŠ”ė¸ ėļ”ę°€", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "항ëĒŠ ėļ”가함" }, @@ -590,22 +978,34 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "ëĄœęˇ¸ė¸ė„ ėļ”가할 ęą´ė§€ ëŦŧė–´ëŗ´ę¸°" + }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" }, "addLoginNotificationDesc": { "message": "\"ëĄœęˇ¸ė¸ ėļ”ę°€ ė•ŒëĻŧ\"ė„ ė‚ŦėšŠí•˜ëŠ´ 냈 ëĄœęˇ¸ė¸ė„ ė‚ŦėšŠí•  때마다 ëŗ´ę´€í•¨ė— ꡸ ëĄœęˇ¸ė¸ė„ ėļ”가할 ę˛ƒė¸ė§€ ëŦŧė–´ë´…ë‹ˆë‹¤." }, + "addLoginNotificationDescAlt": { + "message": "ëŗ´ę´€í•¨ė— 항ëĒŠė´ ė—†ė„ ę˛Ŋ뚰 ėļ”ę°€í•˜ëŧ는 ëŠ”ė‹œė§€ëĨŧ í‘œė‹œí•Šë‹ˆë‹¤. ëĒ¨ë“  ëĄœęˇ¸ė¸ëœ 溄렕뗐 ė ėšŠëŠë‹ˆë‹¤." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "탭 íŽ˜ė´ė§€ė— ėš´ë“œ í‘œė‹œ" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "클ëĻŊëŗ´ë“œ ëš„ėš°ę¸°", @@ -622,10 +1022,19 @@ "message": "똈, ė§€ę¸ˆ ė €ėžĨ하겠ėŠĩ니다." }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "현ėžŦ ëĄœęˇ¸ė¸ėœŧ로 ė—…ë°ė´íŠ¸í•  ęą´ė§€ ëŦģ기" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "ė›šė‚Ŧė´íŠ¸ė—ė„œ ëŗ€ę˛Ŋ ė‚Ŧí•­ė´ ę°ė§€ë˜ëŠ´ ëĄœęˇ¸ė¸ 비밀번호ëĨŧ ė—…ë°ė´íŠ¸í•˜ëŧ는 ëŠ”ė‹œė§€ëĨŧ í‘œė‹œí•Šë‹ˆë‹¤." + }, + "changedPasswordNotificationDescAlt": { + "message": "ė›šė‚Ŧė´íŠ¸ė—ė„œ ëŗ€ę˛Ŋ ė‚Ŧí•­ė´ ę°ė§€ë˜ëŠ´ ëĄœęˇ¸ė¸ 비밀번호ëĨŧ ė—…ë°ė´íŠ¸í•˜ëŧ는 ëŠ”ė‹œė§€ëĨŧ í‘œė‹œí•Šë‹ˆë‹¤. ëĒ¨ë“  ëĄœęˇ¸ė¸ëœ 溄렕뗐 ė ėšŠëŠë‹ˆë‹¤." + }, + "enableUsePasskeys": { + "message": "íŒ¨ėŠ¤í‚¤ëĨŧ ė €ėžĨ 및 ė‚ŦėšŠí• ė§€ ëŦģ기" + }, + "usePasskeysDesc": { + "message": "ëŗ´ę´€í•¨ė— 냈 íŒ¨ėŠ¤í‚¤ëĨŧ ė €ėžĨ하거나 ëĄœęˇ¸ė¸í• ė§€ ëŦŧė–´ë´…ë‹ˆë‹¤. ëĒ¨ë“  ëĄœęˇ¸ė¸ëœ 溄렕뗐 ė ėšŠëŠë‹ˆë‹¤." }, "notificationChangeDesc": { "message": "Bitwarden뗐 ė €ėžĨë˜ė–´ ėžˆëŠ” 비밀번호ëĨŧ ė´ 비밀번호로 ëŗ€ę˛Ŋí•˜ė‹œę˛ ėŠĩ니까?" @@ -634,23 +1043,29 @@ "message": "똈, ė§€ę¸ˆ ëŗ€ę˛Ŋ하겠ėŠĩ니다." }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { - "message": "Unlock" + "message": "ėž ę¸ˆ í•´ė œ" + }, + "additionalOptions": { + "message": "ėļ”ę°€ ė˜ĩė…˜" }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "ę¸°ëŗ¸ URI ėŧėš˜ ė¸ė‹", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "ėžë™ ė™„ė„ą ë“ąė˜ ėž‘ė—…ė—ė„œ 각 ëĄœęˇ¸ė¸ 항ëĒŠė˜ URI ėŧėš˜ 氐맀ëĨŧ 래ëĻŦ할 ę¸°ëŗ¸ ë°Šë˛•ė„ ė„ íƒí•˜ė„¸ėš”." + "message": "ėžë™ ė™„ė„ąę°™ė€ ėž‘ė—…ė„ ėˆ˜í–‰í•  때 ëĄœęˇ¸ė¸ė— 대해 URI ėŧėš˜ 氐맀氀 래ëĻŦ되는 ę¸°ëŗ¸ ë°Šë˛•ė„ ė„ íƒí•˜ė‹­ė‹œė˜¤." }, "theme": { "message": "테마" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ė• í”ŒëĻŦėŧ€ė´ė…˜ė˜ ėƒ‰ėƒ 테마ëĨŧ ëŗ€ę˛Ŋ합니다." }, + "themeDescAlt": { + "message": "ė• í”ŒëĻŦėŧ€ė´ė…˜ ėƒ‰ėƒ 테마ëĨŧ ëŗ€ę˛Ŋ합니다. ëĒ¨ë“  ëĄœęˇ¸ė¸ëœ 溄렕뗐 ė ėšŠëŠë‹ˆë‹¤." + }, "dark": { "message": "ė–´ë‘ėš´ 테마", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "ëŗ´ę´€í•¨ ë‚´ëŗ´ë‚´ę¸°" }, "fileFormat": { "message": "파ėŧ í˜•ė‹" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "파ėŧ 비밀번호" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "ë‚´ëŗ´ë‚´ę¸° ėœ í˜•" + }, + "accountRestricted": { + "message": "ęŗ„ė • ė œí•œë¨" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "ę˛Ŋęŗ ", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ęŗĩėœ ë¨" }, - "learnOrg": { - "message": "ėĄ°ė§ė— 대해 ė•Œė•„ëŗ´ę¸°" - }, - "learnOrgConfirmation": { - "message": "Bitwardenė€ ėĄ°ė§ėšŠ ęŗ„ė •ė„ ė‚ŦėšŠí•˜ëŠ´ ė‚ŦėšŠėžė˜ ëŗ´ę´€í•¨ė„ íƒ€ė¸ė—ę˛Œ ęŗĩėœ í•  눘 ėžˆėŠĩ니다. bitwarden.com ė›š ė‚Ŧė´íŠ¸ëĨŧ ë°ŠëŦ¸í•˜ė—Ŧ 더 ėžė„¸ížˆ ė•Œė•„ëŗ´ė‹œę˛ ėŠĩ니까?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "ėĄ°ė§ėœŧ로 ė´ë™í•˜ę¸°" @@ -762,6 +1204,9 @@ "file": { "message": "파ėŧ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "파ėŧė„ ė„ íƒí•˜ė„¸ėš”." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1GBė˜ ė•”í˜¸í™”ëœ 파ėŧ ė €ėžĨė†Œ." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "bitwarden.com ė›š ëŗ´ę´€í•¨ė—ė„œ 프ëĻŦë¯¸ė—„ ëŠ¤ë˛„ė‹­ė„ ęĩŦėž…í•  눘 ėžˆėŠĩ니다. ė§€ę¸ˆ ė›š ė‚Ŧė´íŠ¸ëĨŧ ë°ŠëŦ¸í•˜ė‹œę˛ ėŠĩ니까?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "프ëĻŦë¯¸ė—„ ė‚ŦėšŠėžėž…ë‹ˆë‹¤!" }, "premiumCurrentMemberThanks": { "message": "Bitwardenė„ ė§€ė›í•´ ėŖŧė…”ė„œ 감ė‚Ŧ합니다." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "ė´ ëĒ¨ë“  기ëŠĨė„ ė—° $PRICE$뗐 ė´ėšŠí•˜ė‹¤ 눘 ėžˆėŠĩ니다!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ėƒˆëĄœ ęŗ ėš¨ ė™„ëŖŒ" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "ė¸ėĻ ė•ą" }, - "authenticatorAppDesc": { - "message": "ė¸ėĻ ė•ą(Authy, Google OTP 등)ė„ í†ĩ하ė—Ŧ ėŧíšŒėšŠ ė¸ėĻ ėŊ”드ëĨŧ ėƒė„ąí•Šë‹ˆë‹¤.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP ëŗ´ė•ˆ 키" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "YubiKeyëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė‚ŦėšŠėžė˜ 溄렕뗐 ė ‘ęˇŧ합니다. YubiKey 4, 4 Nano, 4C 및 NEO 기기ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다." }, - "duoDesc": { - "message": "Duo Mobile ė•ą, SMS, ė „í™” í†ĩ화ëĨŧ ė‚ŦėšŠí•œ Duo Security 또는 U2F ëŗ´ė•ˆ 키ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė¸ėĻí•˜ė„¸ėš”.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "ė´ëŠ”ėŧ" }, - "emailDesc": { - "message": "ė¸ėĻ ėŊ”ë“œę°€ 담긴 ė´ëŠ”ėŧė„ ë‹¤ė‹œ ëŗ´ëƒ…ë‹ˆë‹¤." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "ėžė˛´ í˜¸ėŠ¤íŒ… 환ę˛Ŋ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "똍-í”„ë ˆë¯¸ėŠ¤ Bitwardenė´ í˜¸ėŠ¤íŒ…ë˜ęŗ  ėžˆëŠ” ė„œë˛„ė˜ ę¸°ëŗ¸ URLė„ ė§€ė •í•˜ė„¸ėš”." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "ė‚ŦėšŠėž 맀렕 환ę˛Ŋ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "ė„œë˛„ URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API ė„œë˛„ URL" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "환ę˛Ŋ URL ę°’ė„ ė €ėžĨ했ėŠĩ니다." }, + "showAutoFillMenuOnFormFields": { + "message": "ėž…ë Ĩ í•„ë“œė— ėžë™ ė™„ė„ą 메뉴 í‘œė‹œ", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "ėļŠëŒė„ ë°Šė§€í•˜ę¸° ėœ„í•´ 브ëŧėš°ė €ė˜ ę¸°ëŗ¸ ė•”í˜¸ 관ëĻŦ ė„¤ė •ė„ í•´ė œí•Šë‹ˆë‹¤." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "끄기", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "필드가 ė„ íƒë˜ė—ˆė„ 때 (íŦėģ¤ėФ ėƒíƒœ)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "ėžë™ ė™„ė„ą ė•„ė´ėŊ˜ė´ ė„ íƒë˜ė—ˆė„ 때", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "íŽ˜ė´ė§€ 로드 ė‹œ ėžë™ ė™„ė„ą ė‚ŦėšŠ" }, "enableAutoFillOnPageLoadDesc": { "message": "ëĄœęˇ¸ė¸ ė–‘ė‹ė„ ę°ė§€í•˜ëŠ´ ė›š íŽ˜ė´ė§€ 로드 ė‹œ ėžë™ ė™„ė„ąė„ ėžë™ėœŧ로 ėˆ˜í–‰í•Šë‹ˆë‹¤." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "뎍ė•Ŋ하거나 ė‹ ëĸ°í•  눘 ė—†ëŠ” ė›šė‚Ŧė´íŠ¸ íŽ˜ė´ė§€ 로드 ė‹œ ėžë™ ė™„ė„ąė´ ė•…ėšŠë  눘 ėžˆėŠĩ니다." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "ëĄœęˇ¸ė¸ 항ëĒŠė— 대한 ę¸°ëŗ¸ ėžë™ ė™„ė„ą 네렕" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "ė‚Ŧė´ë“œë°”ė—ė„œ ëŗ´ę´€í•¨ 뗴揰" }, - "commandAutofillDesc": { - "message": "현ėžŦ ė›šė‚Ŧė´íŠ¸ė—ė„œ ėĩœęˇŧ뗐 ė‚ŦėšŠí–ˆë˜ ëĄœęˇ¸ė¸ė„ ėžë™ ė™„ė„ąí•Šë‹ˆë‹¤." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "냈 ëŦ´ėž‘ėœ„ 비밀번호ëĨŧ ë§Œë“¤ęŗ  클ëĻŊëŗ´ë“œė— ëŗĩė‚Ŧ합니다." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "ëŗ´ę´€í•¨ ėž ęˇ¸ę¸°" }, - "privateModeWarning": { - "message": "ė‹œíŦëĻŋ ëĒ¨ë“œ ė§€ė›ė€ ė‹¤í—˜ė ė´ëŠ° ėŧëļ€ ę¸°ëŠĨė´ ė œí•œëŠë‹ˆë‹¤." - }, "customFields": { "message": "ė‚ŦėšŠėž 맀렕 필드" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "ė°¸ / ęą°ė§“" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "ė—°ę˛°ë¨", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,11 +1611,14 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "각 ëĄœęˇ¸ė¸ ė •ëŗ´ ė˜†ė— ė¸ė‹í•  눘 ėžˆëŠ” ė´ë¯¸ė§€ëĨŧ í‘œė‹œí•Šë‹ˆë‹¤. ëĒ¨ë“  ëĄœęˇ¸ė¸ëœ 溄렕뗐 ė ėšŠëŠë‹ˆë‹¤." + }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "ë°°ė§€ 氝눘 í‘œė‹œ" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "현ėžŦ ė›š íŽ˜ė´ė§€ė— ė €ėžĨ된 ëĄœęˇ¸ė¸ ė •ëŗ´ė˜ 눘ëĨŧ í‘œė‹œí•Šë‹ˆë‹¤." }, "cardholderName": { "message": "ėš´ë“œ ė†Œėœ ėž ė´ëĻ„" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "닠뛐" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "비밀번호 ëŗ€ę˛Ŋ 기록" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "뒤로" }, "collections": { "message": "ėģŦë ‰ė…˜" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "ėĻę˛¨ė°žę¸°" }, @@ -1282,6 +1874,10 @@ "message": "ę¸°ëŗ¸ ë„ëŠ”ė¸", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ë„ëŠ”ė¸ ė´ëĻ„", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ėŧėš˜ ė¸ė‹", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ę¸°ëŗ¸ ėŧėš˜ ė¸ė‹", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "í‘œė‹œ / 눍揰揰" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "비밀번호가 ė—†ėŠĩ니다." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "ė œęą°" }, @@ -1343,7 +1948,7 @@ "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "ėƒė„ąë¨", "description": "ex. Date this item was created" }, "datePasswordUpdated": { @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "PIN ėŊ”드ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ėž ę¸ˆ í•´ė œ" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Bitwarden ėž ę¸ˆí•´ė œė— ė‚ŦėšŠë  PIN ėŊ”드ëĨŧ ė„¤ė •í•Šë‹ˆë‹¤. ė´ ė• í”ŒëĻŦėŧ€ė´ė…˜ė—ė„œ ė™„ė „ížˆ ëĄœęˇ¸ė•„ė›ƒí•  ę˛Ŋ뚰 PIN ė„¤ė •ė´ ė´ˆę¸°í™”ëŠë‹ˆë‹¤." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN ėŊ”ë“œę°€ í•„ėš”í•Šë‹ˆë‹¤." }, "invalidPin": { "message": "ėž˜ëĒģ된 PIN ėŊ”ë“œėž…ë‹ˆë‹¤." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "ėž˜ëĒģ된 PIN ėž…ë Ĩ ė‹œë„ę°€ 너ëŦ´ 많ėŠĩ니다. ëĄœęˇ¸ė•„ė›ƒ 합니다." + }, "unlockWithBiometrics": { "message": "ėƒė˛´ ė¸ė‹ė„ ė‚ŦėšŠí•˜ė—Ŧ ėž ę¸ˆ í•´ė œ" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "ë°ėŠ¤íŦ톱ėœŧ로ëļ€í„°ė˜ í™•ė¸ė„ 대기 뤑" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "브ëŧėš°ė € ë‹¤ė‹œ ė‹œėž‘ ė‹œ ë§ˆėŠ¤í„° 비밀번호로 ėž ę¸ˆ" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "ë°˜ë“œė‹œ 하나 ė´ėƒė˜ ėģŦë ‰ė…˜ė„ ė„ íƒí•´ė•ŧ 합니다." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "하나 ė´ėƒė˜ ë‹¨ė˛´ ė •ėą…ė´ ėƒė„ąę¸° ęˇœėš™ė— ė˜í•­ė„ ë¯¸ėš˜ęŗ  ėžˆėŠĩ니다." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ëŗ´ę´€í•¨ ė‹œę°„ ė œí•œ 봈ęŗŧė‹œ ë™ėž‘" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "ėž ę¸ˆ", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "íœ´ė§€í†ĩ", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ëŗĩė›ëœ 항ëĒŠ" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "ëĄœęˇ¸ė•„ė›ƒí•˜ëŠ´ ëŗ´ę´€í•¨ė— 대한 ëĒ¨ë“  ė ‘ęˇŧė´ ė œęą°ë˜ëŠ° ė‹œę°„ ė œí•œė„ 봈ęŗŧ하면 똍ëŧė¸ ė¸ėĻė„ ėš”ęĩŦ합니다. ė •ë§ëĄœ ė´ ė„¤ė •ė„ ė‚ŦėšŠí•˜ė‹œę˛ ėŠĩ니까?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ėžë™ ė™„ė„ą 및 ė €ėžĨ" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "항ëĒŠė„ ėžë™ ė™„ė„ąí•˜ęŗ  URIëĨŧ ė €ėžĨ함" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1489,13 +2144,13 @@ "message": "ë§ˆėŠ¤í„° 비밀번호 네렕" }, "currentMasterPass": { - "message": "Current master password" + "message": "현ėžŦ ë§ˆėŠ¤í„° 비밀번호" }, "newMasterPass": { - "message": "New master password" + "message": "냈 ë§ˆėŠ¤í„° 비밀번호" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "냈 ë§ˆėŠ¤í„° 비밀번호 í™•ė¸" }, "masterPasswordPolicyInEffect": { "message": "하나 ė´ėƒė˜ ë‹¨ė˛´ ė •ėą…ė´ ë§ˆėŠ¤í„° 비밀번호가 ë‹¤ėŒ ė‚Ŧí•­ė„ 따ëĨ´ë„록 ėš”ęĩŦ합니다:" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "냈 ë§ˆėŠ¤í„° 비밀번호가 ė •ėą… ėš”ęĩŦ ė‚Ŧí•­ė„ 따ëĨ´ė§€ ė•ŠėŠĩ니다." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "ė´ ë°•ėŠ¤ëĨŧ 랴íŦ하면 ë‹¤ėŒė— ë™ė˜í•˜ëŠ” 것ėœŧ로 간ėŖŧ됩니다:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "í™•ė¸" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "ë°ėŠ¤íŦ톱ęŗŧė˜ 동기화 ė¸ėĻ" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "ęŗ„ė •ė´ ėŧėš˜í•˜ė§€ ė•ŠėŒ" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "ėƒė˛´ ė¸ė‹ė´ í™œė„ąí™”ë˜ė§€ ė•ŠėŒ" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "ė´ ę¸°ę¸°ė—ė„œëŠ” ėƒė˛´ ė¸ė‹ė´ ė§€ė›ë˜ė§€ ė•ŠėŠĩ니다." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ėĄ°ė§ė˜ ė •ėą…ė´ ė†Œėœ ęļŒ ė„¤ė •ė— 똁í–Ĩė„ ë¯¸ėš˜ęŗ  ėžˆėŠĩ니다." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "ė œė™¸ëœ ë„ëŠ”ė¸" }, "excludedDomainsDesc": { "message": "Bitwardenė€ ė´ ë„ëŠ”ė¸ë“¤ė— 대해 ëĄœęˇ¸ė¸ ė •ëŗ´ëĨŧ ė €ėžĨ할 ę˛ƒė¸ė§€ ëŦģė§€ ė•ŠėŠĩ니다. íŽ˜ė´ė§€ëĨŧ ėƒˆëĄœęŗ ėš¨í•´ė•ŧ ëŗ€ę˛Ŋ된 ë‚´ėšŠė´ ė ėšŠëŠë‹ˆë‹¤." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ë„ëŠ”ė¸ė€ ėœ íš¨í•œ ë„ëŠ”ė¸ė´ ė•„ë‹™ë‹ˆë‹¤.", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send ę˛€ėƒ‰", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "í…ėŠ¤íŠ¸" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "파ėŧ" }, @@ -1666,6 +2406,9 @@ "message": "ëĒ¨ë“  Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "ėĩœëŒ€ ė ‘ęˇŧ íšŸėˆ˜ 도ë‹Ŧ", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "비밀번호로 ëŗ´í˜¸ë¨" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Send 링íŦ ëŗĩė‚Ŧ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "ė •ë§ ė´ SendëĨŧ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Send íŽ¸ė§‘", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "ė´ Send가 ė •í•´ė§„ ėŧė‹œė— 똁ęĩŦ렁ėœŧ로 ė‚­ė œëŠë‹ˆë‹¤.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "ë§ŒëŖŒ ë‚ ė§œ" }, @@ -1769,6 +2523,10 @@ "message": "ė´ Send뗐 ė ‘ęˇŧ하기 ėœ„í•´ ė•”í˜¸ëĨŧ ėž…ë Ĩ하도록 ė„ íƒė ėœŧ로 ėš”ęĩŦ합니다.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "ė´ Send뗐 대한 비ęŗĩ氜 메ëǍ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send ėƒė„ąí•¨", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send ėˆ˜ė •í•¨", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "파ėŧė„ ė„ íƒí•˜ë ¤ëŠ´ ė´ 배너ëĨŧ 클ëĻ­í•˜ė—Ŧ 확ėžĨ í”„ëĄœęˇ¸ëž¨ė„ ė‚Ŧė´ë“œë°”ė—ė„œ ė—´ęą°ë‚˜, ëļˆę°€ëŠĨ한 ę˛Ŋ뚰 냈 ė°Ŋė—ė„œ ė—Ŧė„¸ėš”." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Safariė—ė„œ 파ėŧė„ ė„ íƒí•  ę˛Ŋ뚰, ė´ 배너ëĨŧ 클ëĻ­í•˜ė—Ŧ 확ėžĨ í”„ëĄœęˇ¸ëž¨ė„ 냈 ė°Ŋė—ė„œ ė—Ŧė„¸ėš”." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "ė‹œėž‘í•˜ę¸° 렄뗐" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "받는 ė‚Ŧ람ėœŧ로ëļ€í„° ë‚˜ė˜ ė´ëŠ”ėŧ ėŖŧė†Œ 눍揰揰" }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "하나 ė´ėƒė˜ ë‹¨ė˛´ ė •ėą…ė´ Send 네렕뗐 똁í–Ĩė„ ë¯¸ėš˜ęŗ  ėžˆėŠĩ니다." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ė´ëŠ”ėŧ ė¸ėĻ í•„ėš”í•¨" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "ė´ 기ëŠĨė„ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė´ëŠ”ėŧ ė¸ėĻė´ í•„ėš”í•Šë‹ˆë‹¤. ė›š ëŗ´ę´€í•¨ė—ė„œ ė´ëŠ”ėŧė„ ė¸ėĻí•  눘 ėžˆėŠĩ니다." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "ėžë™ 등록" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "폴더 ė„ íƒ..." }, - "ssoCompleteRegistration": { - "message": "SSO ëĄœęˇ¸ė¸ė„ 하기 ėœ„í•´ė„œ ëŗ´ę´€í•¨ė— ė ‘ęˇŧí•˜ęŗ  ëŗ´í˜¸í•  눘 ėžˆë„ëĄ ë§ˆėŠ¤í„° 비밀번호ëĨŧ ė„¤ė •í•´ėŖŧė„¸ėš”." + "noFoldersFound": { + "message": "폴더ëĨŧ ė°žė„ 눘 ė—†ėŠĩ니다.", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "ė¸ėĻ í•„ėš”", + "description": "Default title for the user verification dialog." }, "hours": { "message": "ė‹œ" @@ -1904,6 +2740,9 @@ "minutes": { "message": "ëļ„" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "ėĄ°ė§ ė •ėą…ė´ ëŗ´ę´€í•¨ ė œí•œ ė‹œę°„ė— 똁í–Ĩė„ ë¯¸ėš˜ęŗ  ėžˆėŠĩ니다. ėĩœëŒ€ í—ˆėšŠ ëŗ´ę´€í•¨ ė œí•œ ė‹œę°„ė€ $HOURS$ė‹œę°„ $MINUTES$ëļ„ėž…ë‹ˆë‹¤", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "똤ëĨ˜" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ė•„ė´ë”” ėƒė„ą" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "ė•„ė´ë”” ėœ í˜•" }, @@ -2044,13 +2938,123 @@ "message": "ė„œëš„ėŠ¤" }, "forwardedEmail": { - "message": "Forwarded email alias" + "message": "íŦė›Œë”Šëœ ė´ëŠ”ėŧ ëŗ„ėš­" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { - "message": "Hostname", + "message": "í˜¸ėŠ¤íŠ¸ ė´ëĻ„", "description": "Part of a URL." }, "apiAccessToken": { @@ -2063,7 +3067,7 @@ "message": "키 ėģ¤ë„Ĩ터 똤ëĨ˜: 키 ėģ¤ë„Ĩ터가 ė‚ŦėšŠ 가ëŠĨí•œė§€ 및 ė •ėƒė ėœŧ로 ėž‘ë™í•˜ęŗ  ėžˆëŠ”ė§€ í™•ė¸í•´ėŖŧė„¸ėš”." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "프ëĻŦë¯¸ė—„ ęĩŦë…ė´ í•„ėš”í•Šë‹ˆë‹¤" }, "organizationIsDisabled": { "message": "Organization suspended." @@ -2090,13 +3094,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server version" + "message": "ė„œë˛„ ë˛„ė „" }, "selfHostedServer": { - "message": "self-hosted" + "message": "ėžė˛´ í˜¸ėŠ¤íŒ…" }, "thirdParty": { - "message": "Third-party" + "message": "렜 3ėž" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", @@ -2123,13 +3127,13 @@ "message": "Logging in as" }, "notYou": { - "message": "Not you?" + "message": "ëŗ¸ė¸ė´ ė•„ë‹Œę°€ėš”?" }, "newAroundHere": { - "message": "New around here?" + "message": "ėƒˆëĄœ ė°žė•„ė˜¤ė…¨ë‚˜ėš”?" }, "rememberEmail": { - "message": "Remember email" + "message": "ė´ëŠ”ėŧ 기ė–ĩ하기" }, "loginWithDevice": { "message": "Log in with device" @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "ėžë™ ė™„ė„ą 네렕" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "ėžë™ ė™„ė„ą í‚¤ëŗ´ë“œ 단ėļ•키" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2243,7 +3253,7 @@ "message": "Device approval required. Select an approval option below:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "ė´ 기기 기ė–ĩ하기" }, "uncheckIfPublicDevice": { "message": "Uncheck if using a public device" @@ -2252,7 +3262,7 @@ "message": "Approve from your other device" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "관ëĻŦėž ėŠšė¸ í•„ėš”" }, "approveWithMasterPassword": { "message": "Approve with master password" @@ -2260,30 +3270,45 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, "general": { - "message": "General" + "message": "ėŧ반" }, "display": { - "message": "Display" + "message": "화면" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "ęŗ„ė •ė´ ėƒė„ąë˜ė—ˆėŠĩ니다!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "관ëĻŦėž ėŠšė¸ í•„ėš”" }, "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2310,7 +3343,7 @@ "message": "required" }, "search": { - "message": "Search" + "message": "ę˛€ėƒ‰" }, "inputMinLength": { "message": "Input must be at least $COUNT$ characters long.", @@ -2358,7 +3391,7 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "하나 ė´ėƒė˜ ė´ëŠ”ėŧė´ ėœ íš¨í•˜ė§€ ė•ŠėŠĩ니다." }, "inputTrimValidator": { "message": "Input must not contain only whitespace.", @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "ë°ė´í„° ę°€ė ¸ė˜¤ę¸° ė„ąęŗĩ!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "ęŗ„ė • ėž ę¸ˆ í•´ė œ", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "냈 항ëĒŠ", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "ë‹¤ė‹œ ė‹œë„" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Duo ė‹¤í–‰" + }, + "importFormatError": { + "message": "ë°ė´í„°ė˜ íŦë§ˇė´ ė˜Ŧ바ëĨ´ė§€ ė•ŠėŠĩ니다. ëļˆëŸŦė˜Ŧ 파ėŧė„ í™•ė¸í•˜ęŗ  ë‹¤ė‹œ ė‹œë„í•´ ėŖŧė‹­ė‹œė˜¤." + }, + "importNothingError": { + "message": "ė•„ëŦ´ę˛ƒë„ ę°€ė ¸ė˜¤ė§€ ëĒģ했ėŠĩ니다." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "íŒ¨ėŠ¤í‚¤" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "íŒ¨ėŠ¤í‚¤ę°€ ëŗĩė‚Ŧë˜ė§€ ė•ŠėŠĩ니다" + }, + "passkeyNotCopiedAlert": { + "message": "íŒ¨ėŠ¤í‚¤ëŠ” ëŗĩė œëœ ė•„ė´í…œė— ëŗĩė‚Ŧë˜ė§€ ė•ŠėŠĩ니다. ęŗ„ė† ė´ 항ëĒŠė„ ëŗĩė œí•˜ė‹œę˛ ė–´ėš”?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "ė‚Ŧė´íŠ¸ė—ė„œ ė¸ėĻė„ ėš”ęĩŦ합니다. ė´ 기ëŠĨė€ 비밀번호가 ė—†ëŠ” ęŗ„ė •ė—ė„œëŠ” 땄링 ė§€ė›í•˜ė§€ ė•ŠėŠĩ니다." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "ė´ë¯¸ ė´ ė• í”ŒëĻŦėŧ€ė´ė…˜ė— 해당하는 íŒ¨ėŠ¤í‚¤ę°€ ėžˆėŠĩ니다." + }, + "noPasskeysFoundForThisApplication": { + "message": "ė´ ė• í”ŒëĻŦėŧ€ė´ė…˜ė— 대한 íŒ¨ėŠ¤í‚¤ëĨŧ ė°žė„ 눘 ė—†ėŠĩ니다." + }, + "noMatchingPasskeyLogin": { + "message": "ė‚Ŧė´íŠ¸ė™€ ėŧėš˜í•˜ëŠ” ëĄœęˇ¸ė¸ė´ ė—†ėŠĩ니다." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "íŒ¨ėŠ¤í‚¤ ė €ėžĨ" + }, + "savePasskeyNewLogin": { + "message": "냈 ëĄœęˇ¸ė¸ėœŧ로 íŒ¨ėŠ¤í‚¤ ė €ėžĨ" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "íŒ¨ėŠ¤í‚¤ 항ëĒŠ" + }, + "overwritePasskey": { + "message": "비밀번호ëĨŧ ëŽė–´ė“°ė‹œę˛ ė–´ėš”?" + }, + "overwritePasskeyAlert": { + "message": "ė´ 항ëĒŠė€ ė´ë¯¸ íŒ¨ėŠ¤í‚¤ę°€ ėžˆėŠĩ니다. ė •ë§ëĄœ 현ėžŦ íŒ¨ėŠ¤í‚¤ëĨŧ ëŽė–´ė“°ė‹œę˛ ė–´ėš”?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "íŒ¨ėŠ¤í‚¤ëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė¸ėĻė´ í•„ėš”í•Šë‹ˆë‹¤. ė¸ėĻė„ ė§„í–‰í•´ėŖŧė„¸ėš”." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Bitwardenė„ ę¸°ëŗ¸ 비밀번호 관ëĻŦėžëĄœ ė§€ė •í•˜ė‹œę˛ ėŠĩ니까?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Bitwardenė„ ę¸°ëŗ¸ 비밀번호 관ëĻŦėžëĄœ 맀렕", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "íŒ¨ėŠ¤í‚¤ ė œęą°" + }, + "passkeyRemoved": { + "message": "íŒ¨ėŠ¤í‚¤ ė œęą°ë¨" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "ęŗ„ė • ëŗ´ė•ˆ" + }, + "notifications": { + "message": "ė•ŒëĻŧ" + }, + "appearance": { + "message": "화면 ėŠ¤íƒ€ėŧ" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 8daba606fa6..547d42b27bf 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "„Bitwarden“ slaptaÅžodÅžiÅŗ tvarkyklė", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Saugi ir nemokama slaptaÅžodÅžiÅŗ tvarkyklė visiems įrenginiams.", - "description": "Extension description" + "message": "Namuose, darbe ar kelyje, Bitwarden apsaugo jÅĢsÅŗ slaptaÅžodÅžius, raktaÅžodÅžius ir svarbią informaciją", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Prisijunkite arba sukurkite naują paskyrą, kad galėtumėte pasiekti saugyklą." }, + "inviteAccepted": { + "message": "Kvietimas priimtas" + }, "createAccount": { "message": "Sukurti paskyrą" }, - "login": { - "message": "Prisijungti" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Nustatyti stiprÅŗ slaptaÅžodį" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Baigkite kurti paskyrą nustatydami slaptaÅžodį" }, "enterpriseSingleSignOn": { "message": "Vienkartinis įmonės prisijungimas" @@ -38,10 +56,23 @@ "message": "Pagrindinis slaptaÅžodis" }, "masterPassDesc": { - "message": "Pagrindinis slaptaÅžodis yra slaptaÅžodis, kurį naudojate norėdami pasiekti savo saugyklą. Labai svarbu nepamirÅĄti pagrindinio slaptaÅžodÅžio. Negalėsite atkurti slaptaÅžodį, jei jį pamirÅĄote." + "message": "Pagrindinis slaptaÅžodis yra slaptaÅžodis, kurį naudojate norėdami pasiekti savo saugyklą. Labai svarbu nepamirÅĄti pagrindinio slaptaÅžodÅžio. Nėra galimybiÅŗ atkurti slaptaÅžodį, jei jį pamirÅĄite." }, "masterPassHintDesc": { - "message": "Pagrindinio slaptaÅžodÅžio uÅžuomina gali padėti prisiminti slaptaÅžodį, jei jį pamirÅĄite." + "message": "Pagrindinio slaptaÅžodÅžio uÅžuomina gali padėti Jums prisiminti slaptaÅžodį, jei jį pamirÅĄite." + }, + "masterPassHintText": { + "message": "Jei pamirÅĄote slaptaÅžodį, slaptaÅžodÅžio uÅžuomina gali bÅĢti iÅĄsiÅŗsta į jÅĢsÅŗ el. paÅĄtą. $CURRENT$ / $MAXIMUM$ didÅžiausias simboliÅŗ skaičius.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } }, "reTypeMasterPass": { "message": "Pakartokite pagrindinį slaptaÅžodį" @@ -49,6 +80,21 @@ "masterPassHint": { "message": "Pagrindinio slaptaÅžodÅžio uÅžuomina (neprivaloma)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Skirtukas" }, @@ -73,8 +119,11 @@ "copyPassword": { "message": "Kopijuoti slaptaÅžodį" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { - "message": "Kopijuoti pastabas" + "message": "Kopijuoti pastabą" }, "copyUri": { "message": "Kopijuoti nuorodą" @@ -88,23 +137,90 @@ "copySecurityCode": { "message": "Kopijuoti saugos kodą" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Automatinis uÅžpildymas" }, + "autoFillLogin": { + "message": "Prisijungimo automatinis uÅžpildymas" + }, + "autoFillCard": { + "message": "Kortelės automatinis uÅžpildymas" + }, + "autoFillIdentity": { + "message": "Tapatybės automatinis uÅžpildymas" + }, "generatePasswordCopied": { - "message": "Kurti slaptaÅžodį (paruoÅĄtas įterpti)" + "message": "Sukurti slaptaÅžodį (nukopijuotas)" }, "copyElementIdentifier": { - "message": "Kopijuoti pritaikyto laukelio pavadinimą" + "message": "Nukopijuoti pasirinktinio laukelio pavadinimą" }, "noMatchingLogins": { - "message": "Nėra atitinkančiÅŗ prisijungimÅŗ." + "message": "Nėra atitinkančiÅŗ prisijungimÅŗ" + }, + "noCards": { + "message": "Nėra korteliÅŗ" + }, + "noIdentities": { + "message": "Nėra tapatybiÅŗ" + }, + "addLoginMenu": { + "message": "Pridėti prisijungimą" + }, + "addCardMenu": { + "message": "Pridėti kortelę" + }, + "addIdentityMenu": { + "message": "Pridėti tapatybę" }, "unlockVaultMenu": { - "message": "Atrakinti saugyklą" + "message": "Atrakinti JÅĢsÅŗ saugyklą" }, "loginToVaultMenu": { - "message": "Prisijungti prie saugyklos" + "message": "Prisijungti prie JÅĢsÅŗ saugyklos" }, "autoFillInfo": { "message": "Nėra galimÅŗ prisijungimÅŗ prie dabartinio narÅĄyklės skirtuko." @@ -115,6 +231,18 @@ "addItem": { "message": "Pridėti elementą" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "SlaptaÅžodÅžio uÅžuomina" }, @@ -142,18 +270,36 @@ "confirmIdentity": { "message": "Norint tęsti, patvirtinkite tapatybę." }, - "account": { - "message": "Paskyra" - }, "changeMasterPassword": { "message": "Keisti pagrindinį slaptaÅžodį" }, + "continueToWebApp": { + "message": "Tęsti į Åžiniatinklio programėlę?" + }, + "continueToWebAppDesc": { + "message": "Atraskite daugiau savo Bitwarden paskyros funkcijÅŗ web programoje." + }, + "continueToHelpCenter": { + "message": "Eiti į pagalbos centrą?" + }, + "continueToHelpCenterDesc": { + "message": "Pagalbos Centre suÅžinokite daugiau kaip naudotis Bitwarden." + }, + "continueToBrowserExtensionStore": { + "message": "Eiti į narÅĄyklės plėtiniÅŗ svetainę?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Padėkite kitiems suÅžinoti ar Bitwarden yra jiems tinkamas. Apsilankykite narÅĄyklės plėtiniÅŗ svetainėje ir įvertinkite Bitwarden." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Pagrindinį slaptaÅžodį galite pakeisti „Bitwarden“ Åžiniatinklio programėlėje." + }, "fingerprintPhrase": { - "message": "Dalijimosi slaptaÅžodis", + "message": "PirÅĄtÅŗ atspaudÅŗ frazė", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "JÅĢsÅŗ paskiros dalijimosi slaptaÅžodis", + "message": "JÅĢsÅŗ paskyros pirÅĄtÅŗ atspaudÅŗ frazė", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { @@ -162,9 +308,45 @@ "logOut": { "message": "Atsijungti" }, + "aboutBitwarden": { + "message": "Apie Bitwarden" + }, "about": { "message": "Apie" }, + "moreFromBitwarden": { + "message": "Daugiau iÅĄ Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Eiti į bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden Verslui" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "„Bitwarden Authenticator“ leidÅžia saugoti autentifikavimo raktus ir generuoti TOTP kodus dviejÅŗ etapÅŗ patvirtinimui. SuÅžinokite daugiau bitwarden.com svetainėje" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Saugiai saugokite, tvarkykite ir dalinkitės kÅĢrėjÅŗ slaptais duomenimis su „Bitwarden Secrets Manager“. SuÅžinokite daugiau bitwarden.com svetainėje." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Sukurkite sklandÅžią ir saugią prisijungimo patirtį be tradiciniÅŗ slaptaÅžodÅžiÅŗ su Passwordless.dev. SuÅžinokite daugiau bitwarden.com svetainėje." + }, + "freeBitwardenFamilies": { + "message": "Nemokamas „Bitwarden Families“" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "JÅĢs turite galimybę gauti nemokamą „Bitwarden Families“ paskyrą. Pasinaudokite ÅĄiuo pasiÅĢlymu ÅĄiandien Interneto svetainėje." + }, "version": { "message": "Versija" }, @@ -175,34 +357,52 @@ "message": "Perkelti" }, "addFolder": { - "message": "Pridėti katalogą" + "message": "Pridėti aplankalą" }, "name": { "message": "Pavadinimas" }, "editFolder": { - "message": "Redaguoti aplanką" + "message": "Redaguoti aplankalą" + }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" }, "deleteFolder": { - "message": "Å alinti katalogą" + "message": "Å alinti aplankalą" }, "folders": { - "message": "Aplankai" + "message": "Aplankalai" }, "noFolders": { - "message": "AplankÅŗ nėra" + "message": "Nėra aplankalÅŗ, kuriuos bÅĢtÅŗ galima iÅĄvardyti." }, "helpFeedback": { "message": "Pagalba ir atsiliepimai" }, "helpCenter": { - "message": "Bitwarden pagalbos centras" + "message": "„Bitwarden“ Pagalbos centras" }, "communityForums": { - "message": "NarÅĄyti Bitwarden bendruomenės forumus" + "message": "NarÅĄyti „Bitwarden“ bendruomenės forumus" }, "contactSupport": { - "message": "Susisiekti su Bitwarden palaikymo komanda" + "message": "Susisiekti su „Bitwarden“ palaikymo komanda" }, "sync": { "message": "Sinchronizuoti" @@ -211,29 +411,32 @@ "message": "Sinchronizuoti saugyklą dabar" }, "lastSync": { - "message": "Sinchronizuota:" + "message": "Paskutinis sinchronizavimas:" }, "passGen": { "message": "SlaptaÅžodÅžiÅŗ generatorius" }, "generator": { "message": "Generatorius", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { - "message": "AutomatiÅĄkai sukurkite patikimus, unikalius slaptaÅžodÅžius." + "message": "AutomatiÅĄkai generuokite stiprius, unikalius prisijungimo slaptaÅžodÅžius." }, - "bitWebVault": { - "message": "„Bitwarden“ Åžiniatinklio saugykla" + "bitWebVaultApp": { + "message": "Bitwarden Interneto svetainė" }, "importItems": { - "message": "Importuoti duomenis" + "message": "Importuoti elementus" }, "select": { "message": "Pasirinkti" }, "generatePassword": { - "message": "Kurti slaptaÅžodį" + "message": "Sugeneruoti slaptaÅžodį" + }, + "generatePassphrase": { + "message": "Generate passphrase" }, "regeneratePassword": { "message": "Generuoti slaptaÅžodį iÅĄ naujo" @@ -244,17 +447,60 @@ "length": { "message": "Ilgis" }, + "passwordMinLength": { + "message": "Minimalus slaptaÅžodÅžio ilgis" + }, "uppercase": { - "message": "DidÅžiosiomis (A-Z)" + "message": "DidÅžiosiomis (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "MaÅžosiomis (a-z)" + "message": "MaÅžosiomis (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Skaitmuo (0-9)" + "message": "Skaitmenys (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Specialieji simboliai (!@#$%^&*)" + "message": "Specialieji simboliai (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ÅŊodÅžiÅŗ skaičius" @@ -276,7 +522,16 @@ "message": "MaÅžiausiai simboliÅŗ" }, "avoidAmbChar": { - "message": "Vengti dviprasmiÅĄkÅŗ simboliÅŗ" + "message": "Vengti dviprasmiÅĄkÅŗ simboliÅŗ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "IeÅĄkoti saugykloje" @@ -291,7 +546,7 @@ "message": "Nėra rodytinÅŗ elementÅŗ." }, "itemInformation": { - "message": "Informacija" + "message": "Elemento informacija" }, "username": { "message": "Vartotojo vardas" @@ -299,15 +554,30 @@ "password": { "message": "SlaptaÅžodis" }, + "totp": { + "message": "Autentifikatoriaus paslaptis" + }, "passphrase": { "message": "Slaptafrazė" }, "favorite": { "message": "Mėgstamas" }, + "unfavorite": { + "message": "PaÅĄalinti iÅĄ mėgstamiausiÅŗ" + }, + "itemAddedToFavorites": { + "message": "Elementas pridėtas prie mėgstamiausiÅŗ" + }, + "itemRemovedFromFavorites": { + "message": "Elementas paÅĄalintas iÅĄ mėgstamiausiÅŗ" + }, "notes": { "message": "Pastabos" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Pastaba" }, @@ -326,6 +596,18 @@ "launch": { "message": "Paleisti" }, + "launchWebsite": { + "message": "Atidaryti svetainę" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Tinklapis" }, @@ -338,9 +620,24 @@ "other": { "message": "Kita" }, + "unlockMethods": { + "message": "Atrakinti parinktis" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Nustatyk atrakinimo bÅĢdą, kad pakeistum saugyklos laiko limito veiksmą." }, + "unlockMethodNeeded": { + "message": "Nustatykite nustatymuose atrakinimo metodą" + }, + "sessionTimeoutHeader": { + "message": "Baigėsi seanso laikas" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Kitos parinktys" + }, "rateExtension": { "message": "ÄŽvertinkite ÅĄÄ¯ plėtinį" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "JÅĢsÅŗ saugykla uÅžrakinta. Norėdami tęsti, patikrinkite pagrindinį slaptaÅžodį." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Atrakinti" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Atsijungta nuo saugyklos" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "UÅžrakinti dabar" }, + "lockAll": { + "message": "UÅžrakinti viską" + }, "immediately": { "message": "Nedelsiant" }, @@ -426,6 +738,18 @@ "security": { "message": "Apsauga" }, + "confirmMasterPassword": { + "message": "Patvirtinkite pagrindinį slaptaÅžodį" + }, + "masterPassword": { + "message": "Pagrindinis slaptaÅžodis" + }, + "masterPassImportant": { + "message": "Pagrindinio slaptaÅžodÅžio negalima atkurti, jei jį pamirÅĄite." + }, + "masterPassHintLabel": { + "message": "Pagrindinio slaptaÅžodÅžio uÅžuomina" + }, "errorOccurred": { "message": "ÄŽvyko klaida" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "JÅĢsÅŗ paskyra sukurta! Galite prisijungti." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "JÅĢs sėkmingai prisijungėte" + }, + "youMayCloseThisWindow": { + "message": "Galite uÅždaryti ÅĄÄ¯ langą" + }, "masterPassSent": { "message": "IÅĄsiuntėme jums el. laiÅĄką su pagrindinio slaptaÅžodÅžio uÅžuomina." }, "verificationCodeRequired": { "message": "BÅĢtinas patvirtinimo kodas." }, + "webauthnCancelOrTimeout": { + "message": "Tapatybės nustatymas buvo atÅĄauktas arba uÅžtruko per ilgai. Bandykite dar kartą." + }, "invalidVerificationCode": { "message": "Neteisingas patvirtinimo kodas" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Nepavyko automatiÅĄkai uÅžpildyti pasirinkto elemento ÅĄiame puslapyje. Nukopijuokite ir įklijuokite informaciją." }, + "totpCaptureError": { + "message": "Nepavyko nuskaityti QR kodo iÅĄ dabartinio tinklalapio" + }, + "totpCaptureSuccess": { + "message": "Pridėtas autentifikatoriaus raktas" + }, + "totpCapture": { + "message": "Nuskaitykite autentifikatoriaus QR kodą iÅĄ dabartinio tinklalapio" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Kopijuoti Autentifikatoriaus raktą (TOTP)" + }, "loggedOut": { "message": "Atsijungta" }, + "loggedOutDesc": { + "message": "JÅĢs atsijungėte." + }, "loginExpired": { "message": "Sesijos laikas baigėsi." }, + "logIn": { + "message": "Prisijungti" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Nebegaliojanti nuoroda" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Ar tikrai norite atsijungti?" }, @@ -503,14 +887,14 @@ "addedFolder": { "message": "Katalogas pridėtas" }, - "changeMasterPass": { - "message": "Keisti pagrindinį slaptaÅžodį" - }, - "changeMasterPasswordConfirmation": { - "message": "Pagrindinį slaptaÅžodį galite pakeisti bitwarden.com Åžiniatinklio saugykloje. Ar norite dabar apsilankyti svetainėje?" - }, "twoStepLoginConfirmation": { - "message": "Prisijungus dviem veiksmais, jÅĢsÅŗ paskyra tampa saugesnė, reikalaujant patvirtinti prisijungimą naudojant kitą įrenginį, pvz., Saugos raktą, autentifikavimo programą, SMS, telefono skambutį ar el. PaÅĄtą. DviejÅŗ ÅžingsniÅŗ prisijungimą galima įjungti „bitwarden.com“ interneto saugykloje. Ar norite dabar apsilankyti svetainėje?" + "message": "Prisijungus dviem veiksmais, jÅĢsÅŗ paskyra tampa saugesnė, reikalaujant patvirtinti prisijungimą naudojant kitą įrenginį, pvz., saugos raktą, autentifikavimo programėlę, SMS, telefono skambutį ar el. paÅĄtą. DviejÅŗ ÅžingsniÅŗ prisijungimą galima įjungti „bitwarden.com“ interneto saugykloje. Ar norite dabar apsilankyti svetainėje?" + }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" }, "editedFolder": { "message": "Katalogas atnaujintas" @@ -552,6 +936,10 @@ "newUri": { "message": "Naujas URI" }, + "addDomain": { + "message": "Pridėti domeną", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Pridėtas elementas" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "PraÅĄyti pridėti prisijungimą" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Prisijungimo pridėjimo praneÅĄimas automatiÅĄkai JÅĢs paragina iÅĄsaugoti naujus prisijungimus JÅĢsÅŗ saugykloje, kuomet prisijungiate pirmą kartą." }, + "addLoginNotificationDescAlt": { + "message": "PapraÅĄykite pridėti elementą, jei jo nerasta JÅĢsÅŗ saugykloje. Taikoma visoms prisijungusioms paskyroms." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Rodyti korteles skirtuko puslapyje" }, "showCardsCurrentTabDesc": { "message": "Pateikti korteliÅŗ elementÅŗ skirtuko puslapyje sąraÅĄÄ…, kad bÅĢtÅŗ lengva automatiÅĄkai uÅžpildyti." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Rodyti tapatybes skirtuko puslapyje" }, @@ -616,7 +1016,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Ar Bitwarden turėtÅŗ įsiminti ÅĄÄ¯ slaptaÅžodį uÅž tave?" + "message": "Ar „Bitwarden“ turėtÅŗ įsiminti ÅĄÄ¯ slaptaÅžodį uÅž Jus?" }, "notificationAddSave": { "message": "IÅĄsaugoti" @@ -627,27 +1027,42 @@ "changedPasswordNotificationDesc": { "message": "PapraÅĄyti atnaujinti prisijungimo slaptaÅžodį, kai pakeitimas aptiktas svetainėje." }, + "changedPasswordNotificationDescAlt": { + "message": "PapraÅĄykite atnaujinti prisijungimo slaptaÅžodį, kai svetainėje aptinkamas pakeitimas. Taikoma visoms prisijungusioms paskyroms." + }, + "enableUsePasskeys": { + "message": "PapraÅĄykite iÅĄsaugoti ir naudoti prieigos raktus" + }, + "usePasskeysDesc": { + "message": "PapraÅĄykite iÅĄsaugoti naujus prieigos raktus arba prisijungti naudodant saugykloje saugomus prieigos raktus. Taikoma visoms prisijungusioms paskyroms." + }, "notificationChangeDesc": { - "message": "Ar nori atnaujinti ÅĄÄ¯ slaptaÅžodį Bitwarden?" + "message": "Ar nori atnaujinti ÅĄÄ¯ slaptaÅžodį „Bitwarden“ programėlėje?" }, "notificationChangeSave": { "message": "Atnaujinti" }, "notificationUnlockDesc": { - "message": "Atrakink savo Bitwarden saugyklą, kad uÅžpildytum automatinio uÅžpildymo uÅžklausą." + "message": "Atrakinkite savo „Bitwarden“ saugyklą, kad uÅžbaigtumėte automatinio uÅžpildymo uÅžklausą." }, "notificationUnlock": { "message": "Atrakinti" }, + "additionalOptions": { + "message": "Papildomos parinktys" + }, "enableContextMenuItem": { "message": "Rodyti kontekstinio meniu pasririnkimus" }, "contextMenuItemDesc": { "message": "Naudokite antrinį paspaudimą, kad patekti į svetainės slaptaÅžodÅžio generavimo ir prisijungimo atitikimo parinktis. " }, + "contextMenuItemDescAlt": { + "message": "Naudokite antrinį paspaudimą, kad pasiektumėte slaptaÅžodÅžio generavimą ir atitinkančius svetainės prisijungimus. Taikoma visoms prisijungusioms paskyroms." + }, "defaultUriMatchDetection": { "message": "Numatytojo URI atitikimo aptikimas", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Pasirinkite standartinį bÅĢdą, kuriuo URI bÅĢtÅŗ aptinkamas prisijungiant, kuomet yra naudojamas automatinio uÅžpildymo veiksmas." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Pakeisti programos spalvos temą" }, + "themeDescAlt": { + "message": "Pakeiskite programėlės spalvÅŗ temą. Taikoma visoms prisijungusioms paskyroms." + }, "dark": { "message": "Tamsi", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Saulėtas tamsą", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Eksportuoti saugyklą" }, "fileFormat": { "message": "Failo formatas" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "ÄŽSPĖJIMAS", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -690,7 +1135,7 @@ "message": "Å is duomenÅŗ exportavimas uÅžÅĄifruoja jÅĢsÅŗ duomenis naudodamas jÅĢsÅŗ prieigos kodÅŗ raktu. Jei jÅĢs kada nuspręsite pakeisti prieigos kodÅŗ raktą, jÅĢs turėtumėte per naują eksportuoti duomenis, nes kitaip, jÅĢs negalėsite iÅĄÅĄifruoti iÅĄeksportuotÅŗ duomenÅŗ." }, "encExportAccountWarningDesc": { - "message": "Prieigos kodÅŗ raktai yra unikalÅĢs kiekvienai Bitwarden vartotojo paskyrai, taigi jums nepavyktÅŗ importuoti uÅžkoduotÅŗ eksportuotÅŗ duomenÅŗ į kitą prieigą." + "message": "Paskyros ÅĄifravimo raktai yra unikalÅĢs kiekvienai „Bitwarden“ vartotojo paskyrai, todėl negalite importuoti uÅžÅĄifruoto eksportavimo į kitą paskyrą." }, "exportMasterPassword": { "message": "ÄŽveskite pagrindinį slaptaÅžodį norint iÅĄsineÅĄti saugyklos duomenis." @@ -698,11 +1143,8 @@ "shared": { "message": "Pasidalinti" }, - "learnOrg": { - "message": "SuÅžinoti apie organizacijas" - }, - "learnOrgConfirmation": { - "message": "Bitwarden leidÅžia jums dalintis savo saugyklos elementais su kitais vartotojais organizacijoje. Ar jÅĢs norėtumėte apsilankyti bitwarden.com puslapyje, kad suÅžinoti daugiau?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Perkelti į organizaciją" @@ -762,6 +1204,9 @@ "file": { "message": "Failas" }, + "fileToShare": { + "message": "Failas, kuri bendrinti" + }, "selectFile": { "message": "Pasirinkite failą." }, @@ -772,7 +1217,7 @@ "message": "Funkcija neprieinama" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Reikalinga ÅĄifravimo rakto migracija. Prisijunkite per Åžiniatinklio saugyklą, kad atnaujintumėte ÅĄifravimo raktą." }, "premiumMembership": { "message": "Premium narystė" @@ -781,7 +1226,7 @@ "message": "Tvarkyti narystę" }, "premiumManageAlert": { - "message": "Galite tvarkyti savo narystę internete per bitwarden.com. Ar norite aplankyti ÅĄÄ¯ puslapį dabar?" + "message": "Savo narystę galite tvarkyti „bitwarden.com“ Åžiniatinklio saugykloje. Ar norite apsilankyti svetainėje dabar?" }, "premiumRefresh": { "message": "Atnaujinti narystę" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB uÅžÅĄifruotos vietos diske bylÅŗ prisegimams." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Patentuotos dviejÅŗ ÅžingsniÅŗ prisijungimo parinktys, tokios kaip YubiKey ir Duo." }, @@ -814,13 +1262,19 @@ "message": "ÄŽsigyti Premium" }, "premiumPurchaseAlert": { - "message": "Gali įsigyti Premium narystę bitwarden.com interneto saugykloje. Ar nori aplankyti svetainėje dabar?" + "message": "Galite įsigyti „Premium“ narystę „bitwarden.com“ Åžiniatinklio saugykloje. Ar norite apsilankyti svetainėje dabar?" + }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." }, "premiumCurrentMember": { "message": "Tu esi Premium narys!" }, "premiumCurrentMemberThanks": { - "message": "Dėkojame, kad remiate Bitwarden." + "message": "Dėkojame, kad palaikote „Bitwarden“." + }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Visa tai tik uÅž $PRICE$ / metus!", @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Atnaujinimas įvykdytas" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Autentifikavimo programa" }, - "authenticatorAppDesc": { - "message": "Naudok autentifikatoriaus programėlę (pvz., Authy arba Google Autentifikatorius), kad sugeneruotum laiko patikrinimo kodus.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "ÄŽveskite autentifikatoriaus programėlės sugeneruotą kodą, pvz., „Bitwarden Authenticator“.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP saugumo raktas" + "yubiKeyTitleV2": { + "message": "„Yubico“ OTP saugumo raktas" }, "yubiKeyDesc": { "message": "Naudok YubiKey, kad prisijungtum prie savo paskyros. Veikia su YubiKey 4, 4 Nano, 4C ir NEO įrenginiais." }, - "duoDesc": { - "message": "Patvirtink su Duo Security naudodami Duo Mobile programą, SMS Åžinutę, telefono skambutį arba U2F saugumo raktą.", + "duoDescV2": { + "message": "ÄŽveskite „Duo Security“ sugeneruotą kodą.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,14 +1405,23 @@ "emailTitle": { "message": "El. paÅĄtas" }, - "emailDesc": { - "message": "Patvirtinimo kodai bus atsiÅŗsti el. paÅĄtu tau." + "emailDescV2": { + "message": "ÄŽveskite į el. paÅĄtą atsiÅŗstą kodą." }, "selfHostedEnvironment": { "message": "SavarankiÅĄkai sukurta aplinka" }, "selfHostedEnvironmentFooter": { - "message": "Nurodyk pagrindinį URL adresą savo patalpose esančio Bitwarden diegimo." + "message": "Nurodykite vietinio priglobto „Bitwarden“ diegimo bazinį URL." + }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." }, "customEnvironment": { "message": "Individualizuota aplinka" @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Serverio URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API serverio nuoroda" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Aplinkos URL adresai iÅĄsaugoti" }, + "showAutoFillMenuOnFormFields": { + "message": "Rodyti automatinio pildymo meniu formos laukeliuose", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "IÅĄjunkite narÅĄyklėje integruotus slaptaÅžodÅžiÅŗ tvarkyklės nustatymus, kad iÅĄvengtumėte konfliktÅŗ." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Redaguoti narÅĄyklės nustatymus." + }, + "autofillOverlayVisibilityOff": { + "message": "IÅĄjungta", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Kai pasirinktas laukelis (fokusuotas)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Kai pasirinkta automatinio uÅžpildymo piktograma", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "AutomatiÅĄkai uÅžpildyti uÅžsikrovus puslapiui" }, "enableAutoFillOnPageLoadDesc": { "message": "Jei aptikta prisijungimo forma, automatiÅĄkai uÅžpildyti, kai kraunamas tinklalapis." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "PaÅžeistos arba nepatikimos svetainės gali iÅĄnaudoti automatinį uÅžpildymą įkeliant puslapį." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { "message": "SuÅžinokite daugiau apie automatinį uÅžpildymą" }, "defaultAutoFillOnPageLoad": { - "message": "Default autofill setting for login items" + "message": "Numatytasis automatinio uÅžpildymo nustatymas prisijungimo elementams" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "Galite iÅĄjungti automatinį pildymą įkeliant puslapį atskiriems prisijungimo elementams, elemento redagavimo rodinyje." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Automatinis pildymas įkeliant puslapį (jei nustatyta Parinktyse)" }, "autoFillOnPageLoadUseDefault": { "message": "Naudoti numatytuosius nustatymus" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Automatinis uÅžpildymas įkeliant puslapį" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Nepildyti automatiÅĄkai įkeliant puslapį" }, "commandOpenPopup": { "message": "Atidaryti saugyklą naujame lange" @@ -1014,23 +1549,26 @@ "commandOpenSidebar": { "message": "Atidaryti saugyklą ÅĄoninėje juostoje" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { - "message": "Generate and copy a new random password to the clipboard" + "message": "Sugeneruokite ir nukopijuokite naują atsitiktinį slaptaÅžodį į iÅĄkarpinę" }, "commandLockVaultDesc": { "message": "UÅžrakinti saugyklą" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { - "message": "Custom fields" + "message": "Pasirinktiniai laukai" }, "copyValue": { - "message": "Copy value" + "message": "Kopijuoti vertę" }, "value": { "message": "ReikÅĄmė" @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Taip/Ne" }, + "cfTypeCheckbox": { + "message": "ÅŊymimasis langelis" + }, "cfTypeLinked": { "message": "Susieta", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1068,7 +1609,10 @@ "message": "Rodyti tinklalapiÅŗ ikonėles" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Rodyti atpaŞįstamą vaizdą ÅĄalia kiekvieno prisijungimo." + }, + "faviconDescAlt": { + "message": "Rodyti atpaŞįstamą vaizdą ÅĄalia kiekvieno prisijungimo. Taikoma visoms prisijungusioms paskyroms." }, "enableBadgeCounter": { "message": "Rodyti ÅženkliukÅŗ skaitiklį" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Tapatybė" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "Naujas $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Redaguoti $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "PerÅžiÅĢrėti $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "SlaptaÅžodÅžio istorija" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Atgal" }, "collections": { "message": "Kolekcijos" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Mėgstamiausi" }, @@ -1282,6 +1874,10 @@ "message": "Bazinis domenas", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domenas", "description": "Domain name. Ex. website.com" @@ -1302,21 +1898,21 @@ }, "matchDetection": { "message": "Atitikmens aptikimas", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Numatytasis atitikties aptikimas", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Perjungti opcijas" }, "toggleCurrentUris": { - "message": "Toggle current URIs", + "message": "Perjunkite dabartinius URI", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "Current URI", + "message": "Dabartinis URI", "description": "The URI of one of the current open tabs in the browser." }, "organization": { @@ -1330,7 +1926,16 @@ "message": "Visi elementai" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "SlaptaÅžodÅžiÅŗ sąraÅĄe nėra." + }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" }, "remove": { "message": "PaÅĄalinti" @@ -1351,13 +1956,13 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Ar tikrai norite naudoti parinktį „Niekada“? Nustačius uÅžrakto parinktis į „Niekada“, saugyklos ÅĄifravimo raktas iÅĄsaugomas įrenginyje. Jei naudojate ÅĄią parinktį, turėtumėte uÅžtikrinti, kad jÅĢsÅŗ įrenginys bÅĢtÅŗ tinkamai apsaugotas." }, "noOrganizationsList": { - "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + "message": "JÅĢs nepriklausote jokiai organizacijai. Organizacijos leidÅžia Jums saugiai bendrinti elementus su kitais vartotojais." }, "noCollectionsInList": { - "message": "There are no collections to list." + "message": "KolekcijÅŗ sąraÅĄe nėra." }, "ownership": { "message": "Nuosavybė" @@ -1381,7 +1986,7 @@ "message": "Silpnas pagrindinis slaptaÅžodis" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "JÅĢsÅŗ pasirinktas pagrindinis slaptaÅžodis yra silpnas. Turėtumėte naudoti stiprÅŗ pagrindinį slaptaÅžodį (arba slaptafrazę), kad tinkamai apsaugotumėte savo „Bitwarden“ paskyrą. Ar tikrai norite naudoti ÅĄÄ¯ pagrindinį slaptaÅžodį?" }, "pin": { "message": "PIN", @@ -1390,26 +1995,44 @@ "unlockWithPin": { "message": "Atrakinti PIN kodu" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Nustatykite savo PIN kodą, kad atrakintumėte „Bitwarden“. JÅĢsÅŗ PIN nustatymai bus nustatyti iÅĄ naujo, jei kada nors visiÅĄkai atsijungsite nuo programos." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN kodas yra privalomas." }, "invalidPin": { "message": "Neteisingas PIN kodas." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Per daug netinkamÅŗ PIN kodo įvedimo bandymÅŗ. Atsijungima." + }, "unlockWithBiometrics": { "message": "Atrakinti naudojant biometrinius duomenis" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { - "message": "Awaiting confirmation from desktop" + "message": "Laukiama patvirtinimo iÅĄ darbalaukio" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." + "message": "Patvirtinkite naudodami biometrinius duomenis „Bitwarden“ darbalaukio programoje, kad nustatytumėte narÅĄyklės biometrinius duomenis." }, "lockWithMasterPassOnRestart": { - "message": "Lock with master password on browser restart" + "message": "UÅžrakinkite pagrindiniu slaptaÅžodÅžiu paleidus narÅĄyklę iÅĄ naujo" + }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" }, "selectOneCollection": { "message": "Turite pasirinkti bent vieną kategoriją." @@ -1421,14 +2044,40 @@ "message": "Klonuoti" }, "passwordGeneratorPolicyInEffect": { - "message": "One or more organization policies are affecting your generator settings." + "message": "Viena ar daugiau organizacijos politikÅŗ turi įtakos JÅĢsÅŗ generatoriaus nustatymams." + }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { - "message": "Vault timeout action" + "message": "Vault skirtojo laiko veiksmas" + }, + "vaultTimeoutAction1": { + "message": "Timeout action" }, "lock": { "message": "UÅžrakinti", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Å iukÅĄliadėŞė", @@ -1452,32 +2101,38 @@ "restoredItem": { "message": "Elementas atkurtas" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { - "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" + "message": "Atsijungus bus paÅĄalinta visa JÅĢsÅŗ prieiga prie saugyklos, o pasibaigus skirtajam laikotarpiui bus reikalinga autentifikacija internetu. Ar tikrai norite naudoti ÅĄÄ¯ nustatymą?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout action confirmation" + "message": "Laiko pabaigos veiksmo patvirtinimas" }, "autoFillAndSave": { "message": "AutomatiÅĄkai uÅžpildyti ir iÅĄsaugoti" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Elementas automatiÅĄkai uÅžpildytas ir URI iÅĄsaugotas" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Elementas uÅžpildytas automatiÅĄkai " }, "insecurePageWarning": { "message": "ÄŽspėjimas: Tai – neapsaugotas HTTP puslapis, todėl bet kokią pateiktą informaciją gali matyti ir keisti kiti asmenys. Å is prisijungimas iÅĄ pradÅžiÅŗ buvo iÅĄsaugotas saugiame (HTTPS) puslapyje." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "Ar vis tiek norite uÅžpildyti ÅĄÄ¯ prisijungimą?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "Formą priglobia kitas domenas nei iÅĄsaugoto prisijungimo URI. Pasirinkite „Gerai“, kad vis tiek pildytumėte automatiÅĄkai arba „AtÅĄaukti“, kad sustabdytumėte." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "Norėdami iÅĄvengti ÅĄio įspėjimo ateityje iÅĄsaugokite ÅĄÄ¯ URI $HOSTNAME$, JÅĢsÅŗ „Bitwarden“, ÅĄios svetainės, prisijungimo elemente.", "placeholders": { "hostname": { "content": "$1", @@ -1539,8 +2194,23 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Tavo naujasis pagrindinis slaptaÅžodis neatitinka politikos reikalavimÅŗ." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Atsisakyti prenumeratos" + }, + "atAnyTime": { + "message": "bet kuriuo metu." + }, + "byContinuingYouAgreeToThe": { + "message": "Tęsiant sutinkate su" + }, + "and": { + "message": "ir" + }, "acceptPolicies": { - "message": "By checking this box you agree to the following:" + "message": "PaÅžymėdami ÅĄÄ¯ laukelį, sutinkate su ÅĄiais dalykais:" }, "acceptPoliciesRequired": { "message": "PaslaugÅŗ teikimo sąlygos ir privatumo politika nebuvo pripaÅžinti." @@ -1552,11 +2222,17 @@ "message": "Privatumo politika" }, "hintEqualsPassword": { - "message": "Your password hint cannot be the same as your password." + "message": "JÅĢsÅŗ slaptaÅžodÅžio uÅžuomina negali bÅĢti tokia pati kaip JÅĢsÅŗ slaptaÅžodis." }, "ok": { "message": "Gerai" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Darbalaukio sinchronizavimo verifikavimas" }, @@ -1567,37 +2243,43 @@ "message": "NarÅĄyklės integracija nėra nustatyta" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." + "message": "NarÅĄyklės integravimas nenustatytas Bitwarden darbalaukio programoje. Nustatykite jį darbalaukio programos nustatymuose." }, "startDesktopTitle": { - "message": "Start the Bitwarden desktop application" + "message": "Paleiskite Bitwarden darbalaukio programą" }, "startDesktopDesc": { - "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + "message": "Reikia paleisti Bitwarden darbalaukio programą prieÅĄ naudojant atrakinimą biometriniais duomenimis." }, "errorEnableBiometricTitle": { - "message": "Unable to set up biometrics" + "message": "Nepavyko nustatyti biometriniÅŗ duomenÅŗ" }, "errorEnableBiometricDesc": { - "message": "Action was canceled by the desktop application" + "message": "Darbalaukio programa atÅĄaukė veiksmą" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + "message": "Darbalaukio programa panaikino saugÅŗ ryÅĄio kanalą. Pabandykite pakartoti ÅĄią operaciją" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Desktop communication interrupted" + "message": "Darbalaukio ryÅĄys nutrauktas" }, "nativeMessagingWrongUserDesc": { - "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + "message": "Darbalaukio programa yra prisijungusi prie kitos paskyros. ÄŽsitikinkite, kad abi programos yra prisijungusios prie tos pačios paskyros." }, "nativeMessagingWrongUserTitle": { "message": "Paskyros neatitikimas" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "TrÅĢksta biometriniÅŗ duomenÅŗ nustatymÅŗ" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + "message": "Pirma reikia nustatymuose nustatyti darbalaukio biometrinius duomenys, prieÅĄ juos naudojant narÅĄyklėje." }, "biometricsNotSupportedTitle": { "message": "Biometrika negali bÅĢti naudojama" @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Å iame įrenginyje biometrikos negalima naudoti." }, + "biometricsNotUnlockedTitle": { + "message": "Naudotojas uÅžrakintas arba atsijungęs" + }, + "biometricsNotUnlockedDesc": { + "message": "Atrakinkite ÅĄÄ¯ naudotoją darbalaukio programoje ir bandykite dar kartą." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrika nepavyko" }, @@ -1615,32 +2309,71 @@ "message": "Nesuteiktos teisės" }, "nativeMessaginPermissionErrorDesc": { - "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + "message": "Negalime pateikti biometriniÅŗ duomenÅŗ narÅĄyklės plėtinyje be leidimo susisiekti su Bitwarden darbalaukio programa. Bandykite dar kartą." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Permission request error" + "message": "TeisiÅŗ uÅžklausos klaida" }, "nativeMessaginPermissionSidebarDesc": { - "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + "message": "Å io veiksmo negalima atlikti ÅĄoninėje juostoje, pabandykite dar kartą atlikti veiksmą iÅĄÅĄokančiajame lange." }, "personalOwnershipSubmitError": { - "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available collections." + "message": "Dėl įmonės politikos Jums draudÅžiama saugoti elementus į savo asmeninę saugyklą. Pakeiskite nuosavybės parinktį į organizaciją ir pasirinkite iÅĄ galimÅŗ rinkiniÅŗ." }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "message": "Organizacijos politika turi įtakos JÅĢsÅŗ nuosavybės pasirinkimo galimybėms." + }, + "personalOwnershipPolicyInEffectImports": { + "message": "Organizacijos politika blokavo elementÅŗ importavimą į JÅĢsÅŗ individualią saugyklą." + }, + "domainsTitle": { + "message": "Domenai", + "description": "A category title describing the concept of web domains" }, "excludedDomains": { - "message": "Excluded domains" + "message": "IÅĄskirti domenai" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "message": "„Bitwarden“ nepraÅĄys iÅĄsaugoti ÅĄiÅŗ domenÅŗ prisijungimo duomenÅŗ. Turite atnaujinti puslapį, kad pokyčiai pradėtÅŗ galioti." + }, + "excludedDomainsDescAlt": { + "message": "„Bitwarden“ nepraÅĄys iÅĄsaugoti prisijungimo detaliÅŗ ÅĄiems domenams, visose prisijungusiose paskyrose. Turite atnaujinti puslapį, kad pokyčiai pradėtÅŗ galioti." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "$DOMAIN$ yra klaidingas domenas", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,17 +2381,24 @@ "message": "SiÅŗsti", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { - "message": "Search Sends", + "message": "IeÅĄkoti „Sends“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Add Send", + "message": "Pridėti „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { "message": "Tekstas" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Byla" }, @@ -1666,6 +2406,9 @@ "message": "Visi siuntimai", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Pasiektas maksimalus prisijungimÅŗ skaičius", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Apsaugota slaptaÅžodÅžiu" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Kopijuoti siuntimo nuorodą", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1711,36 +2457,44 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", + "message": "Ar tikrai norite iÅĄtrinti ÅĄÄ¯ „Send“?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "Edit Send", + "message": "Redaguoti „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { - "message": "What type of Send is this?", + "message": "Kokio tai tipo „Send“?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { - "message": "A friendly name to describe this Send.", + "message": "DraugiÅĄkas pavadinimas, apibÅĢdinantis ÅĄÄ¯ „Send“.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFileDesc": { "message": "Failas, kurį norite siÅŗsti." }, "deletionDate": { - "message": "Deletion date" + "message": "IÅĄtrynimo data" }, "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "message": "Nurodytos datos ir laiko metu „Send“ bus bus iÅĄtrinta visam laikui.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { "message": "Galiojimo data" }, "expirationDateDesc": { - "message": "If set, access to this Send will expire on the specified date and time.", + "message": "Jei nustatyta, prieiga prie ÅĄio „Send“ nustos galioti nurodyta data ir laikui.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { @@ -1756,36 +2510,40 @@ } }, "custom": { - "message": "Custom" + "message": "Pasirinktinis" }, "maximumAccessCount": { "message": "Maksimalus prisijungimÅŗ skaičius" }, "maximumAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "message": "Jei nustatyta, vartotojai nebegalės pasiekti ÅĄio „Send“, kai bus pasiektas maksimalus prisijungimÅŗ skaičius.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", + "message": "Pasirinktinai reikalauti slaptaÅžodÅžio, kad vartotojai galėtÅŗ pasiekti ÅĄÄ¯ „Send“.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { - "message": "Private notes about this Send.", + "message": "Asmeninės pastabos apie ÅĄÄ¯ „Send“.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Deactivate this Send so that no one can access it.", + "message": "IÅĄjunkite ÅĄÄ¯ „Send“, kad niekas negalėtÅŗ jo pasiekti.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Copy this Send's link to clipboard upon save.", + "message": "IÅĄsaugant ÅĄÄ¯ „Send“ nukopijuokite nuorodą į mainÅŗ sritį.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { "message": "Tekstas, kurį norite siÅŗsti." }, "sendHideText": { - "message": "Hide this Send's text by default.", + "message": "Pagal numatytuosius nustatymus slėpti ÅĄÄ¯ „Send“ tekstą.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { @@ -1803,31 +2561,78 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Due to an enterprise policy, you are only able to delete an existing Send.", + "message": "Dėl įmonės politikos galite iÅĄtrinti tik esamą „Send“.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { "message": "Siuntinys sukurtas", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Siuntinys iÅĄsaugotas", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { - "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." + "message": "Norėdami pasirinkti failą, atidarykite plėtinį ÅĄoninėje juostoje (jei įmanoma) arba iÅĄÅĄokkite į naują langą spustelėdami ÅĄią reklamjuostę." }, "sendFirefoxFileWarning": { - "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner." + "message": "Norėdami pasirinkti failą, naudojantis FireFox, atidarykite plėtinį ÅĄoninėje juostoje (jei įmanoma) arba iÅĄÅĄokkite į naują langą spustelėdami ÅĄią reklamjuostę." }, "sendSafariFileWarning": { - "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + "message": "Norėdami pasirinkti failą naudodami „Safari“, iÅĄÅĄokkite į naują langą spustelėdami ÅĄią reklamjuostę." + }, + "popOut": { + "message": "Pop out" }, "sendFileCalloutHeader": { "message": "PrieÅĄ pradedant" }, "sendFirefoxCustomDatePopoutMessage1": { - "message": "To use a calendar style date picker", + "message": "Norint pasinaudoti kalendoriaus stiliaus datos pasirinkikliu", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage2": { @@ -1839,25 +2644,28 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "Nurodytas galiojimo laikas negalioja." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "Nurodyta iÅĄtrynimo data negalioja." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "IÅĄtrynimo data ir laikas yra privalomi." }, "deletionDateAndTimeRequired": { "message": "IÅĄtrynimo data ir laikas yra privalomi." }, "dateParsingError": { - "message": "There was an error saving your deletion and expiration dates." + "message": "IÅĄsaugant jÅĢsÅŗ iÅĄtrynimo ir galiojimo datas įvyko klaida." }, "hideEmail": { "message": "Slėpti mano el. paÅĄto adresą nuo gavėjÅŗ." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { - "message": "One or more organization policies are affecting your Send options." + "message": "Viena ar daugiau organizacijos politikÅŗ turi įtakos JÅĢsÅŗ „Send“ nustatymams." }, "passwordPrompt": { "message": "IÅĄ naujo praÅĄoma pagrindinio slaptaÅžodÅžio" @@ -1871,8 +2679,11 @@ "emailVerificationRequired": { "message": "Reikalingas elektroninio paÅĄto patvirtinimas" }, + "emailVerifiedV2": { + "message": "Patvirtintas el. paÅĄtas" + }, "emailVerificationRequiredDesc": { - "message": "You must verify your email to use this feature. You can verify your email in the web vault." + "message": "Turite patvirtinti savo el. paÅĄtą, kad galėtumėte naudotis ÅĄia funkcija. Savo el. paÅĄto adresą galite patvirtinti Åžiniatinklio saugykloje." }, "updatedMasterPassword": { "message": "Naujasis pagrindinis slaptaÅžodis" @@ -1881,31 +2692,85 @@ "message": "Atnaujinti pagrindinį slaptaÅžodį" }, "updateMasterPasswordWarning": { - "message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "JÅĢsÅŗ pagrindinis slaptaÅžodis neseniai pakeistas JÅĢsÅŗ organizacijos administratorius. Privalote atnaujinti pagrindinį slaptaÅžodį, kad galėtumėte pasiekti saugyklą. Tęsdami bÅĢsite atjungtas nuo dabartinės savo sesijos, todėl turėsite vėl prisijungti. Aktyvios sesijos, kituose įrenginiuose, gali iÅĄlikti aktyvios iki vienos valandos." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "JÅĢsÅŗ pagrindinis slaptaÅžodis neatitinka vieno ar keliÅŗ organizacijos slaptaÅžodÅžiui keliamÅŗ reikalavimÅŗ. Privalote atnaujinti pagrindinį slaptaÅžodį, kad galėtumėte pasiekti saugyklą. Tęsdami bÅĢsite atjungtas nuo dabartinės savo sesijos, todėl turėsite vėl prisijungti. Aktyvios sesijos, kituose įrenginiuose, gali iÅĄlikti aktyvios iki vienos valandos." + }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic enrollment" + "message": "Automatinis registravimas" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + "message": "Å i organizacija turi įmonės politiką, kuri automatiÅĄkai įtrauks Jus į slaptaÅžodÅžio nustatymą iÅĄ naujo. Registravimas leis organizacijos administratoriams pakeisti JÅĢsÅŗ pagrindinį slaptaÅžodį." }, "selectFolder": { - "message": "Select folder..." + "message": "Pasirinkti aplankalą..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "Nerasta aplankÅŗ.", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Dėl organizacijos leidimÅŗ atnaujinimo, Jums reikia nustatyti pagrindinį slaptaÅžodį.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "JÅĢsÅŗ organizacija reikalauja Jus nustatyti pagrindinį slaptaÅžodį.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Reikalingas patikrinimas", + "description": "Default title for the user verification dialog." }, "hours": { - "message": "Hours" + "message": "ValandÅŗ" }, "minutes": { - "message": "Minutes" + "message": "MinučiÅŗ" + }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "JÅĢsÅŗ organizacijos politika nustatė JÅĢsÅŗ didÅžiausią leidÅžiamą saugyklos laiko limitą į $HOURS$ valandas(-Åŗ) ir $MINUTES$ minutes(-čiÅŗ).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", "placeholders": { "hours": { "content": "$1", @@ -1918,7 +2783,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "JÅĢsÅŗ organizacijos politika apriboja JÅĢsÅŗ saugyklos neaktyvumo laiko nustatymus. Maksimalus leidÅžiamas saugyklos neaktyvumo laikas yra $HOURS$ valanda(-os) ir $MINUTES$ minutė(s). JÅĢsÅŗ saugyklos neaktyvumo laiko veiksmas yra nustatytas $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1935,7 +2800,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "JÅĢsÅŗ organizacijos politika nustatė JÅĢsÅŗ saugyklos neaktyvumo veiksmą į $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -1944,22 +2809,22 @@ } }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "JÅĢsÅŗ saugyklos neaktyvumo laikas virÅĄija JÅĢsÅŗ organizacijos nustatytus apribojimus." }, "vaultExportDisabled": { - "message": "Vault export unavailable" + "message": "Saugyklos eksportavimas nepasiekiamas" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your individual vault." + "message": "Viena ar daugiau organizacijos strategijÅŗ neleidÅžia Jums eksportuoti asmeninės saugyklos." }, "copyCustomFieldNameInvalidElement": { - "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + "message": "Nepavyko nustatyti tinkamo formos elemento. Vietoj to pabandykite patikrinti HTML." }, "copyCustomFieldNameNotUnique": { - "message": "No unique identifier found." + "message": "Unikalus identifikatorius nerastas." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "message": "$ORGANIZATION$ naudoja SSO su savarankiÅĄkai sukurtu raktÅŗ serveriu. Pagrindinis slaptaÅžodis nebėra reikalingas norint ÅĄios organizacijos nariams prisijungti.", "placeholders": { "organization": { "content": "$1", @@ -1968,7 +2833,7 @@ } }, "leaveOrganization": { - "message": "Leave organization" + "message": "Palikti organizaciją" }, "removeMasterPassword": { "message": "IÅĄtrinti pagrindinį slaptaÅžodį" @@ -1977,22 +2842,22 @@ "message": "Pagrindinis slaptaÅžodis paÅĄalintas" }, "leaveOrganizationConfirmation": { - "message": "Are you sure you want to leave this organization?" + "message": "Ar tikrai norite palikti ÅĄią organizaciją?" }, "leftOrganization": { - "message": "You have left the organization." + "message": "JÅĢs palikote organizaciją." }, "toggleCharacterCount": { - "message": "Toggle character count" + "message": "Perjungti simboliÅŗ skaičiÅŗ" }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "JÅĢsÅŗ sesija pasibaigė. PraÅĄome grįŞti atgal ir prisijungti iÅĄ naujo." }, "exportingPersonalVaultTitle": { - "message": "Exporting individual vault" + "message": "Eksportuojama individuali saugykla" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Bus eksportuoti tik individualÅĢs saugyklos elementai, kurie susiję su $EMAIL$. Organizacijos saugyklos elementai nebus įtraukti. Bus eksportuota tik saugyklos elementÅŗ informacija, susiję priedai nebus įtraukti.", "placeholders": { "email": { "content": "$1", @@ -2000,30 +2865,59 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { - "message": "Error" + "message": "Klaida" }, "regenerateUsername": { - "message": "Regenerate username" + "message": "Pergeneruoti vartotojo vardą iÅĄ naujo" }, "generateUsername": { - "message": "Generate username" + "message": "Generuoti vartotojo vardą" + }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } }, "usernameType": { - "message": "Username type" + "message": "Vartotojo prisijungimo vardo tipas" }, "plusAddressedEmail": { - "message": "Plus addressed email", + "message": "Plius adresuotas el. paÅĄtas", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "Pasinaudokite savo el. paÅĄto teikėjo antrinio adreso galimybėmis." }, "catchallEmail": { - "message": "Catch-all email" + "message": "Viską palaikantis el. paÅĄtas" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Naudokite savo domeno sukonfigÅĢruotą viską palaikančią paÅĄto deÅžutę." }, "random": { "message": "Atsitiktinis" @@ -2032,35 +2926,145 @@ "message": "Atsitiktinis Åžodis" }, "websiteName": { - "message": "Website name" + "message": "Svetainės pavadinimas" }, "whatWouldYouLikeToGenerate": { "message": "Ką norėtumėte sugeneruoti?" }, "passwordType": { - "message": "Password type" + "message": "SlaptaÅžodÅžio tipas" }, "service": { - "message": "Service" + "message": "Paslauga" }, "forwardedEmail": { - "message": "Forwarded email alias" + "message": "Persiunčiamas el. paÅĄto slapyvardis" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Sugeneruoti el. paÅĄto slapyvardį su iÅĄorine persiuntimo paslauga." + }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "„$SERVICENAME$“ klaida: $ERRORMESSAGE$.", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Sugeneravo „Bitwarden“.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Svetainė: $WEBSITE$. Sugeneravo „Bitwarden“.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Netinkamas „$SERVICENAME$“ API prieigos raktas.", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Netinkamas „$SERVICENAME$“ API prieigos raktas: $ERRORMESSAGE$.", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nepavyksta gauti „$SERVICENAME$“ uÅžmaskuoto el. paÅĄto paskyros ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Netinkamas „$SERVICENAME$“ domenas.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Netinkamas „$SERVICENAME$“ URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "ÄŽvyko neÅžinoma „$SERVICENAME$“ klaida.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "NeÅžinomas persiuntėjas: „$SERVICENAME$“.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } }, "hostname": { - "message": "Hostname", + "message": "Pagrindinio kompiuterio vardas", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "API Prieigos Raktas" }, "apiKey": { "message": "API raktas" }, "ssoKeyConnectorError": { - "message": "Key connector error: make sure key connector is available and working correctly." + "message": "Rakto jungties klaida: įsitikinkite, kad rakto jungtis yra prieinama ir veikia tinkamai." }, "premiumSubcriptionRequired": { "message": "Reikalingas Premium abonementas" @@ -2069,10 +3073,10 @@ "message": "Organizacija suspenduota." }, "disabledOrganizationFilterError": { - "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Elementai esantys suspenduotose Organizacijose yra neprieinami. Susisiekite su savo Organizacijos savininku." }, "loggingInTo": { - "message": "Logging in to $DOMAIN$", + "message": "Prisijungiama prie $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -2081,25 +3085,25 @@ } }, "settingsEdited": { - "message": "Settings have been edited" + "message": "Nustatymai buvo paredaguoti" }, "environmentEditedClick": { "message": "Spauskite čia" }, "environmentEditedReset": { - "message": "to reset to pre-configured settings" + "message": "iÅĄ naujo nustatyti iÅĄ anksto sukonfigÅĢruotus nustatymus" }, "serverVersion": { - "message": "Server version" + "message": "Serverio versija" }, "selfHostedServer": { - "message": "self-hosted" + "message": "savarankiÅĄkai sukurtas" }, "thirdParty": { "message": "Trečioji ÅĄalis" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "Prisijungta prie trečiosios ÅĄalies serverio diegimo $SERVERNAME$. Patikrinkite klaidas naudodami oficialÅŗ serverį arba praneÅĄkite apie jas trečiosios ÅĄalies serveriui.", "placeholders": { "servername": { "content": "$1", @@ -2108,7 +3112,7 @@ } }, "lastSeenOn": { - "message": "last seen on: $DATE$", + "message": "paskutinį kartą matytas: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2138,7 +3142,7 @@ "message": "Prisijungti su įrenginiu turi bÅĢti nustatyta Bitwarden aplikacijos nustatymuose. Reikia kito pasirinkimo?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "PirÅĄtÅŗ atspaudÅŗ frazė" }, "fingerprintMatchInfo": { "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { "message": "Kaip automatiÅĄkai uÅžpildyti" }, "autofillSelectInfoWithCommand": { - "message": "Pasirink elementą iÅĄ ÅĄio puslapio arba naudok trumpąjį klaviÅĄÄ…: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organizacijos SSO identifikatorius yra reikalingas." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "ES", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Prieiga uÅždrausta. Neturi teisės perÅžiÅĢrėti ÅĄÄ¯ puslapį." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Patikimas įrenginys" }, + "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." + }, + "sendsNoItemsMessage": { + "message": "Naudokite „Send“, kad saugiai bendrintumėte uÅžÅĄifruotą informaciją su bet kuriuo asmeniu.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2386,13 +3431,13 @@ "message": "Retrieving options..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "Elementai nerasti" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "IÅĄvalyti viską" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+$QUANTITY$ daugiau", "placeholders": { "quantity": { "content": "$1", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "Submeniu" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Perjungti sutrumpinimą", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Importuoti duomenis į Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Apsaugoti LastPass duomenis ir importuoti į Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "IÅĄsaugoti kaip neuÅžÅĄifruotą failą", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importuoti į Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importuojama...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Duomenys sėkmingai importuoti.", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Klaida importuojant. IÅĄsamesnės informacijos patikrink konsolėje.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Importuojant įvyko tinklo klaida.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Domeno slapyvardis" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Elementai su pagrindinio slaptaÅžodÅžio raginimu negali bÅĢti automatiÅĄkai uÅžpildyti įkeliant puslapį. Automatinis pildymas, įkeliant puslapį, iÅĄjungtas.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Automatinis pildymas įkeliant puslapį nustatytas naudoti numatytąjį nustatymą.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "IÅĄjunkite pagrindinio slaptaÅžodÅžio raginimą, jei norite redaguoti ÅĄÄ¯ lauką", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Perjungti ÅĄoninę narÅĄymą" + }, + "skipToContent": { + "message": "Pereiti prie turinio" + }, + "bitwardenOverlayButton": { + "message": "„Bitwarden“ automatinio pildymo meniu mygtukas", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Perjungti „Bitwarden“ automatinio pildymo meniu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "„Bitwarden“ automatinio pildymo meniu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Atrakinkite savo paskyrą, kad pamatytumėte atitinkamus prisijungimus", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Atrakinti paskyrą", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Atrakinti savo paskyrą, atidaromas naujame lange", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "UÅžpildykite prisijungimo duomenis", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Dalinis vartotojo vardas", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Nėra elementÅŗ, kuriuos bÅĢtÅŗ galima parodyti", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Naujas elementas", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Pridėti naują saugyklos elementą", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Pridėti naują saugyklos prisijungimo elementą, atidaromas naujame lange", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Pridėti naują saugyklos kortelės elementą, atidaromas naujame lange", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Nauja tapatybė", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Pridėti naują saugyklos tapatybės elementą, atidaromas naujame lange", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Galimas „Bitwarden“ automatinio pildymo meniu. Norėdami pasirinkti, paspauskite rodyklės Åžemyn klaviÅĄÄ….", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ÄŽjungti" + }, + "ignore": { + "message": "Ignoruoti" + }, + "importData": { + "message": "Importuoti duomenis", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Importavimo klaida" + }, + "importErrorDesc": { + "message": "Kilo problema su duomenimis, kuriuos bandėte importuoti. PraÅĄome pataisyti klaidas, iÅĄvardytas apačioje, esančiam pradiniame faile ir pabandyti iÅĄ naujo." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "IÅĄtaisykite klaidas ir pabandykite iÅĄ naujo." + }, + "description": { + "message": "ApraÅĄymas" + }, + "importSuccess": { + "message": "Duomenys sėkmingai importuoti" + }, + "importSuccessNumberOfItems": { + "message": "IÅĄ viso importuoti $AMOUNT$ elementai.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Bandyti dar kartą" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Å iam veiksmui reikalingas patikrinimas. Norėdamas (-a) tęsti, nustatyk PIN." + }, + "setPin": { + "message": "Nustatyti PIN" + }, + "verifyWithBiometrics": { + "message": "Patikrininti su biometrinius duomenis" + }, + "awaitingConfirmation": { + "message": "Laukiama patvirtinimo" + }, + "couldNotCompleteBiometrics": { + "message": "Nepavyko atlikti biometriniÅŗ duomenÅŗ." + }, + "needADifferentMethod": { + "message": "Reikia kito metodo?" + }, + "useMasterPassword": { + "message": "Naudoti pagrindinį slaptaÅžodį" + }, + "usePin": { + "message": "Naudoti PIN" + }, + "useBiometrics": { + "message": "Naudoti biometrinius duomenis" + }, + "enterVerificationCodeSentToEmail": { + "message": "ÄŽvesk į el. paÅĄtą atsiÅŗstą patikrinimo kodą." + }, + "resendCode": { + "message": "SiÅŗsti kodą dar kartą" + }, + "total": { + "message": "IÅĄ viso" + }, + "importWarning": { + "message": "JÅĢs importuojate duomenis į $ORGANIZATION$. JÅĢsÅŗ duomenimis gali bÅĢti pasidalinta tarp ÅĄios organizacijos nariÅŗ. Ar norite tęsti?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Klaida prijungiant su „Duo“ paslauga. Naudokite kitą dvigubo prisijungimo bÅĢdą arba susisiekite su „Duo“ dėl pagalbos." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Paleisk DUO ir sek veiksmus, kad baigtum prisijungti." + }, + "duoRequiredForAccount": { + "message": "Tavo paskyrai reikalingas Duo dviejÅŗ veiksmÅŗ prisijungimas." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "IÅĄskleisk plėtinį, kad uÅžbaigtum prisijungimą." + }, + "popoutExtension": { + "message": "IÅĄÅĄokantis plėtinys" + }, + "launchDuo": { + "message": "Paleisti DUO" + }, + "importFormatError": { + "message": "Duomenys neteisingai suformatuoti. PraÅĄome patikrinti savo importuojamą failą ir pabandyti iÅĄ naujo." + }, + "importNothingError": { + "message": "Niekas nebuvo importuota." + }, + "importEncKeyError": { + "message": "Kilo klaida iÅĄÅĄifruojant eksportuotą failą. JÅĢsÅŗ ÅĄifravimo raktas nesutampa su ÅĄifravimo raktu, naudotu eksportuoti duomenis." + }, + "invalidFilePassword": { + "message": "Netinkamas failo slaptaÅžodis, praÅĄome naudoti slaptaÅžodį, kurį įvedėte kurdami eksportuojamą failą." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "SuÅžinoti apie importavimo parinktis" + }, + "selectImportFolder": { + "message": "Pasirinkti aplankalą" + }, + "selectImportCollection": { + "message": "Pasirinkti rinkinį" + }, + "importTargetHint": { + "message": "Pasirinkite ÅĄÄ¯ pasirinkimą, jei norite, jog importuoto failo turinys, bÅĢtÅŗ perkeltas į $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Faile yra nepriskirtÅŗ elementÅŗ." + }, + "selectFormat": { + "message": "Pasirinkti importuojamo failo formatą" + }, + "selectImportFile": { + "message": "Pasirinkti importuojamą failą" + }, + "chooseFile": { + "message": "Pasirinkti failą" + }, + "noFileChosen": { + "message": "Nepasirinktas joks failas" + }, + "orCopyPasteFileContents": { + "message": "arba kopijuokite/įklijuokite importuojamo failo turinį" + }, + "instructionsFor": { + "message": "$NAME$ Instrukcijos", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Patvirtinti saugyklos importavimą" + }, + "confirmVaultImportDesc": { + "message": "Failas yra apsaugotas slaptaÅžodÅžiu. Norint importuoti duomenis, įveskite failo slaptaÅžodį." + }, + "confirmFilePassword": { + "message": "Patvirtinti failo slaptaÅžodį" + }, + "exportSuccess": { + "message": "Eksportuoti saugyklos duomenys" + }, + "typePasskey": { + "message": "Prieigos raktas" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Neteisingas slaptaÅžodis" + }, + "incorrectCode": { + "message": "Neteisingas kodas" + }, + "incorrectPin": { + "message": "Neteisingas PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Su LastPass paskyra susietą YubiKey įkiÅĄk į kompiuterio USB jungtį, tada paliesk jo mygtuką." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Pasiekiamos paskyros" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Tik kartą" + }, + "alwaysForThisSite": { + "message": "Visada ÅĄiam svetainėje" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ pridėta prie neįtraukiamÅŗ domenÅŗ.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Padaryti Bitwarden savo numatytuoju slaptaÅžodÅžiÅŗ tvarkytuvu?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoruojant ÅĄią parinktį, gali kilti konfliktÅŗ tarp Bitwarden automatinio uÅžpildymo meniu ir narÅĄyklės.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Padaryti Bitwarden savo numatytuoju slaptaÅžodÅžiÅŗ tvarkytuvu", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Nepavyksta nustatyti Bitwarden kaip numatytosios slaptaÅžodÅžiÅŗ tvarkyklės", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Norėdamas (-a) nustatyti Bitwarden kaip numatytąją slaptaÅžodÅžiÅŗ tvarkyklę, turi suteikti Bitwarden narÅĄyklės privatumo leidimus.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Padaryti numatytuoju", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Kredencialai iÅĄsaugoti sėkmingai.", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Kredencialai atnaujinti sėkmingai.", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Klaida iÅĄsaugant kredencialus. IÅĄsamesnės informacijos patikrink konsolėje.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Sėkmė" + }, + "removePasskey": { + "message": "PaÅĄalinti slaptaraktį" + }, + "passkeyRemoved": { + "message": "PaÅĄalintas slaptaraktis" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Priskirti į kolekcijas" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Administratoriaus konsolės" + }, + "accountSecurity": { + "message": "Paskyros saugumas" + }, + "notifications": { + "message": "PraneÅĄimai" + }, + "appearance": { + "message": "IÅĄvaizda" + }, + "errorAssigningTargetCollection": { + "message": "Klaida priskiriant tikslinę kolekciją." + }, + "errorAssigningTargetFolder": { + "message": "Klaida priskiriant tikslinį aplanką." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Naujas" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Elemento informacija" + }, + "itemName": { + "message": "Elemento pavadinimas" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Negalite paÅĄalinti kolekcijÅŗ su PerÅžiÅĢrėti tik leidimus: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Savininkas" + }, + "selfOwnershipLabel": { + "message": "JÅĢs", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Papildoma informacija" + }, + "itemHistory": { + "message": "Elemento istorija" + }, + "lastEdited": { + "message": "Paskutinį kartą redaguota" + }, + "ownerYou": { + "message": "Savininkas: JÅĢs" + }, + "linked": { + "message": "Susieta" + }, + "copySuccessful": { + "message": "Kopijavimas sėkmingas" + }, + "upload": { + "message": "ÄŽkelti" + }, + "addAttachment": { + "message": "Pridėti priedą" + }, + "maxFileSizeSansPunctuation": { + "message": "DidÅžiausias failo dydis – 500 MB" + }, + "deleteAttachmentName": { + "message": "IÅĄtrinti priedą $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "AtsisiÅŗsti $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Ar tikrai norite negrįŞtamai iÅĄtrinti ÅĄÄ¯ priedą?" + }, + "premium": { + "message": "„Premium“" + }, + "freeOrgsCannotUseAttachments": { + "message": "Nemokamos organizacijos negali naudoti priedÅŗ" + }, + "filters": { + "message": "Filtrai" + }, + "personalDetails": { + "message": "Asmeniniai duomenys" + }, + "identification": { + "message": "Identifikavimas" + }, + "contactInfo": { + "message": "Kontaktinė informacija" + }, + "downloadAttachment": { + "message": "AtsisiÅŗsti – $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "kortelės numeris baigiasi su", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Prisijungimo kredencialai" + }, + "authenticatorKey": { + "message": "Autentifikatoriaus raktas" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Kortelės duomenys" + }, + "cardBrandDetails": { + "message": "„$BRAND$“ duomenys", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Pridėti paskyrą" + }, + "loading": { + "message": "ÄŽkeliama" + }, + "data": { + "message": "Duomenys" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Priskirti" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Pridėti lauką" + }, + "add": { + "message": "Pridėti" + }, + "fieldType": { + "message": "Lauko tipas" + }, + "fieldLabel": { + "message": "Lauko etiketė" + }, + "textHelpText": { + "message": "Naudokite tekstinius laukus duomenims, pavyzdÅžiui, saugumo klausimams" + }, + "hiddenHelpText": { + "message": "Naudokite paslėptus laukus slaptiems duomenims, pavyzdÅžiui, slaptaÅžodÅžiams" + }, + "checkBoxHelpText": { + "message": "Naudokite Åžymimuosius langelius, jei norite automatiÅĄkai uÅžpildyti formos Åžymimąjį langelį, pavyzdÅžiui, prisiminti el. paÅĄtą" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Redaguoti lauką" + }, + "editFieldLabel": { + "message": "Redaguoti $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "IÅĄtrinti $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "Pridėtas $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Elemento vieta" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index f094022695c..88c08977b7e 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden paroÄŧu pārvaldnieks", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "DroÅĄs bezmaksas paroÄŧu pārvaldnieks visām Tavām ierÄĢcēm.", - "description": "Extension description" + "message": "Bitwarden viegli aizsargā visas paroles, paroÄŧu atslēgas un jutÄĢgu informāciju mājās, darbā vai ceÄŧā", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Jāpiesakās vai jāizveido jauns konts, lai piekÄŧÅĢtu droÅĄajai glabātavai." }, + "inviteAccepted": { + "message": "Uzaicinājums apstiprināts" + }, "createAccount": { "message": "Izveidot kontu" }, - "login": { - "message": "Pieteikties" + "newToBitwarden": { + "message": "Bitwarden iepriekÅĄ nav izmantots?" + }, + "logInWithPasskey": { + "message": "Pieteikties ar piekÄŧuves atslēgu" + }, + "useSingleSignOn": { + "message": "Izmantot vienoto pieteikÅĄanos" + }, + "welcomeBack": { + "message": "Laipni lÅĢdzam atpakaÄŧ" + }, + "setAStrongPassword": { + "message": "Jāiestata droÅĄa parole" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Sava konta izveidoÅĄana jāpabeidz ar paroles iestatÄĢÅĄanu" }, "enterpriseSingleSignOn": { "message": "Uzņēmuma vienotā pieteikÅĄanās" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Galvenās paroles norāde var palÄĢdzēt atcerēties paroli, ja tā ir aizmirsta." }, + "masterPassHintText": { + "message": "Ja tiks aizmirsta parole, tās norādi var nosÅĢtÄĢt uz e-pasta adresi. $CURRENT$/$MAXIMUM$ lielākais pieÄŧaujamais rakstzÄĢmju skaits.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Atkārtoti ievadÄĢt galveno paroli " }, "masterPassHint": { "message": "Galvenās paroles norāde (nav nepiecieÅĄama)" }, + "joinOrganization": { + "message": "Pievienoties apvienÄĢbai" + }, + "joinOrganizationName": { + "message": "Pievienoties $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Pabeigt pievienoÅĄanos ÅĄai apvienÄĢbai ar galvenās paroles iestatÄĢÅĄanu." + }, "tab": { "message": "Cilne" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Ievietot paroli starpliktuvē" }, + "copyPassphrase": { + "message": "Ievietot paroles vārdkopu starpliktuvē" + }, "copyNote": { "message": "Ievietot piezÄĢmi starpliktuvē" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Ievietot droÅĄÄĢbas kodu starpliktuvē" }, + "copyName": { + "message": "Ievietot nosaukumu starpliktuvē" + }, + "copyCompany": { + "message": "Ievietot uzņēmumu starpliktuvē" + }, + "copySSN": { + "message": "Ievietot sociālās nodroÅĄinÄÅĄanas numuru starpliktuvē" + }, + "copyPassportNumber": { + "message": "Ievietot pases numuru starpliktuvē" + }, + "copyLicenseNumber": { + "message": "Ievietot licences numuru starpliktuvē" + }, + "copyPrivateKey": { + "message": "Ievietot starpliktuvē privāto atslēgu" + }, + "copyPublicKey": { + "message": "Ievietot starpliktuvē publisko atslēgu" + }, + "copyFingerprint": { + "message": "Ievietot starpliktuvē pirkstu nospiedumu" + }, + "copyCustomField": { + "message": "Ievietot $FIELD$ starpliktuvē", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Ievietot tÄĢmekÄŧvietni starpliktuvē" + }, + "copyNotes": { + "message": "Ievietot piezÄĢmes starpliktuvē" + }, + "fill": { + "message": "AizpildÄĢt", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Automātiskā aizpildÄĢÅĄana" + "message": "Automātiskā aizpilde" + }, + "autoFillLogin": { + "message": "Automātiski aizpildÄĢt pieteikÅĄanos" + }, + "autoFillCard": { + "message": "Automātiski aizpildÄĢt karti" + }, + "autoFillIdentity": { + "message": "Automātiski aizpildÄĢt identitāti" }, "generatePasswordCopied": { "message": "Izveidot paroli (tiks ievietota starpliktuvē)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Nav atbilstoÅĄu pieteikÅĄanās vienumu" }, + "noCards": { + "message": "Nav karÅĄu" + }, + "noIdentities": { + "message": "Nav identitÄÅĄu" + }, + "addLoginMenu": { + "message": "Pievienot pieteikÅĄanās vienumu" + }, + "addCardMenu": { + "message": "Pievienot karti" + }, + "addIdentityMenu": { + "message": "Pievienot identitāti" + }, "unlockVaultMenu": { "message": "Atslēgt glabātavu" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Pievienot vienumu" }, + "accountEmail": { + "message": "Konta e-pasta adrese" + }, + "requestHint": { + "message": "PieprasÄĢt norādi" + }, + "requestPasswordHint": { + "message": "PieprasÄĢt paroles norādi" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Jāievada sava konta e-pasta adrese, un paroles norāde tiks nosÅĢtÄĢta" + }, "passwordHint": { "message": "Paroles norāde" }, @@ -140,14 +268,32 @@ "message": "ApstiprinÄÅĄanas kods" }, "confirmIdentity": { - "message": "Jāapstiprina identitāte, lai turpinātu." - }, - "account": { - "message": "Konts" + "message": "Jāapliecina sava identitāte, lai turpinātu." }, "changeMasterPassword": { "message": "MainÄĢt galveno paroli" }, + "continueToWebApp": { + "message": "Pāriet uz tÄĢmekÄŧa lietotni?" + }, + "continueToWebAppDesc": { + "message": "Vairāk sava Bitwarden konta iespēju var izpētÄĢt tÄĢmekÄŧa vietnē." + }, + "continueToHelpCenter": { + "message": "Pāriet uz palÄĢdzÄĢbas centru?" + }, + "continueToHelpCenterDesc": { + "message": "Vairāk par to, kā izmantot Bitwarden, var uzzināt palÄĢdzÄĢbas centrā." + }, + "continueToBrowserExtensionStore": { + "message": "Turpināt pārlÅĢka paplaÅĄinājumu veikalā?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Var palÄĢdzēt citiem noskaidrot, vai Bitwarden viņiem der. To var izdarÄĢt pārlÅĢka lietotņu veikalā, atstājot vērtējumu." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Savu galveno paroli var mainÄĢt Bitwarden tÄĢmekÄŧa lietotnē." + }, "fingerprintPhrase": { "message": "AtpazÄĢÅĄanas vārdkopa", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Atteikties" }, + "aboutBitwarden": { + "message": "Par Bitwarden" + }, "about": { "message": "Par" }, + "moreFromBitwarden": { + "message": "Vairāk no Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Pāriet uz bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden uzņēmējdarbÄĢbai" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden autentificētājs" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden autentificētājs Äŧauj glabāt autentificētāja atslēgas un izveidot TOTP kodus divpakāpju apliecinÄÅĄanas plÅĢsmām. Vairāk var uzzināt tÄĢmekÄŧvietnē bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden noslēpumu pārvaldnieks" + }, + "continueToSecretsManagerPageDesc": { + "message": "DroÅĄa izstrādātāju noslēpumu uzglabÄÅĄana, pārvaldÄĢÅĄana un kopÄĢgoÅĄana ar Bitwarden noslēpumu pārvaldnieku. Vairāk var uzzināt tÄĢmekÄŧvietnē bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "PlÅĢdenu un droÅĄu pieteikÅĄanās pieredÅžu, kas ir brÄĢvas no ierastajām parolēm, izveidoÅĄana ar Passwordless.dev. Vairāk var uzzināt tÄĢmekÄŧvietnē bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bezmaksas Bitwarden ÄŖimenēm" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Tev ir tiesÄĢbas uz bezmaksas Bitwarden ÄŖimenēm. Å o piedāvājumu ÅĄodien var pieņemt tÄĢmekÄŧa lietotnē." + }, "version": { "message": "Laidiens" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Labot mapi" }, + "newFolder": { + "message": "Jauna mape" + }, + "folderName": { + "message": "Mapes nosaukums" + }, + "folderHintText": { + "message": "ApakÅĄmapes var izveidot, ja pievieno iekÄŧaujoÅĄÄs mapes nosaukumu, aiz kura ir \"/\". Piemēram: TÄĢkloÅĄanās/Forumi" + }, + "noFoldersAdded": { + "message": "Nav pievienota neviena mape" + }, + "createFoldersToOrganize": { + "message": "Mapes ir izveidojamas, lai sakārtotu savas glabātavas vienumus" + }, + "deleteFolderPermanently": { + "message": "Vai tieÅĄÄm neatgriezeniski izdzēst ÅĄo mapi?" + }, "deleteFolder": { "message": "Dzēst mapi" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Veidotājs", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automātiski veido spēcÄĢgas, neatkārtojamas paroles visiem pieteikÅĄanās vienumiem." }, - "bitWebVault": { - "message": "Bitwarden tÄĢmekÄŧa glabātava" + "bitWebVaultApp": { + "message": "Bitwarden tÄĢmekÄŧa lietotne" }, "importItems": { "message": "Ievietot vienumus" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Veidot paroli" }, + "generatePassphrase": { + "message": "Izveidot paroles vārdkopu" + }, "regeneratePassword": { "message": "Pārizveidot paroli" }, @@ -244,17 +447,60 @@ "length": { "message": "Garums" }, + "passwordMinLength": { + "message": "Mazākais pieÄŧaujamais paroles garums" + }, "uppercase": { - "message": "Lielie burti (A-Z)" + "message": "Lielie burti (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Mazie burti (a-z)" + "message": "Mazie burti (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Cipari (0-9)" + "message": "Cipari (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ÄĒpaÅĄÄs rakstzÄĢmes (!@#$%^&*)" + "message": "ÄĒpaÅĄÄs rakstzÄĢmes (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "IekÄŧaut", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "IekÄŧaut lielos burtus", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "IekÄŧaut mazos burtus", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "IekÄŧaut ciparus", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "IekÄŧaut ÄĢpaÅĄÄs rakstzÄĢmes", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Vārdu skaits" @@ -276,7 +522,16 @@ "message": "Mazākais pieÄŧaujamais ÄĢpaÅĄo rakstzÄĢmju skaits" }, "avoidAmbChar": { - "message": "IzvairÄĢties no viegli sajaucamām rakstzÄĢmēm" + "message": "IzvairÄĢties no viegli sajaucamām rakstzÄĢmēm", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "IzvairÄĢties no viegli sajaucamām rakstzÄĢmēm", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Veidotāja iespējām tika piemērotas uzņēmējdarbÄĢbas nosacÄĢjumu prasÄĢbas.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Meklēt glabātavā" @@ -299,15 +554,30 @@ "password": { "message": "Parole" }, + "totp": { + "message": "Autentificētāja noslēpums" + }, "passphrase": { "message": "Paroles vārdkopa" }, "favorite": { "message": "Izlasē" }, + "unfavorite": { + "message": "Noņemt no izlases" + }, + "itemAddedToFavorites": { + "message": "Vienums pievienots izlasē" + }, + "itemRemovedFromFavorites": { + "message": "Vienums noņemts no izlases" + }, "notes": { "message": "PiezÄĢmes" }, + "privateNote": { + "message": "Personiska piezÄĢme" + }, "note": { "message": "PiezÄĢme" }, @@ -326,6 +596,18 @@ "launch": { "message": "Palaist" }, + "launchWebsite": { + "message": "Atvērt tÄĢmekÄŧvietni" + }, + "launchWebsiteName": { + "message": "Atvērt tÄĢmekÄŧvietni $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "TÄĢmekÄŧa vietne" }, @@ -338,9 +620,24 @@ "other": { "message": "Cits" }, + "unlockMethods": { + "message": "AtslēgÅĄanas iespējas" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Jāuzstāda atslēgÅĄanas veids, lai mainÄĢtu glabātavas noildzes darbÄĢbu." }, + "unlockMethodNeeded": { + "message": "Jāuzstāda atslēgÅĄanas veids iestatÄĢjumos" + }, + "sessionTimeoutHeader": { + "message": "Sesijas noildze" + }, + "vaultTimeoutHeader": { + "message": "Glabātavas noildze" + }, + "otherOptions": { + "message": "Citas iespējas" + }, "rateExtension": { "message": "Novērtēt paplaÅĄinājumu" }, @@ -348,13 +645,22 @@ "message": "LÅĢgums apsvērt palÄĢdzēt mums ar labu atsauksmi." }, "browserNotSupportClipboard": { - "message": "TÄĢmekÄŧa pārlÅĢks neatbalsta vienkārÅĄu starpliktuves kopÄ“ÅĄanu. Tā vietā tas paÅĄrocÄĢgi jāievieto starpliktuvē." + "message": "PārlÅĢks neatbalsta vienkārÅĄo ievietoÅĄanu starpliktuvē. Tā vietā tas jāievieto starpliktuvē paÅĄrocÄĢgi." }, "verifyIdentity": { - "message": "Apstiprināt identitāti" + "message": "Identitātes apliecinÄÅĄana" }, "yourVaultIsLocked": { - "message": "Glabātava ir aizslēgta. Jāapstiprina identitāte, lai turpinātu." + "message": "Glabātava ir aizslēgta. Jāapliecina sava identitāte, lai turpinātu." + }, + "yourVaultIsLockedV2": { + "message": "Glabātava ir slēgta" + }, + "yourAccountIsLocked": { + "message": "Konts ir slēgts" + }, + "or": { + "message": "vai" }, "unlock": { "message": "Atslēgt" @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Glabātavas noildze" }, + "vaultTimeout1": { + "message": "Noildze" + }, "lockNow": { "message": "Aizslēgt" }, + "lockAll": { + "message": "Aizslēgt visu" + }, "immediately": { "message": "Nekavējoties" }, @@ -426,8 +738,20 @@ "security": { "message": "DroÅĄÄĢba" }, + "confirmMasterPassword": { + "message": "Apstiprināt galveno paroli" + }, + "masterPassword": { + "message": "Galvenā parole" + }, + "masterPassImportant": { + "message": "Galveno paroli nevar atgÅĢt, ja tā tiek aizmirsta." + }, + "masterPassHintLabel": { + "message": "Galvenās paroles norāde" + }, "errorOccurred": { - "message": "Radusies kÄŧÅĢda" + "message": "AtgadÄĢjās kÄŧÅĢda" }, "emailRequired": { "message": "E-pasta adrese ir nepiecieÅĄama." @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Jaunais konts ir izveidots. Tagad vari pieteikties." }, + "newAccountCreated2": { + "message": "Jaunais konts tika izveidots." + }, + "youHaveBeenLoggedIn": { + "message": "Tu esi pieteicies." + }, + "youSuccessfullyLoggedIn": { + "message": "PieteikÅĄanās bija veiksmÄĢga" + }, + "youMayCloseThisWindow": { + "message": "Å o logu var aizvērt" + }, "masterPassSent": { "message": "Mēs nosÅĢtÄĢjām galvenās paroles norādi e-pastā." }, "verificationCodeRequired": { "message": "Apstiprinājuma kods ir nepiecieÅĄams." }, + "webauthnCancelOrTimeout": { + "message": "Autentifikācija tika atcelta vai tā aizņēma pārāk daudz laika. LÅĢgums mēĪināt vēlreiz." + }, "invalidVerificationCode": { "message": "NederÄĢgs apstiprinājuma kods" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Neizdevās automātiski aizpildÄĢt izvēlēto vienumu ÅĄajā lapā. Tā vietā informācija ir jāievieto starpliktuvē un jāielÄĢmē paÅĄrocÄĢgi." }, + "totpCaptureError": { + "message": "Neizdevās nolasÄĢt kvadrātkodu paÅĄreizējā tÄĢmekÄŧa lapā" + }, + "totpCaptureSuccess": { + "message": "Autentificētāja atslēga ir pievienota" + }, + "totpCapture": { + "message": "NolasÄĢt autentificētāja kvadrātkodu paÅĄreizējā tÄĢmekÄŧa lapā" + }, + "totpHelperTitle": { + "message": "PadarÄĢt divpakāpju apliecinÄÅĄanu plÅĢdenu" + }, + "totpHelper": { + "message": "Bitwarden var glabāt un aizpildÄĢt divpakāpju apliecinÄÅĄanas kodus. Atslēga jāievieto starpliktuvē un jāielÄĢmē ÅĄajā laukā." + }, + "totpHelperWithCapture": { + "message": "Bitwarden var glabāt un aizpildÄĢt divpakāpju apliecinÄÅĄanas kodus. Jāizvēlas kameras ikona, lai veiktu tÄĢmekÄŧvietnes autentificētāja kvadrātkoda ekrānuzņēmumu, vai jāievieto starpliktuvē atslēga un jāielÄĢmē ÅĄajā laukā." + }, + "learnMoreAboutAuthenticators": { + "message": "Uzzināt vairāk par autentificētājiem" + }, + "copyTOTP": { + "message": "Ievietot starpliktuvē autentificētāja atslēgu (TOTP)" + }, "loggedOut": { "message": "Atteicies" }, + "loggedOutDesc": { + "message": "Notika izrakstÄĢÅĄanās no Tava konta." + }, "loginExpired": { "message": "PieteikÅĄanās sesija ir beigusies." }, + "logIn": { + "message": "Pieteikties" + }, + "logInToBitwarden": { + "message": "Pieteikties Bitwarden" + }, + "restartRegistration": { + "message": "Sākt reÄŖistrÄ“ÅĄanos no jauna" + }, + "expiredLink": { + "message": "Saitei beidzies derÄĢgums" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "LÅĢgums sākt reÄŖistrÄ“ÅĄanos no jauna vai mēĪināt pieteikties." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Tev jau varētu bÅĢt konts" + }, "logOutConfirmation": { "message": "Vai tieÅĄÄm atteikties?" }, @@ -503,14 +887,14 @@ "addedFolder": { "message": "Pievienoja mapi" }, - "changeMasterPass": { - "message": "MainÄĢt galveno paroli" - }, - "changeMasterPasswordConfirmation": { - "message": "Galveno paroli ir iespējams mainÄĢt bitwarden.com tÄĢmekÄŧa glabātavā. Vai apmeklēt tÄĢmekÄŧa vietni?" - }, "twoStepLoginConfirmation": { - "message": "Divpakāpju pieteikÅĄanās padara kontu krietni droÅĄÄku, pieprasot apstiprināt pieteikÅĄanos ar tādu citu ierÄĢču vai pakalpojumu starpniecÄĢbu kā droÅĄÄĢbas atslēga, autentificētāja lietotne, ÄĢsziņa, tālruņa zvans vai e-pasts. Divpakāpju pieteikÅĄanos var iespējot bitwarden.com tÄĢmekÄŧa glabātavā. Vai apmeklēt tÄĢmekÄŧa vietni?" + "message": "Divpakāpju pieteikÅĄanās padara kontu krietni droÅĄÄku, pieprasot apstiprināt pieteikÅĄanos ar tādu citu ierÄĢču vai pakalpojumu starpniecÄĢbu kā droÅĄÄĢbas atslēga, autentificētāja lietotne, ÄĢsziņa, tālruņa zvans vai e-pasts. Divpakāpju pieteikÅĄanos var iespējot bitwarden.com tÄĢmekÄŧa glabātavā. Vai tagad apmeklēt tÄĢmekÄŧvietni?" + }, + "twoStepLoginConfirmationContent": { + "message": "Savu kontu var padarÄĢt droÅĄÄku ar divpakāpju pieteikÅĄanās uzstādÄĢÅĄanu Bitwarden tÄĢmekÄŧa lietotnē." + }, + "twoStepLoginConfirmationTitle": { + "message": "Pāriet uz tÄĢmekÄŧa lietotni?" }, "editedFolder": { "message": "Mape labota" @@ -525,7 +909,7 @@ "message": "UzsākÅĄanas pamācÄĢba" }, "gettingStartedTutorialVideo": { - "message": "Noskaties mÅĢsu uzsākÅĄanas pamācÄĢbu, lai uzzinātu, kā iegÅĢt vislielāko labumu no pārlÅĢka paplaÅĄinājuma." + "message": "Noskaties mÅĢsu uzsākÅĄanas pamācÄĢbu, lai uzzinātu, kā iegÅĢt vislielāko labumu no pārlÅĢka paplaÅĄinājuma!" }, "syncingComplete": { "message": "Sinhronizācija pabeigta" @@ -552,6 +936,10 @@ "newUri": { "message": "Jauns URI" }, + "addDomain": { + "message": "Pievienot domēna vārdu", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Vienums pievienots" }, @@ -592,27 +980,39 @@ "enableAddLoginNotification": { "message": "Vaicāt, lai pievienotu pieteikÅĄanās vienumu" }, + "vaultSaveOptionsTitle": { + "message": "Saglabāt glabātavas iespējās" + }, "addLoginNotificationDesc": { "message": "Vaicāt pievienot vienumu, ja tāds nav atrodams glabātavā." }, + "addLoginNotificationDescAlt": { + "message": "Vaicāt, vai pievienot vienumu, ja glabātavā tāds nav atrodams. Attiecas uz visiem kontiem, kuri ir pieteikuÅĄies." + }, + "showCardsInVaultView": { + "message": "RādÄĢt kartes kā automātiskās aizpildes ieteikumus glabātavas skatā" + }, "showCardsCurrentTab": { "message": "RādÄĢt kartes cilnes lapā" }, "showCardsCurrentTabDesc": { "message": "Attēlot kartes ciÄŧņu lapā vieglākai aizpildÄĢÅĄanai." }, + "showIdentitiesInVaultView": { + "message": "RādÄĢt identitātes kā automātiskās aizpildes ieteikumus glabātavas skatā" + }, "showIdentitiesCurrentTab": { "message": "RādÄĢt identitātes cilnes pārskatā" }, "showIdentitiesCurrentTabDesc": { - "message": "Attēlot identitātes ciÄŧņu lapā vieglākai aizpildÄĢÅĄanai." + "message": "Attēlot identitātes ciÄŧņu lapā vieglākai aizpildei." }, "clearClipboard": { "message": "NotÄĢrÄĢt starpliktuvi", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "Automātiski noņemt kopētās vērtÄĢbas no starpliktuves.", + "message": "Automātiski noņemt starpliktuvē ievietotās vērtÄĢbas.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { @@ -625,7 +1025,16 @@ "message": "Vaicāt atjaunināt esoÅĄu pieteikÅĄanās vienumu" }, "changedPasswordNotificationDesc": { - "message": "Vaicāt atjaunināt pieteikÅĄanās vienuma paroli, ja vietnē ir noteiktas tās izmaiņas." + "message": "Vaicāt atjaunināt pieteikÅĄanās vienuma paroli, ja tÄĢmekÄŧvietnē ir noteiktas tās izmaiņas." + }, + "changedPasswordNotificationDescAlt": { + "message": "Vaicāt, vai atjaunināt pieteikÅĄanās vienuma paroli, kad tÄĢmekÄŧvietnē ir noteikta atÅĄÄˇirÄĢba. Attiecas uz visiem kontiem, kuri ir pieteikuÅĄies." + }, + "enableUsePasskeys": { + "message": "Vaicāt, vai saglabāt un izmantot piekÄŧuves atslēgas" + }, + "usePasskeysDesc": { + "message": "Vaicāt, vai saglabāt jaunas piekÄŧuves atslēgas vai pieteikties ar glabātavā esoÅĄajām piekÄŧuves atslēgām. Attiecas uz visiem kontiem, kuri ir pieteikuÅĄies." }, "notificationChangeDesc": { "message": "Vai atjaunināt ÅĄo paroli Bitwarden?" @@ -634,23 +1043,29 @@ "message": "Jā, atjaunināt" }, "notificationUnlockDesc": { - "message": "Jāatslēdz Bitwarden glabātava, lai pabeigtu automātiskās aizpildÄĢÅĄanas pieprasÄĢjumu." + "message": "Jāatslēdz Bitwarden glabātava, lai pabeigtu automātiskās aizpildes pieprasÄĢjumu." }, "notificationUnlock": { "message": "Atslēgt" }, + "additionalOptions": { + "message": "Papildu iespējas" + }, "enableContextMenuItem": { "message": "RādÄĢt konteksta izvēlnes iespējas" }, "contextMenuItemDesc": { - "message": "Izmantot orējo klikÅĄÄˇi, lai piekÄŧÅĢtu paroÄŧu veidoÅĄanai un vietnei atbilstoÅĄajiem pieteikÅĄanās vienumiem. " + "message": "Izmantot otrējo klikÅĄÄˇi, lai piekÄŧÅĢtu paroÄŧu veidoÅĄanai un tÄĢmekÄŧvietnei atbilstoÅĄajiem pieteikÅĄanās vienumiem." + }, + "contextMenuItemDescAlt": { + "message": "Izmantot otrējo klikÅĄÄˇi, lai piekÄŧÅĢtu paroÄŧu veidoÅĄanai un tÄĢmekÄŧvietnei atbilstoÅĄajiem pieteikÅĄanās vienumiem. Attiecas uz visiem kontiem, kuri ir pieteikuÅĄies." }, "defaultUriMatchDetection": { "message": "Noklusējuma URI atbilstÄĢbas noteikÅĄana", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Izvēlēties noklusējuma veidu, kādā tiek apstrādāta pieteikÅĄan'ās vienumu URI atbilstÄĢbas noteikÅĄana, kad tiek veiktas tādas darbÄĢbas kā automātiska aizpildÄĢÅĄana." + "message": "Izvēlēties noklusējuma veidu, kādā tiek apstrādāta pieteikÅĄanās vienumu URI atbilstÄĢbas noteikÅĄana, kad tiek veiktas tādas darbÄĢbas kā automātiska aizpilde." }, "theme": { "message": "Izskats" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "MainÄĢt lietotnes izskata krāsas." }, + "themeDescAlt": { + "message": "MainÄĢt lietotnes izskata krāsas. Attiecas uz visiem kontiem, kuri ir pieteikuÅĄies." + }, "dark": { "message": "TumÅĄs", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "IzgÅĢt no" + }, "exportVault": { "message": "IzgÅĢt glabātavas saturu" }, "fileFormat": { "message": "Datnes veids" }, + "fileEncryptedExportWarningDesc": { + "message": "Å ÄĢ datņu izgÅĢÅĄana bÅĢs aizsargāta ar paroli, un bÅĢs nepiecieÅĄama datnes parole, lai to atÅĄifrētu." + }, + "filePassword": { + "message": "Datnes parole" + }, + "exportPasswordDescription": { + "message": "Å ÄĢ parole tiks izmantota, lai izgÅĢtu un ievietotu ÅĄo datni" + }, + "accountRestrictedOptionDescription": { + "message": "Jāizmanto konta ÅĄifrÄ“ÅĄanas atslēga, kas iegÅĢta no lietotājvārda un galvenās paroles, lai ÅĄifrētu izguvi un atÄŧautu ievietoÅĄanu tikai paÅĄreizējā Bitwarden kontā." + }, + "passwordProtectedOptionDescription": { + "message": "UzstādÄĢt paroli, lai ÅĄifrētu izguvi un tad to ievietotu jebkurā Bitwarden kontā, izmantojot atÅĄifrÄ“ÅĄanas paroli." + }, + "exportTypeHeading": { + "message": "IzgÅĢÅĄanas veids" + }, + "accountRestricted": { + "message": "Konts ir ierobeÅžots" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Datnes parole\" un \"Apstiprināt datnes paroli\" vērtÄĢbas nesakrÄĢt." + }, "warning": { "message": "UZMANÄĒBU", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -684,7 +1129,7 @@ "message": "Apstiprināt glabātavas satura izgÅĢÅĄanu" }, "exportWarningDesc": { - "message": "Å ÄĢ izguve satur glabātavas datus neÅĄifrētā veidā. Izdoto datni nevajadzētu glabāt vai sÅĢtÄĢt nedroÅĄos veidos (piemēram, e-pastā). Izdzēst to uzreiz pēc izmantoÅĄanas." + "message": "Å ÄĢ izguve satur glabātavas datus neÅĄifrētā veidā. IzgÅĢto datni nevajadzētu glabāt vai sÅĢtÄĢt nedroÅĄos veidos (piemēram, e-pastā). Tā ir jāizdzÄ“ÅĄ uzreiz pēc izmantoÅĄanas." }, "encExportKeyWarningDesc": { "message": "Å ÄĢ izguve ÅĄifrē datus ar konta ÅĄifrÄ“ÅĄanas atslēgu. Ja tā jebkad tiks mainÄĢta, izvadi vajadzētu veikt vēlreiz, jo vairs nebÅĢs iespējams atÅĄifrēt ÅĄo datni." @@ -698,11 +1143,8 @@ "shared": { "message": "KopÄĢgots" }, - "learnOrg": { - "message": "Uzzināt par apvienÄĢbām" - }, - "learnOrgConfirmation": { - "message": "Bitwarden nodroÅĄina iespēju kopÄĢgot glabātavas vienumus ar citiem, kad tiek izmantota apvienÄĢba. Vai apmeklēt bitwarden.com tÄĢmekÄŧa vietni, lai uzzinātu vairāk?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden uzņēmējdarbÄĢbai nodroÅĄina iespēju kopÄĢgot savas glabātavas vienumus ar citiem, kad tiek izmantota apvienÄĢba. Vairāk var uzzināt tÄĢmekÄŧvietnē bitwarden.com." }, "moveToOrganization": { "message": "Pārvietot uz apvienÄĢbu" @@ -762,6 +1204,9 @@ "file": { "message": "Datne" }, + "fileToShare": { + "message": "Datne, ko kopÄĢgot" + }, "selectFile": { "message": "AtlasÄĢt datni" }, @@ -781,7 +1226,7 @@ "message": "PārvaldÄĢt dalÄĢbu" }, "premiumManageAlert": { - "message": "DalÄĢbu ir iespējams pārvaldÄĢt bitwarden.com tÄĢmekÄŧa glabātavā. Vai apmeklēt tÄĢmekÄŧa vietni?" + "message": "DalÄĢbu ir iespējams pārvaldÄĢt bitwarden.com tÄĢmekÄŧa glabātavā. Vai tagad apmeklēt tÄĢmekÄŧvietni?" }, "premiumRefresh": { "message": "Atjaunot dalÄĢbu" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB ÅĄifrētas krātuves datņu pielikumiem." }, + "premiumSignUpEmergency": { + "message": "Ārkārtas piekÄŧuve" + }, "premiumSignUpTwoStepOptions": { "message": "Tādas slēgtā pirmavota divpakāpju pieteikÅĄanās iespējas kā YubiKey un Duo." }, @@ -814,7 +1262,10 @@ "message": "Iegādāties Premium" }, "premiumPurchaseAlert": { - "message": "Premium dalÄĢbu ir iespējams iegādāties bitwarden.com tÄĢmekÄŧa glabātavā. Vai apmeklēt tÄĢmekÄŧa vietni?" + "message": "Premium dalÄĢbu ir iespējams iegādāties bitwarden.com tÄĢmekÄŧa glabātavā. Vai tagad apmeklēt tÄĢmekÄŧvietni?" + }, + "premiumPurchaseAlertV2": { + "message": "Premium var iegādāties Bitwarden tÄĢmekÄŧa lietotnē sava konta iestatÄĢjumos." }, "premiumCurrentMember": { "message": "Tu esi Premium dalÄĢbnieks!" @@ -822,6 +1273,9 @@ "premiumCurrentMemberThanks": { "message": "Paldies, ka atbalsti Bitwarden!" }, + "premiumFeatures": { + "message": "Uzlabo uz \"Premium\" un saņem:" + }, "premiumPrice": { "message": "Viss par tikai $PRICE$ gadā!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Viss par tikai $PRICE$ gadā.", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "AtsvaidzinÄÅĄana pabeigta" }, @@ -838,7 +1301,7 @@ "message": "Automātiski ievietot TOTP starpliktuvē" }, "disableAutoTotpCopyDesc": { - "message": "Ja pieteikÅĄanās vienumam ir pievienota autentificētāja atslēga, TOTP apstiprinājuma kods tiks automātiski pārkopēts uz starpliktuvi, kad vien tiks automātiski aizpildÄĢta pieteikÅĄanās veidne." + "message": "Ja pieteikÅĄanās vienumam ir pievienota autentificētāja atslēga, TOTP apstiprinājuma kods tiks automātiski ievietots starpliktuvē, kad vien tiks automātiski aizpildÄĢta pieteikÅĄanās veidne." }, "enableAutoBiometricsPrompt": { "message": "PalaiÅžot vaicāt biometriju" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Autentificētāja lietotne" }, - "authenticatorAppDesc": { - "message": "Izmanto autentificētāja lietotni (piemēram, Authy vai Google autentifikators), lai izveidotu laikā balstÄĢtus apstiprinājuma kodus!", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Jāievada autentificētāja lietotnes, piemēram, Bitwarden Authenticator, izveidots kods.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP droÅĄÄĢbas atslēga" + "yubiKeyTitleV2": { + "message": "Yubico OTP droÅĄÄĢbas atslēga" }, "yubiKeyDesc": { "message": "Ir izmantojams YubiKey, lai piekÄŧÅĢtu savam kontam. Darbojas ar YubiKey 4, 4 Nano, 4C un NEO ierÄĢcēm." }, - "duoDesc": { - "message": "Ar Duo Security apliecinÄÅĄanu var veikt ar Duo Mobile lietotni, ÄĢsziņu, tālruņa zvanu vai U2F droÅĄÄĢbas atslēgu.", + "duoDescV2": { + "message": "Jāievada Duo Security izveidots kods.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-pasts" }, - "emailDesc": { - "message": "Apstiprinājuma kodi tiks nosÅĢtÄĢti e-pastā." + "emailDescV2": { + "message": "Jāievada e-pastā nosÅĢtÄĢtais kods." }, "selfHostedEnvironment": { "message": "PaÅĄuzturēta vide" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "NorādÄĢt paÅĄuzstādÄĢta Bitwarden pamata URL." }, + "selfHostedBaseUrlHint": { + "message": "Jānorāda sava paÅĄizvietotā Bitward servera pamata URL. Piemērs: https://bitwarden.uznemums.lv" + }, + "selfHostedCustomEnvHeader": { + "message": "Papildu konfigurācijā ir iespējams norādÄĢt URL katram pakalpojumam atseviÅĄÄˇi." + }, + "selfHostedEnvFormInvalid": { + "message": "Jāpievieno vai no servera pamata URL vai vismaz viena pielāgota vide." + }, "customEnvironment": { "message": "Pielāgota vide" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Servera URL" }, + "selfHostBaseUrl": { + "message": "PaÅĄmitināta servera URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API servera URL" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "Vides URL ir saglabāti." }, + "showAutoFillMenuOnFormFields": { + "message": "RādÄĢt automātiskās aizpildes izvēlni veidlapu laukos", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Automātiskās aizpildes ieteikumi" + }, + "showInlineMenuLabel": { + "message": "RādÄĢt automātiskās aizpildes ieteikumuis veidlapu laukos" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Attēlot identitātes kā ieteikumus" + }, + "showInlineMenuCardsLabel": { + "message": "Attēlot kartes kā ieteikumus" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Attēlot ieteikumus, kad tiek atlasÄĢta ikona" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Attiecas uz visiem kontiem, kuri ir pieteikuÅĄies." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Jāizslēdz sava pārlÅĢka iebÅĢvētā paroÄŧu pārvaldnieka iestatÄĢjumi, lai izvairÄĢtos no nesaderÄĢbām." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "MainÄĢt pārlÅĢka iestatÄĢjumus." + }, + "autofillOverlayVisibilityOff": { + "message": "Izslēgts", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Kad lauks ir atlasÄĢts (atlasot)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Kad tiek atlasÄĢta automātiskās aizpildes ikona", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Automātiski aizpildÄĢt lapas ielādes brÄĢdÄĢ" + }, "enableAutoFillOnPageLoad": { - "message": "Iespējot aizpildÄĢÅĄanu lapas ielādes brÄĢdÄĢ" + "message": "Automātiski aizpildÄĢt lapas ielādes brÄĢdÄĢ" }, "enableAutoFillOnPageLoadDesc": { "message": "Ja tiek noteikta pieteikÅĄanās veidne, tā tiks aizpildÄĢta lapas ielādes brÄĢdÄĢ." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$BrÄĢdinājums:$CLOSETAG$ pārveidotās vai neuzticamās tÄĢmekÄŧvietnēs automātiskā aizpilde lapas ielādes laikā var tikt ÄŧaunprātÄĢgi izmantota.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Pārveidotās vai neuzticamās vietnēs automātiskā aizpildÄĢÅĄana lapas ielādes laikā var tikt ÄŧaunprātÄĢgi izmantota." + "message": "Pārveidotās vai neuzticamās tÄĢmekÄŧvietnēs automātiskā aizpilde lapas ielādes laikā var tikt ÄŧaunprātÄĢgi izmantota." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Uzzināt vairāk par iespējamām bÄĢstamÄĢbām" }, "learnMoreAboutAutofill": { - "message": "Uzzināt vairāk par automātisko aizpildÄĢÅĄanu" + "message": "Uzzināt vairāk par automātisko aizpildi" }, "defaultAutoFillOnPageLoad": { "message": "Noklusējuma automātiskās aizpildes iestatÄĢjums pieteikÅĄanās vienumiem" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Atvērt glabātavu sānu joslā" }, - "commandAutofillDesc": { - "message": "Automātiski aizpildÄĢt ar iepriekÅĄ izmantoto pieteikÅĄanās vienumu paÅĄreizējā tÄĢmekÄŧa vietnē" + "commandAutofillLoginDesc": { + "message": "Automātiski aizpildÄĢt ar iepriekÅĄ izmantoto pieteikÅĄanās vienumu paÅĄreizējā tÄĢmekÄŧvietnē" + }, + "commandAutofillCardDesc": { + "message": "Automātiski aizpildÄĢt ar iepriekÅĄ izmantoto karti paÅĄreizējā tÄĢmekÄŧvietnē" + }, + "commandAutofillIdentityDesc": { + "message": "Automātiski aizpildÄĢt ar iepriekÅĄ izmantoto identitāti paÅĄreizējā tÄĢmekÄŧvietnē" }, "commandGeneratePasswordDesc": { "message": "Izveidot jaunu nejauÅĄu paroli un ievietot to starpliktuvē" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Aizslēgt glabātavu" }, - "privateModeWarning": { - "message": "Personiskā stāvokÄŧa atbalsts ir izmēĪinājuma, un daÅžas iespējas ir ierobeÅžotas." - }, "customFields": { "message": "Pielāgoti lauki" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Patiesuma vērtÄĢba" }, + "cfTypeCheckbox": { + "message": "Izvēles rÅĢtiņa" + }, "cfTypeLinked": { "message": "SaistÄĢts", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1065,11 +1606,14 @@ "message": "Å is pārlÅĢks nevar apstrādāt U2F pieprasÄĢjumus ÅĄajā uznirstoÅĄajā logā. Vai atvērt to atseviÅĄÄˇÄ logā, lai varētu pieteikties, izmantojot U2F?" }, "enableFavicon": { - "message": "RādÄĢt vietņu ikonas" + "message": "RādÄĢt tÄĢmekÄŧvietņu ikonas" }, "faviconDesc": { "message": "Attēlot atpazÄĢstamu attēlu pie katra pieteikÅĄanās vienuma." }, + "faviconDescAlt": { + "message": "ParādÄĢt atpazÄĢstamu attēlu pie katra pieteikÅĄanās vienuma. Attiecas uz visiem kontiem, kuros ir notikusi pieteikÅĄanās." + }, "enableBadgeCounter": { "message": "RādÄĢt skaita nozÄĢmÄĢti" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitāte" }, + "typeSshKey": { + "message": "SSH atslēga" + }, + "newItemHeader": { + "message": "Jauns/a $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Labot $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "ApskatÄĢt $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "ParoÄŧu vēsture" }, + "generatorHistory": { + "message": "Veidotāja vēsture" + }, + "clearGeneratorHistoryTitle": { + "message": "IztÄĢrÄĢt veidotāja vēsturi" + }, + "cleargGeneratorHistoryDescription": { + "message": "Turpinot visi veidotāja vēstures ieraksti tiks neatgrieziniski izdzēsti. Vai tieÅĄÄm turpināt?" + }, "back": { "message": "AtpakaÄŧ" }, "collections": { "message": "Krājumi" }, + "nCollections": { + "message": "$COUNT$ krājumi", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Izlase" }, @@ -1282,6 +1874,10 @@ "message": "Pamata domēns", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Pamata domēns (ieteicams)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domēna vārds", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "AtbilstÄĢbas noteikÅĄana", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Noklusētā atbilstÄĢbas noteikÅĄana", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Pārslēgt iespējas" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Nav paroÄŧu, ko parādÄĢt." }, + "clearHistory": { + "message": "NotÄĢrÄĢt vēsturi" + }, + "nothingToShow": { + "message": "Nav nekā, ko parādÄĢt" + }, + "nothingGeneratedRecently": { + "message": "Pēdējā laikā nav nekas izveidots" + }, "remove": { "message": "Noņemt" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Atslēgt ar PIN" }, + "setYourPinTitle": { + "message": "IestatÄĢt PIN" + }, + "setYourPinButton": { + "message": "IestatÄĢt PIN" + }, "setYourPinCode": { "message": "IestatÄĢt PIN kodu Bitwarden atslēgÅĄanai. PIN iestatÄĢjumi tiks atiestatÄĢti pēc pilnÄĢgas izrakstÄĢÅĄanās no lietotnes." }, + "setYourPinCode1": { + "message": "PIN bÅĢs izmantojams galvenās paroles vietā, lai atslēgtu Bitwarden. PIN tiks atiestatÄĢts, ja kādreiz notiks pilnÄĢga izrakstÄĢÅĄanās no Bitwarden." + }, "pinRequired": { "message": "Ir nepiecieÅĄams PIN kods." }, "invalidPin": { "message": "NederÄĢgs PIN kods." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Pārāk daudz nederÄĢgu PIN ievadÄĢÅĄanas mēĪinājumu. Atsakās." + }, "unlockWithBiometrics": { "message": "Atslēgt ar biometriju" }, + "unlockWithMasterPassword": { + "message": "Atslēgt ar galveno paroli" + }, "awaitDesktop": { "message": "Tiek gaidÄĢts apstiprinājums no darbvirsmas" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Aizslēgt ar galveno paroli pēc pārlÅĢka atsāknÄ“ÅĄanas" }, + "lockWithMasterPassOnRestart1": { + "message": "PieprasÄĢt galveno paroli pēc pārlÅĢka pārsāknÄ“ÅĄanas" + }, "selectOneCollection": { "message": "Ir jāizvēlas vismaz viens krājums." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Viens vai vairāki apvienÄĢbas nosacÄĢjumi ietekmē veidotāja iestatÄĢjumus." }, + "passwordGenerator": { + "message": "ParoÄŧu veidotājs" + }, + "usernameGenerator": { + "message": "Lietotājvārdu veidotājs" + }, + "useThisPassword": { + "message": "Izmantot ÅĄo paroli" + }, + "useThisUsername": { + "message": "Izmantot ÅĄo lietotājvārdu" + }, + "securePasswordGenerated": { + "message": "DroÅĄa parole izveidota. Neaizmirsti arÄĢ atjaunināt savu paroli tÄĢmekÄŧvietnē!" + }, + "useGeneratorHelpTextPartOne": { + "message": "Veidotājs ir izmantojams", + "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": ", lai izveidotu spēcÄĢgu un vienreizēju paroli", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Glabātavas noildzes darbÄĢba" }, + "vaultTimeoutAction1": { + "message": "Noildzes darbÄĢba" + }, "lock": { "message": "Slēgt", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Atkritne", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Vienums atjaunots" }, + "alreadyHaveAccount": { + "message": "Jau ir konts?" + }, "vaultTimeoutLogOutConfirmation": { "message": "AtteikÅĄanās noņems piekÄŧuvi glabātavai un pieprasÄĢs tieÅĄsaistes pieteikÅĄanos pēc noildzes laika. Vai tieÅĄÄm izmantot ÅĄo iestatÄĢjumu?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Automātiski aizpildÄĢt un saglabāt" }, + "fillAndSave": { + "message": "AizpildÄĢt un saglabāt" + }, "autoFillSuccessAndSavedUri": { "message": "Automātiski aizpildÄĢts vienums un saglabāts URI" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Jaunā galvenā parole neatbilst nosacÄĢjumu prasÄĢbām." }, + "receiveMarketingEmailsV2": { + "message": "IegÅĢt savā iesÅĢtnē padomus, paziņojumus un izpētes iespējas no Bitwarden." + }, + "unsubscribe": { + "message": "Atteikt abonÄ“ÅĄanu" + }, + "atAnyTime": { + "message": "jebkurā laikā." + }, + "byContinuingYouAgreeToThe": { + "message": "Turpinot tiek sniegta piekriÅĄana" + }, + "and": { + "message": "un" + }, "acceptPolicies": { "message": "Ar ÅĄÄĢs rÅĢtiņas atzÄĢmÄ“ÅĄanu tiek piekrists sekojoÅĄajam:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Labi" }, + "errorRefreshingAccessToken": { + "message": "PiekÄŧuves pilnvaras atsvaizinÄÅĄanas kÄŧÅĢda" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Netika atrastas atsvaidzinÄÅĄanas pilnvaras vai API atslēgas. LÅĢgums mēĪināt izrakstÄĢties un atkal pieteikties." + }, "desktopSyncVerificationTitle": { "message": "Darbvirsmas sinhronizācijas apstiprinājums" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Konta nesaderÄĢba" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometriskās atslēgas neatbilstÄĢba" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometriskā atslēgÅĄana neizdevās. Biometriskā slepenā atslēgai neizdevās atslēgt glabātavu. LÅĢgums vēlreiz mēĪināt iestatÄĢt biometriju." + }, "biometricsNotEnabledTitle": { "message": "Biometrija nav iespējota" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Å ajā ierÄĢcē netiek atbalstÄĢta pārlÅĢka biometrija." }, + "biometricsNotUnlockedTitle": { + "message": "Lietotājs aizslēgts vai izrakstÄĢjies" + }, + "biometricsNotUnlockedDesc": { + "message": "LÅĢgums atslēgt ÅĄo lietotāju darbvirsmas lietotnē un mēĪināt vēlreiz." + }, + "biometricsNotAvailableTitle": { + "message": "AtslēgÅĄana ar biometriju nav pieejama" + }, + "biometricsNotAvailableDesc": { + "message": "AtslēgÅĄana ar biometriju paÅĄlaik nav pieejama. LÅĢgums vēlāk mēĪināt vēlreiz." + }, "biometricsFailedTitle": { "message": "Biometrija neizdevās" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ApvienÄĢbas nosacÄĢjumi ietekmē Tavas ÄĢpaÅĄumtiesÄĢbu iespējas." }, + "personalOwnershipPolicyInEffectImports": { + "message": "ApvienÄĢbas nosacÄĢjums neÄŧauj ievietot ārējos vienumus savā personÄĢgajā glabātavā." + }, + "domainsTitle": { + "message": "Domēna vārdi", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Izņēmuma domēni" }, "excludedDomainsDesc": { "message": "Bitwarden nevaicās saglabāt pieteikÅĄanās datus ÅĄiem domēniem. Ir jāpārlādē lapa, lai izmaiņas iedarbotos." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden nevaicās saglabāt pieteikÅĄanās datus visiem ÅĄÄĢ domēna kontiem, kuri ir pieteikuÅĄies. Ir jāpārlādē lapa, lai iedarbotos izmaiņas." + }, + "websiteItemLabel": { + "message": "TÄĢmekÄŧvietne $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nav derÄĢgs domēns", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Saglabātas vērā neņemto domēna vārdu izmaiņas" + }, + "limitSendViews": { + "message": "IerobeÅžot skatÄĢjumus" + }, + "limitSendViewsHint": { + "message": "Neviens nevar apskatÄĢt ÅĄo Send pēc tam, kad ir sasniegts ierobeÅžojums.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "AtlikuÅĄi $ACCESSCOUNT$ skatÄĢjumi", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Informācija par Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Meklēt Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Teksts" }, + "sendTypeTextToShare": { + "message": "KopÄĢgojamais teksts" + }, "sendTypeFile": { "message": "Datne" }, @@ -1666,6 +2406,9 @@ "message": "Visi Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Pēc noklusējuma paslēpt tekstu" + }, "maxAccessCountReached": { "message": "Sasniegts lielākais pieÄŧaujamais piekÄŧuves reiÅžu skaits", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Aizsargāts ar paroli" }, + "copyLink": { + "message": "Ievietot saiti starpliktuvē" + }, "copySendLink": { "message": "Ievietot Send saiti starpliktuvē", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Vai tieÅĄÄm izdzēst ÅĄo Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Vai tieÅĄÄm neatgriezeniski izdzēst ÅĄo Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Labot Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send tiks neatgriezeniski izdzēsts norādÄĢtajā datumā un laikā.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send ÅĄajā datumā tiks neatgriezeniski izdzēsts.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "DerÄĢguma beigu datums" }, @@ -1769,6 +2523,10 @@ "message": "Pēc izvēles pieprasÄĢt paroli, lai lietotāji varētu piekÄŧÅĢt ÅĄim Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Pēc izvēles var pievienot paroli, lai saņēmēji varētu piekÄŧÅĢt ÅĄim Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "PersonÄĢgas piezÄĢmes par ÅĄo Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send izveidots", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send tika veiksmÄĢgi izveidots.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send bÅĢs pieejams nākamo stundu ikvienam, kuram ir saite.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Send bÅĢs pieejams nākamās $HOURS$ stundas ikvienam, kuram ir saite.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send bÅĢs pieejams nākamo dienu ikvienam, kuram ir saite.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Send bÅĢs pieejams nākamās $DAYS$ dienas ikvienam, kuram ir saite.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send saite ievietota starpliktuvē", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saglabāts", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Atvērt paplaÅĄinājumu atseviÅĄÄˇi?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Lai izveidotu datņu Send, nepiecieÅĄams atvērt paplaÅĄinājumu atseviÅĄÄˇÄ logā.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Lai izvēlētos datni, paplaÅĄinājums ir jāatver sānjoslā (ja iespējams) vai atseviÅĄÄˇÄ logā, klikÅĄÄˇinot uz ÅĄÄĢ paziņojuma." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Lai izvēlētos datni, ja tiek izmantots Safari, paplaÅĄinājums ir jāatver jaunā logā, klikÅĄÄˇinot uz ÅĄÄĢ paziņojuma." }, + "popOut": { + "message": "Atvērt atseviÅĄÄˇi" + }, "sendFileCalloutHeader": { "message": "Pirms sākÅĄanas" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Slēpt e-pasta adresi no saņēmējiem." }, + "hideYourEmail": { + "message": "Paslēpt e-pasta adresi no apskatÄĢtājiem." + }, "sendOptionsPolicyInEffect": { "message": "Viens vai vairāki apvienÄĢbas nosacÄĢjumi ietekmē Send iespējas." }, @@ -1866,11 +2674,14 @@ "message": "Galvenās paroles apstiprinÄÅĄana" }, "passwordConfirmationDesc": { - "message": "Å ÄĢ darbÄĢba ir aizsargāta. Lai turpinātu, ir jāievada galvenā parole, lai apstiprinātu identitāti." + "message": "Å ÄĢ darbÄĢba ir aizsargāta. Lai turpinātu, ir jāievada galvenā parole, lai apliecinātu savu identitāti." }, "emailVerificationRequired": { "message": "NepiecieÅĄama e-pasta adreses apstiprinÄÅĄana" }, + "emailVerifiedV2": { + "message": "E-pasta adrese ir apliecināta" + }, "emailVerificationRequiredDesc": { "message": "Ir nepiecieÅĄams apstiprināt e-pasta adresi, lai bÅĢtu iespējams izmantot ÅĄo iespēju. To var izdarÄĢt tÄĢmekÄŧa glabātavā." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Galvenā parole neatbilst vienam vai vairākiem apvienÄĢbas nosacÄĢjumiem. Ir jāatjaunina galvenā parole, lai varētu piekÄŧÅĢt glabātavai. Turpinot notiks atteikÅĄanās no paÅĄreizējās sesijas, un bÅĢs nepiecieÅĄams pieteikties no jauna. Citās ierÄĢcēs esoÅĄÄs sesijas var turpināt darboties lÄĢdz vienai stundai." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Tava apvienÄĢba ir atspējojusi uzticamo ierÄĢču ÅĄifrÄ“ÅĄanu. LÅĢgums iestatÄĢt galveno paroli, lai piekÄŧÅĢtu savai glabātavai." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automātiska ievietoÅĄana sarakstā" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Izvēlēties mapi..." }, - "ssoCompleteRegistration": { - "message": "Lai pabeigtu vienotās pieteikÅĄanās uzstādÄĢÅĄanu, ir jānorāda galvenā parole, lai piekÄŧÅĢtu glabātavai un aizsargātu to." + "noFoldersFound": { + "message": "Nav atrasta neviena mape", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "ApvienÄĢbas atÄŧaujas tika atjauninātas, un tās pieprasa iestatÄĢt galveno paroli.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "ApvienÄĢba pieprasa iestatÄĢt galveno paroli.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "no $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "NepiecieÅĄams apliecinājums", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Stundas" @@ -1904,6 +2740,9 @@ "minutes": { "message": "MinÅĢtes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Noildzes iespējām tika piemērotas uzņēmējdarbÄĢbas nosacÄĢjumu prasÄĢbas" + }, "vaultTimeoutPolicyInEffect": { "message": "ApvienÄĢbas nosacÄĢjumi ietekmē glabātavas noildzi. Lielākā atÄŧautā glabātavas noildze ir $HOURS$ stunda(s) un $MINUTES$ minÅĢte(s)", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Ne vairāk kā $HOURS$ stunda(s) un $MINUTES$ minÅĢte(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Noildze pārsniedz apvienÄĢbas iestatÄĢto ierobeÅžojumu: ne vairāk kā $HOURS$ stunda(s) un $MINUTES$ minÅĢte(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "ApvienÄĢbas nosacÄĢjumi ietekmē glabātavas noildzi. Lielākā atÄŧautā glabātavas noildze ir $HOURS$ stunda(s) un $MINUTES$ minÅĢte(s). Kā glabātavas noildzes darbÄĢba ir uzstādÄĢta $ACTION$.", "placeholders": { @@ -1989,7 +2854,7 @@ "message": "Sesijai iestājās noildze. LÅĢgums mēĪināt pieteikties vēlreiz." }, "exportingPersonalVaultTitle": { - "message": "Izdod personÄĢgo glabātavu" + "message": "IzgÅĢst personÄĢgo glabātavu" }, "exportingIndividualVaultDescription": { "message": "Tiks izgÅĢti tikai atseviÅĄÄˇi glabātavas vienumi, kas ir saistÄĢti ar $EMAIL$. ApvienÄĢbas glabātavas vienumi netiks iekÄŧauti. Tiks izgÅĢta tikai glabātavas vienumu informācija, un saistÄĢtie pielikumi netiks iekÄŧauti.", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "IzgÅĢst apvienÄĢbas glabātavu" + }, + "exportingOrganizationVaultDesc": { + "message": "Tiks izgÅĢta tikai apvienÄĢbas glabātava, kas ir saistÄĢta ar $ORGANIZATION$. AtseviÅĄÄˇu glabātavu vai citu apvienÄĢbu vienumi netiks iekÄŧauti.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "KÄŧÅĢda" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Izveidot lietotājvārdu" }, + "generateEmail": { + "message": "Izveidot e-pasta adresi" + }, + "generatorBoundariesHint": { + "message": "VērtÄĢbai jābÅĢt starp $MIN$ un $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Lietotājvārda veids" }, @@ -2032,7 +2926,7 @@ "message": "NejauÅĄs vārds" }, "websiteName": { - "message": "TÄĢmekÄŧa vietnes nosaukums" + "message": "TÄĢmekÄŧvietnes nosaukums" }, "whatWouldYouLikeToGenerate": { "message": "Ko ir nepiecieÅĄams izveidot?" @@ -2047,7 +2941,117 @@ "message": "PārvirzÄĢto e-pastu aizstājvārds" }, "forwardedEmailDesc": { - "message": "Izveidot e-pastu aizstājvārdu ar ārēju pārvirzÄĢÅĄanas pakalpojumu." + "message": "Izveidot e-pasta aizstājadresi ar ārēju pārvirzÄĢÅĄanas pakalpojumu." + }, + "forwarderDomainName": { + "message": "E-pasta domēns", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Jāizvēlas domēns, kuru atbalsta atlasÄĢtais pakalpojums", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ kÄŧÅĢda: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Izveidoja Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "TÄĢmekÄŧvietne: $WEBSITE$. Izveidoja Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "NederÄĢga $SERVICENAME$ API pilnvara", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "NederÄĢga $SERVICENAME$ API pilnvara: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Neizdevās iegÅĢt $SERVICENAME$ aizsegta e-pasta konta Id.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "NederÄĢgs $SERVICENAME$ domēna vārds.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "NederÄĢgs $SERVICENAME$ URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "AtgadÄĢjās nezināma $SERVICENAME$ kÄŧÅĢda.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Nezināms pārsÅĢtÄĢtājs: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } }, "hostname": { "message": "Resursdatora nosaukums", @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Tavas apvienÄĢbas nosacÄĢjumos ir ieslēgta automātiskā aizpildÄĢÅĄana lapas ielādes brÄĢdÄĢ." + "message": "Tavas apvienÄĢbas nosacÄĢjumos ir ieslēgta automātiskā aizpilde lapas ielādes brÄĢdÄĢ." }, "howToAutofill": { "message": "Kā automātiski aizpildÄĢt" }, "autofillSelectInfoWithCommand": { - "message": "Jāatlasa vienums ÅĄai lapai vai jāizmanto ÄĢsceÄŧÅĄ: $COMMAND$", + "message": "Jāizvēlas ÅĄÄĢ skata vienums, jāizmanto ÄĢsceÄŧÅĄ $COMMAND$ vai iestatÄĢjumos jāizpēta citas iespējas.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Jāatlasa vienums ÅĄai lapai vai iestatÄĢjumos jāuzstāda ÄĢsceÄŧÅĄ." + "message": "Jāizvēlas ÅĄÄĢ skata vienums vai iestatÄĢjumos jāizpēta citas iespējas." }, "gotIt": { "message": "Sapratu" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Automātiskās aizpildes iestatÄĢjumi" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Automātiskās aizpildes ÄĢsinājumtaustiņi" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "MainÄĢt ÄĢsinājumtaustiņus" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "PārvaldÄĢt saÄĢsnes" + }, "autofillShortcut": { "message": "Automātiskās aizpildes ÄĢsinājumtaustiņi" }, - "autofillShortcutNotSet": { - "message": "Automātiskās aizpildes ÄĢsceÄŧÅĄ nav uzstādÄĢts. To var izdarÄĢt pārlÅĢka iestatÄĢjumos." + "autofillLoginShortcutNotSet": { + "message": "Automātiskās aizpildes ÄĢsceÄŧÅĄ pieteikÅĄanās vienumiem nav uzstādÄĢts. To var izdarÄĢt pārlÅĢka iestatÄĢjumos." }, - "autofillShortcutText": { - "message": "Automātiskās aizpildes ÄĢsceÄŧÅĄ ir: $COMMAND$. To var mainÄĢt pārlÅĢka iestatÄĢjumos.", + "autofillLoginShortcutText": { + "message": "Automātiskās aizpildes ÄĢsceÄŧÅĄ pieteikÅĄanās vienumiem ir: $COMMAND$. Visus ÄĢsinājumtaustiņus var pārvaldÄĢt pārlÅĢka iestatÄĢjumos.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Piesakās" - }, "opensInANewWindow": { "message": "Atver jaunā logā" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Ir nepiecieÅĄams apvienÄĢbas SSO identifikators." }, + "creatingAccountOn": { + "message": "Tiek veidots konts" + }, + "checkYourEmail": { + "message": "Jāpārbauda e-pasts" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Jāatver saite, kas tika nosÅĢtÄĢta uz e-pasta adresi" + }, + "andContinueCreatingYourAccount": { + "message": "un jāturpina sava konta izveide." + }, + "noEmail": { + "message": "Nav e-pasta?" + }, + "goBack": { + "message": "Atgriezties" + }, + "toEditYourEmailAddress": { + "message": ", lai labotu savu e-pasta adresi." + }, "eu": { "message": "ES", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "PiekÄŧuve liegta. Nav nepiecieÅĄamo atÄŧauju, lai skatÄĢtu ÅĄo lapu." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "IerÄĢce ir uzticama" }, + "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." + }, + "sendsNoItemsMessage": { + "message": "Send ir izmantojams, lai ar ikvienu droÅĄi kopÄĢgotu ÅĄifrētu informāciju.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Jāievada vērtÄĢba." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 laukam jāpievērÅĄ uzmanÄĢba." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ laukiem ir jāpievērÅĄ uzmanÄĢba.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- AtlasÄĢt --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Pārslēgt sakÄŧauÅĄanu", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Ievietot datus Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Aizsargāt LastPass datus un ievietot tos Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Saglabāt kā neÅĄifrētu datni", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Ievietot Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Ievieto...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Dati veiksmÄĢgi ievietoti.", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "KÄŧÅĢda ievietoÅĄanā. Jāpārbauda konsole, lai iegÅĢtu vairāk informācijas.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "IevietoÅĄanas laikā atgadÄĢjās tÄĢkla kÄŧÅĢda.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Aizstājdomēns" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Vienumus ar galvenās paroles pārvaicÄÅĄanu nevar automātiski aizpildÄĢt lapas ielādes brÄĢdÄĢ. Automātiskā aizpilde lapas ielādes brÄĢdÄĢ ir izslēgta.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Automātiskā aizpilde lapas ielādes brÄĢdÄĢ iestatÄĢta izmantot noklusējuma iestatÄĢjumu.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Jāizslēdz galvenās paroles pārvaicÄÅĄana, lai labotu ÅĄo lauku", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Pārslēgt sānu pārvietoÅĄanās joslu" + }, + "skipToContent": { + "message": "Pāriet uz saturu" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden automātiskās aizpildes izvēlnes poga", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Pārslēgt Bitwarden automātiskās aizpildes izvēlni", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden automātiskās aizpildes izvēlne", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Jāatslēdz savs konts, lai apskatÄĢtu atbilstoÅĄos pieteikÅĄanās vienumus", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Jāatslēdz savs konts, lai apskatÄĢtu automātiskās aizpildes ieteikumus", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Atslēgt kontu", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Atslēgt savu kontu, tiks atvērts jaunā logā", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "AizpildÄĢt pieteikÅĄanās datus", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "DaÄŧējs lietotājvārds", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Nav vienumu, ko parādÄĢt", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Jauns vienums", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Pievienot jaunu glabātavas vienumu", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Jauns pieteikÅĄanās vienums", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Pievienot jaunu glabātavas pieteikÅĄanās vienumu, tiks atvērts jaunā logā", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Jauna karte", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Pievienot jaunu glabātavas kartes vienumu, tiks atvērts jaunā logā", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Jauna identitāte", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Pievienot jaunu glabātavas identitātes vienumu, tiks atvērts jaunā logā", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Ir pieejama Bitwarden automātiskās aizpildes izvēlne. JānospieÅž poga ar bultu uz leju, lai atlasÄĢtu.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Ieslēgt" + }, + "ignore": { + "message": "Neņemt vērā" + }, + "importData": { + "message": "Ievietot datus", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "IevietoÅĄanas kÄŧÅĢda" + }, + "importErrorDesc": { + "message": "Ir nepilnÄĢbas ievietojamajos datos. LÅĢgums novērst zemāk uzskaitÄĢtās kÄŧÅĢdas avota datnē un mēĪināt vēlreiz." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Jāatrisina zemāk norādÄĢtās kÄŧÅĢdas un jāmēĪina vēlreiz." + }, + "description": { + "message": "Apraksts" + }, + "importSuccess": { + "message": "Dati veiksmÄĢgi ievietoti" + }, + "importSuccessNumberOfItems": { + "message": "Kopumā tika ievietoti $AMOUNT$ vienumi.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "JāmēĪina vēlreiz" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Å ai darbÄĢbai ir nepiecieÅĄama apliecinÄÅĄana. Jāiestata PIN, lai turpinātu." + }, + "setPin": { + "message": "IestatÄĢt PIN" + }, + "verifyWithBiometrics": { + "message": "Apliecināt ar biometriju" + }, + "awaitingConfirmation": { + "message": "Gaida apstiprinājumu" + }, + "couldNotCompleteBiometrics": { + "message": "Nevarēja pabeigt biometriju." + }, + "needADifferentMethod": { + "message": "NepiecieÅĄams cits veids?" + }, + "useMasterPassword": { + "message": "Izmantot galveno paroli" + }, + "usePin": { + "message": "Izmantot PIN" + }, + "useBiometrics": { + "message": "Izmantot biometriju" + }, + "enterVerificationCodeSentToEmail": { + "message": "Jāievada apliecinājuma kods, kas tika nosÅĢtÄĢts e-pastā." + }, + "resendCode": { + "message": "Atkārtoti nosÅĢtÄĢt kodu" + }, + "total": { + "message": "Kopā" + }, + "importWarning": { + "message": "Tiek ievietoti dati apvienÄĢbā $ORGANIZATION$. Tie var tikt kopÄĢgoti ar citiem apvienÄĢbas dalÄĢbniekiem. Vai turpināt?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "KÄŧÅĢda savienojuma izveidoÅĄanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikÅĄanās veids vai jāvērÅĄas pie Duo pēc palÄĢdzÄĢbas." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "JāpalaiÅž DUO un jāseko soÄŧiem, lai pabeigtu pieteikÅĄanos." + }, + "duoRequiredForAccount": { + "message": "Kontam ir nepiecieÅĄama Duo divpakāpju pieteikÅĄanās." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Jāatver paplaÅĄinājums atseviÅĄÄˇÄ logā, lai pabeigtu pieteikÅĄanos." + }, + "popoutExtension": { + "message": "Atvērt paplaÅĄinājumu atseviÅĄÄˇi" + }, + "launchDuo": { + "message": "Palaist DUO" + }, + "importFormatError": { + "message": "Dati nav pareizi formatēti. LÅĢgums pārbaudÄĢt ievietoÅĄanas datni un mēĪināt vēlreiz." + }, + "importNothingError": { + "message": "Nekas netika ievietots." + }, + "importEncKeyError": { + "message": "KÄŧÅĢda izguves datnes atÅĄifrÄ“ÅĄanā. Izmantotā atslēga neatbilst tai, kas tika izmantota satura izgÅĢÅĄanai." + }, + "invalidFilePassword": { + "message": "NederÄĢga datnes parole, lÅĢgums izmantot to paroli, kas tika ievadÄĢta izgÅĢÅĄanas datnes izveidoÅĄanas brÄĢdÄĢ." + }, + "destination": { + "message": "Galamērġis" + }, + "learnAboutImportOptions": { + "message": "Uzzināt par ievietoÅĄanas iespējām" + }, + "selectImportFolder": { + "message": "AtlasÄĢt mapi" + }, + "selectImportCollection": { + "message": "AtlasÄĢt krājumu" + }, + "importTargetHint": { + "message": "Å ÄĢ iespēja jāatlasa, ja ir vēlÄ“ÅĄanās ievietotās datnes saturu pārvietot uz $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Datne satur nepieÅĄÄˇirtus vienumus." + }, + "selectFormat": { + "message": "AtlasÄĢt ievietoÅĄanas datnes veidolu" + }, + "selectImportFile": { + "message": "AtlasÄĢt ievietoÅĄanas datni" + }, + "chooseFile": { + "message": "Izvēlēties datni" + }, + "noFileChosen": { + "message": "Nav izvēlēta neviena datne" + }, + "orCopyPasteFileContents": { + "message": "vai ievietot starpliktuvē un ielÄĢmēt ievietoÅĄanas datnes saturu" + }, + "instructionsFor": { + "message": "NorādÄĢjumi $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Apstiprināt glabātavas satura ievietoÅĄanu" + }, + "confirmVaultImportDesc": { + "message": "Å ÄĢ datne ir aizsargāta ar paroli. LÅĢgums ievadÄĢt datnes paroli, lai ievietotu datus." + }, + "confirmFilePassword": { + "message": "Apstiprināt datnes paroli" + }, + "exportSuccess": { + "message": "Glabātavas saturs izgÅĢts" + }, + "typePasskey": { + "message": "PiekÄŧuves atslēga" + }, + "accessing": { + "message": "PiekÄŧÅĢst" + }, + "passkeyNotCopied": { + "message": "PiekÄŧuves atslēga netiks ievietota starpliktuvē" + }, + "passkeyNotCopiedAlert": { + "message": "PiekÄŧuves atslēga netiks ievietota klonētajā vienumā. Vai turpināt ÅĄÄĢ vienuma klonÄ“ÅĄanu?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Vietne, kurā tika uzsākta darbÄĢba, pieprasa pārbaudi. Å ÄĢ iespēja vēl nav ÄĢstenota kontiem, kuriem nav galvenās paroles." + }, + "logInWithPasskeyQuestion": { + "message": "Pieteikties ar piekÄŧuves atslēgu?" + }, + "passkeyAlreadyExists": { + "message": "Å ai lietotnei jau pastāv piekÄŧuves atslēga." + }, + "noPasskeysFoundForThisApplication": { + "message": "Å ai lietotnei netika atrastas piekÄŧuves atslēgas." + }, + "noMatchingPasskeyLogin": { + "message": "Nav ÅĄai vietnei atbilstoÅĄa pieteikÅĄanās vienuma." + }, + "noMatchingLoginsForSite": { + "message": "Å ai vietnei nav atbilstoÅĄu pieteikÅĄanās vietnumu" + }, + "searchSavePasskeyNewLogin": { + "message": "Meklēt vai saglabāt piekÄŧuves atslēgu kā jaunu pieteikÅĄanās vienumu" + }, + "confirm": { + "message": "Apstiprināt" + }, + "savePasskey": { + "message": "Saglabāt piekÄŧuves atslēgu" + }, + "savePasskeyNewLogin": { + "message": "Saglabāt piekÄŧuves atslēgu kā jaunu pieteikÅĄanās vienumu" + }, + "chooseCipherForPasskeySave": { + "message": "Jāizvēlas pieteikÅĄanās vienumu, kurā saglabāt ÅĄo piekÄŧuves atslēgu" + }, + "chooseCipherForPasskeyAuth": { + "message": "Izvēlēties piekÄŧuves atslēgu, ar kuru pieteikties" + }, + "passkeyItem": { + "message": "PiekÄŧuves atslēgas vienums" + }, + "overwritePasskey": { + "message": "PārrakstÄĢt piekÄŧuves atslēgu?" + }, + "overwritePasskeyAlert": { + "message": "Å is vienums jau satur piekÄŧuves atslēgu. Vai tieÅĄÄm pārrakstÄĢt paÅĄreizējo piekÄŧuves atslēgu?" + }, + "featureNotSupported": { + "message": "Iespēja vēl netiek nodroÅĄināta" + }, + "yourPasskeyIsLocked": { + "message": "NepiecieÅĄama apstiprinājums, lai izmantotu piekÄŧuves atslēgu. Jāapliecina sava identitāte, lai turpinātu." + }, + "multifactorAuthenticationCancelled": { + "message": "Daudzpakāpju pieteikÅĄanās atcelta" + }, + "noLastPassDataFound": { + "message": "Netika atrasti LastPass dati" + }, + "incorrectUsernameOrPassword": { + "message": "Nepareizs lietotājvārds vai parole" + }, + "incorrectPassword": { + "message": "Nepareiza parole" + }, + "incorrectCode": { + "message": "Nepareizs kods" + }, + "incorrectPin": { + "message": "Nepareizs PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Daudzpakāpju pieteikÅĄanās neizdevās" + }, + "includeSharedFolders": { + "message": "IekÄŧaut kopÄĢgotās mapes" + }, + "lastPassEmail": { + "message": "LastPass e-pasta adrese" + }, + "importingYourAccount": { + "message": "Ievieto kontu..." + }, + "lastPassMFARequired": { + "message": "NepiecieÅĄama LastPass daudzpakāpju pieteikÅĄanās" + }, + "lastPassMFADesc": { + "message": "Jāievada vienreizējais piekÄŧuves kods no autentificētāja lietotnes" + }, + "lastPassOOBDesc": { + "message": "Jāapstiprina pieteikÅĄanās pieprasÄĢjums autentificētāja lietotnē vai jāievada vienreizējs piekÄŧuves kods." + }, + "passcode": { + "message": "PiekÄŧuves kods" + }, + "lastPassMasterPassword": { + "message": "LastPass galvenā parole" + }, + "lastPassAuthRequired": { + "message": "NepiecieÅĄama pieteikÅĄanās LastPass" + }, + "awaitingSSO": { + "message": "Gaida vienoto pieteikÅĄanos" + }, + "awaitingSSODesc": { + "message": "LÅĢgums turpināt pieteikÅĄanos ar savas apvienÄĢbas pieteikÅĄanās datiem." + }, + "seeDetailedInstructions": { + "message": "Izvērstas norādes ir aplÅĢkojamas mÅĢsu palÄĢdzÄĢbas vietnē", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Ievietot tieÅĄi no LastPass" + }, + "importFromCSV": { + "message": "Ievietot no CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "JāmēĪina vēlreiz vai jālÅĢko pēc e-pasta no LastPass, lai apliecinātu sevi." + }, + "collection": { + "message": "Krājums" + }, + "lastPassYubikeyDesc": { + "message": "Jāievieto ar LastPass kontu sasaistÄĢtā YubiKey datora USB ligzdā, tad jāpieskaras tās pogai." + }, + "switchAccount": { + "message": "Pārslēgties starp kontiem" + }, + "switchAccounts": { + "message": "Pārslēgties starp kontiem" + }, + "switchToAccount": { + "message": "Pārslēgties uz kontu" + }, + "activeAccount": { + "message": "PaÅĄlaik izmantotais konts" + }, + "availableAccounts": { + "message": "Pieejamie konti" + }, + "accountLimitReached": { + "message": "Sasniegti konta ierobeÅžojumi. Jāizrakstās no konta, lai pievienotu citu." + }, + "active": { + "message": "izmantots" + }, + "locked": { + "message": "aizslēgts" + }, + "unlocked": { + "message": "atslēgta" + }, + "server": { + "message": "serveris" + }, + "hostedAt": { + "message": "izvietots" + }, + "useDeviceOrHardwareKey": { + "message": "Jāizmanto sava ierÄĢce vai aparatÅĢras atslēga" + }, + "justOnce": { + "message": "Tikai vienreiz" + }, + "alwaysForThisSite": { + "message": "Vienmēr ÅĄai vietnei" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ pievienots neiekÄŧautajiem domēniem.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "IzplatÄĢti veidoli", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Pāriet uz pārlÅĢka iestatÄĢjumiem?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Pāriet uz palÄĢdzÄĢbas centru?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Jāmaina sava pārlÅĢka automātiskās aizpildes un paroÄŧu pārvaldÄĢbas iestatÄĢjumi.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "PaplaÅĄinājuma ÄĢsinājumtaustiņus skatÄĢt un iestatÄĢt var pārlÅĢka iestatÄĢjumos.", + "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": "Jāmaina sava pārlÅĢka automātiskās aizpildes un paroÄŧu pārvaldÄĢbas iestatÄĢjumi.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "PaplaÅĄinājuma ÄĢsinājumtaustiņus skatÄĢt un iestatÄĢt var pārlÅĢka iestatÄĢjumos.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "PadarÄĢt Bitwarden par noklusējuma paroÄŧu pārvaldnieku?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Å ÄĢs iespējas neņemÅĄana vērā var radÄĢt nesaderÄĢbas starp Bitwarden automātiskās aizpildes izvēlni un pārlÅĢka.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "PadarÄĢt Bitwarden par noklusējuma paroÄŧu pārvaldnieku", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Nebija iespējams iestatÄĢt Bitwarden kā noklusējuma paroÄŧu pārvaldnieku", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Ir nepiecieÅĄams Bitwarden nodroÅĄināt pārlÅĢka privātuma atÄŧaujas, lai iestatÄĢtu to kā noklusējuma paroÄŧu pārvaldnieku.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "PadarÄĢt par noklusējumu", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "PiekÄŧuves informācija veiksmÄĢgi saglabāta.", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Parole saglabāta.", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "PiekÄŧuves informācija veiksmÄĢgi atjaunināta.", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Parole atjaunināta.", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "KÄŧÅĢda piekÄŧuves informācijas saglabÄÅĄanā. Jāpārbauda, vai konsolē ir izvērstāka informācija.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Izdevās" + }, + "removePasskey": { + "message": "Noņemt piekÄŧuves atslēgu" + }, + "passkeyRemoved": { + "message": "PiekÄŧuves atslēga noņemta" + }, + "autofillSuggestions": { + "message": "Ieteikumi automātiskajai aizpildei" + }, + "autofillSuggestionsTip": { + "message": "Saglabāt pieteikÅĄanās vienumi, ko automātiski aizpildÄĢt ÅĄajā vietnē" + }, + "yourVaultIsEmpty": { + "message": "Glabātava ir tukÅĄa" + }, + "noItemsMatchSearch": { + "message": "Neviens vienums neatbilst meklētajam" + }, + "clearFiltersOrTryAnother": { + "message": "JānotÄĢra atlases vērtÄĢbas vai jāmēĪina cits meklÄ“ÅĄanas vaicājums" + }, + "copyInfoTitle": { + "message": "Ievietot starpliktuvē informāciju - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Ievietot starpliktuvē piezÄĢmi - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Vairāk iespēju, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Vairāk iespēju - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "SkatÄĢt vienumu - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Automātiski aizpildÄĢt - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Nav vērtÄĢbu, ko ievietot starpliktuvē" + }, + "assignToCollections": { + "message": "PieÅĄÄˇirt krājumiem" + }, + "copyEmail": { + "message": "Ievietot starpliktuvē e-pasta adresi" + }, + "copyPhone": { + "message": "Ievietot starpliktuvē tālruņa numuru" + }, + "copyAddress": { + "message": "Ievietot starpliktuvē adresi" + }, + "adminConsole": { + "message": "pārvaldÄĢbas konsolē," + }, + "accountSecurity": { + "message": "Konta droÅĄÄĢba" + }, + "notifications": { + "message": "Paziņojumi" + }, + "appearance": { + "message": "Izskats" + }, + "errorAssigningTargetCollection": { + "message": "KÄŧÅĢda mērġa krājuma pieÅĄÄˇirÅĄanā." + }, + "errorAssigningTargetFolder": { + "message": "KÄŧÅĢda mērġa mapes pieÅĄÄˇirÅĄanā." + }, + "viewItemsIn": { + "message": "SkatÄĢt $NAME$ vienumus", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Atgriezties uz $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Jauns" + }, + "removeItem": { + "message": "Noņemt $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Vienumi bez mapes" + }, + "itemDetails": { + "message": "Vienuma dati" + }, + "itemName": { + "message": "Vienuma nosaukums" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Nevar noņemt krājumus ar tiesÄĢbām \"Tikai skatÄĢt\": $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "ApvienÄĢba ir atspējota" + }, + "owner": { + "message": "ÄĒpaÅĄnieks" + }, + "selfOwnershipLabel": { + "message": "Tu", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Atspējotu apvienÄĢbu vienumiem nevar piekÄŧÅĢt. Jāsazinās ar apvienÄĢbas ÄĢpaÅĄnieku, lai iegÅĢtu palÄĢdzÄĢbu." + }, + "additionalInformation": { + "message": "Papildu informācija" + }, + "itemHistory": { + "message": "Vienuma vēsture" + }, + "lastEdited": { + "message": "Pēdējo reizi labots" + }, + "ownerYou": { + "message": "ÄĒpaÅĄnieks: Tu" + }, + "linked": { + "message": "SaistÄĢts" + }, + "copySuccessful": { + "message": "IevietoÅĄana starpliktuvē veiksmÄĢga" + }, + "upload": { + "message": "AugÅĄupielādēt" + }, + "addAttachment": { + "message": "Pievienot pielikumu" + }, + "maxFileSizeSansPunctuation": { + "message": "Lielākais pieÄŧaujamais datnes izmērs ir 500 MB" + }, + "deleteAttachmentName": { + "message": "Izdzēst pielikumu $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Lejupielādēt $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Vai tieÅĄÄm neatgriezeniski izdzēst ÅĄo pielikumu?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Bezmaksas apvienÄĢbas nevar izmantot pielikumus" + }, + "filters": { + "message": "Atlases" + }, + "personalDetails": { + "message": "Personiskā informācija" + }, + "identification": { + "message": "Identifikācija" + }, + "contactInfo": { + "message": "Saziņas informācija" + }, + "downloadAttachment": { + "message": "Lejupielādēt $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "kartes numurs beidzas ar", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "PieteikÅĄanās dati" + }, + "authenticatorKey": { + "message": "Autentificētāja atslēga" + }, + "autofillOptions": { + "message": "Automātiskās aizpildes iespējas" + }, + "websiteUri": { + "message": "TÄĢmekÄŧvietne (URI)" + }, + "websiteUriCount": { + "message": "TÄĢmekÄŧvietne (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "TÄĢmekÄŧvietne pievienota" + }, + "addWebsite": { + "message": "Pievient tÄĢmekÄŧvietni" + }, + "deleteWebsite": { + "message": "Izdzēst tÄĢmekÄŧvietni" + }, + "defaultLabel": { + "message": "Noklusējums ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "RādÄĢt atbilstÄĢbas noteikÅĄanu $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Paslēpt atbilstÄĢbas noteikÅĄanu $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Automātiski aizpildÄĢt lapas ielādes brÄĢdÄĢ?" + }, + "cardExpiredTitle": { + "message": "Beidzies kartes derÄĢgums" + }, + "cardExpiredMessage": { + "message": "Ja atjaunoji to, jāatjaunina kartes informācija" + }, + "cardDetails": { + "message": "Kartes dati" + }, + "cardBrandDetails": { + "message": "$BRAND$ dati", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Iespējot animācijas" + }, + "showAnimations": { + "message": "RādÄĢt animācijas" + }, + "addAccount": { + "message": "Pievienot kontu" + }, + "loading": { + "message": "Ielādē" + }, + "data": { + "message": "Dati" + }, + "passkeys": { + "message": "PiekÄŧuves atslēgas", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Paroles", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Pieteikties ar piekÄŧuves atslēgu", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "PieÅĄÄˇirt" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Vienumu varēs redzēt tikai apvnienÄĢbas dalÄĢbnieki ar piekÄŧuvi ÅĄiem krājumiem." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Vienumus varēs redzēt tikai apvnienÄĢbas dalÄĢbnieki ar piekÄŧuvi ÅĄiem krājumiem." + }, + "bulkCollectionAssignmentWarning": { + "message": "Ir atlasÄĢti $TOTAL_COUNT$ vienumi. Nevar atjaunināt $READONLY_COUNT$ no vienumiem, jo trÅĢkst laboÅĄanas atÄŧaujas.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Pievienot lauku" + }, + "add": { + "message": "Pievienot" + }, + "fieldType": { + "message": "Lauka veids" + }, + "fieldLabel": { + "message": "Lauka iezÄĢme" + }, + "textHelpText": { + "message": "Teksta lauki ir izmantojami tādai informācijai kā droÅĄÄĢbas jautājumi" + }, + "hiddenHelpText": { + "message": "Paslēptie lauki ir izmantojami tādai slepenai informācijai kā parole" + }, + "checkBoxHelpText": { + "message": "Izvēles rÅĢtiņas ir izmantojamas, ja ir vajadzÄĢba automātiski aizpildÄĢt veidlapas izvēles rÅĢtiņu, piemēram, atcerēties e-pasta adresi" + }, + "linkedHelpText": { + "message": "SaistÄĢtais lauks ir izmantojams, kad noteiktā lapā tiek pieredzētas nepilnÄĢbas ar automātisko aizpildi." + }, + "linkedLabelHelpText": { + "message": "Jāievada lauka HTML id, name, aria-label vai placeholder vērtÄĢba." + }, + "editField": { + "message": "Labot lauku" + }, + "editFieldLabel": { + "message": "Labot $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Izdzēst $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ pievienots", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Pārkārtot $LABEL$. Jāizmanto bultas taustiÅ†ÅĄ, lai pārvietotu vienumu augÅĄup vai lejup.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ pārvietots augÅĄup, $INDEX$. no $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "AtlasÄĢt krājumus, lai pieÅĄÄˇirtu" + }, + "personalItemTransferWarningSingular": { + "message": "1 vienums tiks neatgriezeniski nodots atlasÄĢtajai apvienÄĢbai. Å is vienums Tev vairs nepiederēs." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ vienumi tiks neatgriezeniski nodoti atlasÄĢtajai apvienÄĢbai. Å ie vienumi Tev vairs nepiederēs.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 vienums tiks neatgriezeniski nodots $ORG$. Å is vienums Tev vairs nepiederēs.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ vienumi tiks neatgriezeniski nodoti $ORG$. Å ie vienumi Tev vairs nepiederēs.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Krājumi veiksmÄĢgi pieÅĄÄˇirti" + }, + "nothingSelected": { + "message": "Nekas nav atlasÄĢts." + }, + "movedItemsToOrg": { + "message": "AtzÄĢmētie vienumi pārvietoti uz $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Vienumi pārvietoti uz $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Vienums pārvietots uz $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ pārvietots lejup, $INDEX$. no $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Vienuma atraÅĄanās vieta" + }, + "fileSend": { + "message": "Datņu Send" + }, + "fileSends": { + "message": "Datņu Send" + }, + "textSend": { + "message": "Teksta Send" + }, + "textSends": { + "message": "Teksta Send" + }, + "bitwardenNewLook": { + "message": "Bitwarden ir jauns izskats." + }, + "bitwardenNewLookDesc": { + "message": "Veikt automātisko aizpildi un meklÄ“ÅĄanu glabātavas cilnē ir vienkārÅĄÄk un izprotamāk kā jebkad. Apskati izmaiņas!" + }, + "accountActions": { + "message": "Konta darbÄĢbas" + }, + "showNumberOfAutofillSuggestions": { + "message": "PaplaÅĄinājuma ikonā rādÄĢt pieteikÅĄanās automātiskās aizpildes ieteikumu skaitu" + }, + "systemDefault": { + "message": "Sistēmas noklusējums" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Å im iestatÄĢjumam tika piemērotas uzņēmējdarbÄĢbas nosacÄĢjumu prasÄĢbas" + }, + "sshPrivateKey": { + "message": "Privātā atslēga" + }, + "sshPublicKey": { + "message": "Publiskā atslēga" + }, + "sshFingerprint": { + "message": "Pirkstu nospiedums" + }, + "sshKeyAlgorithm": { + "message": "Atslēgas veids" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "MēĪināt vēlreiz" + }, + "vaultCustomTimeoutMinimum": { + "message": "Mazākā pieÄŧaujamā pielāgotā noildze ir 1 minÅĢte." + }, + "additionalContentAvailable": { + "message": "Ir pieejams papildu saturs" + }, + "fileSavedToDevice": { + "message": "Datne saglabāta ierÄĢcē. Tā ir atrodama ierÄĢces lejupielāŞu mapē." + }, + "showCharacterCount": { + "message": "RādÄĢt rakstzÄĢmju skaitu" + }, + "hideCharacterCount": { + "message": "Paslēpt rakstzÄĢmju skaitu" + }, + "itemsInTrash": { + "message": "Vienumi atkritnē" + }, + "noItemsInTrash": { + "message": "Atkritnē nav vienumu" + }, + "noItemsInTrashDesc": { + "message": "Izdzēstie vienumi parādÄĢsies ÅĄeit, un tie tiks neatgriezeniski izdzēsti pēc 30 dienām" + }, + "trashWarning": { + "message": "Vienumi, kas atkritnē atrodas vairāk nekā 30 dienas, tiks automatiski izdzēsti" + }, + "restore": { + "message": "Atjaunot" + }, + "deleteForever": { + "message": "Izdzēst pavisam" + }, + "noEditPermissions": { + "message": "Nav nepiecieÅĄamo atÄŧauju, lai labotu ÅĄo vienumu" + }, + "authenticating": { + "message": "Autentificē" + }, + "fillGeneratedPassword": { + "message": "AizpildÄĢt izveidoto paroli", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Parole pārizveidota", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Saglabāt pieteikÅĄanās vienumu Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Atstarpe", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "AtpakaÄŧpēdiņa", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Izsaukuma zÄĢme", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At zÄĢme", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Restes zÄĢme", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dolāra zÄĢme", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Procentu zÄĢme", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "JumtiÅ†ÅĄ", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Un zÄĢme", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisks", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Kreisā iekava", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Labā iekava", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "ApakÅĄsvÄĢtra", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Defise", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Pluss", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "VienādÄĢbas zÄĢme", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Kreisā figÅĢriekava", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Labā figÅĢriekava", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Kreisā kvadrātiekava", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Labā kvadrātiekava", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Stateniska svÄĢtra", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "AtpakaÄŧslÄĢpsvÄĢtra", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Kols", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semikols", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "DivkārÅĄÄs pēdiņas", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Vienpēdiņas", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Mazāks par", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Lielāks par", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Komats", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Punkts", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Jautājuma zÄĢme", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "SlÄĢpsvÄĢtra", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Mazie burti" + }, + "uppercaseAriaLabel": { + "message": "Lielie burti" + }, + "generatedPassword": { + "message": "Izveidotā parole" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 94e71f2d8f1..79fbf209846 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - ā´¸āĩ—ā´œā´¨āĩā´¯ ā´Ēā´žā´¸āĩā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´Žā´žā´¨āĩ‡ā´œāĩŧ ", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Žā´˛āĩā´˛ā´ž ā´‰ā´Ēā´•ā´°ā´Ŗā´™āĩā´™āĩžā´•āĩā´•āĩā´‚ ā´¸āĩā´°ā´•āĩā´ˇā´ŋā´¤ā´ĩāĩā´‚ ā´¸āĩ—ā´œā´¨āĩā´¯ā´ĩāĩā´Žā´žā´¯ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´Žā´žā´¨āĩ‡ā´œāĩŧ.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´¸āĩā´°ā´•āĩā´ˇā´ŋā´¤ ā´ĩā´žāĩžā´Ÿāĩā´Ÿā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Ēāĩā´°ā´ĩāĩ‡ā´ļā´ŋā´•āĩā´•ā´žāĩģ ā´˛āĩ‹ā´—ā´ŋāĩģ ⴚāĩ†ā´¯āĩā´¯āĩā´• ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´’ā´°āĩ ā´Ēāĩā´¤ā´ŋā´¯ ā´…ā´•āĩā´•āĩ—ā´Ŗāĩā´Ÿāĩ ā´¸āĩƒā´ˇāĩā´Ÿā´ŋā´•āĩā´•āĩā´•." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "ā´…ā´•āĩā´•āĩ—ā´Ŗāĩā´Ÿāĩ ā´¸āĩƒā´ˇāĩā´Ÿā´ŋā´•āĩā´•āĩā´•" }, - "login": { - "message": "ā´˛āĩ‡ā´žā´—ā´ŋāĩģ" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "ā´Žā´¨āĩā´ąāĩŧā´Ēāĩā´°āĩˆā´¸āĩ ā´¸ā´ŋā´‚ā´—ā´ŋāĩž ā´¸āĩˆāĩģ-ā´“āĩē" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´Žā´ąā´¨āĩā´¨ā´žāĩŊ ā´…ā´¤āĩ ā´“āĩŧā´Žāĩā´Žā´ŋā´•āĩā´•ā´žāĩģ ā´’ā´°āĩ ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¸āĩ‚ā´šā´¨ ā´¸ā´šā´žā´¯ā´ŋā´•āĩā´•āĩā´‚." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ⴟāĩˆā´Ēāĩā´Ēāĩâ€Œ ⴚāĩ†ā´¯āĩā´¯āĩā´•" }, "masterPassHint": { "message": "ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¸āĩ‚ā´šā´¨ (ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ā´Žā´žā´¯)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "ā´Ÿā´žā´Ŧāĩ " }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´Ēā´•āĩŧā´¤āĩā´¤āĩā´•" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "ā´•āĩā´ąā´ŋā´Ēāĩā´Ēāĩ ā´Ēā´•āĩŧā´¤āĩā´¤āĩā´•" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "ā´¸āĩā´°ā´•āĩā´ˇā´ž ā´•āĩ‹ā´Ąāĩ ā´Ēā´•āĩŧā´¤āĩā´¤āĩā´•" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ā´“ā´Ÿāĩā´Ÿāĩ‹ā´Ģā´ŋāĩŊ" }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" + }, "generatePasswordCopied": { "message": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¸āĩƒā´ˇāĩā´Ÿā´ŋā´•āĩā´•āĩā´• (ā´Ēā´•āĩŧā´¤āĩā´¤āĩā´• )" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "ā´ĒāĩŠā´°āĩā´¤āĩā´¤ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¨āĩā´¨ ā´˛āĩ‹ā´—ā´ŋā´¨āĩā´•ā´ŗāĩŠā´¨āĩā´¨āĩā´Žā´ŋā´˛āĩā´˛." }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -115,6 +231,18 @@ "addItem": { "message": " ⴇⴍⴂ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ā´Ēā´žā´¸āĩā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¸āĩ‚ā´šā´¨ā´ž" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "ā´…ā´•āĩā´•āĩ—ā´Ŗāĩā´Ÿāĩ" - }, "changeMasterPassword": { "message": "ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´Žā´žā´ąāĩā´ąāĩā´•" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "ā´Ģā´ŋā´‚ā´—āĩŧā´Ēāĩā´°ā´ŋā´¨āĩā´ąāĩ ā´Ģāĩā´°āĩ‡ā´¸āĩâ€Œ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ā´˛āĩ‹ā´—āĩ ā´”ā´Ÿāĩā´Ÿāĩ" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "ⴇⴤā´ŋā´¨āĩ† ā´•āĩā´ąā´ŋⴚāĩā´šāĩ" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "ā´ĩāĩ‡āĩŧā´ˇāĩģ " }, @@ -183,6 +365,24 @@ "editFolder": { "message": "ā´Ģāĩ‹āĩžā´Ąāĩŧ ā´¤ā´ŋā´°āĩā´¤āĩā´¤āĩā´•" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "ā´Ģāĩ‹āĩžā´Ąāĩŧ ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ā´¸āĩā´°ā´ˇāĩā´Ÿā´žā´ĩāĩ", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´ļā´•āĩā´¤ā´Žā´žā´¯ ā´Ēā´žā´¸āĩā´¸āĩâ€Œā´ĩāĩ‡āĩŧā´Ąāĩā´•āĩž ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´˛āĩ‹ā´—ā´ŋā´¨āĩ ā´ĩāĩ‡ā´Ŗāĩā´Ÿā´ŋ ā´¨ā´ŋāĩŧā´Žā´ŋā´•āĩā´•āĩā´• " }, - "bitWebVault": { - "message": "Bitwarden ā´ĩāĩ†ā´Ŧāĩ ā´ĩā´žāĩžā´Ÿāĩ " + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "ⴇⴍⴙāĩā´™āĩž ā´‡ā´Žāĩā´Ēāĩ‹āĩŧⴟāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•" @@ -235,6 +435,9 @@ "generatePassword": { "message": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¸āĩƒā´ˇāĩā´Ÿā´ŋā´•āĩā´•āĩā´•" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "ā´Ēā´žā´¸āĩā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ā´¸āĩƒā´ˇāĩā´Ÿā´ŋā´•āĩā´•āĩā´•" }, @@ -244,17 +447,60 @@ "length": { "message": "ā´¨āĩ€ā´ŗā´‚" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ā´ĩā´žā´•āĩā´•āĩā´•ā´ŗāĩā´Ÿāĩ† ā´Žā´Ŗāĩā´Ŗā´‚" @@ -276,7 +522,16 @@ "message": "ā´•āĩā´ąā´žāĩā´ž ā´Ēāĩā´°ā´¤āĩā´¯āĩ‡ā´• ā´Ēāĩā´°ā´¤āĩ€ā´•ā´™āĩā´™āĩž" }, "avoidAmbChar": { - "message": "ā´…ā´ĩāĩā´¯ā´•āĩā´¤ā´Žā´žā´¯ ā´Ēāĩā´°ā´¤āĩ€ā´•ā´™āĩā´™āĩž ā´’ā´´ā´ŋā´ĩā´žā´•āĩā´•āĩā´•" + "message": "ā´…ā´ĩāĩā´¯ā´•āĩā´¤ā´Žā´žā´¯ ā´Ēāĩā´°ā´¤āĩ€ā´•ā´™āĩā´™āĩž ā´’ā´´ā´ŋā´ĩā´žā´•āĩā´•āĩā´•", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ā´ĩā´žāĩžā´Ÿāĩ ā´¤ā´ŋā´°ā´¯āĩā´•" @@ -299,15 +554,30 @@ "password": { "message": "ā´Ēā´žā´¸āĩā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩâ€Œ" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "ā´°ā´šā´¸āĩā´¯ ā´ĩā´žā´šā´•ā´‚" }, "favorite": { "message": "ā´Ēāĩā´°ā´ŋⴝⴙāĩā´•ā´°ā´‚" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "ā´•āĩā´ąā´ŋā´Ēāĩā´Ēāĩā´•āĩž" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "ā´•āĩā´ąā´ŋā´Ēāĩā´Ēāĩ" }, @@ -326,6 +596,18 @@ "launch": { "message": "ā´¤āĩā´ąā´•āĩā´•āĩā´•" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ā´ĩāĩ†ā´Ŧāĩā´¸āĩˆā´ąāĩā´ąāĩ" }, @@ -338,9 +620,24 @@ "other": { "message": "ā´Žā´ąāĩā´ąāĩā´ŗāĩā´ŗā´ĩ" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "ā´Žā´•āĩā´¸āĩā´ąāĩā´ąāĩģā´ˇāĩģ ā´ąāĩ‡ā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´• " }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "ⴤⴙāĩā´™ā´ŗāĩā´Ÿāĩ† ā´ĩā´žāĩžā´Ÿāĩ ā´Ēāĩ‚ā´Ÿāĩā´Ÿā´ŋā´¯ā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ. ā´¤āĩā´Ÿā´°āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´Ēā´°ā´ŋā´ļāĩ‹ā´§ā´ŋā´•āĩā´•āĩā´•." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "ā´…āĩēā´˛āĩ‹ā´•āĩā´•āĩ" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "ā´ĩā´žāĩžā´Ÿāĩ ⴟāĩˆā´‚ā´”ā´Ÿāĩā´Ÿāĩ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "ā´‡ā´Ēāĩā´Ēāĩ‹āĩž ā´˛āĩ‹ā´•āĩā´•āĩā´šāĩ†ā´¯āĩā´¯āĩā´•" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "ā´‰ā´Ÿā´¨āĩâ€ā´¤ā´¨āĩā´¨āĩ†" }, @@ -426,6 +738,18 @@ "security": { "message": "ā´¸āĩā´°ā´•āĩā´ˇ" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "ā´’ā´°āĩ ā´Ēā´ŋā´´ā´ĩāĩ ⴏⴂⴭā´ĩā´ŋⴚāĩā´šā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "ⴤⴙāĩā´™ā´ŗāĩā´Ÿāĩ† ā´…ā´•āĩā´•āĩ—ā´Ŗāĩā´Ÿāĩ ā´¸āĩƒā´ˇāĩā´Ÿā´ŋā´•āĩā´•ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´Ÿāĩ! ⴇⴍā´ŋ ā´¤ā´žā´™āĩā´•āĩžā´•āĩā´•āĩ ā´˛āĩ‹ā´—ā´ŋāĩģ ⴚāĩ†ā´¯āĩā´¯ā´žā´‚." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¸āĩ‚ā´šā´¨ā´¯āĩā´ŗāĩā´ŗ ā´’ā´°āĩ ā´‡ā´Žāĩ†ā´¯ā´ŋāĩŊ ā´žā´™āĩā´™āĩž ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´…ā´¯ā´šāĩā´šāĩ." }, "verificationCodeRequired": { "message": "ā´Ēā´°ā´ŋā´ļāĩ‹ā´§ā´ŋⴚāĩā´šāĩā´ąā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩŊ ā´•āĩ‹ā´Ąāĩ ā´†ā´ĩā´ļāĩā´¯ā´Žā´žā´Ŗāĩ." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "ⴈ ā´Ēāĩ‡ā´œā´ŋāĩŊ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´¤āĩā´¤ ⴇⴍⴂ ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•ā´žāĩģ ā´•ā´´ā´ŋā´¯ā´ŋā´˛āĩā´˛. ā´Ēā´•ā´°ā´‚ ā´ĩā´ŋā´ĩā´°ā´™āĩā´™āĩž ā´Ēā´•āĩŧā´¤āĩā´¤ā´ŋ ā´’ā´Ÿāĩā´Ÿā´ŋā´•āĩā´•āĩā´•." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "ā´˛āĩ‹ā´—āĩ‡ā´Ąāĩ ā´”ā´Ÿāĩā´Ÿāĩ" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ ā´¸ā´Žā´¯ā´‚ ā´•ā´´ā´ŋā´žāĩā´žā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´˛āĩ‹ā´—āĩ ā´”ā´Ÿāĩā´Ÿāĩ ⴚāĩ†ā´¯āĩā´¯ā´Ŗā´Žāĩ†ā´¨āĩā´¨āĩ ā´‰ā´ąā´Ēāĩā´Ēā´žā´Ŗāĩ‹?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "ⴚāĩ‡āĩŧā´•āĩā´•ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´Ÿ ā´Ģāĩ‹āĩžā´Ąāĩŧ" }, - "changeMasterPass": { - "message": "ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´Žā´žā´ąāĩā´ąāĩā´•" - }, - "changeMasterPasswordConfirmation": { - "message": "ⴤⴙāĩā´™āĩžā´•āĩā´•āĩ ā´Ŧā´ŋā´ąāĩā´ąāĩ ā´ĩā´žāĩŧā´Ąāĩģ ā´ĩāĩ†ā´Ŧāĩ ā´ĩā´žāĩžā´Ÿāĩā´Ÿā´ŋāĩŊ ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´Žā´žā´ąāĩā´ąā´žāĩģ ā´¸ā´žā´§ā´ŋā´•āĩā´•āĩā´‚.ā´ĩāĩ†ā´Ŧāĩā´¸āĩˆā´ąāĩā´ąāĩ ā´‡ā´Ēāĩā´Ēāĩ‹āĩž ⴏⴍāĩā´Ļāĩŧā´ļā´ŋā´•āĩā´•ā´žāĩģ ⴆⴗāĩā´°ā´šā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩā´ĩāĩ‹?" - }, "twoStepLoginConfirmation": { "message": "ā´¸āĩā´°ā´•āĩā´ˇā´ž ā´•āĩ€, ⴓⴤⴍāĩā´ąā´ŋā´•āĩā´•āĩ‡ā´ąāĩā´ąāĩŧ ā´…ā´Ēāĩā´˛ā´ŋā´•āĩā´•āĩ‡ā´ˇāĩģ, SMS, ā´Ģāĩ‹āĩē ā´•āĩ‹āĩž ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´‡ā´Žāĩ†ā´¯ā´ŋāĩŊ ā´Ēāĩ‹ā´˛āĩā´ŗāĩā´ŗ ā´Žā´ąāĩā´ąāĩŠā´°āĩ ā´‰ā´Ēā´•ā´°ā´Ŗā´‚ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ⴤⴙāĩā´™ā´ŗāĩā´Ÿāĩ† ā´˛āĩ‹ā´—ā´ŋāĩģ ā´¸āĩā´Ĩā´ŋā´°āĩ€ā´•ā´°ā´ŋā´•āĩā´•ā´žāĩģ ā´†ā´ĩā´ļāĩā´¯ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¨āĩā´¨ā´¤ā´ŋā´˛āĩ‚ā´Ÿāĩ† ā´°ā´Ŗāĩā´Ÿāĩ-ⴘⴟāĩā´Ÿ ā´˛āĩ‹ā´—ā´ŋāĩģ ⴤⴙāĩā´™ā´ŗāĩā´Ÿāĩ† ā´…ā´•āĩā´•āĩ—ā´Ŗāĩā´Ÿā´ŋā´¨āĩ† ā´•āĩ‚ā´Ÿāĩā´¤āĩŊ ā´¸āĩā´°ā´•āĩā´ˇā´ŋā´¤ā´Žā´žā´•āĩā´•āĩā´¨āĩā´¨āĩ. bitwarden.com ā´ĩāĩ†ā´Ŧāĩ ā´ĩā´žāĩžā´Ÿāĩā´Ÿā´ŋāĩŊ ā´°ā´Ŗāĩā´Ÿāĩ-ⴘⴟāĩā´Ÿ ā´˛āĩ‹ā´—ā´ŋāĩģ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´•āĩā´ˇā´Žā´Žā´žā´•āĩā´•ā´žā´¨ā´žā´•āĩā´‚.ⴤⴙāĩā´™ā´ŗāĩā´•āĩā´•āĩ ā´‡ā´Ēāĩā´Ēāĩ‹āĩž ā´ĩāĩ†ā´Ŧāĩā´¸āĩˆā´ąāĩā´ąāĩ ⴏⴍāĩā´Ļāĩŧā´ļā´ŋā´•āĩā´•ā´žāĩģ ⴆⴗāĩā´°ā´šā´Žāĩā´Ŗāĩā´Ÿāĩ‹?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "ā´¤ā´ŋā´°āĩā´¤āĩā´¤ā´ŋā´¯ ā´Ģāĩ‹āĩžā´Ąāĩŧ" }, @@ -552,6 +936,10 @@ "newUri": { "message": "ā´Ēāĩā´¤ā´ŋā´¯ URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "ⴚāĩ‡āĩŧā´•āĩā´•ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´Ÿ ⴇⴍⴂ" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "ā´¨ā´ŋā´™āĩā´™āĩž ā´†ā´Ļāĩā´¯ā´Žā´žā´¯ā´ŋ ā´¸āĩˆā´ąāĩā´ąā´ŋāĩŊ ā´Ēāĩā´°ā´ĩāĩ‡ā´ļā´ŋā´•āĩā´•āĩā´Žāĩā´Ēāĩ‹āĩž ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´ĩā´žāĩžā´Ÿāĩā´Ÿā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴤⴍā´ŋā´¯āĩ† ā´Ēāĩā´°ā´ĩāĩ‡ā´ļⴍⴂ ā´‰āĩžā´Ēāĩ†ā´Ÿāĩā´¤āĩā´¤ā´žāĩģ \"ā´Ēāĩā´°ā´ĩāĩ‡ā´ļⴍⴂ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´• ā´Žā´¨āĩā´¨ ā´…ā´ąā´ŋā´¯ā´ŋā´Ēāĩā´Ēāĩ\" ā´†ā´ĩā´ļāĩā´¯ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´‚." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "ā´•āĩā´˛ā´ŋā´Ēāĩā´Ŧāĩ‹ā´°āĩâ€ā´Ąāĩ ā´Žā´žā´¯āĩā´•āĩā´•āĩā´•", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "ā´Ŧā´ŋā´ąāĩā´ąāĩā´ĩā´žāĩŧā´Ąā´¨ā´ŋāĩŊ ⴈ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´…ā´Ēāĩâ€Œā´Ąāĩ‡ā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯ā´žāĩģ ā´¨ā´ŋā´™āĩā´™āĩž ⴆⴗāĩā´°ā´šā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩā´Ŗāĩā´Ÿāĩ‹?" }, @@ -634,20 +1043,26 @@ "message": "ā´ļā´°ā´ŋ, ā´‡ā´Ēāĩā´Ēāĩ‹āĩž ā´…ā´Ēāĩā´Ąāĩ‡ā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "ā´¸ā´žā´§ā´žā´°ā´Ŗ URI ā´ĒāĩŠā´°āĩā´¤āĩā´¤ā´‚ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩŊ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´• ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩŊ ā´Ēāĩ‹ā´˛āĩā´ŗāĩā´ŗ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´™āĩā´™āĩž ⴍⴟⴤāĩā´¤āĩā´Žāĩā´Ēāĩ‹āĩž ā´˛āĩ‹ā´—ā´ŋā´¨āĩā´•āĩžā´•āĩā´•ā´žā´¯ā´ŋ ā´¯āĩā´†āĩŧⴐ ā´Žā´žā´šāĩā´šāĩ ā´Ąā´ŋā´ąāĩā´ąā´•āĩā´ˇāĩģ ā´•āĩˆā´•ā´žā´°āĩā´¯ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨ ā´¸āĩā´Ĩā´ŋā´°ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ ā´Žā´žāĩŧā´—ā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ā´…ā´Ēāĩā´˛ā´ŋā´•āĩā´•āĩ‡ā´ˇā´¨āĩā´ąāĩ† ā´¤āĩ€ā´Žāĩā´‚ ā´ĩāĩŧā´Ŗāĩā´Ŗā´™āĩā´™ā´ŗāĩā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "ⴇⴰāĩā´Ŗāĩā´Ÿā´¤āĩ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "ā´ĩā´žāĩžā´Ÿāĩ ā´Žā´•āĩā´¸āĩā´Ēāĩ‹āĩŧⴟāĩ" }, "fileFormat": { "message": "ā´Ģā´¯āĩŊ ā´Ģāĩ‹āĩŧā´Žā´žā´ąāĩā´ąāĩ" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "ā´Žāĩā´¨āĩā´¨ā´ąā´ŋā´¯ā´ŋā´Ēāĩā´Ēāĩ", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ā´Ēā´™āĩā´•ā´ŋⴟāĩā´Ÿā´ĩ" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "ā´Ģā´¯āĩŊ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "ā´’ā´°āĩ ā´Ģā´¯āĩŊ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "ā´Ģā´¯āĩŊ ā´…ā´ąāĩā´ąā´žā´šāĩā´šāĩā´Žāĩ†ā´¨āĩā´ąāĩā´•āĩžā´•āĩā´•ā´žā´¯ā´ŋ 1 ⴜā´ŋā´Ŧā´ŋ ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩā´šāĩ†ā´¯āĩâ€Œā´¤ ⴏⴂⴭⴰ⴪ⴂ." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ bitwarden.com ā´ĩāĩ†ā´Ŧāĩ ā´ĩā´žāĩžā´Ÿāĩā´Ÿā´ŋāĩŊ ā´Ēāĩā´°āĩ€ā´Žā´ŋⴝⴂ ā´…ā´‚ā´—ā´¤āĩā´ĩā´‚ ā´ĩā´žā´™āĩā´™ā´žā´‚. ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´‡ā´Ēāĩā´Ēāĩ‹āĩž ā´ĩāĩ†ā´Ŧāĩā´¸āĩˆā´ąāĩā´ąāĩ ⴏⴍāĩā´Ļāĩŧā´ļā´ŋā´•āĩā´•ā´žāĩģ ⴆⴗāĩā´°ā´šā´Žāĩā´Ŗāĩā´Ÿāĩ‹?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "ⴤⴙāĩā´™āĩž ā´’ā´°āĩ ā´Ēāĩā´°āĩ€ā´Žā´ŋⴝⴂ ā´…ā´‚ā´—ā´Žā´žā´Ŗāĩ!" }, "premiumCurrentMemberThanks": { "message": "Bitwardenā´¨āĩ† ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´šāĩā´šā´¤ā´ŋā´¨āĩ ⴍⴍāĩā´Ļā´ŋ." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "ā´Žā´˛āĩā´˛ā´žā´‚ ā´ĩāĩ†ā´ąāĩā´‚ $PRICE$/ ā´ĩāĩŧⴎⴤāĩā´¤āĩ‡ā´•āĩā´•āĩ!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ā´ąā´ŋā´Ģāĩā´°ā´ˇāĩ ā´Ēāĩ‚āĩŧā´¤āĩā´¤ā´ŋā´¯ā´žā´¯ā´ŋ" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "ⴓⴤⴍāĩā´ąā´ŋā´•āĩā´•āĩ‡ā´ąāĩā´ąāĩŧ ā´†ā´Ēāĩā´Ēāĩ" }, - "authenticatorAppDesc": { - "message": "ā´¸ā´Žā´¯-ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ ā´Ēā´°ā´ŋā´ļāĩ‹ā´§ā´¨ ā´•āĩ‹ā´Ąāĩā´•āĩž ā´¸āĩƒā´ˇāĩā´Ÿā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ ā´’ā´°āĩ ⴓⴤⴍāĩā´ąā´ŋā´•āĩā´•āĩ‡ā´ąāĩā´ąāĩŧ ā´…ā´Ēāĩā´˛ā´ŋā´•āĩā´•āĩ‡ā´ˇāĩģ (ā´“ā´¤āĩā´¤ā´ŋ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ Google ⴓⴤⴍāĩā´ąā´ŋā´•āĩā´•āĩ‡ā´ąāĩā´ąāĩŧ ā´Ēāĩ‹ā´˛āĩā´ŗāĩā´ŗā´ĩ) ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´•.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP ā´¸āĩā´°ā´•āĩā´ˇā´ž ā´•āĩ€" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´…ā´•āĩā´•āĩ—ā´Ŗāĩā´Ÿāĩ ⴆⴕāĩā´¸ā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ ā´’ā´°āĩ ā´¯āĩ‚ā´Ŧā´ŋā´•āĩā´•ā´ŋ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´•. YubiKey 4, 4 Nano, 4C, NEO ā´‰ā´Ēā´•ā´°ā´Ŗā´™āĩā´™ā´ŗā´ŋāĩŊ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ." }, - "duoDesc": { - "message": "Duo Mobile ā´…ā´Ēāĩā´˛ā´ŋā´•āĩā´•āĩ‡ā´ˇāĩģ, ā´Žā´¸āĩā´Žā´‚ā´Žā´¸āĩ, ā´Ģāĩ‹āĩē ā´•āĩ‹āĩž ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´¯āĩ 2 ā´Žā´Ģāĩ ā´¸āĩā´°ā´•āĩā´ˇā´ž ā´•āĩ€ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ Duoā´¸āĩ†ā´•āĩā´¯āĩ‚ā´°ā´ŋā´ąāĩā´ąā´ŋ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´Ēā´°ā´ŋā´ļāĩ‹ā´§ā´ŋā´•āĩā´•āĩā´•.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "ā´‡ā´Žāĩ†ā´¯ā´ŋāĩŊ" }, - "emailDesc": { - "message": "ā´¸āĩā´Ĩā´ŋā´°āĩ€ā´•ā´°ā´Ŗ ā´•āĩ‹ā´Ąāĩā´•āĩž ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´‡ā´Žāĩ†ā´¯ā´ŋāĩŊ ⴚāĩ†ā´¯āĩā´¯āĩā´‚." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "ā´¸āĩā´ĩⴝⴂ ā´šāĩ‹ā´¸āĩā´ąāĩā´ąāĩā´šāĩ†ā´¯āĩâ€Œā´¤ ā´Žāĩģā´ĩā´ŋā´¯āĩ‹ā´Ŗāĩā´Žāĩ†ā´¨āĩā´ąāĩ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "ⴤⴙāĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēā´°ā´ŋⴏⴰⴤāĩā´¤āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨ ā´Ŧā´ŋā´ąāĩā´ąāĩ ā´ĩā´žāĩŧā´Ąāĩģ ā´‡āĩģā´¸āĩā´ąāĩā´ąā´žā´ŗāĩ‡ā´ˇā´¨āĩā´ąāĩ† ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ URL ā´ĩāĩā´¯ā´•āĩā´¤ā´Žā´žā´•āĩā´•āĩā´•." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "ⴇⴎāĩâ€Œā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´Žāĩģā´ĩā´ŋā´¯āĩ‹ā´Ŗāĩā´Žāĩ†ā´¨āĩā´ąāĩ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "ā´¸āĩ†āĩŧā´ĩāĩŧ URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API ā´¸āĩ†āĩŧā´ĩāĩŧ URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "ā´Žā´¨āĩā´ĩā´ŋā´¯ā´žā´Ŗā´Žāĩ†ā´¨āĩā´ąāĩ URL ⴏⴂⴰⴕāĩā´ˇā´ŋⴚāĩā´šāĩ." }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "ā´Ēāĩ‡ā´œāĩ ā´˛āĩ‹ā´Ąā´ŋāĩŊ ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´•-ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩŊ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´•āĩā´ˇā´Žā´Žā´žā´•āĩā´•āĩā´•" }, "enableAutoFillOnPageLoadDesc": { "message": "ā´’ā´°āĩ ā´˛āĩ‹ā´—ā´ŋāĩģ ā´Ģāĩ‹ā´‚ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤ā´ŋā´¯ā´žāĩŊ, ā´ĩāĩ†ā´Ŧāĩ ā´Ēāĩ‡ā´œāĩ ā´˛āĩ‹ā´Ąāĩā´šāĩ†ā´¯āĩā´¯āĩā´Žāĩā´Ēāĩ‹āĩž ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´’ā´°āĩ ā´¸āĩā´ĩⴝⴂ ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩŊ ⴍⴟⴤāĩā´¤āĩā´•." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "ā´ĩāĩ‹āĩžā´Ÿāĩā´Ÿāĩ ā´Ēāĩ‹ā´Ēāĩā´Ēāĩā´…ā´Ēāĩā´Ēāĩ ā´¤āĩā´ąā´•āĩā´•āĩā´•" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "ā´ĩā´žāĩžā´Ÿāĩ ā´¸āĩˆā´Ąāĩā´Ŧā´žā´ąā´ŋāĩŊ ā´¤āĩā´ąā´•āĩā´•āĩā´•" }, - "commandAutofillDesc": { - "message": "ā´¨ā´ŋā´˛ā´ĩā´ŋā´˛āĩ† ā´ĩāĩ†ā´Ŧāĩâ€Œā´¸āĩˆā´ąāĩā´ąā´ŋā´¨ā´žā´¯ā´ŋ ā´…ā´ĩā´¸ā´žā´¨ā´Žā´žā´¯ā´ŋ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´š ā´˛āĩ‹ā´—ā´ŋāĩģ ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "ā´•āĩā´˛ā´ŋā´Ēāĩā´Ēāĩā´Ŧāĩ‹āĩŧā´Ąā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´’ā´°āĩ ā´Ēāĩā´¤ā´ŋā´¯ ā´ąā´žāĩģā´Ąā´‚ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¸āĩƒā´ˇāĩā´Ÿā´ŋⴚāĩā´šāĩ ā´Ēā´•āĩŧā´¤āĩā´¤āĩā´•" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "ā´¨ā´ŋā´˛ā´ĩā´ą ā´Ēāĩ‚ā´Ÿāĩā´Ÿāĩā´•" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "ⴇⴎāĩâ€Œā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´Ģāĩ€āĩŊā´Ąāĩā´•āĩž" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "ā´Ŧāĩ‚ā´ŗā´ŋā´¯āĩģ" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "ā´ā´Ąā´¨āĩā´ąā´ŋā´ąāĩā´ąā´ŋ" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "ā´Ēā´žā´¸āĩā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨ā´žāĩžā´ĩā´´ā´ŋ" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "ā´Ēāĩā´ąā´•āĩ‹ā´Ÿāĩā´Ÿāĩ" }, "collections": { "message": "ā´•ā´ŗā´•āĩā´ˇāĩģā´¸āĩ" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "ā´Ēāĩā´°ā´ŋⴝⴙāĩā´•ā´°ā´™āĩā´™ā´ŗāĩâ€" }, @@ -1282,6 +1874,10 @@ "message": "ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ ā´ĄāĩŠā´Žāĩ†ā´¯āĩāĩģ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ā´ĒāĩŠā´°āĩā´¤āĩā´¤ā´‚ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩŊ", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ā´¸āĩā´Ĩā´ŋā´°ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ ā´ĒāĩŠā´°āĩā´¤āĩā´¤ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩŊ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ā´“ā´Ēāĩā´ˇā´¨āĩā´•āĩž ⴟāĩ‹ā´—ā´ŋāĩž ⴚāĩ†ā´¯āĩā´¯āĩā´•" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "ā´Ēāĩā´°ā´Ļāĩŧā´ļā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•ā´žāĩģ ā´Ēā´žā´¸āĩā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩā´•āĩž ā´’ā´¨āĩā´¨āĩā´‚ ⴇⴞāĩā´˛." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "ā´¨āĩ€ā´•āĩā´•āĩā´•" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "ā´Ēā´ŋāĩģ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´…āĩēā´˛āĩ‹ā´•āĩā´•āĩā´šāĩ†ā´¯āĩā´¯āĩā´•" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Bitwarden ā´…āĩēā´˛āĩ‹ā´•āĩā´•āĩā´šāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ ⴤⴙāĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēā´ŋāĩģ ā´•āĩ‹ā´Ąāĩ ⴏⴜāĩā´œā´Žā´žā´•āĩā´•āĩā´•. ⴤⴙāĩā´™āĩž ā´Žā´Ēāĩā´Ēāĩ‹ā´´āĩ†ā´™āĩā´•ā´ŋā´˛āĩā´‚ ā´…ā´Ēāĩā´˛ā´ŋā´•āĩā´•āĩ‡ā´ˇā´¨ā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Ēāĩ‚āĩŧā´Ŗāĩā´Ŗā´Žā´žā´¯ā´ŋ ā´˛āĩ‹ā´—āĩ ā´”ā´Ÿāĩā´Ÿāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•ā´¯ā´žā´Ŗāĩ†ā´™āĩā´•ā´ŋāĩŊ, ā´Ēā´ŋāĩģ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´Ŗā´™āĩā´™āĩž ā´Ēāĩā´¨ā´¸ā´œāĩā´œā´Žā´žā´•āĩā´•āĩā´‚." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "ā´Ēā´ŋāĩģ ā´•āĩ‹ā´Ąāĩ ā´¨ā´ŋāĩŧā´Ŧā´¨āĩā´§ā´Žā´žā´Ŗāĩ." }, "invalidPin": { "message": " ā´Ēā´ŋāĩģ ā´•āĩ‹ā´Ąāĩ ā´…ā´¸ā´žā´§āĩā´ĩā´žā´Ŗāĩ." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "ā´Ŧāĩā´°āĩŒā´¸āĩŧ ā´Ēāĩā´¨ā´°ā´žā´°ā´‚ā´­ā´¤āĩā´¤ā´ŋāĩŊ ā´Ēāĩā´°ā´žā´Ĩā´Žā´ŋā´• ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´˛āĩ‹ā´•āĩā´•āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "ā´¨ā´ŋā´™āĩā´™āĩž ā´’ā´°āĩ ā´•ā´ŗā´•āĩā´ˇā´¨āĩ†ā´™āĩā´•ā´ŋā´˛āĩā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•ā´Ŗā´‚." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "ā´’ā´¨āĩā´¨āĩ‹ ā´…ā´¤ā´ŋⴞⴧā´ŋā´•ā´Žāĩ‹ ā´¸ā´‚ā´˜ā´Ÿā´¨ ⴍⴝⴙāĩā´™āĩž ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēā´žā´¸āĩā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¸āĩƒā´ˇāĩā´Ÿā´žā´ĩā´ŋāĩģāĩā´ąāĩ† ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´Ŗā´™āĩā´™ā´ŗāĩ† ā´Ŧā´žā´§ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ā´ĩā´žāĩžā´Ÿāĩ ⴟāĩˆā´‚ ā´”ā´Ÿāĩā´Ÿāĩ ⴆⴕāĩā´ˇāĩģ" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "ā´Ēāĩ‚ā´Ÿāĩā´Ÿāĩā´•", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ⴟāĩā´°ā´žā´ˇāĩ", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩ†ā´Ÿāĩā´¤āĩā´¤ ⴇⴍⴂ" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "ā´˛āĩ‹ā´—āĩ—ā´Ÿāĩā´Ÿāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•ā´¯ā´žā´Ŗāĩ†ā´™āĩā´•ā´ŋāĩŊ ⴤⴙāĩā´™ā´ŗāĩā´Ÿāĩ† ā´ĩā´žāĩžā´Ÿāĩā´Ÿā´ŋā´˛āĩ‡ā´•āĩā´•āĩā´ŗāĩā´ŗ ā´Žā´˛āĩā´˛ā´ž ⴆⴕāĩā´¸ā´¸āĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ā´šāĩ†ā´¯āĩā´¯āĩā´‚. ā´•ā´žā´˛ā´¯ā´ŗā´ĩā´ŋā´¨āĩā´ļāĩ‡ā´ˇā´‚ ā´“āĩēā´˛āĩˆāĩģ ⴓⴤⴍāĩā´ąā´ŋā´•āĩā´•āĩ‡ā´ąāĩā´ąāĩŧ ā´†ā´ĩā´ļāĩā´¯ā´Žā´žā´Ŗāĩ. ⴈ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´Ŗā´‚ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•ā´žāĩģ ā´¨ā´ŋā´™āĩā´™āĩž ⴆⴗāĩā´°ā´šā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩā´Ŗāĩā´Ÿāĩ‹?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋⴚāĩā´šāĩ ⴏⴂⴰⴕāĩā´ˇā´ŋā´•āĩā´•āĩā´•" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "ā´¯ā´žā´¨āĩā´¤āĩā´°ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋⴚāĩā´š ⴇⴍā´ĩāĩā´‚ ⴏⴂⴰⴕāĩā´ˇā´ŋⴚāĩā´š URI" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Ēāĩā´¤ā´ŋā´¯ ā´Žā´žā´¸āĩā´ąāĩā´ąāĩŧ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴍⴝ ā´†ā´ĩā´ļāĩā´¯ā´•ⴤⴕāĩž ā´¨ā´ŋā´ąā´ĩāĩ‡ā´ąāĩā´ąāĩā´¨āĩā´¨ā´ŋā´˛āĩā´˛." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "ⴈ ā´Ŧāĩ‹ā´•āĩā´¸āĩ ⴚāĩ†ā´•āĩā´•āĩā´šāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨ā´¤ā´ŋā´˛āĩ‚ā´Ÿāĩ† ā´¨ā´ŋā´™āĩā´™āĩž ⴇⴍā´ŋā´Ēāĩā´Ēā´ąā´¯āĩā´¨āĩā´¨ā´ĩ ā´…ā´‚ā´—āĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 00a2e755376..88748b19b95 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - ā¤ĩā¤ŋā¤¨ā¤žā¤ŽāĨ‚⤞āĨā¤¯ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤žā¤Ē⤕", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "⤤āĨā¤Žā¤šāĨā¤¯ā¤ž ⤏⤰āĨā¤ĩ ⤉ā¤Ēā¤•ā¤°ā¤Ŗā¤žā¤‚ā¤¸ā¤žā¤ āĨ€ ā¤ā¤• ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ā¤ĩ ā¤ĩā¤ŋā¤¨ā¤žā¤ŽāĨ‚⤞āĨā¤¯ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤žā¤Ē⤕.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "⤤āĨā¤Žā¤šāĨā¤¯ā¤ž ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ā¤¤ ā¤ĒāĨ‹ā¤šā¤šā¤ŖāĨā¤¯ā¤žā¤¸ā¤žā¤ āĨ€ ⤞āĨ‰ā¤— ⤇⤍ ā¤•ā¤°ā¤ž ⤕ā¤ŋ⤂ā¤ĩā¤ž ⤍ā¤ĩāĨ€ā¤¨ ā¤–ā¤žā¤¤āĨ‡ ā¤‰ā¤˜ā¤Ąā¤ž." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "ā¤–ā¤žā¤¤āĨ‡ ā¤¤ā¤¯ā¤žā¤° ā¤•ā¤°ā¤ž" }, - "login": { - "message": "ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤•ā¤°ā¤ž" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "ā¤ŽāĨā¤–āĨā¤¯ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ąā¤šā¤ž ⤏⤂⤕āĨ‡ā¤¤ (ā¤Ē⤰āĨā¤¯ā¤žā¤¯āĨ€)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "⤟āĨ…ā¤Ŧ" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‰ā¤ĒāĨ€ ā¤•ā¤°ā¤ž" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "⤟āĨ€ā¤Ē ⤕āĨ‰ā¤ĒāĨ€ ā¤•ā¤°ā¤ž" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "⤏āĨā¤°ā¤•āĨā¤ˇā¤ž ⤕āĨ‹ā¤Ą ⤕āĨ‰ā¤ĒāĨ€ ā¤•ā¤°ā¤ž" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "⤏āĨā¤ĩ⤝⤂⤭⤰⤪" }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" + }, "generatePasswordCopied": { "message": "Generate password (copied)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ ā¤‰ā¤˜ā¤Ąā¤ž" }, @@ -107,7 +223,7 @@ "message": "⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ā¤¤ ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤•ā¤°ā¤ž" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "⤞āĨ‰ā¤—ā¤ŋ⤍ ⤜āĨ‹ā¤Ąā¤ž" @@ -115,6 +231,18 @@ "addItem": { "message": "ā¤ĩ⤏āĨā¤¤āĨ‚ ⤜āĨ‹ā¤Ąā¤ž" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏⤂⤕āĨ‡ā¤¤" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "ā¤ĒāĨā¤ĸāĨ‡ ā¤œā¤žā¤ŖāĨā¤¯ā¤žā¤¸ā¤žā¤ āĨ€ ⤤āĨā¤Žā¤šāĨā¤¯ā¤ž ⤓⤺⤖āĨ€ā¤šāĨ€ ā¤ĒāĨā¤ˇāĨā¤ŸāĨ€ ā¤•ā¤°ā¤ž." }, - "account": { - "message": "ā¤–ā¤žā¤¤āĨ‡" - }, "changeMasterPassword": { "message": "ā¤ŽāĨā¤–āĨā¤¯ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤Ŧā¤Ļā¤˛ā¤ž" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "⤅⤂⤗āĨā¤˛ā¤ŋā¤ŽāĨā¤ĻāĨā¤°ā¤ž ā¤ĩā¤žā¤•āĨā¤¯ā¤žā¤‚ā¤ļ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ā¤Ŧā¤žā¤šāĨ‡ā¤° ā¤Ēā¤Ąā¤ž" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "ā¤†ā¤Žā¤šāĨā¤¯ā¤ž ā¤ĩā¤ŋ⤎⤝āĨ€" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "⤆ā¤ĩāĨƒā¤¤āĨā¤¤āĨ€" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "ā¤ĢāĨ‹ā¤˛āĨā¤Ąā¤° ⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ā¤•ā¤°ā¤ž" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "ā¤ĢāĨ‹ā¤˛āĨā¤Ąā¤° ⤖āĨ‹ā¤ĄāĨ‚⤍ ā¤Ÿā¤žā¤•ā¤ž" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "⤜⤍ā¤ŋ⤤āĨā¤°", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "ā¤ĩ⤏āĨā¤¤āĨ‚ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤ž" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤ĒāĨā¤¨ā¤°āĨā¤œā¤¨ā¤ŋ⤤ ā¤•ā¤°ā¤ž" }, @@ -244,17 +447,60 @@ "length": { "message": "ā¤˛ā¤žā¤‚ā¤ŦāĨ€" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ā¤¤ ā¤ļāĨ‹ā¤§ā¤ž" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "ā¤ĩā¤žā¤•āĨā¤¯ā¤žā¤‚ā¤ļ" }, "favorite": { "message": "⤆ā¤ĩā¤Ąā¤¤āĨ‡" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "⤟ā¤ŋā¤Ē" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "ā¤‰ā¤˜ā¤Ąā¤ž" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "⤏⤂⤕āĨ‡ā¤¤ā¤¸āĨā¤Ĩ⤺" }, @@ -338,9 +620,24 @@ "other": { "message": "⤇⤤⤰" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "ā¤ĩā¤ŋ⤏āĨā¤¤ā¤žā¤°ā¤•ā¤žā¤šāĨ‡ ā¤ŽāĨ‚⤞āĨā¤¯ā¤žā¤‚⤕⤍ ā¤•ā¤°ā¤ž" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "⤤āĨā¤Žā¤šāĨ€ ⤤ā¤ŋ⤜āĨ‹ā¤°āĨ€ā¤˛ā¤ž ⤕āĨā¤˛āĨ‚ā¤Ē ā¤˛ā¤žā¤ĩ⤞āĨ‡ ā¤†ā¤šāĨ‡. ā¤ĒāĨā¤ĸāĨ‡ ā¤œā¤žā¤ŖāĨā¤¯ā¤žā¤¸ā¤žā¤ āĨ€ ⤤āĨā¤Žā¤šāĨ€ ⤓⤺⤖ ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ā¤•ā¤°ā¤ž." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "⤕āĨā¤˛āĨ‚ā¤Ē ā¤‰ā¤˜ā¤Ąā¤ž" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index bf1eedd8261..a4668a65add 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-fill" + "message": "Autofill" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,7 +223,7 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Add a login" @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index a69e43ddbd6..8a04c78ed5a 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden — Fri passordbehandling", + "message": "Bitwarden passordbehandler", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden er en sikker og fri passordbehandler for alle dine PCer og mobiler.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Logg pÃĨ eller opprett en ny konto for ÃĨ fÃĨ tilgang til ditt sikre hvelv." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Opprett en konto" }, - "login": { - "message": "Logg inn" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Bedriftsinnlogging (SSO)" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Et hint for superpassordet kan hjelpe deg med ÃĨ huske pÃĨ 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.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Skriv inn hovedpassordet pÃĨ nytt" }, "masterPassHint": { "message": "Et hint for hovedpassordet (valgfritt)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Fane" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopier passordet" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Kopier notatet" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopier sikkerhetskoden" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-utfylling" }, + "autoFillLogin": { + "message": "Auto-utfyll pÃĨlogging" + }, + "autoFillCard": { + "message": "Auto-utfyll kort" + }, + "autoFillIdentity": { + "message": "Auto-utfyll identitet" + }, "generatePasswordCopied": { "message": "Generer et passord (kopiert)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Ingen samsvarende innlogginger." }, + "noCards": { + "message": "Ingen kort" + }, + "noIdentities": { + "message": "Ingen identiteter" + }, + "addLoginMenu": { + "message": "Legg til pÃĨlogging" + }, + "addCardMenu": { + "message": "Legg til kort" + }, + "addIdentityMenu": { + "message": "Legg til identitet" + }, "unlockVaultMenu": { "message": "LÃĨs opp hvelvet ditt" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Legg til en gjenstand" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Passordhint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Bekreft identiteten din for ÃĨ fortsette." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Endre hovedpassordet" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingeravtrykksfrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Logg ut" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "Om" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Versjon" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Rediger mappen" }, + "newFolder": { + "message": "Ny mappe" + }, + "folderName": { + "message": "Mappenavn" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Slett mappen" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Generer automatisk sterke og unike passord for dine innlogginger." }, - "bitWebVault": { - "message": "Bitwarden netthvelv" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Importer elementer" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generer et passord" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Omgenerer et passord" }, @@ -244,17 +447,60 @@ "length": { "message": "Lengde" }, + "passwordMinLength": { + "message": "īģŋMinimum passordlengde" + }, "uppercase": { - "message": "Store bokstaver (A–Å)" + "message": "Store bokstaver (A–Å)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "SmÃĨ bokstaver (a-z)" + "message": "SmÃĨ bokstaver (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Tall (0-9)" + "message": "Tall (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Spesialtegn (!@#$%^&*)" + "message": "Spesialtegn (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Inkluder", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Å", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Inkluder tall", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Antall ord" @@ -276,7 +522,16 @@ "message": "Minste antall spesialtegn" }, "avoidAmbChar": { - "message": "UnngÃĨ tvetydige tegn" + "message": "UnngÃĨ tvetydige tegn", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Søk i hvelvet" @@ -299,15 +554,30 @@ "password": { "message": "Passord" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passfrase" }, "favorite": { "message": "Favoritt" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notater" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Notat" }, @@ -326,6 +596,18 @@ "launch": { "message": "Åpne" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Nettsted" }, @@ -338,9 +620,24 @@ "other": { "message": "Annet" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Andre valg" + }, "rateExtension": { "message": "Gi denne utvidelsen en vurdering" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Hvelvet ditt er lÃĨst. Kontroller hovedpassordet ditt for ÃĨ fortsette." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "LÃĨs opp" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Tidsavbrudd i hvelvet" }, + "vaultTimeout1": { + "message": "Tidsavbrudd" + }, "lockNow": { "message": "LÃĨs nÃĨ" }, + "lockAll": { + "message": "LÃĨs alle" + }, "immediately": { "message": "Umiddelbart" }, @@ -426,6 +738,18 @@ "security": { "message": "Sikkerhet" }, + "confirmMasterPassword": { + "message": "Bekreft hovedpassord" + }, + "masterPassword": { + "message": "Hovedpassord" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "En feil har oppstÃĨtt" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Din nye konto har blitt opprettet! Du kan nÃĨ logge pÃĨ." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "Vi har sendt deg en E-post med hintet til superpassordet." }, "verificationCodeRequired": { "message": "En verifiseringskode er pÃĨkrevd." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Ugyldig bekreftelseskode" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Klarte ikke ÃĨ auto-utfylle den valgte gjenstanden pÃĨ denne siden. Kopier og lim inn informasjonen i stedet." + "message": "Klarte ikke ÃĨ auto-utfylle det valgte elementet pÃĨ denne siden. Kopier og lim inn informasjonen i stedet." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Autentiseringsnøkkel ble lagt til" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logget av" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Din innloggingsøkt har utløpt." }, + "logIn": { + "message": "Logg inn" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Er du sikker pÃĨ at du vil logge av?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "La til en mappe" }, - "changeMasterPass": { - "message": "Endre hovedpassordet" - }, - "changeMasterPasswordConfirmation": { - "message": "Du kan endre superpassordet ditt pÃĨ bitwarden.net-netthvelvet. Vil du besøke det nettstedet nÃĨ?" - }, "twoStepLoginConfirmation": { "message": "2-trinnsinnlogging gjør kontoen din mer sikker, ved ÃĨ kreve at du verifiserer din innlogging med en annen enhet, f.eks. en autentiseringsapp, SMS, e-post, telefonsamtale, eller sikkerhetsnøkkel. 2-trinnsinnlogging kan aktiveres i netthvelvet ditt pÃĨ bitwarden.com. Vil du besøke bitwarden.com nÃĨ?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Redigerte mappen" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Ny URI" }, + "addDomain": { + "message": "Legg til domene", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "La til element" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Spør om ÃĨ legge til innlogging" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "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." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Vis kort pÃĨ fanesiden" }, "showCardsCurrentTabDesc": { "message": "Vis kortelementer pÃĨ fanesiden for lett auto-utfylling." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Vis identiteter pÃĨ fanesiden" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Spør om ÃĨ oppdatere passordet til innlogging nÃĨr endring pÃĨ nettside oppdages." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Vil du oppdatere dette passordet i Bitwarden?" }, @@ -634,10 +1043,13 @@ "message": "Ja, oppdater nÃĨ" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { - "message": "Unlock" + "message": "LÃĨs opp" + }, + "additionalOptions": { + "message": "Additional options" }, "enableContextMenuItem": { "message": "Vis alternativer for kontekstmeny" @@ -645,9 +1057,12 @@ "contextMenuItemDesc": { "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." + }, "defaultUriMatchDetection": { "message": "Standard URI-samsvarsgjenkjenning", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Velg standardmÃĨten for ÃĨ hÃĨndtere URI-samsvarsgjenkjenning for pÃĨlogginger ved f. eks. auto-utfylling." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Endre appens fargetema." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Mørkt", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarisert mørk", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Eksporter hvelvet" }, "fileFormat": { "message": "Filformat" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "Filpassord" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "ADVARSEL", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Delt" }, - "learnOrg": { - "message": "LÃĻr om organisasjoner" - }, - "learnOrgConfirmation": { - "message": "Bitwarden lar deg dele dine hvelvelementer med andre ved ÃĨ bruke en organisasjon. Vil du besøke bitwarden.com for ÃĨ lÃĻre mer?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Flytt til organisasjon" @@ -762,6 +1204,9 @@ "file": { "message": "Fil" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Velg en fil." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB med kryptert fillagring for filvedlegg." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Du kan kjøpe et Premium-medlemskap pÃĨ bitwarden.com. Vil du besøke det nettstedet nÃĨ?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Du er et Premium-medlem!" }, "premiumCurrentMemberThanks": { "message": "Takk for at du støtter Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "Og alt det for %price%/ÃĨr!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Oppfriskning fullført" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Autentiseringsapp" }, - "authenticatorAppDesc": { - "message": "Bruk en autentiseringsapp (f.eks. Authy eller Google Authenticator) for ÃĨ generere tidsbegrensede verifiseringskoder.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP-sikkerhetsnøkkel" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Bruk en YubiKey for ÃĨ fÃĨ tilgang til kontoen din. Virker med enheter av typene YubiKey 4, 4 Nano, 4C, og NEO." }, - "duoDesc": { - "message": "Verifiser med Duo Security gjennom Duo Mobile-appen, SMS, telefonsamtale, eller en U2F-sikkerhetsnøkkel.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-post" }, - "emailDesc": { - "message": "Verifiseringskoder vil bli sendt til deg med E-post." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Selvbetjent miljø" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Spesifiser grunn-nettadressen til din selvbetjente Bitwarden-installasjon." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Tilpasset miljø" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Tjener-nettadresse" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API-tjenernettadresse" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "Miljø-nettadressene har blitt lagret." }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Rediger nettleserinnstillingene." + }, + "autofillOverlayVisibilityOff": { + "message": "Av", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Aktiver auto-utfylling ved sideinnlastning" }, "enableAutoFillOnPageLoadDesc": { "message": "Dersom et innloggingskjema blir oppdaget, utfør automatisk en auto-utfylling nÃĨr nettstedet lastes inn." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Kompromitterte eller upÃĨlitelige nettsider kan utnytte auto-utfylling nÃĨr du laster inn siden." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "LÃĻr mer om auto-utfylling" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Åpne hvelv i sidepanelet" }, - "commandAutofillDesc": { - "message": "Auto-utfyll den senest brukte innloggingen til den nÃĨvÃĻrende nettsiden." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generer og kopier et nytt tilfeldig passord til utklippstavlen." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "LÃĨs hvelvet" }, - "privateModeWarning": { - "message": "Støtte for privatmodus er eksperimentelt, og noen funksjoner er begrenset." - }, "customFields": { "message": "Tilpassede felter" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolsk verdi" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Tilkoblet", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Vis et gjenkjennelig bilde ved siden av hver innlogging." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Vis merke-teller" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitet" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Passordhistorikk" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Tilbake" }, "collections": { "message": "Samlinger" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoritter" }, @@ -1282,6 +1874,10 @@ "message": "Grunndomene", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domenenavn", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match-gjenkjenning", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Standard match-gjenkjenning", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Skru innstillinger av/pÃĨ" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Det er ingen passord ÃĨ liste opp." }, + "clearHistory": { + "message": "Tøm historikk" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Fjern" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "LÃĨs opp med PIN-kode" }, + "setYourPinTitle": { + "message": "Velg PIN" + }, + "setYourPinButton": { + "message": "Velg PIN" + }, "setYourPinCode": { "message": "Angi PIN-koden din for ÃĨ lÃĨse opp Bitwarden. PIN-innstillingene tilbakestilles hvis du logger deg helt ut av programmet." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN-kode er pÃĨkrevd." }, "invalidPin": { "message": "Ugyldig PIN-kode." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "LÃĨs opp med biometri" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Venter pÃĨ bekreftelse fra skrivebordsprogrammet" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "LÃĨs med hovedpassordet nÃĨr du starter nettleseren pÃĨ nytt" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Du mÃĨ velge minst Ên samling." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "En eller flere av virksomhetens regler pÃĨvirker generatorinnstillingene dine." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Bruk dette passordet" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Handling ved tidsavbrudd i hvelvet" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "LÃĨs", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkurv", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Gjenopprettet objekt" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Hvis du logger ut, fjerner du all tilgang til hvelvet ditt og krever online godkjenning etter tidsavbrudd. Er du sikker pÃĨ at du vil bruke denne innstillingen?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Autofyll og lagre" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Autoutfylt objekt og lagret URI" }, @@ -1471,10 +2126,10 @@ "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "Ønsker du likevel ÃĨ fylle ut denne innloggingen?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1489,13 +2144,13 @@ "message": "Angi hovedpassord" }, "currentMasterPass": { - "message": "Current master password" + "message": "Gjeldende hovedpassord" }, "newMasterPass": { - "message": "New master password" + "message": "Nytt hovedpassord" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "Bekreft det nye hovedpassordet" }, "masterPasswordPolicyInEffect": { "message": "En eller flere av virksomhetens regler krever at hovedpassordet oppfyller følgende krav:" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Det nye hovedpassordet ditt oppfyller ikke vilkÃĨr i virksomhetsreglene." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Avslutt abonnement" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "og" + }, "acceptPolicies": { "message": "Ved ÃĨ merke av denne boksen sier du deg enig i følgende:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Verifisering av skrivebordssynkronisering" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Kontoen eksisterer ikke" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometri ikke aktivert" }, @@ -1605,8 +2287,20 @@ "biometricsNotSupportedDesc": { "message": "Biometri i nettleseren støttes ikke pÃĨ denne enheten." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "Biometri mislyktes" }, "biometricsFailedDesc": { "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "En virksomhetsregel pÃĨvirker dine eierskapsinnstillinger." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domener", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Ekskluderte domener" }, "excludedDomainsDesc": { "message": "Bitwarden vil ikke be om ÃĨ lagre innloggingsdetaljer for disse domenene. Du mÃĨ oppdatere siden for at endringene skal tre i kraft." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ er ikke et gyldig domene", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Søk i Send-ene", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fil" }, @@ -1666,6 +2406,9 @@ "message": "Alle Send-er", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Maksimalt antall tilganger nÃĨdd", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Passord beskyttet" }, + "copyLink": { + "message": "Kopier lenke" + }, "copySendLink": { "message": "Kopier Send-lenke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Er du sikker pÃĨ at du vil slette denne Send-en?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Rediger Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send-en vil bli slettet permanent pÃĨ den angitte dato og klokkeslett.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Utløpsdato" }, @@ -1769,6 +2523,10 @@ "message": "Eventuelt krever et passord for brukere ÃĨ fÃĨ tilgang til denne Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notater om denne Send-en.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Opprettet Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Redigerte Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "For ÃĨ velge en fil, ÃĨpne utvidelsen i sidepanelet (hvis mulig) eller poppe ut til et nytt vindu ved ÃĨ klikke pÃĨ dette banneret." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "For ÃĨ velge en fil med Safari, popp ut i et nytt vindu ved ÃĨ klikke pÃĨ dette banneret." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Før du starter" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Skjul min e-postadresse fra mottakere." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "En eller flere av virksomhetens regler pÃĨvirker generatorinnstillingene dine." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "E-postbekreftelse kreves" }, + "emailVerifiedV2": { + "message": "E-post bekreftet" + }, "emailVerificationRequiredDesc": { "message": "Du mÃĨ bekrefte e-posten din for ÃĨ bruke denne funksjonen. Du kan bekrefte e-postadressen din i netthvelvet." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatisk registrering" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Velg mappe â€Ļ" }, - "ssoCompleteRegistration": { - "message": "For ÃĨ fullføre pÃĨloggingen med SSO, vennligst velg et hovedpassord for ÃĨ fÃĨ tilgang til og beskytte hvelvet ditt." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verifisering kreves", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Åpningstider" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutter" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Din virksomhets regler pÃĨvirker tidsavbruddet for hvelvet ditt. Maksimalt tillatt tidsavbrudd for hvelv er $HOURS$ time(r) og $MINUTES$ minutt(er)", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Feil" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generer brukernavn" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Brukernavntype" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generer et e-postalias med en ekstern videresendingstjeneste." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Vertsnavn ", "description": "Part of a URL." @@ -2093,7 +3097,7 @@ "message": "Server Versjon" }, "selfHostedServer": { - "message": "self-hosted" + "message": "selvbetjent" }, "thirdParty": { "message": "Tredjepart" @@ -2192,7 +3196,7 @@ "message": "Hvordan bruke auto-utfylling" }, "autofillSelectInfoWithCommand": { - "message": "Velg et element fra denne siden eller bruk snarveien: $COMMAND$", + "message": "Velg en gjenstand fra denne skjermen, bruk snarveien $COMMAND$, eller utforsk andre alternativer i innstillingene.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Velg et element fra denne siden eller angi en snarvei i innstillingene." + "message": "Velg en gjenstand fra denne skjermen, eller utforsk andre alternativer i innstillingene." }, "gotIt": { "message": "Skjønner" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Innstillinger for auto-utfylling" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "Auto-utfyll tastatursnarvei" }, - "autofillShortcutNotSet": { - "message": "Snarveien for automatisk utfylling er ikke angitt. Endre dette i nettleserens innstillinger." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "Snarveien for automatisk utfylling er: $COMMAND$. Endre dette i nettleserens innstillinger.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,51 +3246,63 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "Åpnes i et nytt vindu" }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Husk denne enheten" }, "uncheckIfPublicDevice": { "message": "Uncheck if using a public device" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Godkjenn fra en av dine andre enheter" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Be om administratorgodkjennelse" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Godkjenn med hovedpassord" }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "GÃĨ tilbake" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, "general": { - "message": "General" + "message": "Generelt" }, "display": { - "message": "Display" + "message": "Vis" }, "accountSuccessfullyCreated": { "message": "Account successfully created!" @@ -2286,16 +3311,16 @@ "message": "Admin approval requested" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Forespørselen din har blitt sendt til administratoren din." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "Du vil bli varslet nÃĨr det er godkjent." }, "troubleLoggingIn": { "message": "Trouble logging in?" }, "loginApproved": { - "message": "Login approved" + "message": "Innlogging godkjent" }, "userEmailMissing": { "message": "User email missing" @@ -2303,17 +3328,25 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { - "message": "Input is required." + "message": "Inndata er pÃĨkrevd." }, "required": { - "message": "required" + "message": "pÃĨkrevd" }, "search": { - "message": "Search" + "message": "Søk" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "Inndataen mÃĨ vÃĻre minst $COUNT$ tegn.", "placeholders": { "count": { "content": "$1", @@ -2322,7 +3355,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "Inndataen kan ikke ha mer enn $COUNT$ tegn.", "placeholders": { "count": { "content": "$1", @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "Inndataverdien mÃĨ vÃĻre minst $MIN$.", "placeholders": { "min": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "Inndataverdien kan ikke vÃĻre mer enn $MAX$.", "placeholders": { "max": { "content": "$1", @@ -2365,7 +3398,7 @@ "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "Inndataen er ikke en E-postadresse." }, "fieldsNeedAttention": { "message": "$COUNT$ field(s) above need your attention.", @@ -2376,23 +3409,35 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Velg --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "— Skriv for ÃĨ filtrere —" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "Innhenter alternativer..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "Ingen gjenstander funnet" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "Tøm alle" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ til", "placeholders": { "quantity": { "content": "$1", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "Undermeny" }, "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Vil du importere dataene dine til Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Lagre som ukryptert fil", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importer til Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importerer â€Ļ", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Dataene ble vellykket importert!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias-domene" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Hopp frem til innholdet" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "LÃĨs opp kontoen", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Delvis brukernavn", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Ingen gjenstander ÃĨ vise", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nytt objekt", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Legg til nytt hvelvobjekt", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Ny innlogging", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Ny identitet", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Skru pÃĨ" + }, + "ignore": { + "message": "Ignorer" + }, + "importData": { + "message": "Importer data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Fiks feilene nedenfor og prøv igjen." + }, + "description": { + "message": "Beskrivelse" + }, + "importSuccess": { + "message": "Dataene ble vellykket importert" + }, + "importSuccessNumberOfItems": { + "message": "$AMOUNT$ gjenstander totalt ble importert.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Prøv igjen" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Velg PIN" + }, + "verifyWithBiometrics": { + "message": "Bekreft med biometri" + }, + "awaitingConfirmation": { + "message": "Avventer bekreftelse" + }, + "couldNotCompleteBiometrics": { + "message": "Kunne ikke fullføre biometri." + }, + "needADifferentMethod": { + "message": "Trenger du en annen metode?" + }, + "useMasterPassword": { + "message": "Bruk hovedpassord" + }, + "usePin": { + "message": "Bruk PIN-kode" + }, + "useBiometrics": { + "message": "Bruk biometri" + }, + "enterVerificationCodeSentToEmail": { + "message": "Skriv inn bekreftelseskoden som ble sendt til e-postadressen din." + }, + "resendCode": { + "message": "Send koden pÃĨ nytt" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Ingenting ble importert." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destinasjon" + }, + "learnAboutImportOptions": { + "message": "LÃĻr mer om importalternativene dine" + }, + "selectImportFolder": { + "message": "Velg en mappe" + }, + "selectImportCollection": { + "message": "Velg en samling" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Filen inneholder utildelte elementer." + }, + "selectFormat": { + "message": "Velg formatet til importfilen" + }, + "selectImportFile": { + "message": "Velg importfilen" + }, + "chooseFile": { + "message": "Velg fil" + }, + "noFileChosen": { + "message": "Ingen fil er valgt" + }, + "orCopyPasteFileContents": { + "message": "eller kopier/lim inn importfilens innhold" + }, + "instructionsFor": { + "message": "$NAME$-instruksjoner", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Bekreft hvelvimportering" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Bekreft filpassord" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "Du har ikke en samsvarende innlogging for dette nettstedet." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Bekreft" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Funksjonen støttes ikke ennÃĨ" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifaktorautentisering ble avbrutt" + }, + "noLastPassDataFound": { + "message": "Ingen LastPass-data ble funnet" + }, + "incorrectUsernameOrPassword": { + "message": "Feil brukernavn eller passord" + }, + "incorrectPassword": { + "message": "Feil passord" + }, + "incorrectCode": { + "message": "Feil kode" + }, + "incorrectPin": { + "message": "Feil PIN-kode" + }, + "multifactorAuthenticationFailed": { + "message": "Multifaktorautentisering mislyktes" + }, + "includeSharedFolders": { + "message": "Inkluder delte mapper" + }, + "lastPassEmail": { + "message": "LastPass-E-postadresse" + }, + "importingYourAccount": { + "message": "Importerer kontoen dinâ€Ļ" + }, + "lastPassMFARequired": { + "message": "LastPass-multifaktorautentisering kreves" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass-hovedpassord" + }, + "lastPassAuthRequired": { + "message": "LastPass-autentisering kreves" + }, + "awaitingSSO": { + "message": "Avventer SSO-autentisering" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "Se detaljerte instruksjoner pÃĨ hjelpesidene vÃĨre pÃĨ", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importer direkte fra LastPass" + }, + "importFromCSV": { + "message": "Importer fra CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Samling" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Bytt konto" + }, + "switchAccounts": { + "message": "Bytt kontoer" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Aktiv konto" + }, + "availableAccounts": { + "message": "Tilgjengelige kontoer" + }, + "accountLimitReached": { + "message": "Kontogrense nÃĨdd. Logg ut av en konto for ÃĨ legge til en annen en." + }, + "active": { + "message": "aktiv" + }, + "locked": { + "message": "lÃĨst" + }, + "unlocked": { + "message": "lÃĨst opp" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "betjent hos" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Kun Ên gang" + }, + "alwaysForThisSite": { + "message": "Alltid for dette nettstedet" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ ble lagt til i de ekskluderte domenene.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Vanlige formater", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Gjør Bitwarden til din standard passordbehandler", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Suksess" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Kontosikkerhet" + }, + "notifications": { + "message": "Varsler" + }, + "appearance": { + "message": "Utseende" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Ny" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Eier" + }, + "selfOwnershipLabel": { + "message": "Du", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Tilleggsinformasjon" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Tilknyttet" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Last opp" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filtre" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Kontaktinfo" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Legitimasjoner for innlogging" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Legg til nettsted" + }, + "deleteWebsite": { + "message": "Slett nettsted" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Aktiver animasjoner" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Legg til konto" + }, + "loading": { + "message": "Laster" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Knytt" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Legg til" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Rediger felt" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "Systemforvalg" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Prøv igjen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Gjenopprett" + }, + "deleteForever": { + "message": "Slett for alltid" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Autentiserer" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index bf1eedd8261..a4668a65add 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-fill" + "message": "Autofill" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,7 +223,7 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Add a login" @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index d6dda3290e7..2a9294c3f00 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Gratis wachtwoordbeheer", + "message": "Bitwarden - wachtwoordbeheerder", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Een veilige en gratis oplossing voor wachtwoordbeheer voor al je apparaten.", - "description": "Extension description" + "message": "Thuis, op werk of onderweg. Bitwarden beveiligt makkelijk all je wachtwoorden, passkeys en gevoelige informatie", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in of maak een nieuw account aan om toegang te krijgen tot je beveiligde kluis." }, + "inviteAccepted": { + "message": "Uitnodiging geaccepteerd" + }, "createAccount": { "message": "Account aanmaken" }, - "login": { - "message": "Inloggen" + "newToBitwarden": { + "message": "Nieuw bij Bitwarden?" + }, + "logInWithPasskey": { + "message": "Inloggen met passkey" + }, + "useSingleSignOn": { + "message": "Single sign-on gebruiken" + }, + "welcomeBack": { + "message": "Welkom terug" + }, + "setAStrongPassword": { + "message": "Sterk wachtwoord instellen" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Rond het aanmaken van je account af met het instellen van een wachtwoord" }, "enterpriseSingleSignOn": { "message": "Single sign-on voor bedrijven" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Een hoofdwachtwoordhint kan je helpen je wachtwoord te herinneren als je het vergeten bent." }, + "masterPassHintText": { + "message": "Als je je wachtwoord vergeten bent, kan de hint naar je e-mail gestuurd worden. $CURRENT$/$MAXIMUM$ tekens maximaal.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Hoofdwachtwoord opnieuw invoeren" }, "masterPassHint": { "message": "Hoofdwachtwoordhint (optioneel)" }, + "joinOrganization": { + "message": "Lid van organisatie worden" + }, + "joinOrganizationName": { + "message": "Aansluiten bij $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Voltooi je lidmaatschap aan deze organisatie door een hoofdwachtwoord in te stellen." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Wachtwoord kopiÃĢren" }, + "copyPassphrase": { + "message": "Wachtwoordzin kopiÃĢren" + }, "copyNote": { "message": "Notitie kopiÃĢren" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Beveiligingscode kopiÃĢren" }, + "copyName": { + "message": "Naam kopiÃĢren" + }, + "copyCompany": { + "message": "Bedrijf kopiÃĢren" + }, + "copySSN": { + "message": "Burgerservicenummer kopiÃĢren" + }, + "copyPassportNumber": { + "message": "Paspoortnummer kopiÃĢren" + }, + "copyLicenseNumber": { + "message": "Kenteken kopiÃĢren" + }, + "copyPrivateKey": { + "message": "PrivÊsleutel kopiÃĢren" + }, + "copyPublicKey": { + "message": "Publieke sleutel kopiÃĢren" + }, + "copyFingerprint": { + "message": "Vingerafdruk kopiÃĢren" + }, + "copyCustomField": { + "message": "$FIELD$ kopiÃĢren", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Website kopiÃĢren" + }, + "copyNotes": { + "message": "Notities kopiÃĢren" + }, + "fill": { + "message": "Invullen", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-invullen" }, + "autoFillLogin": { + "message": "Login automatisch invullen" + }, + "autoFillCard": { + "message": "Kaart automatisch invullen" + }, + "autoFillIdentity": { + "message": "Identiteit automatisch invullen" + }, "generatePasswordCopied": { "message": "Wachtwoord genereren (op klembord)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Geen overeenkomstige logins." }, + "noCards": { + "message": "Geen kaarten" + }, + "noIdentities": { + "message": "Geen identiteiten" + }, + "addLoginMenu": { + "message": "Login toevoegen" + }, + "addCardMenu": { + "message": "Kaart toevoegen" + }, + "addIdentityMenu": { + "message": "Identiteit toevoegen" + }, "unlockVaultMenu": { "message": "Ontgrendel je kluis" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Item toevoegen" }, + "accountEmail": { + "message": "E-mailadres van account" + }, + "requestHint": { + "message": "Hint vragen" + }, + "requestPasswordHint": { + "message": "Hoofdwachtwoordhint vragen" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Als je het e-mailadres van je account invult, versturen we je je wachtwoordhint" + }, "passwordHint": { "message": "Wachtwoordhint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Bevestig je identiteit om door te gaan." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Hoofdwachtwoord wijzigen" }, + "continueToWebApp": { + "message": "Doorgaan naar web-app?" + }, + "continueToWebAppDesc": { + "message": "Ontdek meer functies van je Bitwarden-account in de webapp." + }, + "continueToHelpCenter": { + "message": "Doorgaan naar Helpcentrum?" + }, + "continueToHelpCenterDesc": { + "message": "Leer meer over het gebruik van Bitwarden in het Helpcentrum." + }, + "continueToBrowserExtensionStore": { + "message": "Doorgaan naar de app store van browserextensies?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help anderen met beslissen of Bitwarden iets voor hen is. Bezoek de app store voor extensies en laat een beoordeling achter." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Je kunt je hoofdwachtwoord wijzigen in de Bitwarden-webapp." + }, "fingerprintPhrase": { "message": "Vingerafdrukzin", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Uitloggen" }, + "aboutBitwarden": { + "message": "Over Bitwarden" + }, "about": { "message": "Over" }, + "moreFromBitwarden": { + "message": "Meer van Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Doorgaan naar bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden voor Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Met Bitwarden Authenticator kunt je authenticatiesleutels opslaan en TOTP-codes voor tweestapsaanmelding genereren. Lees meer op de website bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Ontwikkelaars kunnen geheimen veilig opslaan, beheren en delen met Bitwarden Secrets Manager. Lees meer op de website bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Maak vlotte en veilige inlogervaringen, vrij van traditionele wachtwoorden, met Passwordless.dev. Meer informatie op de website bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Gratis Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Je komt in aanmerking voor gratis Bitwarden Families. Claim deze aanbieding vandaag in de webapp." + }, "version": { "message": "Versie" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Map bewerken" }, + "newFolder": { + "message": "Nieuwe map" + }, + "folderName": { + "message": "Mapnaam" + }, + "folderHintText": { + "message": "Je kunt een map onderbrengen door het toevoegen van de naam van de bovenliggende map gevolgd door een \"/\". Voorbeeld: Social/Forums" + }, + "noFoldersAdded": { + "message": "Geen mappen toegevoegd" + }, + "createFoldersToOrganize": { + "message": "Maak mappen om je kluis items te organiseren" + }, + "deleteFolderPermanently": { + "message": "Weet je zeker dat je deze map definitief wilt verwijderen?" + }, "deleteFolder": { "message": "Map verwijderen" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatisch sterke, unieke wachtwoorden voor je logins genereren." }, - "bitWebVault": { - "message": "Bitwarden Webkluis" + "bitWebVaultApp": { + "message": "Bitwarden webapp" }, "importItems": { "message": "Items importeren" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Wachtwoord genereren" }, + "generatePassphrase": { + "message": "Wachtwoordzin genereren" + }, "regeneratePassword": { "message": "Wachtwoord opnieuw genereren" }, @@ -244,17 +447,60 @@ "length": { "message": "Lengte" }, + "passwordMinLength": { + "message": "Minimale wachtwoordlengte" + }, "uppercase": { - "message": "Hoofdletters (A-Z)" + "message": "Hoofdletters (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Kleine letters (a-z)" + "message": "Kleine letters (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Cijfers (0-9)" + "message": "Cijfers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Speciale tekens (!@#$%^&*)" + "message": "Speciale tekens (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Toevoegen", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Hoofdletters toevoegen", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Kleine letters toevoegen", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Nummers toevoegen", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Speciale tekens toevoegen", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Aantal woorden" @@ -276,7 +522,16 @@ "message": "Minimum aantal speciale tekens" }, "avoidAmbChar": { - "message": "Dubbelzinnige tekens vermijden" + "message": "Dubbelzinnige tekens vermijden", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Dubbelzinnige tekens vermijden", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Bedrijfsbeleidseisen zijn toegepast op je generator-instellingen.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Kluis doorzoeken" @@ -299,15 +554,30 @@ "password": { "message": "Wachtwoord" }, + "totp": { + "message": "Authenticatie-geheim" + }, "passphrase": { "message": "Wachtwoordzin" }, "favorite": { "message": "Favoriet" }, + "unfavorite": { + "message": "Ontfavoriet" + }, + "itemAddedToFavorites": { + "message": "Item toegevoegd aan favorieten" + }, + "itemRemovedFromFavorites": { + "message": "Item verwijderd uit favorieten" + }, "notes": { "message": "Notities" }, + "privateNote": { + "message": "PrivÊnotitie" + }, "note": { "message": "Notitie" }, @@ -326,6 +596,18 @@ "launch": { "message": "Starten" }, + "launchWebsite": { + "message": "Website openen" + }, + "launchWebsiteName": { + "message": "Start website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Overig" }, + "unlockMethods": { + "message": "Ontgrendelopties" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Stel een ontgrendelingsmethode in om je kluis time-out actie te wijzigen." }, + "unlockMethodNeeded": { + "message": "Stel je ontgrendelingsmethode in in de instellingen" + }, + "sessionTimeoutHeader": { + "message": "Sessietime-out" + }, + "vaultTimeoutHeader": { + "message": "Time-out van de kluis" + }, + "otherOptions": { + "message": "Andere opties" + }, "rateExtension": { "message": "Deze extensie beoordelen" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Je kluis is vergrendeld. Bevestig je identiteit om door te gaan." }, + "yourVaultIsLockedV2": { + "message": "Je kluis is vergrendeld" + }, + "yourAccountIsLocked": { + "message": "Je account is vergrendeld" + }, + "or": { + "message": "of" + }, "unlock": { "message": "Ontgrendelen" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Time-out van de kluis" }, + "vaultTimeout1": { + "message": "Time-out" + }, "lockNow": { "message": "Nu vergrendelen" }, + "lockAll": { + "message": "Vergrendel alles" + }, "immediately": { "message": "Onmiddellijk" }, @@ -426,6 +738,18 @@ "security": { "message": "Beveiliging" }, + "confirmMasterPassword": { + "message": "Hoofdwachtwoord bevestigen" + }, + "masterPassword": { + "message": "Hoofdwachtwoord" + }, + "masterPassImportant": { + "message": "Je kunt je hoofdwachtwoord niet herstellen als je het vergeet!" + }, + "masterPassHintLabel": { + "message": "Hoofdwachtwoordhint" + }, "errorOccurred": { "message": "Er is een fout opgetreden" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Je nieuwe account is aangemaakt! Je kunt nu inloggen." }, + "newAccountCreated2": { + "message": "Je nieuwe account is aangemaakt!" + }, + "youHaveBeenLoggedIn": { + "message": "Je bent ingelogd!" + }, + "youSuccessfullyLoggedIn": { + "message": "U bent succesvol ingelogd" + }, + "youMayCloseThisWindow": { + "message": "U kunt het venster sluiten" + }, "masterPassSent": { "message": "We hebben je een e-mail gestuurd met je hoofdwachtwoordhint." }, "verificationCodeRequired": { "message": "Verificatiecode is vereist." }, + "webauthnCancelOrTimeout": { + "message": "De authenticatie werd geannuleerd of duurde te lang. Probeer het opnieuw." + }, "invalidVerificationCode": { "message": "Ongeldige verificatiecode" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Automatisch invullen mislukt; kopieer en plak je inloggegevens handmatig." }, + "totpCaptureError": { + "message": "Kan de QR-code van de huidige webpagina niet scannen" + }, + "totpCaptureSuccess": { + "message": "Authenticatiesleutel toegevoegd" + }, + "totpCapture": { + "message": "Scan de authenticatie-QR-code van de huidige webpagina" + }, + "totpHelperTitle": { + "message": "Maak tweestapsaanmelding naadloos" + }, + "totpHelper": { + "message": "Bitwarden kan tweestapsaanmeldingscodes opslaan en invullen. Kopieer en plak de sleutel in dit veld." + }, + "totpHelperWithCapture": { + "message": "Bitwarden kan tweestapsaanmeldingscodes opslaan en invullen. Selecteer het camerapictogram om een schermafbeelding van de QR-code van deze website te maken of kopieer en plak de sleutel in dit veld." + }, + "learnMoreAboutAuthenticators": { + "message": "Meer informatie over authenticatoren" + }, + "copyTOTP": { + "message": "Authenticatie-sleutel (TOTP) kopiÃĢren" + }, "loggedOut": { "message": "Uitgelogd" }, + "loggedOutDesc": { + "message": "Je bent uitgelogd van je account." + }, "loginExpired": { "message": "Je inlogsessie is verlopen." }, + "logIn": { + "message": "Inloggen" + }, + "logInToBitwarden": { + "message": "Inloggen op Bitwarden" + }, + "restartRegistration": { + "message": "Registratie herstarten" + }, + "expiredLink": { + "message": "Verlopen link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Herstart de registratie of probeer in te loggen." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Je hebt al een account" + }, "logOutConfirmation": { "message": "Weet je zeker dat je wilt uitloggen?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Map is toegevoegd" }, - "changeMasterPass": { - "message": "Hoofdwachtwoord wijzigen" - }, - "changeMasterPasswordConfirmation": { - "message": "Je kunt je hoofdwachtwoord wijzigen in de kluis op bitwarden.com. Wil je de website nu bezoeken?" - }, "twoStepLoginConfirmation": { "message": "Tweestapsaanmelding beschermt je account door je inlogpoging te bevestigen met een ander apparaat zoals een beveiligingscode, authenticatie-app, SMS, spraakoproep of e-mail. Je kunt Tweestapsaanmelding inschakelen in de webkluis op bitwarden.com. Wil je de website nu bezoeken?" }, + "twoStepLoginConfirmationContent": { + "message": "Maak je account veiliger met het instellen van tweestapsaanmelding in de Bitwarden-webapp." + }, + "twoStepLoginConfirmationTitle": { + "message": "Doorgaan naar web-app?" + }, "editedFolder": { "message": "Map is bewerkt" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Nieuwe URI" }, + "addDomain": { + "message": "Domein toevoegen", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item is toegevoegd" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Vraag om toevoegen login" }, + "vaultSaveOptionsTitle": { + "message": "Opslaan in kluisopties" + }, "addLoginNotificationDesc": { "message": "\"Melding bij nieuwe login\" vraagt automatisch om nieuwe sites in de kluis op te slaan wanneer je ergens voor de eerste keer inlogt." }, + "addLoginNotificationDescAlt": { + "message": "Vraag om een item toe te voegen als het niet is gevonden is je kluis. Dit geld voor alle ingelogde accounts." + }, + "showCardsInVaultView": { + "message": "Kaarten als Autofill-suggesties in de kluisweergave weergeven" + }, "showCardsCurrentTab": { "message": "Kaarten weergeven op tabpagina" }, "showCardsCurrentTabDesc": { "message": "Kaartenitems weergeven op de tabpagina voor gemakkelijk automatisch invullen." }, + "showIdentitiesInVaultView": { + "message": "Identiteiten als Autofill-suggesties in de kluisweergave weergeven" + }, "showIdentitiesCurrentTab": { "message": "Identiteiten weergeven op tabpagina" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Vraag om bijwerken van het wachtwoord van een login zodra een wijziging op een website is gedetecteerd." }, + "changedPasswordNotificationDescAlt": { + "message": "Vraag om het wachtwoord bij te werken als er een wijziging is gedetecteerd op een website. Geldt voor alle ingelogde accounts." + }, + "enableUsePasskeys": { + "message": "Vragen om opslaan en gebruiken van passkeys en wachtwoorden" + }, + "usePasskeysDesc": { + "message": "Vragen om opslaan nieuwe passkeys of inloggen met opgeslagen passkeys in je privÊkluis. Geldt voor alle ingelogde accounts." + }, "notificationChangeDesc": { "message": "Wilt je dit wachtwoord in Bitwarden bijwerken?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Ontgrendelen" }, + "additionalOptions": { + "message": "Extra instellingen" + }, "enableContextMenuItem": { "message": "Contextmenu-opties weergeven" }, "contextMenuItemDesc": { "message": "Gebruik de tweede klikfunctie voor toegang tot wachtwoordgeneratie en het matchen van logins voor de website." }, + "contextMenuItemDescAlt": { + "message": "Gebruik de tweede klikfunctie voor toegang tot wachtwoordgeneratie en het matchen van logins voor de website." + }, "defaultUriMatchDetection": { "message": "Standaard URI-overeenkomstdetectie", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Kies de standaardmethode voor detectie van URI-overeenkomsten voor logins bij acties, zoals automatisch invullen." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Het kleurenthema van de toepassing wijzigen." }, + "themeDescAlt": { + "message": "Verander het kleurenthema van de applicatie. Geldt voor alle ingelogde accounts." + }, "dark": { "message": "Donker", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Overbelicht donker", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Exporteren vanuit" + }, "exportVault": { "message": "Kluis exporteren" }, "fileFormat": { "message": "Bestandsindeling" }, + "fileEncryptedExportWarningDesc": { + "message": "We beveiligen deze bestandsexport met een wachtwoord, je hebt het bestandswachtwoord nodig om het bestand te decoderen." + }, + "filePassword": { + "message": "Bestandswachtwoord" + }, + "exportPasswordDescription": { + "message": "We gebruiken dit wachtwoord bij het exporteren en importeren van dit bestand" + }, + "accountRestrictedOptionDescription": { + "message": "Gebruik de encryptiesleutel van je account, afgeleid van je gebruikersnaam en hoodfwachtwoord, om de export te versleutelen en importeren te beperken tot het huidige Bitwarden-account." + }, + "passwordProtectedOptionDescription": { + "message": "Stel een bestandswachtwoord in om de export te versleutelen en te importeren naar een willekeurig Bitwarden-account met het wachtwoord voor decoderen." + }, + "exportTypeHeading": { + "message": "Exporttype" + }, + "accountRestricted": { + "message": "Account beperkt" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Bestandswachtwoord\" en \"Bestandswachtwoord bevestigen\" komen niet overeen." + }, "warning": { "message": "WAARSCHUWING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Gedeeld" }, - "learnOrg": { - "message": "Meer over organisaties" - }, - "learnOrgConfirmation": { - "message": "Door een organisatie te gebruiken in Bitwarden kun je kluis-items delen met anderen. Wil je de website van bitwarden.com bezoeken voor meer informatie?" + "bitwardenForBusinessPageDesc": { + "message": "Met Bitwarden voor Business kun je je kluis-items met anderen delen door gebruik te maken van een organisatie. Lees meer op de website bitwarden.com." }, "moveToOrganization": { "message": "Naar organisatie verplaatsen" @@ -762,6 +1204,9 @@ "file": { "message": "Bestand" }, + "fileToShare": { + "message": "Bestand om te delen" + }, "selectFile": { "message": "Selecteer een bestand." }, @@ -772,7 +1217,7 @@ "message": "Functionaliteit niet beschikbaar" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Migratie van de encryptiesleutel vereist. Login via de website om je sleutel te bij te werken." }, "premiumMembership": { "message": "Premium-abonnement" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB versleutelde opslag voor bijlagen." }, + "premiumSignUpEmergency": { + "message": "Noodtoegang" + }, "premiumSignUpTwoStepOptions": { "message": "Eigen opties voor tweestapsaanmelding zoals YubiKey en Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Je kunt een Premium-abonnement aanschaffen in de webkluis op bitwarden.com. Wil je de website nu bezoeken?" }, + "premiumPurchaseAlertV2": { + "message": "Je kunt Premium via je accountinstellingen in de Bitwarden-webapp kopen." + }, "premiumCurrentMember": { "message": "Je bent Premium-lid!" }, "premiumCurrentMemberThanks": { "message": "Bedankt voor het ondersteunen van Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade naar premium en ontvang:" + }, "premiumPrice": { "message": "Dit alles voor slechts $PRICE$ per jaar!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Dit alles voor slechts $PRICE$ per jaar!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Bijwerken voltooid" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticatie-app" }, - "authenticatorAppDesc": { - "message": "Gebruik een authenticatie-app (zoals Authy of Google Authenticator) om tijdgebaseerde authenticatiecodes te genereren.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Door een authenticatie-app zoals Bitwarden Authenticator gegenereerde code invoeren.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { + "yubiKeyTitleV2": { "message": "YubiKey OTP-beveiligingssleutel" }, "yubiKeyDesc": { "message": "Gebruik een YubiKey om toegang te krijgen tot uw account. Werkt met YubiKey 4, 4 Nano, 4C en Neo-apparaten." }, - "duoDesc": { - "message": "Verificatie met Duo Security middels de Duo Mobile-app, sms, spraakoproep of een U2F-beveiligingssleutel.", + "duoDescV2": { + "message": "Door Duo Security gegenereerde code invoeren.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-mail" }, - "emailDesc": { - "message": "Je ontvangt verificatiecodes via e-mail." + "emailDescV2": { + "message": "Via e-mail verstuurde code invoeren." }, "selfHostedEnvironment": { "message": "Zelfgehoste omgeving" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Geef de basis-URL van jouw zelfgehoste Bitwarden-installatie." }, + "selfHostedBaseUrlHint": { + "message": "Specificeer de basis-URL van je zelfgehoste Bitwarden-installatie. Bijvoorbeeld: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Aangepaste omgeving" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server-URL" }, + "selfHostBaseUrl": { + "message": "URL zelfgehoste server", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server-URL" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "De omgeving-URL's zijn opgeslagen." }, + "showAutoFillMenuOnFormFields": { + "message": "Auto-invulmenu op formuliervelden weergeven", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Suggesties voor automatisch invullen" + }, + "showInlineMenuLabel": { + "message": "Suggesties voor automatisch invullen op formuliervelden weergeven" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Identiteiten als suggesties weergeven" + }, + "showInlineMenuCardsLabel": { + "message": "Kaarten als suggesties weergeven" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Suggesties weergeven wanneer pictogram is geselecteerd" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Van toepassing op alle ingelogde accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Schakel de ingebouwde wachtwoordbeheerinstellingen van je browser uit om conflicten te voorkomen." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Browserinstellingen bewerken." + }, + "autofillOverlayVisibilityOff": { + "message": "Uit", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Wanneer het veld is geselecteerd (op focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Wanneer het pictogram automatisch aanvullen is geselecteerd", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Automatisch invullen bij laden van pagina" + }, "enableAutoFillOnPageLoad": { "message": "Automatisch invullen bij laden van pagina" }, "enableAutoFillOnPageLoadDesc": { "message": "Als een inlogformulier wordt gedetecteerd, dan worden de inloggegevens automatisch ingevuld." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Waarschuwing:$CLOSETAG$ Geconpromitteerde of niet-vertrouwde websites kunnen het automatische invullen bij het laden van de pagina misbruiken.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Gehackte of onbetrouwbare websites kunnen auto-invullen tijdens het laden van de pagina misbruiken." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Meer over risico's lezen" + }, "learnMoreAboutAutofill": { "message": "Lees meer over automatisch invullen" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open kluis in zijbalk" }, - "commandAutofillDesc": { - "message": "Vul automatisch de laatst gebruikte login in voor de huidige website" + "commandAutofillLoginDesc": { + "message": "Automatisch de laatst gebruikte login invullen voor de huidige website" + }, + "commandAutofillCardDesc": { + "message": "Automatisch de laatst gebruikte kaart invullen voor de huidige website" + }, + "commandAutofillIdentityDesc": { + "message": "Automatisch de laatst gebruikte identiteit invullen voor de huidige website" }, "commandGeneratePasswordDesc": { "message": "Genereer en kopieer een nieuw willekeurig wachtwoord naar het klembord." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Kluis vergrendelen" }, - "privateModeWarning": { - "message": "Private mode ondersteuning is experimenteel en sommige functies zijn beperkt." - }, "customFields": { "message": "Aangepaste velden" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Selectievakje" + }, "cfTypeLinked": { "message": "Gekoppeld", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Een herkenbare afbeelding naast iedere login weergeven." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Teller weergeven" }, @@ -1080,7 +1624,7 @@ "message": "Naam kaarthouder" }, "number": { - "message": "Kaartummer" + "message": "Kaartnummer" }, "brand": { "message": "Merk" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identiteit" }, + "typeSshKey": { + "message": "SSH-sleutel" + }, + "newItemHeader": { + "message": "Nieuwe $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ bewerken", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "$TYPE$ weergeven", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Geschiedenis" }, + "generatorHistory": { + "message": "Generatorgeschiedenis" + }, + "clearGeneratorHistoryTitle": { + "message": "Generatorgeschiedenis wissen" + }, + "cleargGeneratorHistoryDescription": { + "message": "Als je doorgaat, wis je definitief de geschiedenis van de generator. Weet je zeker dat je wilt doorgaan?" + }, "back": { "message": "Terug" }, "collections": { "message": "Verzamelingen" }, + "nCollections": { + "message": "$COUNT$ collecties", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorieten" }, @@ -1282,6 +1874,10 @@ "message": "Basisdomein", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Basisdomein (aanbevolen)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domeinnaam", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Overeenkomstdetectie", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Standaard overeenkomstdetectie", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Opties schakelen" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Er zijn geen wachtwoorden om weer te geven." }, + "clearHistory": { + "message": "Geschiedenis wissen" + }, + "nothingToShow": { + "message": "Niets om te laten zien" + }, + "nothingGeneratedRecently": { + "message": "Je hebt de laatste tijd niets gegenereerd" + }, "remove": { "message": "Verwijderen" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Ontgrendelen met PIN" }, + "setYourPinTitle": { + "message": "PIN-code instellen" + }, + "setYourPinButton": { + "message": "PIN-code instellen" + }, "setYourPinCode": { "message": "Stel je PIN-code in voor het ontgrendelen van Bitwarden. Je PIN-code wordt opnieuw ingesteld als je je ooit volledig afmeldt bij de applicatie." }, + "setYourPinCode1": { + "message": "Je pincode wordt gebruikt om Bitwarden te ontgrendelen in plaats van je hoofdwachtwoord. Je pincode wordt opnieuw ingesteld als je ooit volledig uitlogt op Bitwarden." + }, "pinRequired": { "message": "PIN-code is vereist." }, "invalidPin": { "message": "Ongeldige PIN-code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "PIN te vaak verkeerd ingevuld. Bezig met uitloggen." + }, "unlockWithBiometrics": { "message": "Biometrisch ontgrendelen" }, + "unlockWithMasterPassword": { + "message": "Ontgrendelen met hoofdwachtwoord" + }, "awaitDesktop": { "message": "Wacht op bevestiging van de desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Vergrendelen met hoofdwachtwoord bij herstart browser" }, + "lockWithMasterPassOnRestart1": { + "message": "Hoofdwachtwoord vereisen bij herstart van browser" + }, "selectOneCollection": { "message": "Je moet tenminste ÊÊn verzameling selecteren." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Een of meer organisatiebeleidseisen heeft invloed op de instellingen van je generator." }, + "passwordGenerator": { + "message": "Wachtwoordgenerator" + }, + "usernameGenerator": { + "message": "Gebruikersnaamgenerator" + }, + "useThisPassword": { + "message": "Dit wachtwoord gebruiken" + }, + "useThisUsername": { + "message": "Deze gebruikersnaam gebruiken" + }, + "securePasswordGenerated": { + "message": "Veilig wachtwoord aangemaakt! Vergeet niet om je wachtwoord ook op de website bij te werken." + }, + "useGeneratorHelpTextPartOne": { + "message": "Gebruik de generator", + "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": "om een sterk uniek wachtwoord te maken", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Actie bij time-out" }, + "vaultTimeoutAction1": { + "message": "Time-out actie" + }, "lock": { "message": "Vergrendelen", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Prullenbak", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Hersteld item" }, + "alreadyHaveAccount": { + "message": "Heb je al een account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Uitloggen ontneemt je de toegang tot je kluis en vereist online authenticatie na een periode van time-out. Weet je zeker dat je deze instelling wilt gebruiken?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Automatisch invullen en opslaan" }, + "fillAndSave": { + "message": "Invullen en opslaan" + }, "autoFillSuccessAndSavedUri": { "message": "Automatisch gevuld item en opgeslagen URI" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Je nieuwe hoofdwachtwoord voldoet niet aan de beleidseisen." }, + "receiveMarketingEmailsV2": { + "message": "Krijg advies, aankondigingen en onderzoeksmogelijkheden van Bitwarden in je inbox." + }, + "unsubscribe": { + "message": "Afmelden" + }, + "atAnyTime": { + "message": "op ieder moment." + }, + "byContinuingYouAgreeToThe": { + "message": "Door verder te gaan, ga je akkoord met de" + }, + "and": { + "message": "en" + }, "acceptPolicies": { "message": "Door dit vakje aan te vinken, ga je akkoord met het volgende:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Fout bij vernieuwen toegangstoken" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktopsynchronisatieverificatie" }, @@ -1570,10 +2246,10 @@ "message": "Browserintegratie is niet ingeschakeld in de Bitwarden-desktopapplicatie. Schakel deze optie in de instellingen binnen de desktop-applicatie in." }, "startDesktopTitle": { - "message": "Bitwarden-desktopapplicatie opstarten" + "message": "Bitwarden desktopapplicatie opstarten" }, "startDesktopDesc": { - "message": "Je moet de Bitwarden-desktopapplicatie starten om deze functie te gebruiken." + "message": "Je moet de Bitwarden desktopapplicatie starten om deze functie te gebruiken." }, "errorEnableBiometricTitle": { "message": "Kon biometrie niet inschakelen" @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Accounts komt niet overeen" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometrische sleutel discrepantie" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrische ontgrendelen mislukt. De biometrische geheime sleutel kon de kluis niet ontgrendelen. Probeer biometrische gegevens opnieuw in te stellen." + }, "biometricsNotEnabledTitle": { "message": "Biometrie niet ingeschakeld" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Dit apparaat ondersteunt geen browserbiometrie." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometrisch ontgrendelen niet beschikbaar" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrische ontgrendeling is momenteel niet beschikbaar. Probeer het later opnieuw." + }, "biometricsFailedTitle": { "message": "Biometrie mislukt" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Een organisatiebeleid heeft invloed op je eigendomsopties." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Organisatiebeleid heeft het importeren van items in je persoonlijke kluis geblokkeerd." + }, + "domainsTitle": { + "message": "Domeinen", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Uitgesloten domeinen" }, "excludedDomainsDesc": { "message": "Bitwarden zal voor deze domeinen niet vragen om inloggegevens op te slaan. Je moet de pagina vernieuwen om de wijzigingen toe te passen." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden zal voor deze domeinen niet vragen om de wachtwoorden op te slaan voor alle ingelogde accounts. Je moet de pagina verversen om de wijzigingen op te slaan." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is geen geldig domein", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Uitgesloten domeinwijzigingen opgeslagen" + }, + "limitSendViews": { + "message": "Weergaven limiteren" + }, + "limitSendViewsHint": { + "message": "Niemand kan deze Send weergeven als de limiet is bereikt.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ weergaven over", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send-details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Sends zoeken", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Te delen tekst" + }, "sendTypeFile": { "message": "Bestand" }, @@ -1666,6 +2406,9 @@ "message": "Alle Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Tekst standaard verbergen" + }, "maxAccessCountReached": { "message": "Maximum aantal keren benaderd", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Beveiligd met wachtwoord" }, + "copyLink": { + "message": "Link kopiÃĢren" + }, "copySendLink": { "message": "Send-link kopiÃĢren", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Weet je zeker dat je deze Send wilt verwijderen?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Weet je zeker dat je deze Send permanent wil verwijderen?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Send bewerken", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Deze Send wordt op de aangegeven datum en tijd definitief verwijderd.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Op deze datum wordt de Send definitief verwijderd.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Vervaldatum" }, @@ -1769,6 +2523,10 @@ "message": "Vereis optioneel een wachtwoord voor gebruikers om toegang te krijgen tot deze Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Voeg een optioneel wachtwoord toe voor ontvangers om toegang te krijgen tot deze Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "PrivÊnotities over deze Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send aangemaakt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send succesvol aangemaakt!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "De Send is het komende uur beschikbaar voor iedereen met de link.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "De Send is de komende $HOURS$ uur beschikbaar voor iedereen met de link.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "De Send is de komende dag beschikbaar voor iedereen met de link.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "De Send is de komende $DAYS$ dagen beschikbaar voor iedereen met de link.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send-link gekopieerd", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send bewerkt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Extensie uitklappen?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Om een bestand te versturen via Send, moet je de extensie naar een nieuw venster uitklappen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Om een bestand te kiezen open je de extensie in de zijbalk (indien mogelijk) of pop-out naar een nieuw venster door op deze banner te klikken." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Om een bestand te kiezen met Safari, open je een nieuw pop-up-venster door op deze banner te klikken." }, + "popOut": { + "message": "Uitklappen" + }, "sendFileCalloutHeader": { "message": "Voor je begint" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Verberg mijn e-mailadres voor ontvangers." }, + "hideYourEmail": { + "message": "Je e-mailadres voor ontvangers verbergen." + }, "sendOptionsPolicyInEffect": { "message": "Een of meer organisatiebeleidseisen heeft invloed op de mogelijkheden van je Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "E-mailverificatie vereist" }, + "emailVerifiedV2": { + "message": "E-mailadres geverifieerd" + }, "emailVerificationRequiredDesc": { "message": "Je moet je e-mailadres verifiÃĢren om deze functie te gebruiken. Je kunt je e-mailadres verifiÃĢren in de kluis." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Je hoofdwachtwoord voldoet niet aan en of meerdere oganisatiebeleidsonderdelen. Om toegang te krijgen tot de kluis, moet je je hoofdwachtwoord nu bijwerken. Doorgaan zal je huidige sessie uitloggen, waarna je opnieuw moet inloggen. Actieve sessies op andere apparaten blijven mogelijk nog een uur actief." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Je organisatie heeft het versleutelen van vertrouwde apparaten uitgeschakeld. Stel een hoofdwachtwoord in om toegang te krijgen tot je kluis." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatische inschrijving" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Map selecteren..." }, - "ssoCompleteRegistration": { - "message": "Voor het inloggen met SSO moet je een hoofdwachtwoord instellen voor toegang tot en bescherming van je kluis." + "noFoldersFound": { + "message": "Geen mappen gevonden", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "van $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verificatie vereist", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Uren" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minuten" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Bedrijfsbeleidseisen zijn toegepast op je time-out instellingen" + }, "vaultTimeoutPolicyInEffect": { "message": "Het beleid van je organisatie heeft invloed op de time-out van je kluis. De maximaal toegestane kluis time-out is $HOURS$ uur en $MINUTES$ minuten.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ uur en $MINUTES$ minu(u)t(en) maximaal.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Time-out overschrijdt de beperking van je organisatie: $HOURS$ uur en $MINUTES$ minu(u) t(en) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "De beleidsinstellingen van je organisatie hebben invloed op de time-out van je kluis. De maximale toegestane kluis time-out is $HOURS$ uur en $MINUTES$ minuten. Jouw time-out is ingesteld op $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Organisatiekluis exporteren" + }, + "exportingOrganizationVaultDesc": { + "message": "Exporteert alleen de organisatiekluis van $ORGANIZATION$. Geen persoonlijke kluis-items of items van andere organisaties.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Fout" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Gebruikersnamen genereren" }, + "generateEmail": { + "message": "E-mailadres genereren" + }, + "generatorBoundariesHint": { + "message": "Waarde moet tussen $MIN$ en $MAX$ liggen", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Type gebruikersnaam" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Genereer een e-mailalias met een externe doorschakelservice." }, + "forwarderDomainName": { + "message": "E-maildomein", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Kies een domein dat wordt ondersteund door de geselecteerde dienst", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Gegenereerd door Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostnaam", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Hoe automatisch aanvullen" }, "autofillSelectInfoWithCommand": { - "message": "Selecteer een item op deze pagina of gebruik de snelkoppeling: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Selecteer een item op deze pagina of stel een snelkoppeling in via instellingen." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Ik snap het" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Instellingen automatisch invullen" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Shortcut voor automatisch invullen" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Snelkoppeling wijzigen" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Snelkoppelingen beheren" + }, "autofillShortcut": { "message": "Snelkoppeling automatisch invullen" }, - "autofillShortcutNotSet": { - "message": "De sneltoets voor automatisch invullen is niet ingesteld. Wijzig dit in de instellingen van de browser." + "autofillLoginShortcutNotSet": { + "message": "De sneltoets voor automatisch invullen is niet ingesteld. Je kunt dit in de instellingen van de browser wijzigen." }, - "autofillShortcutText": { - "message": "De sneltoets voor automatisch invullen is: $COMMAND$. Wijzig dit in de instellingen van de browser.", + "autofillLoginShortcutText": { + "message": "De sneltoets voor automatisch invullen is $COMMAND$. Je kunt alle sneltoetsen in de instellingen van de browser wijzigen.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Inloggen op" - }, "opensInANewWindow": { "message": "Opent in een nieuw venster" }, @@ -2260,21 +3270,36 @@ "ssoIdentifierRequired": { "message": "Organisatie SSO-identificatie vereist." }, + "creatingAccountOn": { + "message": "Account maken bij" + }, + "checkYourEmail": { + "message": "Check je e-mail" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Volg de link in de e-mail die verstuurd is naar" + }, + "andContinueCreatingYourAccount": { + "message": "en ga verder met het aanmaken van je account." + }, + "noEmail": { + "message": "Geen e-mail?" + }, + "goBack": { + "message": "Ga terug" + }, + "toEditYourEmailAddress": { + "message": "om je e-mailadres te bewerken." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Toegang geweigerd. Je hebt geen toestemming om deze pagina te bekijken." }, "general": { - "message": "General" + "message": "Algemeen" }, "display": { "message": "Display" @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Vertrouwd apparaat" }, + "sendsNoItemsTitle": { + "message": "Geen actieve Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Gebruik Send voor het veilig delen van versleutelde informatie met wie dan ook.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Invoer vereist." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 veld heeft je aandacht nodig." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ velden hebben je aandacht nodig.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Selecteer --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "In-/Uitklappen", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Gegevens importeren naar Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Je LastPass-gegevens beschermen en naar Bitwarden importeren?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Als niet-versleuteld bestand opslaan", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Naar Bitwarden importeren", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importeren...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Gegevens succesvol geïmporteerd!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Fout bij importeren. Controleer console voor meer informatie.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Netwerkfout opgetreden tijdens het importeren.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Aliasdomein" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Zijnavigatie schakelen" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Menuknop Bitwarden automatisch invullen", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Bitwarden auto-invulmenu in- en uitschakelen", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden auto-invulmenu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Ontgrendel je account om overeenkomende logins te bekijken", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Je account ontgrendelen om suggesties voor automatisch inloggen te bekijken", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Account ontgrendelen", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Je account ontgrendelen, opent in een nieuw venster", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Inloggegevens invullen voor", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Gedeeltelijke gebruikersnaam", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Geen items om weer te geven", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nieuw item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Nieuwe kluisitem toevoegen", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Nieuwe login", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Nieuw inlogitem aan kluis toevoegen, openen in een nieuw venster", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Nieuwe kaart", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Nieuw item aan kluis toevoegen, openen in een nieuw venster", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Nieuwe identiteit", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Nieuw identiteitsitem aan kluis toevoegen, openen in een nieuw venster", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden auto-invulmenu beschikbaar. Druk op de pijltjestoets omlaag om te selecteren.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Inschakelen" + }, + "ignore": { + "message": "Negeren" + }, + "importData": { + "message": "Data importeren", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Fout bij importeren" + }, + "importErrorDesc": { + "message": "Er was een probleem met de data die je probeerde te importeren. Los de onderstaande fouten op in het bronbestand en probeer het opnieuw." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Los onderstaande fouten op en probeer het opnieuw." + }, + "description": { + "message": "Omschrijving" + }, + "importSuccess": { + "message": "Data succesvol geïmporteerd" + }, + "importSuccessNumberOfItems": { + "message": "Een totaal van $AMOUNT$ items zijn geïmporteerd.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Opnieuw proberen" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Deze actie vereist verificatie actie. Stel een pincode in om door te gaan." + }, + "setPin": { + "message": "Pincode instellen" + }, + "verifyWithBiometrics": { + "message": "Biometrisch ontgrendelen" + }, + "awaitingConfirmation": { + "message": "Wacht op bevestiging" + }, + "couldNotCompleteBiometrics": { + "message": "Kon biometrie niet afronden." + }, + "needADifferentMethod": { + "message": "Een andere methode proberen?" + }, + "useMasterPassword": { + "message": "Hoofdwachtwoord gebruiken" + }, + "usePin": { + "message": "Pincode gebruiken" + }, + "useBiometrics": { + "message": "Biometrie gebruiken" + }, + "enterVerificationCodeSentToEmail": { + "message": "Voer de verificatiecode in die naar je e-mail is gestuurd." + }, + "resendCode": { + "message": "Code opnieuw sturen" + }, + "total": { + "message": "Totaal" + }, + "importWarning": { + "message": "Je importeert gegevens naar $ORGANIZATION$. Je gegevens kunnen gedeeld worden met de leden van deze organisatie. Wil je doorgaan?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Fout bij het verbinden met de Duo-service. Gebruik een andere tweestapsaanmeldingsmethode of neem contact op met Duo voor hulp." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Jouw account vereist Duo-tweestapsaanmelding." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Open de extensie om in te loggen." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "De gegevens zijn niet correct opgemaakt. Controleer je importbestand en probeer het opnieuw." + }, + "importNothingError": { + "message": "Er is niets geïmporteerd." + }, + "importEncKeyError": { + "message": "Fout bij het decoderen van het geÃĢxporteerde bestand. Je encryptiesleutel komt niet overeen met de gebruikte sleutel waarmee de gegevens zijn geÃĢxporteerd." + }, + "invalidFilePassword": { + "message": "Onjuist bestandswachtwoord, gebruik het wachtwoord dat je hebt ingevoerd bij het aanmaken van het exportbestand." + }, + "destination": { + "message": "Bestemming" + }, + "learnAboutImportOptions": { + "message": "Leer meer over je importopties" + }, + "selectImportFolder": { + "message": "Map selecteren" + }, + "selectImportCollection": { + "message": "Collectie selecteren" + }, + "importTargetHint": { + "message": "Kies deze optie als je de geïmporteerde bestandsinhoud wilt verplaatsen naar een $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Bestand bevat niet-toegewezen items." + }, + "selectFormat": { + "message": "Formaat van het importbestand kiezen" + }, + "selectImportFile": { + "message": "Importbestand kiezen" + }, + "chooseFile": { + "message": "Bestand kiezen" + }, + "noFileChosen": { + "message": "Geen bestand gekozen" + }, + "orCopyPasteFileContents": { + "message": "of kopieer en plak de inhoud van het importbestand" + }, + "instructionsFor": { + "message": "Instructies voor $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Kluisimport bevestigen" + }, + "confirmVaultImportDesc": { + "message": "Dit bestand is beveiligd met een wachtwoord. Voer het bestandswachtwoord in om gegevens te importeren." + }, + "confirmFilePassword": { + "message": "Bestandswachtwoord bevestigen" + }, + "exportSuccess": { + "message": "Kluisgegevens geÃĢxporteerd" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Toegang verkrijgen" + }, + "passkeyNotCopied": { + "message": "Passkey wordt niet gekopieerd" + }, + "passkeyNotCopiedAlert": { + "message": "De passkey wordt niet gekopieerd naar het gekloonde item. Wil je doorgaan met het klonen van dit item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "De initiÃĢrende site vereist verificatie. Deze functie is nog niet geïmplementeerd voor accounts zonder hoofdwachtwoord." + }, + "logInWithPasskeyQuestion": { + "message": "Inloggen met passkey?" + }, + "passkeyAlreadyExists": { + "message": "Er bestaat al een passkey voor deze applicatie." + }, + "noPasskeysFoundForThisApplication": { + "message": "Geen passkeys gevonden voor deze applicatie." + }, + "noMatchingPasskeyLogin": { + "message": "Je hebt geen overeenkomende login voor deze site." + }, + "noMatchingLoginsForSite": { + "message": "Geen overeenkomende logins voor deze site" + }, + "searchSavePasskeyNewLogin": { + "message": "Passkey zoeken of als nieuwe login opslaan" + }, + "confirm": { + "message": "Bevestigen" + }, + "savePasskey": { + "message": "Passkey opslaan" + }, + "savePasskeyNewLogin": { + "message": "Passkey als nieuwe login opslaan" + }, + "chooseCipherForPasskeySave": { + "message": "Kies een login om deze passkey bij op te slaan" + }, + "chooseCipherForPasskeyAuth": { + "message": "Kies een passkey om mee in te loggen" + }, + "passkeyItem": { + "message": "Passkey-Item" + }, + "overwritePasskey": { + "message": "Passkey overschrijven?" + }, + "overwritePasskeyAlert": { + "message": "Dit item bevat al een passkey. Weet je zeker dat je de huidige passkey wilt overschrijven?" + }, + "featureNotSupported": { + "message": "Functie nog niet ondersteund" + }, + "yourPasskeyIsLocked": { + "message": "Authenticatie vereist om passkey te gebruiken. Verifieer je identiteit om door te gaan." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor-authenticatie geannuleerd" + }, + "noLastPassDataFound": { + "message": "Geen LastPass-gegevens gevonden" + }, + "incorrectUsernameOrPassword": { + "message": "Onjuiste gebruikersnaam of wachtwoord" + }, + "incorrectPassword": { + "message": "Wachtwoord onjuist" + }, + "incorrectCode": { + "message": "Code onjuist" + }, + "incorrectPin": { + "message": "Pincode onjuist" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor-authenticatie mislukt" + }, + "includeSharedFolders": { + "message": "Gedeelde mappen insluiten" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Account impoteren..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor-authenticatie vereist" + }, + "lastPassMFADesc": { + "message": "Voer je eenmalige toegangscode van je authenticatie-app in" + }, + "lastPassOOBDesc": { + "message": "Bevestig het inlogverzoek in je authenticatie-app of voer een eenmalige toegangscode in." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass-hoofdwachtwoord" + }, + "lastPassAuthRequired": { + "message": "LastPass-authenticatie vereist" + }, + "awaitingSSO": { + "message": "Wacht op SSO-authenticatie" + }, + "awaitingSSODesc": { + "message": "Ga door met inloggen met de inloggegevens van je bedrijf." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Rechtstreeks vanuit LastPass importeren" + }, + "importFromCSV": { + "message": "Vanuit CSV importeren" + }, + "lastPassTryAgainCheckEmail": { + "message": "Probeer het opnieuw of zoek naar een e-mailbericht van LastPass om te verifiÃĢren dat jij het bent." + }, + "collection": { + "message": "Collectie" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Beschikbare accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Veelvoorkomende formaten", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Doorgaan naar browserinstellingen?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Doorgaan naar Helpcentrum?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "De instellingen voor het beheer van je browser's automatisch invullen en wachtwoorden veranderen.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "Je kunt sneltoetsen van de extensie bekijken en instellen in de instellingen van je browser.", + "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": "De instellingen voor het beheer van je browser's automatisch invullen en wachtwoorden veranderen.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "Je kunt sneltoetsen van de extensie bekijken en instellen in de instellingen van je browser.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Bitwarden als je standaardwachtbeheerder gebruiken?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Deze optie negeren kan tot conflicten leiden tussen het automatisch invullen van Bitwarden en dat van je browser.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Maak van Bitwarden je standaardwachtbeheerder", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Kan Bitwarden niet als standaardwachtbeheerder instellen", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Je moet Bitwarden browser-privacyrechten geven aan om deze in te stellen als standaard wachtwoordmanager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Standaard maken", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Wachtwoord opgeslagen!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Wachtwoord bijgewerkt!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Succes" + }, + "removePasskey": { + "message": "Passkey verwijderen" + }, + "passkeyRemoved": { + "message": "Passkey verwijderd" + }, + "autofillSuggestions": { + "message": "Suggesties voor automatisch invullen" + }, + "autofillSuggestionsTip": { + "message": "Inlogitem opslaan voor automatisch invullen op deze site" + }, + "yourVaultIsEmpty": { + "message": "Je kluis is leeg" + }, + "noItemsMatchSearch": { + "message": "Geen items voldoen aan je zoekopdracht" + }, + "clearFiltersOrTryAnother": { + "message": "Wis filters of probeer een andere zoekterm" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Automatisch invullen - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Geen waarden om te kopiÃĢren" + }, + "assignToCollections": { + "message": "Aan collecties toewijzen" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Accountbeveiliging" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Uiterlijk" + }, + "errorAssigningTargetCollection": { + "message": "Fout bij toewijzen doelverzameling." + }, + "errorAssigningTargetFolder": { + "message": "Fout bij toewijzen doelmap." + }, + "viewItemsIn": { + "message": "Items weergeven in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Terug naar $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Verwijder $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items zonder map" + }, + "itemDetails": { + "message": "Itemdetails" + }, + "itemName": { + "message": "Itemnaam" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organisatie is gedeactiveerd" + }, + "owner": { + "message": "Eigenaar" + }, + "selfOwnershipLabel": { + "message": "Jij", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in een gedeactiveerde organisatie zijn niet toegankelijk. Neem contact op met de eigenaar van je organisatie voor hulp." + }, + "additionalInformation": { + "message": "Aanvullende informatie" + }, + "itemHistory": { + "message": "Itemgeschiedenis" + }, + "lastEdited": { + "message": "Laatst gewijzigd" + }, + "ownerYou": { + "message": "Eigenaar: Jij" + }, + "linked": { + "message": "Gekoppeld" + }, + "copySuccessful": { + "message": "KopiÃĢren gelukt" + }, + "upload": { + "message": "Uploaden" + }, + "addAttachment": { + "message": "Bijlage toevoegen" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximale bestandsgrootte is 500 MB" + }, + "deleteAttachmentName": { + "message": "Bijlage $NAME$ verwijderen", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "$NAME$ downloaden", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Weet je zeker dat je deze bijlage definitief wilt verwijderen?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Gratis organisaties kunnen geen bijlagen gebruiken" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Persoonlijke gegevens" + }, + "identification": { + "message": "Identificatie" + }, + "contactInfo": { + "message": "Contactgegevens" + }, + "downloadAttachment": { + "message": "$ITEMNAME$ downloaden", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "kaartnummer eindigt met", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Inloggegevens" + }, + "authenticatorKey": { + "message": "Authenticatiesleutel" + }, + "autofillOptions": { + "message": "Instellingen automatisch invullen" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website toegevoegd" + }, + "addWebsite": { + "message": "Website toevoegen" + }, + "deleteWebsite": { + "message": "Website verwijderen" + }, + "defaultLabel": { + "message": "Standaard ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Overeenkomstdetectie weergeven $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Overeenkomstdetectie verbergen $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Automatisch invullen bij laden van pagina?" + }, + "cardExpiredTitle": { + "message": "Verlopen kaart" + }, + "cardExpiredMessage": { + "message": "Als je het hebt vernieuwd, werk dan de informatie van de kaart bij" + }, + "cardDetails": { + "message": "Kaartgegevens" + }, + "cardBrandDetails": { + "message": "", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Animaties inschakelen" + }, + "showAnimations": { + "message": "Animaties weergeven" + }, + "addAccount": { + "message": "Account toevoegen" + }, + "loading": { + "message": "Laden" + }, + "data": { + "message": "Gegevens" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Wachtwoorden", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Inloggen met passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Toewijzen" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Alleen organisatieleden met toegang tot deze collecties kunnen de items zien." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Alleen organisatieleden met toegang tot deze collecties kunnen de items zien." + }, + "bulkCollectionAssignmentWarning": { + "message": "Je hebt $TOTAL_COUNT$ items geselecteerd. Je kunt $READONLY_COUNT$ items niet bijwerken omdat je geen bewerkrechten hebt.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Veld toevoegen" + }, + "add": { + "message": "Toevoegen" + }, + "fieldType": { + "message": "Veldtype" + }, + "fieldLabel": { + "message": "Veldlabel" + }, + "textHelpText": { + "message": "Gebruik tekstvelden voor data zoals beveiligingsvragen" + }, + "hiddenHelpText": { + "message": "Gebruik verborgen velden voor gevoelige gegevens zoals een wachtwoord" + }, + "checkBoxHelpText": { + "message": "Gebruik aanvinkvakjes als je een formulier automatisch wilt invullen, zoals e-mailadres herinneren" + }, + "linkedHelpText": { + "message": "Gebruik een gekoppeld veld als je problemen ervaart met het automatisch invullen voor een specifieke website." + }, + "linkedLabelHelpText": { + "message": "Html-id, naam, aria-label of placeholder van het veld invullen." + }, + "editField": { + "message": "Veld bewerken" + }, + "editFieldLabel": { + "message": "$LABEL$ bewerken", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "$LABEL$ verwijderen", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ toegevoegd", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "$LABEL$ herschikken. Gebruik de pijltjestoets om het item omhoog of omlaag te verplaatsen.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ is naar boven verplaatst, positie $INDEX$ van $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Collecties voor toewijzen selecteren" + }, + "personalItemTransferWarningSingular": { + "message": "1 item wordt permanent overgedragen aan de geselecteerde organisatie. Je bent niet langer de eigenaar van dit item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items worden permanent overgedragen aan de geselecteerde organisatie. Je bent niet langer de eigenaar van deze items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item wordt permanent overgedragen aan $ORG$. Je bent niet langer de eigenaar van dit item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items worden permanent overgedragen aan $ORG$. Je bent niet langer de eigenaar van deze items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Succesvol toegewezen collecties" + }, + "nothingSelected": { + "message": "Je hebt niets geselecteerd." + }, + "movedItemsToOrg": { + "message": "Geselecteerde items verplaatst naar $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items verplaatst naar $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Items verplaatst naar $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ is naar boven verplaatst, positie $INDEX$ van $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Itemlocatie" + }, + "fileSend": { + "message": "Bestand-Sends" + }, + "fileSends": { + "message": "Bestand-Sends" + }, + "textSend": { + "message": "Tekst-Sends" + }, + "textSends": { + "message": "Tekst-Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden heeft een nieuw uiterlijk!" + }, + "bitwardenNewLookDesc": { + "message": "Automatisch invullen en zoeken is makkelijker en intuïtiever dan ooit vanaf het tabblad Kluis. Kijk rond!" + }, + "accountActions": { + "message": "Accountacties" + }, + "showNumberOfAutofillSuggestions": { + "message": "Aantal login-autofill-suggesties op het extensie-pictogram weergeven" + }, + "systemDefault": { + "message": "Systeemstandaard" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Bedrijfsbeleidseisen zijn op deze instelling toegepast" + }, + "sshPrivateKey": { + "message": "PrivÊsleutel" + }, + "sshPublicKey": { + "message": "Publieke sleutel" + }, + "sshFingerprint": { + "message": "Vingerafdruk" + }, + "sshKeyAlgorithm": { + "message": "Sleuteltype" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-bit" + }, + "retry": { + "message": "Opnieuw proberen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimale aangepaste time-out is 1 minuut." + }, + "additionalContentAvailable": { + "message": "Extra inhoud beschikbaar" + }, + "fileSavedToDevice": { + "message": "Bestand op apparaat opgeslagen. Beheer vanaf de downloads op je apparaat." + }, + "showCharacterCount": { + "message": "Aantal tekens weergeven" + }, + "hideCharacterCount": { + "message": "Aantal tekens verbergen" + }, + "itemsInTrash": { + "message": "Items in prullenbak" + }, + "noItemsInTrash": { + "message": "Geen items in prullenbak" + }, + "noItemsInTrashDesc": { + "message": "Items die je verwijdert verschijnen hier en worden na 30 dagen definitief verwijderd" + }, + "trashWarning": { + "message": "Items die meer dan 30 dagen in de prullenbak zitten worden automatisch verwijderd" + }, + "restore": { + "message": "Herstellen" + }, + "deleteForever": { + "message": "Definitief verwijderen" + }, + "noEditPermissions": { + "message": "Je hebt geen toestemming om dit item te bewerken" + }, + "authenticating": { + "message": "Aan het inloggen" + }, + "fillGeneratedPassword": { + "message": "Gegenereerd wachtwoordin vullen", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Wachtwoord opnieuw gegenereerd", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Login opslaan in Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Spatie", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Uitroepteken", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "Apenstaartje", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hekje", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollarteken", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Procentteken", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Dakje", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "En-teken", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Sterretje", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Haakje opnenen", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Haakje sluiten", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Liggend streepje", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Koppelteken", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Gelijkteken", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Accolade openen", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Accolade sluiten", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Blokhaak openen", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Blokhaak sluiten", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Verticale streep", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Backslash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Dubbele punt", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Puntkomma", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Dubbel aanhalingsteken", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Enkel aanhalingsteken", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Kleiner dan", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Groter dan", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Komma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Punt", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Vraagteken", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Kleine letters" + }, + "uppercaseAriaLabel": { + "message": "Hoofdletters" + }, + "generatedPassword": { + "message": "Gegenereerd wachtwoord" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index bf1eedd8261..a4668a65add 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-fill" + "message": "Autofill" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,7 +223,7 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Add a login" @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index bf1eedd8261..a4668a65add 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-fill" + "message": "Autofill" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,7 +223,7 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Add a login" @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 296c76ddbd1..b8a1f1a2e02 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - darmowy menedÅŧer haseł", + "message": "MenedÅŧer Haseł Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bezpieczny i darmowy menedÅŧer haseł dla wszystkich Twoich urządzeń.", - "description": "Extension description" + "message": "W domu, w pracy, lub w ruchu, Bitwarden z łatwością zabezpiecza Twoje hasła, passkeys i poufne informacje", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Zaloguj się lub utwÃŗrz nowe konto, aby uzyskać dostęp do Twojego bezpiecznego sejfu." }, + "inviteAccepted": { + "message": "Zaproszenie zostało zaakceptowane" + }, "createAccount": { "message": "UtwÃŗrz konto" }, - "login": { - "message": "Zaloguj się" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Ustaw silne hasło" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Ukończ tworzenie konta poprzez utworzenie hasła" }, "enterpriseSingleSignOn": { "message": "Logowanie jednokrotne" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "PodpowiedÅē do hasła gÅ‚Ãŗwnego moÅŧe pomÃŗc Ci przypomnieć hasło, jeśli je zapomnisz." }, + "masterPassHintText": { + "message": "Jeśli zapomnisz hasła, podpowiedÅē hasła moÅŧe zostać wysłana na TwÃŗj adres e-mail. $CURRENT$ z $MAXIMUM$ znakÃŗw.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Wpisz ponownie hasło gÅ‚Ãŗwne" }, "masterPassHint": { "message": "PodpowiedÅē do hasła gÅ‚Ãŗwnego (opcjonalnie)" }, + "joinOrganization": { + "message": "Dołącz do organizacji" + }, + "joinOrganizationName": { + "message": "Dołącz do $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Zakończ dołączanie do tej organizacji przez ustawienie hasła gÅ‚Ãŗwnego." + }, "tab": { "message": "Karta" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopiuj hasło" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Kopiuj notatkę" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopiuj kod zabezpieczający" }, + "copyName": { + "message": "Kopiuj nazwę" + }, + "copyCompany": { + "message": "Kopiuj firmę" + }, + "copySSN": { + "message": "Kopiuj numer PESEL" + }, + "copyPassportNumber": { + "message": "Kopiuj numer paszportu" + }, + "copyLicenseNumber": { + "message": "Kopiuj numer licencji" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Kopiuj $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiuj stronę internetową" + }, + "copyNotes": { + "message": "Kopiuj notatki" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Autouzupełnianie" }, + "autoFillLogin": { + "message": "Autouzupełnianie logowania" + }, + "autoFillCard": { + "message": "Autouzupełnianie karty" + }, + "autoFillIdentity": { + "message": "Autouzupełnianie toÅŧsamości" + }, "generatePasswordCopied": { "message": "Wygeneruj hasło (do schowka)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Brak pasujących danych logowania" }, + "noCards": { + "message": "Brak kart" + }, + "noIdentities": { + "message": "Brak toÅŧsamości" + }, + "addLoginMenu": { + "message": "Dodaj dane logowania" + }, + "addCardMenu": { + "message": "Dodaj kartę" + }, + "addIdentityMenu": { + "message": "Dodaj toÅŧsamość" + }, "unlockVaultMenu": { "message": "Odblokuj sejf" }, @@ -107,7 +223,7 @@ "message": "Zaloguj się do sejfu" }, "autoFillInfo": { - "message": "Brak dostępnych danych logowania do autouzupełnienia dla obecnej karty przeglądarki." + "message": "Brak danych logowania do uÅŧycia przez autouzupełnienie na obecnej karcie przeglądarki." }, "addLogin": { "message": "Dodaj dane logowania" @@ -115,6 +231,18 @@ "addItem": { "message": "Dodaj element" }, + "accountEmail": { + "message": "Adres e-mail konta" + }, + "requestHint": { + "message": "Poproś o podpowiedÅē" + }, + "requestPasswordHint": { + "message": "Poproś o podpowiedÅē do hasła" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "WprowadÅē adres e-mail swojego konta, a podpowiedÅē hasła zostanie wysłana do Ciebie" + }, "passwordHint": { "message": "PodpowiedÅē do hasła" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "PotwierdÅē swoją toÅŧsamość, aby kontynuować." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Zmień hasło gÅ‚Ãŗwne" }, + "continueToWebApp": { + "message": "Kontynuować do aplikacji internetowej?" + }, + "continueToWebAppDesc": { + "message": "Odkryj więcej funkcji swojego konta Bitwarden w aplikacji internetowej." + }, + "continueToHelpCenter": { + "message": "Kontynuować do centrum pomocy?" + }, + "continueToHelpCenterDesc": { + "message": "Dowiedz się więcej o tym, jak korzystać z centrum pomocy Bitwarden." + }, + "continueToBrowserExtensionStore": { + "message": "Kontynuować do sklepu z rozszerzeniami przeglądarki?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "PomÃŗÅŧ innym dowiedzieć się, czy Bitwarden jest dla nich odpowiedni. OdwiedÅē swÃŗj sklep z rozszerzeniami do przeglądarki i zostaw ocenę." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "MoÅŧesz zmienić swoje hasło gÅ‚Ãŗwne w aplikacji internetowej Bitwarden." + }, "fingerprintPhrase": { "message": "Unikalny identyfikator konta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Wyloguj się" }, + "aboutBitwarden": { + "message": "O Bitwarden" + }, "about": { "message": "O aplikacji" }, + "moreFromBitwarden": { + "message": "Więcej od Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Kontynuować do bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden dla biznesu" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator pozwala na przechowywanie kluczy uwierzytelniających i generowanie kodÃŗw TOTP do dwuetapowego procesu weryfikacji. Dowiedz się więcej na stronie bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "MenedÅŧer sekretÃŗw Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bezpiecznie przechowuj, zarządzaj i udostępniaj sekrety programistÃŗw z MenedÅŧerem sekretÃŗw Bitwarden. Dowiedz się więcej na stronie bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "TwÃŗrz przyjemne i bezpieczne doświadczenia z logowaniem wolne od tradycyjnych haseł za pomocą Passwordless.dev. Dowiedz się więcej na stronie bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Darmowy plan rodzinny" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Masz prawo do bezpłatengo planu rodzinnego Bitwarden. Zrealizuj tę ofertę juÅŧ dziś w aplikacji internetowej." + }, "version": { "message": "Wersja" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edytuj folder" }, + "newFolder": { + "message": "Nowy folder" + }, + "folderName": { + "message": "Nazwa folderu" + }, + "folderHintText": { + "message": "ZagnieÅŧdÅŧaj foldery dodając nazwę folderu nadrzędnego, a następnie “/”. Przykład: Społeczne/Fora" + }, + "noFoldersAdded": { + "message": "Nie dodano folderÃŗw" + }, + "createFoldersToOrganize": { + "message": "TwÃŗrz foldery, aby zorganizować elementy swojego sejfu" + }, + "deleteFolderPermanently": { + "message": "Czy na pewno chcesz trwale usunąć ten folder?" + }, "deleteFolder": { "message": "Usuń folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatycznie wygeneruj silne, unikatowe hasła dla swoich loginÃŗw." }, - "bitWebVault": { - "message": "Sejf internetowy Bitwarden" + "bitWebVaultApp": { + "message": "Aplikacja internetowa Bitwarden" }, "importItems": { "message": "Importuj elementy" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Wygeneruj hasło" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Wygeneruj ponownie hasło" }, @@ -244,17 +447,60 @@ "length": { "message": "Długość" }, + "passwordMinLength": { + "message": "Minimalna długość hasła" + }, "uppercase": { - "message": "Wielkie litery (A-Z)" + "message": "Wielkie litery (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Małe litery (a-z)" + "message": "Małe litery (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Cyfry (0-9)" + "message": "Cyfry (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Znaki specjalne (!@#$%^&*)" + "message": "Znaki specjalne (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Uwzględnij", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Uwzględnij wielkie litery", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Uwzględnij małe litery", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Uwzględnij cyfry", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Uwzględnij znaki specjalne", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Liczba sÅ‚Ãŗw" @@ -276,7 +522,16 @@ "message": "Minimalna liczba znakÃŗw specjalnych" }, "avoidAmbChar": { - "message": "Unikaj niejednoznacznych znakÃŗw" + "message": "Unikaj niejednoznacznych znakÃŗw", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Unikaj niejednoznacznych znakÃŗw", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Wymagania polityki przedsiębiorstwa zostały uÅŧyte do ustawienia opcji generatora.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Szukaj w sejfie" @@ -299,15 +554,30 @@ "password": { "message": "Hasło" }, + "totp": { + "message": "Sekret uwierzytelniania" + }, "passphrase": { "message": "Hasło wyrazowe" }, "favorite": { "message": "Ulubione" }, + "unfavorite": { + "message": "Usuń z ulubionych" + }, + "itemAddedToFavorites": { + "message": "Element dodany do ulubionych" + }, + "itemRemovedFromFavorites": { + "message": "Element usunięty z ulubionych" + }, "notes": { "message": "Notatki" }, + "privateNote": { + "message": "Prywatna notatka" + }, "note": { "message": "Notatka" }, @@ -326,6 +596,18 @@ "launch": { "message": "Uruchom" }, + "launchWebsite": { + "message": "OtwÃŗrz stronę" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Strona" }, @@ -338,9 +620,24 @@ "other": { "message": "Inne" }, + "unlockMethods": { + "message": "Odblokuj Opcje" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Ustaw metodę odblokowania, aby zmienić czas blokowania sejfu." }, + "unlockMethodNeeded": { + "message": "Ustaw metodę odblokowania w Ustawieniach" + }, + "sessionTimeoutHeader": { + "message": "Limit czasu sesji" + }, + "vaultTimeoutHeader": { + "message": "Blokowanie sejfu" + }, + "otherOptions": { + "message": "Pozostałe opcje" + }, "rateExtension": { "message": "Oceń rozszerzenie" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Sejf jest zablokowany. Zweryfikuj swoją toÅŧsamość, aby kontynuować." }, + "yourVaultIsLockedV2": { + "message": "TwÃŗj sejf jest zablokowany" + }, + "yourAccountIsLocked": { + "message": "Twoje konto jest zablokowane" + }, + "or": { + "message": "lub" + }, "unlock": { "message": "Odblokuj" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Blokowanie sejfu" }, + "vaultTimeout1": { + "message": "Limit czasu" + }, "lockNow": { "message": "Zablokuj" }, + "lockAll": { + "message": "Zablokuj wszystkie" + }, "immediately": { "message": "Natychmiast" }, @@ -426,6 +738,18 @@ "security": { "message": "Zabezpieczenia" }, + "confirmMasterPassword": { + "message": "PotwierdÅē hasło gÅ‚Ãŗwne" + }, + "masterPassword": { + "message": "Hasło gÅ‚Ãŗwne" + }, + "masterPassImportant": { + "message": "Twoje hasło gÅ‚Ãŗwne nie moÅŧe zostać odzyskane, jeśli je zapomnisz!" + }, + "masterPassHintLabel": { + "message": "PodpowiedÅē do hasła gÅ‚Ãŗwnego" + }, "errorOccurred": { "message": "Wystąpił błąd" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Konto zostało utworzone! Teraz moÅŧesz się zalogować." }, + "newAccountCreated2": { + "message": "Twoje nowe konto zostało utworzone!" + }, + "youHaveBeenLoggedIn": { + "message": "Zalogowano Cię!" + }, + "youSuccessfullyLoggedIn": { + "message": "Zalogowałeś się pomyślnie" + }, + "youMayCloseThisWindow": { + "message": "MoÅŧesz zamknąć to okno." + }, "masterPassSent": { "message": "Wysłaliśmy Tobie wiadomość e-mail z podpowiedzią do hasła gÅ‚Ãŗwnego." }, "verificationCodeRequired": { "message": "Kod weryfikacyjny jest wymagany." }, + "webauthnCancelOrTimeout": { + "message": "Uwierzytelnianie zostało anulowane lub trwało zbyt długo. SprÃŗbuj ponownie." + }, "invalidVerificationCode": { "message": "Kod weryfikacyjny jest nieprawidłowy" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Nie moÅŧna zastosować autouzupełnienia na tej stronie. Skopiuj i wklej informacje ręcznie." }, + "totpCaptureError": { + "message": "Nie moÅŧna zeskanować kodu QR z bieÅŧącej strony" + }, + "totpCaptureSuccess": { + "message": "Klucz uwierzytelniający został dodany" + }, + "totpCapture": { + "message": "Zeskanuj kod QR z bieÅŧącej strony" + }, + "totpHelperTitle": { + "message": "Spraw, aby dwuetapowa weryfikacja była bezproblemowa" + }, + "totpHelper": { + "message": "Bitwarden moÅŧe przechowywać i wypełniać kody weryfikacyjne. Skopiuj i wklej klucz do tego pola." + }, + "totpHelperWithCapture": { + "message": "Bitwarden moÅŧe przechowywać i wypełniać kody weryfikacyjne. Wybierz ikonę aparatu, aby zrobić zrzut ekranu z kodem QR lub skopiuj i wklej klucz do tego pola." + }, + "learnMoreAboutAuthenticators": { + "message": "Dowiedz się więcej o uwierzytelniaczach" + }, + "copyTOTP": { + "message": "Kopiuj klucz uwierzytelniający (TOTP)" + }, "loggedOut": { "message": "Wylogowano" }, + "loggedOutDesc": { + "message": "Zostałeś wylogowany z konta." + }, "loginExpired": { "message": "Twoja sesja wygasła." }, + "logIn": { + "message": "Zaloguj się" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Zrestartuj rejestrację" + }, + "expiredLink": { + "message": "Link wygasł" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Zrestartuj rejestrację lub sprÃŗbuj się zalogować." + }, + "youMayAlreadyHaveAnAccount": { + "message": "MoÅŧesz mieć juÅŧ konto" + }, "logOutConfirmation": { "message": "Czy na pewno chcesz się wylogować?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder został dodany" }, - "changeMasterPass": { - "message": "Zmień hasło gÅ‚Ãŗwne" - }, - "changeMasterPasswordConfirmation": { - "message": "Hasło gÅ‚Ãŗwne moÅŧesz zmienić na stronie sejfu bitwarden.com. Czy chcesz przejść do tej strony?" - }, "twoStepLoginConfirmation": { "message": "Logowanie dwustopniowe sprawia, Åŧe konto jest bardziej bezpieczne poprzez wymuszenie potwierdzenia logowania z innego urządzenia, takiego jak z klucza bezpieczeństwa, aplikacji uwierzytelniającej, wiadomości SMS, telefonu lub adresu e-mail. Logowanie dwustopniowe moÅŧesz włączyć w sejfie internetowym bitwarden.com. Czy chcesz przejść do tej strony?" }, + "twoStepLoginConfirmationContent": { + "message": "Spraw, aby Twoje konto było bezpieczniejsze poprzez skonfigurowanie dwustopniowego logowania w aplikacji internetowej Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Kontynuować do aplikacji internetowej?" + }, "editedFolder": { "message": "Folder został zapisany" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Nowy URI" }, + "addDomain": { + "message": "Dodaj domenę", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Element został dodany" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Poproś o dodanie danych logowania" }, + "vaultSaveOptionsTitle": { + "message": "Zapisz do ustawień sejfu" + }, "addLoginNotificationDesc": { "message": "\"Dodaj powiadomienia logowania\" automatycznie wyświetla monit o zapisanie nowych danych logowania do sejfu przy kaÅŧdym pierwszym logowaniu." }, + "addLoginNotificationDescAlt": { + "message": "Poproś o dodanie elementu, jeśli nie zostanie znaleziony w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." + }, + "showCardsInVaultView": { + "message": "PokaÅŧ karty jako sugestie autouzupełniania w widoku sejfu" + }, "showCardsCurrentTab": { "message": "PokaÅŧ karty na stronie gÅ‚Ãŗwnej" }, "showCardsCurrentTabDesc": { "message": "PokaÅŧ elementy karty na stronie gÅ‚Ãŗwnej, aby ułatwić autouzupełnianie." }, + "showIdentitiesInVaultView": { + "message": "PokaÅŧ toÅŧsamośći jako sugestie autouzupełniania w widoku sejfu" + }, "showIdentitiesCurrentTab": { "message": "PokaÅŧ toÅŧsamości na stronie gÅ‚Ãŗwnej" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Poproś o aktualizację hasła danych logowania po wykryciu zmiany w witrynie." }, + "changedPasswordNotificationDescAlt": { + "message": "Poproś o aktualizację hasła, gdy zmiana zostanie wykryta na stronie. Dotyczy wszystkich zalogowanych kont." + }, + "enableUsePasskeys": { + "message": "Pytaj o zapisywanie i uÅŧywanie passkey" + }, + "usePasskeysDesc": { + "message": "Pytaj o zapisywanie nowych passkey albo danych logowania z passkey w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." + }, "notificationChangeDesc": { "message": "Czy chcesz zaktualizować to hasło w Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Odblokuj" }, + "additionalOptions": { + "message": "Dodatkowe opcje" + }, "enableContextMenuItem": { "message": "PokaÅŧ opcje menu kontekstowego" }, "contextMenuItemDesc": { "message": "UÅŧyj drugiego kliknięcia, aby uzyskać dostęp do generowania haseł i pasujących danych logowania do witryny. " }, + "contextMenuItemDescAlt": { + "message": "UÅŧyj drugiego kliknięcia, aby uzyskać dostęp do generowania haseł i pasujących danych logowania do witryny. Dotyczy wszystkich zalogowanych kont." + }, "defaultUriMatchDetection": { "message": "Domyślne wykrywanie dopasowania", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Wybierz domyślny sposÃŗb wykrywania dopasowania adresÃŗw dla czynności takich jak autouzupełnianie." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Zmień motyw kolorystyczny aplikacji." }, + "themeDescAlt": { + "message": "Zmień kolor motywu aplikacji. Dotyczy wszystkich zalogowanych kont." + }, "dark": { "message": "Ciemny", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Eksportuj z" + }, "exportVault": { "message": "Eksportuj sejf" }, "fileFormat": { "message": "Format pliku" }, + "fileEncryptedExportWarningDesc": { + "message": "Plik będzie chroniony hasłem, ktÃŗre będzie wymagane do odszyfrowania pliku." + }, + "filePassword": { + "message": "Hasło do pliku" + }, + "exportPasswordDescription": { + "message": "Hasło będzie uÅŧywane do eksportowania i importowania pliku" + }, + "accountRestrictedOptionDescription": { + "message": "UÅŧyj klucza szyfrowania konta, pochodzącego z nazwy uÅŧytkownika konta i hasła gÅ‚Ãŗwnego, aby zaszyfrować eksport i ograniczyć import tylko do bieÅŧącego konta Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "Ustaw hasło dla pliku, aby zaszyfrować eksport i zaimportować je na dowolne konto Bitwarden przy uÅŧyciu hasła do odszyfrowania." + }, + "exportTypeHeading": { + "message": "Rodzaj eksportu" + }, + "accountRestricted": { + "message": "Konto ograniczone" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“Hasło pliku” i “PotwierdÅē hasło pliku“ nie pasują do siebie." + }, "warning": { "message": "UWAGA", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Udostępnione" }, - "learnOrg": { - "message": "Dowiedz się więcej o organizacjach" - }, - "learnOrgConfirmation": { - "message": "Bitwarden pozwala na udostępnianie zawartości sejfu innym osobom za pośrednictwem organizacji. Czy chcesz odwiedzić stronę bitwarden.com, aby dowiedzieć się więcej?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden dla biznesu pozwala na udostępnianie zawartości sejfu innym osobom za pośrednictwem organizacji. Dowiedz się wiecej na bitwarden.com." }, "moveToOrganization": { "message": "Przenieś do organizacji" @@ -762,6 +1204,9 @@ "file": { "message": "Plik" }, + "fileToShare": { + "message": "Plik do udostępnienia" + }, "selectFile": { "message": "Wybierz plik" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB miejsca na zaszyfrowane załączniki." }, + "premiumSignUpEmergency": { + "message": "Dostęp awaryjny." + }, "premiumSignUpTwoStepOptions": { "message": "Własnościowe opcje logowania dwuetapowego, takie jak YubiKey i Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Konto Premium moÅŧesz zakupić na stronie sejfu bitwarden.com. Czy chcesz otworzyć tę stronę?" }, + "premiumPurchaseAlertV2": { + "message": "MoÅŧesz kupić Premium w ustawieniach konta w aplikacji internetowej Bitwarden." + }, "premiumCurrentMember": { "message": "Posiadasz konto Premium!" }, "premiumCurrentMemberThanks": { "message": "Dziękujemy za wspieranie Bitwarden." }, + "premiumFeatures": { + "message": "Uaktualnij do wersji Premium i otrzymaj:" + }, "premiumPrice": { "message": "Wszystko to jedynie za $PRICE$ /rok!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Wszystko tylko za $PRICE$ rocznie!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "OdświeÅŧanie zostało zakończone" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Aplikacja uwierzytelniająca" }, - "authenticatorAppDesc": { - "message": "UÅŧyj aplikacji mobilnej (np. Authy lub Google Authenticator) do generowania czasowych kodÃŗw weryfikacyjnych.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "WprowadÅē kod wygenerowany przez aplikację uwierzytelniającą, jak Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "Klucz bezpieczeństwa YubiKey OTP" + "yubiKeyTitleV2": { + "message": "Klucz bezpieczeństwa Yubico OTP" }, "yubiKeyDesc": { "message": "UÅŧyj YubiKey jako metody dostępu do konta. Działa z YubiKey 4, 4 Nano, 4C i urządzeniami NEO." }, - "duoDesc": { - "message": "Weryfikacja z uÅŧyciem Duo Security poprzez aplikację Duo Mobile, SMS, połączenie telefoniczne lub klucz bezpieczeństwa U2F.", + "duoDescV2": { + "message": "WprowadÅē kod wygenerowany przez Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Adres e-mail" }, - "emailDesc": { - "message": "Kody weryfikacyjne zostaną wysłane do Ciebie wiadomością e-mail." + "emailDescV2": { + "message": "Wpisz kod wysłany na TwÃŗj adres e-mail." }, "selfHostedEnvironment": { "message": "Samodzielnie hostowane środowisko" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Wpisz podstawowy adres URL hostowanej instalacji Bitwarden." }, + "selfHostedBaseUrlHint": { + "message": "Określ bazowy adres URL swojej instalacji Bitwarden. Przykład: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Dla zaawansowanych konfiguracji moÅŧesz określić podstawowy adres URL niezaleÅŧnie dla kaÅŧdej usługi." + }, + "selfHostedEnvFormInvalid": { + "message": "Musisz dodać podstawowy adres URL serwera lub co najmniej jedno niestandardowe środowisko." + }, "customEnvironment": { "message": "Niestandardowe środowisko" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Adres URL serwera" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "Adres URL serwera API" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "Adresy URL środowiska zostały zapisane" }, + "showAutoFillMenuOnFormFields": { + "message": "PokaÅŧ menu autouzupełniania na polach formularza", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Sugestie autouzupełniania" + }, + "showInlineMenuLabel": { + "message": "PokaÅŧ sugestie autouzupełniania na polach formularza" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Pokazuj toÅŧsamości jako sugestie" + }, + "showInlineMenuCardsLabel": { + "message": "Pokazuj karty jako sugestie" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Wyświetlaj sugestie kiedy ikona jest zaznaczona" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Dotyczy wszystkich zalogowanych kont." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Wyłącz wbudowany w przeglądarkę menedÅŧera haseł, aby uniknąć konfliktÃŗw." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edytuj ustawienia przeglądarki." + }, + "autofillOverlayVisibilityOff": { + "message": "Wył.", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Gdy pole jest zaznaczone", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Gdy wybrano ikonę autouzupełniania", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Włącz autouzupełnianie po załadowaniu strony" + }, "enableAutoFillOnPageLoad": { "message": "Włącz autouzupełnianie po załadowaniu strony" }, "enableAutoFillOnPageLoadDesc": { "message": "Jeśli zostanie wykryty formularz logowania, automatycznie uzupełnij dane logowania po załadowaniu strony." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$OstrzeÅŧenie:$CLOSETAG$ Niebezpieczne witryny są w stanie wykorzystać autouzupełnianie przy wczytywaniu strony.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Zaatakowane lub niezaufane witryny internetowe mogą wykorzystać funkcję autouzupełniania podczas wczytywania strony, aby wyrządzić szkody." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Dowiedz się więcej o ryzyku" + }, "learnMoreAboutAutofill": { "message": "Dowiedz się więcej o autouzupełnianiu" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "OtwÃŗrz sejf na pasku bocznym" }, - "commandAutofillDesc": { - "message": "Autouzupełnianie korzysta z ostatnio uÅŧywanych danych logowania na tej stronie." + "commandAutofillLoginDesc": { + "message": "Autouzupełnianie korzysta z ostatnio uÅŧywanych danych logowania na tej stronie" + }, + "commandAutofillCardDesc": { + "message": "Autouzupełnianie korzysta z ostatnio uÅŧywanych danych karty na tej stronie" + }, + "commandAutofillIdentityDesc": { + "message": "Autouzupełnianie korzysta z ostatnio uÅŧywanej toÅŧsamości na tej stronie" }, "commandGeneratePasswordDesc": { "message": "Wygeneruj nowe losowe hasło i skopiuj je do schowka." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Zablokuj sejf" }, - "privateModeWarning": { - "message": "Obsługa trybu prywatnego jest eksperymentalna, a niektÃŗre funkcje są ograniczone." - }, "customFields": { "message": "Pola niestandardowe" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Wartość logiczna" }, + "cfTypeCheckbox": { + "message": "Pole wyboru" + }, "cfTypeLinked": { "message": "Powiązane pole", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "PokaÅŧ rozpoznawalny obraz obok danych logowania." }, + "faviconDescAlt": { + "message": "PokaÅŧ rozpoznawalny obraz obok kaÅŧdego logowania. Dotyczy wszystkich zalogowanych kont." + }, "enableBadgeCounter": { "message": "PokaÅŧ licznik na ikonie" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "ToÅŧsamość" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "Nowy $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edytuj $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Zobacz $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Historia hasła" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "PowrÃŗt" }, "collections": { "message": "Kolekcje" }, + "nCollections": { + "message": "Kolekcje: $COUNT$", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Ulubione" }, @@ -1282,6 +1874,10 @@ "message": "Domena podstawowa", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Domena podstawowa (rekomendowana)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Nazwa domeny", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Wykrywanie dopasowania", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Domyślne wykrywanie dopasowania", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Zmień opcje" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Brak haseł." }, + "clearHistory": { + "message": "Wyczyść historię" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Usuń" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Odblokuj kodem PIN" }, + "setYourPinTitle": { + "message": "Ustaw kod PIN" + }, + "setYourPinButton": { + "message": "Ustaw kod PIN" + }, "setYourPinCode": { "message": "Ustaw kod PIN do odblokowywania aplikacji Bitwarden. Ustawienia odblokowywania kodem PIN zostaną zresetowane po wylogowaniu." }, + "setYourPinCode1": { + "message": "TwÃŗj PIN będzie uÅŧywany do odblokowania Bitwardena zamiast hasła gÅ‚Ãŗwnego. TwÃŗj kod PIN zostanie zresetowany jeśli kiedykolwiek wylogujesz się z Bitwarden." + }, "pinRequired": { "message": "Kod PIN jest wymagany." }, "invalidPin": { "message": "Kod PIN jest nieprawidłowy." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Zbyt wiele nieprawidłowych prÃŗb wpisywania PIN. Wylogowywanie." + }, "unlockWithBiometrics": { "message": "Odblokuj danymi biometrycznymi" }, + "unlockWithMasterPassword": { + "message": "Odblokuj za pomocą gÅ‚Ãŗwnego hasła" + }, "awaitDesktop": { "message": "Oczekiwanie na potwierdzenie z aplikacji desktopowej" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Zablokuj hasłem gÅ‚Ãŗwnym po uruchomieniu przeglądarki" }, + "lockWithMasterPassOnRestart1": { + "message": "Wymagaj hasła gÅ‚Ãŗwnego przy ponownym uruchomieniu przeglądarki" + }, "selectOneCollection": { "message": "Musisz wybrać co najmniej jedną kolekcję." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Co najmniej jedna zasada organizacji wpływa na ustawienia generatora." }, + "passwordGenerator": { + "message": "Generator hasła" + }, + "usernameGenerator": { + "message": "Generator nazw uÅŧytkownika" + }, + "useThisPassword": { + "message": "UÅŧyj tego hasła" + }, + "useThisUsername": { + "message": "UÅŧyj tej nazwy uÅŧytkownika" + }, + "securePasswordGenerated": { + "message": "Wygenerowane bezpieczne hasło! Nie zapomnij rÃŗwnieÅŧ zaktualizować hasła na stronie." + }, + "useGeneratorHelpTextPartOne": { + "message": "UÅŧyj generatora", + "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": ", aby utworzyć mocne unikalne hasło", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "SposÃŗb blokowania sejfu" }, + "vaultTimeoutAction1": { + "message": "Akcja po przekroczeniu limitu czasu" + }, "lock": { "message": "Zablokuj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Kosz", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Element został przywrÃŗcony" }, + "alreadyHaveAccount": { + "message": "Masz juÅŧ konto?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Po wylogowaniu się z sejfu musisz ponownie zalogować się, aby uzyskać do niego dostęp. Czy na pewno chcesz uÅŧyć tego ustawienia?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Automatycznie uzupełnij i zapisz" }, + "fillAndSave": { + "message": "Wypełnij i zapisz" + }, "autoFillSuccessAndSavedUri": { "message": "URI został zapisany i automatycznie uzupełniony" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Nowe hasło gÅ‚Ãŗwne nie spełnia wymaganych zasad." }, + "receiveMarketingEmailsV2": { + "message": "Uzyskaj poradę, ogłoszenia i moÅŧliwości badawcze od Bitwarden w swojej skrzynce odbiorczej." + }, + "unsubscribe": { + "message": "Anuluj subskrypcję" + }, + "atAnyTime": { + "message": "w kaÅŧdej chwili." + }, + "byContinuingYouAgreeToThe": { + "message": "Kontynuując, zgadzasz się na" + }, + "and": { + "message": "i" + }, "acceptPolicies": { "message": "Zaznaczając tę opcję, akceptujesz:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Błąd podczas odświeÅŧania tokenu" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Nie znaleziono tokenu odświeÅŧającego ani kluczy API. SprÃŗbuj wylogować się i zalogować ponownie." + }, "desktopSyncVerificationTitle": { "message": "Weryfikacja synchronizacji z aplikacją desktopową" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Konto jest niezgodne" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Klucz biometryczny jest niepoprawny" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Odblokowanie biometryczne nie powiodło się. Sekretny klucz biometryczny nie odblokował sejfu. SprÃŗbuj skonfigurować biometrię ponownie." + }, "biometricsNotEnabledTitle": { "message": "Dane biometryczne są wyłączone" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Dane biometryczne przeglądarki nie są obsługiwane na tym urządzeniu." }, + "biometricsNotUnlockedTitle": { + "message": "UÅŧytkownik zablokowany lub wylogowany" + }, + "biometricsNotUnlockedDesc": { + "message": "Odblokuj tego uÅŧytkownika w aplikacji desktopowej i sprÃŗbuj ponownie." + }, + "biometricsNotAvailableTitle": { + "message": "Odblokowanie biometryczne jest niedostępne" + }, + "biometricsNotAvailableDesc": { + "message": "Odblokowanie biometryczne jest obecnie niedostępne. SprÃŗbuj ponownie pÃŗÅēniej." + }, "biometricsFailedTitle": { "message": "Dane biometryczne są błędne" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Zasada organizacji ma wpływ na opcję własności elementÃŗw." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Polityka organizacji zablokowała importowanie elementÃŗw do Twojego sejfu." + }, + "domainsTitle": { + "message": "Domeny", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Wykluczone domeny" }, "excludedDomainsDesc": { "message": "Aplikacja Bitwarden nie będzie proponować zapisywania danych logowania dla tych domen. Musisz odświeÅŧyć stronę, aby zastosowywać zmiany." }, + "excludedDomainsDescAlt": { + "message": "Aplikacja Bitwarden nie będzie proponować zapisywania danych logowania dla tych domen dla wszystkich zalogowanych kont. Musisz odświeÅŧyć stronę, aby zastosowywać zmiany." + }, + "websiteItemLabel": { + "message": "Strona internetowa $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nie jest prawidłową nazwą domeny", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Zmiany w wykluczonych domenach zapisane" + }, + "limitSendViews": { + "message": "Limit wyświetleń" + }, + "limitSendViewsHint": { + "message": "Nikt nie moÅŧe wyświetlić Send po osiągnieciu limitu.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Zostało wyświetleń: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Wyślij", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "SzczegÃŗÅ‚y Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Szukaj w wysyłkach", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Tekst do udostępnienia" + }, "sendTypeFile": { "message": "Plik" }, @@ -1666,6 +2406,9 @@ "message": "Wszystkie wysyłki", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Domyślnie ukryj tekst" + }, "maxAccessCountReached": { "message": "Maksymalna liczba dostępÃŗw została osiągnięta", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Chroniona hasłem" }, + "copyLink": { + "message": "Kopiuj link" + }, "copySendLink": { "message": "Kopiuj link wysyłki", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Czy na pewno chcesz usunąć tę wysyłkę?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Czy na pewno chcesz trwale usunąć to Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edytuj wysyłkę", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Wysyłka zostanie trwale usunięta w określonym czasie.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send zostanie trwale usunięte w tej dacie.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data wygaśnięcia" }, @@ -1769,6 +2523,10 @@ "message": "Opcjonalne hasło dla uÅŧytkownika, aby uzyskać dostęp do wysyłki.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Prywatne notatki o tej wysyłce.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Wysyłka została utworzona", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send został stworzony!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Wiadomość będzie dostępna dla kaÅŧdego z dostępem do tego linku przez następną godzinę.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Wiadomość będzie dostępna dla kaÅŧdego z dostępem do tego linku przez następne $HOURS$ godzin.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Wiadomość będzie dostępna dla kaÅŧdego z dostępem do tego linku przez 1 dzień.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Wiadomość będzie dostępna dla kaÅŧdego z dostępem do tego linku przez następne $DAYS$ dni.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Link Send został skopiowany", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Wysyłka została zapisana", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Aby wybrać plik, otwÃŗrz rozszerzenie na pasku bocznym (jeśli to moÅŧliwe) lub w nowym oknie." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Aby wybrać plik za pomocą przeglądarki Safari, otwÃŗrz rozszerzenie w nowym oknie." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Zanim zaczniesz" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Ukryj mÃŗj adres e-mail przed odbiorcami." }, + "hideYourEmail": { + "message": "Ukryj mÃŗj adres e-mail przed oglądającymi." + }, "sendOptionsPolicyInEffect": { "message": "Co najmniej jedna zasada organizacji wpływa na ustawienia wysyłek." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Weryfikacja adresu e-mail jest wymagana" }, + "emailVerifiedV2": { + "message": "E-mail zweryfikowany" + }, "emailVerificationRequiredDesc": { "message": "Musisz zweryfikować adres e-mail, aby korzystać z tej funkcji. Adres moÅŧesz zweryfikować w sejfie internetowym." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Twoje hasło gÅ‚Ãŗwne nie spełnia jednej lub kilku zasad organizacji. Aby uzyskać dostęp do sejfu, musisz teraz zaktualizować swoje hasło gÅ‚Ãŗwne. Kontynuacja wyloguje Cię z bieÅŧącej sesji, wymagając zalogowania się ponownie. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie jedną godzinę." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Twoja organizacja wyłączyła szyfrowanie zaufanego urządzenia. Ustaw hasło gÅ‚Ãŗwne, aby uzyskać dostęp do sejfu." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatyczne rejestrowanie uÅŧytkownikÃŗw" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Wybierz folder..." }, - "ssoCompleteRegistration": { - "message": "W celu zakończenia jednokrotnego logowania SSO, ustaw hasło gÅ‚Ãŗwne, aby uzyskać dostęp do sejfu." + "noFoldersFound": { + "message": "Nie znaleziono folderÃŗw", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Uprawnienia w Twojej organizacji zostały zaktualizowane, musisz teraz ustawić hasło gÅ‚Ãŗwne.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Twoja organizacja wymaga ustawienia hasła gÅ‚Ãŗwnego.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "z $TOTAL$ elementÃŗw", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Wymagana weryfikacja", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Godziny" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minuty" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Wymagania polityki przedsiębiorstwa zostały zastosowane do twoich opcji przekrocznia limitu czasu" + }, "vaultTimeoutPolicyInEffect": { "message": "Zasady organizacji mają wpływ czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ godzin(y) i $MINUTES$ minut(y) maksymalnie.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Limit czasu przekracza ograniczenie ustawione przez Twoją organizację: $HOURS$ godzin(y) i $MINUTES$ minut(y) maksymalnie", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Zasady organizacji mają wpływ na czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min. TwÃŗj czas blokowania sejfu to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Eksportowanie sejfu organizacji" + }, + "exportingOrganizationVaultDesc": { + "message": "Tylko sejf organizacji powiązany z $ORGANIZATION$ zostanie wyeksportowany. Pozycje w poszczegÃŗlnych sejfach lub innych organizacji nie będą uwzględnione.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Błąd" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Wygeneruj nazwę uÅŧytkownika" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Rodzaj nazwy uÅŧytkownika" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Wygeneruj alias adresu e-mail z zewnętrznej usługi przekierowania." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Błąd $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Wygenerowane przez Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Strona internetowa: $WEBSITE$. Wygenerowano przez Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Nieprawidłowy token API dla $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Nieprawidłowy token API dla $SERVICENAME$, błąd: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nie moÅŧna uzyskać ID maskowanego konta e-mail dla $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Nieprawidłowa domena $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Nieprawidłowy adres URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Wystąpił nieznany błąd w $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Nieznana usługa przekierowania: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nazwa hosta", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Jak autouzupełniać" }, "autofillSelectInfoWithCommand": { - "message": "Wybierz element z tej strony lub uÅŧyj skrÃŗtu: $COMMAND$", + "message": "Wybierz element z tego ekranu, uÅŧyj skrÃŗtu $COMMAND$ lub zobacz inne opcje w ustawieniach.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Wybierz element z tej strony lub ustaw skrÃŗt w ustawieniach." + "message": "Wybierz element z tego ekranu lub zobacz inne opcje w ustawieniach." }, "gotIt": { "message": "Rozumiem" @@ -2209,13 +3213,22 @@ "autofillSettings": { "message": "Ustawienia autouzupełniania" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "SkrÃŗt autouzupełniania" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Zmień skrÃŗt" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Zarządzaj skrÃŗtami" + }, "autofillShortcut": { "message": "SkrÃŗt klawiaturowy autouzupełniania" }, - "autofillShortcutNotSet": { + "autofillLoginShortcutNotSet": { "message": "SkrÃŗt autouzupełniania nie jest ustawiony. Zmień to w ustawieniach przeglądarki." }, - "autofillShortcutText": { + "autofillLoginShortcutText": { "message": "SkrÃŗt autouzupełniania to: $COMMAND$. Zmień to w ustawieniach przeglądarki.", "placeholders": { "command": { @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logowanie do" - }, "opensInANewWindow": { "message": "Otwiera w nowym oknie" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Identyfikator organizacji jest wymagany." }, + "creatingAccountOn": { + "message": "Tworzenie konta na" + }, + "checkYourEmail": { + "message": "SprawdÅē swoją pocztę e-mail" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Kliknij łącze w wiadomości e-mail wysłanej do" + }, + "andContinueCreatingYourAccount": { + "message": "i kontynuuj tworzenie konta." + }, + "noEmail": { + "message": "Brak wiadomości e-mail?" + }, + "goBack": { + "message": "WrÃŗÄ‡" + }, + "toEditYourEmailAddress": { + "message": "aby edytować swÃŗj adres e-mail." + }, "eu": { "message": "UE", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Odmowa dostępu. Nie masz uprawnień do przeglądania tej strony." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Zaufano urządzeniu" }, + "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." + }, + "sendsNoItemsMessage": { + "message": "UÅŧyj wysyłki, aby bezpiecznie dzielić się zaszyfrowanymi informacjami ze wszystkimi.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Dane wejściowe są wymagane." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 pole wymaga Twojej uwagi." + }, + "multipleFieldsNeedAttention": { + "message": "Pola wymagające Twojej uwagi: $COUNT$.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Wybierz --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Zwiń/rozwiń", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Zaimportować Twoje dane do Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Ochronić Twoje dane LastPass i zaimportować do Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Zapisz jako niezaszyfrowany plik", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importuj do Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importowanie...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Dane pomyślnie zaimportowane!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Błąd podczas importowania. SprawdÅē konsolę, aby uzyskać szczegÃŗÅ‚owe informacje.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Wystąpił błąd sieci podczas importu.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Domena aliasu" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Elementy z pytaniem o hasło gÅ‚Ãŗwnege nie mogą być automatycznie wypełniane przy wczytywaniu strony. Automatyczne wypełnianie po wczytywania strony zostało wyłączone.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Automatyczne wypełnianie przy wczytywaniu strony zostało ustawione, aby uÅŧywać ustawień domyślnych.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Wyłącz prośbę o podanie hasła gÅ‚Ãŗwnego, aby edytować to pole", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Przełącz nawigację boczną" + }, + "skipToContent": { + "message": "PrzejdÅē do treści" + }, + "bitwardenOverlayButton": { + "message": "Przycisk menu autouzupełniania Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Przełącz menu autouzupełniania Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Menu autouzupełniania Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Odblokuj swoje konto, aby wyświetlić pasujące elementy", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Odblokuj swoje konto, aby zobaczyć sugestie autouzupełniania", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Odblokuj konto", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Odblokuj swoje konto, otwiera się w nowym oknie", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Wypełnij dane logowania dla", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Częściowa nazwa uÅŧytkownika", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Brak elementÃŗw do wyświetlenia", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nowy element", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Dodaj nowy element do sejfu", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Nowe dane logowania", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Dodaj nowe dane logowania do sejfu, otwiera się w nowym oknie", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Nowa karta", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Dodaj nową kartę do sejfu, otwiera się w nowym oknie", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Nowa toÅŧsamość", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Dodaj nową toÅŧsamość do sejfu, otwiera się w nowym oknie", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Dostępne menu autouzupełniania Bitwarden. Naciśnij przycisk strzałki w dÃŗÅ‚, aby wybrać.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Włącz" + }, + "ignore": { + "message": "Ignoruj" + }, + "importData": { + "message": "Importuj dane", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Błąd importu" + }, + "importErrorDesc": { + "message": "Wystąpił problem z danymi, ktÃŗre chcesz zaimportować. RozwiąÅŧ poniÅŧsze problemy w Twoim pliku i sprÃŗbuj ponownie." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "RozwiąÅŧ poniÅŧsze błędy i sprÃŗbuj ponownie." + }, + "description": { + "message": "Opis" + }, + "importSuccess": { + "message": "Importowanie danych zakończone sukcesem" + }, + "importSuccessNumberOfItems": { + "message": "Zaimportowano elementÃŗw: $AMOUNT$.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "SprÃŗbuj ponownie" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Weryfikacja dla tej akcji jest wymagana. Ustaw kod PIN, aby kontynuować." + }, + "setPin": { + "message": "Ustaw PIN" + }, + "verifyWithBiometrics": { + "message": "Weryfikuj za pomocą biometrii" + }, + "awaitingConfirmation": { + "message": "Oczekiwanie na potwierdzenie" + }, + "couldNotCompleteBiometrics": { + "message": "Nie moÅŧna ukończyć z uÅŧyciem biometrii." + }, + "needADifferentMethod": { + "message": "Potrzebujesz innej metody?" + }, + "useMasterPassword": { + "message": "UÅŧyj hasła gÅ‚Ãŗwnego" + }, + "usePin": { + "message": "UÅŧyj PINu" + }, + "useBiometrics": { + "message": "UÅŧyj biometrii" + }, + "enterVerificationCodeSentToEmail": { + "message": "Wpisz kod weryfikacyjny, ktÃŗry został wysłany na adres e-mail." + }, + "resendCode": { + "message": "Wysłać kod ponownie" + }, + "total": { + "message": "Łącznie" + }, + "importWarning": { + "message": "Importujesz dane do organizacji $ORGANIZATION$. Dane mogą zostać udostępnione członkom organizacji. Czy chcesz kontynuować?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Wystąpił błąd podczas połączenia z usługą Duo. Aby uzyskać pomoc, uÅŧyj innej metody dwustopniowego logowania lub skontaktuj się z Duo." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Uruchom DUO i wykonaj kroki, aby zakończyć logowanie." + }, + "duoRequiredForAccount": { + "message": "Dwustopniowe logowanie Duo jest wymagane dla Twojego konta." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "OtwÃŗrz rozszerzenie w nowym oknie, aby dokończyć logowanie." + }, + "popoutExtension": { + "message": "OtwÃŗrz rozszerzenie w nowym oknie" + }, + "launchDuo": { + "message": "Uruchom DUO" + }, + "importFormatError": { + "message": "Dane nie są poprawnie sformatowane. SprawdÅē importowany plik i sprÃŗbuj ponownie." + }, + "importNothingError": { + "message": "Nic nie zostało zaimportowane." + }, + "importEncKeyError": { + "message": "Wystąpił błąd podczas odszyfrowywania pliku. Klucz szyfrowania nie pasuje do klucza uÅŧytego podczas eksportowania danych." + }, + "invalidFilePassword": { + "message": "Hasło do pliku jest nieprawidłowe. UÅŧyj hasła ktÃŗre podano przy tworzeniu pliku eksportu." + }, + "destination": { + "message": "Miejsce docelowe" + }, + "learnAboutImportOptions": { + "message": "Dowiedz się więcej o opcjach importu" + }, + "selectImportFolder": { + "message": "Wybierz folder" + }, + "selectImportCollection": { + "message": "Wybierz kolekcję" + }, + "importTargetHint": { + "message": "Wybierz tę opcję, jeśli chcesz, aby zawartość zaimportowanego pliku została przeniesiona do $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Plik zawiera nieprzypisane elementy." + }, + "selectFormat": { + "message": "Wybierz format importowanego pliku" + }, + "selectImportFile": { + "message": "Wybierz plik do zaimportowania" + }, + "chooseFile": { + "message": "Wybierz plik" + }, + "noFileChosen": { + "message": "Nie wybrano pliku" + }, + "orCopyPasteFileContents": { + "message": "lub skopiuj/wklej treść pliku" + }, + "instructionsFor": { + "message": "Instrukcja dla $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "PotwierdÅē importowanie sejfu" + }, + "confirmVaultImportDesc": { + "message": "Plik jest chroniony hasłem. WprowadÅē hasło pliku, aby zaimportować dane." + }, + "confirmFilePassword": { + "message": "PotwierdÅē hasło pliku" + }, + "exportSuccess": { + "message": "Dane sejfu zostały wyeksportowane" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Uzyskiwanie dostępu" + }, + "passkeyNotCopied": { + "message": "Passkey nie zostanie skopiowany" + }, + "passkeyNotCopiedAlert": { + "message": "Passkey nie zostanie skopiowane do sklonowanego elementu. Czy chcesz kontynuować klonowanie tego elementu?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Weryfikacja jest wymagana przez stronę inicjującą. Ta funkcja nie jest jeszcze zaimplementowana dla kont bez hasła gÅ‚Ãŗwnego." + }, + "logInWithPasskeyQuestion": { + "message": "Zaloguj się za pomocą passkey?" + }, + "passkeyAlreadyExists": { + "message": "Passkey juÅŧ istnieje dla tej aplikacji." + }, + "noPasskeysFoundForThisApplication": { + "message": "Nie znaleziono passkey'a dla tej aplikacji." + }, + "noMatchingPasskeyLogin": { + "message": "Nie masz pasujących danych logowania do tej witryny." + }, + "noMatchingLoginsForSite": { + "message": "Brak pasujących loginÃŗw dla tej witryny" + }, + "searchSavePasskeyNewLogin": { + "message": "Wyszukaj alb zapisz passkey jako nowy login" + }, + "confirm": { + "message": "PotwierdÅē" + }, + "savePasskey": { + "message": "Zapisz passkey" + }, + "savePasskeyNewLogin": { + "message": "Zapisz passkey jako nowe dane logowania" + }, + "chooseCipherForPasskeySave": { + "message": "Wybierz dane logowania do ktÃŗrych przypisać passkey" + }, + "chooseCipherForPasskeyAuth": { + "message": "Wybierz passkey Åŧeby się zalogować" + }, + "passkeyItem": { + "message": "Element Passkey" + }, + "overwritePasskey": { + "message": "Zastąpić passkey?" + }, + "overwritePasskeyAlert": { + "message": "Ten element zawiera juÅŧ passkey. Czy na pewno chcesz nadpisać bieÅŧący passkey?" + }, + "featureNotSupported": { + "message": "Funkcja nie jest jeszcze obsługiwana" + }, + "yourPasskeyIsLocked": { + "message": "Wymagane uwierzytelnienie aby uÅŧywać passkey. SprawdÅē swoją toÅŧsamość, aby kontynuować." + }, + "multifactorAuthenticationCancelled": { + "message": "Uwierzytelnianie wieloskładnikowe zostało anulowane" + }, + "noLastPassDataFound": { + "message": "Nie znaleziono danych LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "Nieprawidłowa nazwa uÅŧytkownika lub hasło" + }, + "incorrectPassword": { + "message": "Błędne hasło" + }, + "incorrectCode": { + "message": "Błędny kod" + }, + "incorrectPin": { + "message": "Niepoprawny PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Uwierzytelnianie wieloskładnikowe nie powiodło się" + }, + "includeSharedFolders": { + "message": "Dołącz udostępnione foldery" + }, + "lastPassEmail": { + "message": "E-mail LastPass" + }, + "importingYourAccount": { + "message": "Importowanie konta..." + }, + "lastPassMFARequired": { + "message": "Wymagane jest uwierzytelnianie wieloskładnikowe LastPass" + }, + "lastPassMFADesc": { + "message": "WprowadÅē jednorazowy kod z aplikacji uwierzytelniającej" + }, + "lastPassOOBDesc": { + "message": "ZatwierdÅē Åŧądanie logowania w aplikacji uwierzytelniającej lub wprowadÅē jednorazowe hasło." + }, + "passcode": { + "message": "Kod" + }, + "lastPassMasterPassword": { + "message": "Hasło gÅ‚Ãŗwne LastPass" + }, + "lastPassAuthRequired": { + "message": "Wymagane uwierzytelnianie LastPass" + }, + "awaitingSSO": { + "message": "Oczekiwanie na uwierzytelnianie SSO" + }, + "awaitingSSODesc": { + "message": "Kontynuuj logowanie przy uÅŧyciu danych firmowych." + }, + "seeDetailedInstructions": { + "message": "Zobacz szczegÃŗÅ‚owe instrukcje na naszej stronie pomocy pod adresem", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importuj bezpośrednio z LastPass" + }, + "importFromCSV": { + "message": "Importuj z CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "SprÃŗbuj ponownie lub poszukaj wiadomości e-mail od LastPass, aby zweryfikować, Åŧe to Ty." + }, + "collection": { + "message": "Kolekcja" + }, + "lastPassYubikeyDesc": { + "message": "WÅ‚ÃŗÅŧ YubiKey powiązany z Twoim kontem LastPass do portu USB komputera, a następnie naciśnij jego przycisk." + }, + "switchAccount": { + "message": "Przełącz konto" + }, + "switchAccounts": { + "message": "Przełącz konta" + }, + "switchToAccount": { + "message": "Przełącz na konto" + }, + "activeAccount": { + "message": "Aktywne konto" + }, + "availableAccounts": { + "message": "Dostępne konta" + }, + "accountLimitReached": { + "message": "Limit kont został osiągnięty. Wyloguj się z konta, aby dodać inne." + }, + "active": { + "message": "aktywne" + }, + "locked": { + "message": "zablokowane" + }, + "unlocked": { + "message": "odblokowane" + }, + "server": { + "message": "serwer" + }, + "hostedAt": { + "message": "hostowany w" + }, + "useDeviceOrHardwareKey": { + "message": "UÅŧyj swojego urządzenia lub klucza sprzętowego" + }, + "justOnce": { + "message": "Tylko raz" + }, + "alwaysForThisSite": { + "message": "Zawsze dla tej witryny" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ dodana do wykluczonych domen.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Popularne formaty", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Kontynuować do ustawień przeglądarki?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Kontynuować do centrum pomocy?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Zmień ustawienia autouzupełniania przeglądarki i zarządzania hasłami.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "MoÅŧesz przeglądać i ustawiać skrÃŗty klawiaturowe rozszerzeń w ustawieniach przeglądarki.", + "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": "Zmień ustawienia autouzupełniania przeglądarki i zarządzania hasłami.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "MoÅŧesz przeglądać i ustawiać skrÃŗty klawiaturowe rozszerzeń w ustawieniach przeglądarki.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Czy Bitwarden ma być domyślnym menadÅŧerem haseł?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignorowanie tej opcji moÅŧe spowodować konflikty pomiędzy menu autouzupełniania Bitwarden a przeglądarką.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Ustaw Bitwarden jako domyślny menedÅŧer haseł", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Nie moÅŧna ustawić Bitwarden jako domyślnego menedÅŧera haseł", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Musisz przyznać Bitwarden uprawnienia do prywatności przeglądarki, aby ustawić go jako domyślnego menedÅŧera haseł.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Ustaw jako domyślny", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Pomyślnie zapisano dane logowania!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Hasło zostało zapisane!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Pomyślnie zaktualizowano dane logowania!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Hasło zostało zaktualizowane!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Błąd podczas zapisywania danych logowania. SprawdÅē konsolę, aby uzyskać szczegÃŗÅ‚y.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Sukces" + }, + "removePasskey": { + "message": "Usuń passkey" + }, + "passkeyRemoved": { + "message": "Passkey został usunięty" + }, + "autofillSuggestions": { + "message": "Sugestie autouzupełnienia" + }, + "autofillSuggestionsTip": { + "message": "Zapisz element logowania dla tej witryny, aby automatycznie wypełnić" + }, + "yourVaultIsEmpty": { + "message": "TwÃŗj sejf jest pusty" + }, + "noItemsMatchSearch": { + "message": "Åģaden element nie pasuje do Twojego wyszukiwania" + }, + "clearFiltersOrTryAnother": { + "message": "Wyczyść filtry lub uÅŧyj innej frazy" + }, + "copyInfoTitle": { + "message": "Skopiuj informacje - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Skopiuj notatkę - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Więcej opcji, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Więcej opcji - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Zobacz element - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autouzupełnij - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Brak wartości do skopiowania" + }, + "assignToCollections": { + "message": "Przypisz do kolekcji" + }, + "copyEmail": { + "message": "Skopiuj e-mail" + }, + "copyPhone": { + "message": "Skopiuj telefon" + }, + "copyAddress": { + "message": "Skopiuj adres" + }, + "adminConsole": { + "message": "Konsola Administracyjna" + }, + "accountSecurity": { + "message": "Bezpieczeństwo konta" + }, + "notifications": { + "message": "Powiadomienia" + }, + "appearance": { + "message": "Wygląd" + }, + "errorAssigningTargetCollection": { + "message": "Wystąpił błąd podczas przypisywania kolekcji." + }, + "errorAssigningTargetFolder": { + "message": "Wystąpił błąd podczas przypisywania folderu." + }, + "viewItemsIn": { + "message": "Zobacz elementy w $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "WrÃŗÄ‡ do $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Nowy" + }, + "removeItem": { + "message": "Usuń $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Elementy bez folderu" + }, + "itemDetails": { + "message": "SzczegÃŗÅ‚y elementu" + }, + "itemName": { + "message": "Nazwa elementu" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Nie moÅŧna usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organizacja jest wyłączona" + }, + "owner": { + "message": "Właściciel" + }, + "selfOwnershipLabel": { + "message": "Ty", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Nie moÅŧna uzyskać dostępu do elementÃŗw w wyłączonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." + }, + "additionalInformation": { + "message": "Dodatkowe informacje" + }, + "itemHistory": { + "message": "Historia elementu" + }, + "lastEdited": { + "message": "Ostatnio edytowany" + }, + "ownerYou": { + "message": "Właściciel: Ty" + }, + "linked": { + "message": "Powiązane" + }, + "copySuccessful": { + "message": "Kopiowanie zakończone sukcesem" + }, + "upload": { + "message": "Wyślij" + }, + "addAttachment": { + "message": "Dodaj załącznik" + }, + "maxFileSizeSansPunctuation": { + "message": "Maksymalny rozmiar pliku to 500 MB" + }, + "deleteAttachmentName": { + "message": "Usuń załącznik $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Pobierz $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Czy na pewno chcesz trwale usunąć ten załącznik?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Darmowe organizacje nie mogą uÅŧywać załącznikÃŗw" + }, + "filters": { + "message": "Filtry" + }, + "personalDetails": { + "message": "Dane osobowe" + }, + "identification": { + "message": "ToÅŧsamość" + }, + "contactInfo": { + "message": "Daje kontaktowe" + }, + "downloadAttachment": { + "message": "Pobierz - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "numer karty kończy się", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Dane logowania" + }, + "authenticatorKey": { + "message": "Klucz uwierzytelniający" + }, + "autofillOptions": { + "message": "Opcje autouzupełniania" + }, + "websiteUri": { + "message": "Strona internetowa (URI)" + }, + "websiteUriCount": { + "message": "Strona internetowa (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Strona dodana" + }, + "addWebsite": { + "message": "Dodaj stronę internetową" + }, + "deleteWebsite": { + "message": "Usuń stronę internetową" + }, + "defaultLabel": { + "message": "Domyślnie ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "PokaÅŧ wykrywanie dopasowań $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Ukryj wykrywanie dopasowań $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Włącz autouzupełnianie po załadowaniu strony?" + }, + "cardExpiredTitle": { + "message": "Karta wygasła" + }, + "cardExpiredMessage": { + "message": "Jeśli ją wznowiłeś, zaktualizuj informacje o karcie" + }, + "cardDetails": { + "message": "SzczegÃŗÅ‚y karty" + }, + "cardBrandDetails": { + "message": "SzczegÃŗÅ‚y $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Włącz animacje" + }, + "showAnimations": { + "message": "PokaÅŧ animacje" + }, + "addAccount": { + "message": "Dodaj konto" + }, + "loading": { + "message": "Wczytywanie" + }, + "data": { + "message": "Dane" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Hasła", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Zaloguj się za pomocą passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Przypisz" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Tylko członkowie organizacji z dostępem do tych kolekcji będą mogli zobaczyć ten element." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Tylko członkowie organizacji z dostępem do tych kolekcji będą mogli zobaczyć te elementy." + }, + "bulkCollectionAssignmentWarning": { + "message": "Wybrałeś $TOTAL_COUNT$ elementÃŗw. Nie moÅŧesz zaktualizować $READONLY_COUNT$ elementÃŗw, poniewaÅŧ nie masz uprawnień do edycji.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Dodaj pole" + }, + "add": { + "message": "Dodaj" + }, + "fieldType": { + "message": "Typ pola" + }, + "fieldLabel": { + "message": "Etykieta pola" + }, + "textHelpText": { + "message": "UÅŧyj pÃŗl tekstowych dla danych takich jak pytania bezpieczeństwa" + }, + "hiddenHelpText": { + "message": "UÅŧyj ukrytych pÃŗl dla danych poufnych, takich jak hasło" + }, + "checkBoxHelpText": { + "message": "UÅŧyj pÃŗl wyboru, jeśli chcesz automatycznie wypełnić pole wyboru formularza, np. zapamiętaj e-mail" + }, + "linkedHelpText": { + "message": "UÅŧyj powiązanego pola, gdy masz problemy z autouzupełnianiem na konkretnej stronie internetowej." + }, + "linkedLabelHelpText": { + "message": "WprowadÅē atrybut z HTML'a: id, name, aria-label lub placeholder." + }, + "editField": { + "message": "Edytuj pole" + }, + "editFieldLabel": { + "message": "Edytuj $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Usuń $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "Dodano $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Zmień kolejność $LABEL$. UÅŧyj klawiszy Åŧe strzałkami aby przenieść element w gÃŗrę lub w dÃŗÅ‚.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ przeniÃŗsł się w gÃŗrę, pozycja $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Wybierz kolekcje do przypisania" + }, + "personalItemTransferWarningSingular": { + "message": "1 element zostanie trwale przeniesiony do wybranej organizacji. Nie będziesz juÅŧ posiadać tego elementu." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ elementÃŗw zostanie trwale przeniesionych do wybranej organizacji. Nie będziesz juÅŧ posiadać tych elementÃŗw.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 przedmiot zostanie trwale przeniesiony do $ORG$. Nie będziesz juÅŧ posiadać tego przedmiotu.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ elementy zostaną trwale przeniesione do $ORG$. Nie będziesz juÅŧ posiadać tych elementÃŗw.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Pomyślnie przypisano kolekcje" + }, + "nothingSelected": { + "message": "Nie zaznaczyłeś Åŧadnych elementÃŗw." + }, + "movedItemsToOrg": { + "message": "Zaznaczone elementy zostały przeniesione do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Elementy przeniesione do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Element przeniesiony do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ przeniÃŗsł się w dÃŗÅ‚, pozycja $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Lokalizacja elementu" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden ma nowy wygląd!" + }, + "bitwardenNewLookDesc": { + "message": "Auto wypełnianie i szukanie na zakładce sejfu jest teraz prostsze i bardziej intuicyjne. Rozejrzyj się tam!" + }, + "accountActions": { + "message": "Akcje konta" + }, + "showNumberOfAutofillSuggestions": { + "message": "PokaÅŧ liczbę sugestii autouzupełniania logowania na ikonie rozszerzenia" + }, + "systemDefault": { + "message": "Domyślny systemu" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Do tego ustalenia zastosowano wymogi polityki przedsiębiorstw" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "PowtÃŗrz" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimalny limit czasu niestandardowego wynosi 1 minutę." + }, + "additionalContentAvailable": { + "message": "Dostępna jest dodatkowa zawartość" + }, + "fileSavedToDevice": { + "message": "Plik zapisany na urządzeniu. Zarządzaj plikiem na swoim urządzeniu." + }, + "showCharacterCount": { + "message": "PokaÅŧ liczbę znakÃŗw" + }, + "hideCharacterCount": { + "message": "Ukryj liczbę znakÃŗw" + }, + "itemsInTrash": { + "message": "Elementy w koszu" + }, + "noItemsInTrash": { + "message": "Brak elementÃŗw w koszu" + }, + "noItemsInTrashDesc": { + "message": "Usunięte elementy pojawią się tutaj i zostaną trwale usunięte po 30 dniach" + }, + "trashWarning": { + "message": "Elementy znajdujące się w koszu ponad 30 dni zostaną automatycznie usunięte" + }, + "restore": { + "message": "PrzywrÃŗÄ‡" + }, + "deleteForever": { + "message": "Usuń na zawsze" + }, + "noEditPermissions": { + "message": "Nie masz uprawnień do edycji tego elementu" + }, + "authenticating": { + "message": "Uwierzytelnianie" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 89ba426c960..6bdb8fc331b 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden Gerenciador de Senhas", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Um gerenciador de senhas seguro e gratuito para todos os seus dispositivos.", - "description": "Extension description" + "message": "Em qual lugar for, o Bitwarden protege suas senhas, chaves de acesso, e informaçÃĩes confidenciais", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Inicie a sessÃŖo ou crie uma nova conta para acessar seu cofre seguro." }, + "inviteAccepted": { + "message": "Convite aceito" + }, "createAccount": { "message": "Criar Conta" }, - "login": { - "message": "Iniciar SessÃŖo" + "newToBitwarden": { + "message": "Novo no Bitwarden?" + }, + "logInWithPasskey": { + "message": "Iniciar sessÃŖo com a chave de acesso" + }, + "useSingleSignOn": { + "message": "Usar login Ãēnico" + }, + "welcomeBack": { + "message": "Bem vindo de volta" + }, + "setAStrongPassword": { + "message": "Defina uma senha forte" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Termine de criar a sua conta definindo uma senha" }, "enterpriseSingleSignOn": { "message": "Iniciar SessÃŖo Empresarial Única" @@ -32,7 +50,7 @@ "message": "Enviar" }, "emailAddress": { - "message": "Endereço de E-mail" + "message": "Endereço de correio eletrônico" }, "masterPass": { "message": "Senha Mestra" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Uma dica de senha mestra pode ajudÃĄ-lo(a) a lembrÃĄ-lo(a) caso vocÃĒ esqueça." }, + "masterPassHintText": { + "message": "Se vocÃĒ esquecer sua senha, a dica de senha pode ser enviada ao seu e-mail. $CURRENT$/$MAXIMUM$ caracteres mÃĄximos.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Digite Novamente a Senha Mestra" }, "masterPassHint": { "message": "Dica de Senha Mestra (opcional)" }, + "joinOrganization": { + "message": "Juntar-se à organizaÃ§ÃŖo" + }, + "joinOrganizationName": { + "message": "Entrar em $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Termine de juntar-se nessa organizaÃ§ÃŖo definindo uma senha mestra." + }, "tab": { "message": "Aba" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copiar Senha" }, + "copyPassphrase": { + "message": "Copiar senha" + }, "copyNote": { "message": "Copiar Nota" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copiar CÃŗdigo de Segurança" }, + "copyName": { + "message": "Copiar nome" + }, + "copyCompany": { + "message": "Copiar empresa" + }, + "copySSN": { + "message": "Cadastro de Pessoas Físicas" + }, + "copyPassportNumber": { + "message": "Copiar nÃēmero do passaporte" + }, + "copyLicenseNumber": { + "message": "Copiar nÃēmero da CNH" + }, + "copyPrivateKey": { + "message": "Copiar chave privada" + }, + "copyPublicKey": { + "message": "Copiar chave pÃēblica" + }, + "copyFingerprint": { + "message": "Copiar impressÃŖo digital" + }, + "copyCustomField": { + "message": "Copiar $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copiar site" + }, + "copyNotes": { + "message": "Copiar Notas" + }, + "fill": { + "message": "Preencher", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Autopreencher" }, + "autoFillLogin": { + "message": "Preenchimento automÃĄtico ‘login’" + }, + "autoFillCard": { + "message": "Preenchimento automÃĄtico cartÃŖo" + }, + "autoFillIdentity": { + "message": "Preenchimento automÃĄtico identidade" + }, "generatePasswordCopied": { "message": "Gerar Senha (copiada)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Sem credenciais correspondentes." }, + "noCards": { + "message": "Sem cartÃĩes" + }, + "noIdentities": { + "message": "Sem Identidade" + }, + "addLoginMenu": { + "message": "Adicionar login" + }, + "addCardMenu": { + "message": "Adicionar cartÃŖo" + }, + "addIdentityMenu": { + "message": "Adicionar identidade" + }, "unlockVaultMenu": { "message": "Desbloqueie seu cofre" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Adicionar Item" }, + "accountEmail": { + "message": "Correio eletrônico da conta" + }, + "requestHint": { + "message": "Pedir dica" + }, + "requestPasswordHint": { + "message": "Dica da senha mestra" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Digite o endereço de seu correio eletrônico da sua conta e sua dica da senha serÃĄ enviada para vocÃĒ" + }, "passwordHint": { "message": "Dica da Senha" }, @@ -142,11 +270,29 @@ "confirmIdentity": { "message": "Confirme a sua identidade para continuar." }, - "account": { - "message": "Conta" - }, "changeMasterPassword": { - "message": "Alterar Senha Mestra" + "message": "Alterar senha mestra" + }, + "continueToWebApp": { + "message": "Continuar no aplicativo web?" + }, + "continueToWebAppDesc": { + "message": "Explore mais recursos da sua conta no Bitwarden no aplicativo web." + }, + "continueToHelpCenter": { + "message": "Continuar no Centro de Ajuda?" + }, + "continueToHelpCenterDesc": { + "message": "Saiba mais sobre como usar o Bitwarden no Centro de Ajuda." + }, + "continueToBrowserExtensionStore": { + "message": "Continuar na extensÃŖo da loja do navegador?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Ajude outros a descobrir se o Bitwarden estÃĄ certo para eles. Visite a loja de extensÃĩes do seu navegador e deixe uma classificaÃ§ÃŖo agora." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "VocÃĒ pode alterar a sua senha mestra no aplicativo web Bitwarden." }, "fingerprintPhrase": { "message": "Frase BiomÊtrica", @@ -162,9 +308,45 @@ "logOut": { "message": "Encerrar SessÃŖo" }, + "aboutBitwarden": { + "message": "Sobre o Bitwarden" + }, "about": { "message": "Sobre" }, + "moreFromBitwarden": { + "message": "Mais do Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continuar para bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden para NegÃŗcios" + }, + "bitwardenAuthenticator": { + "message": "Autenticador Bitwarden" + }, + "continueToAuthenticatorPageDesc": { + "message": "O Autenticador Bitwarden permite que vocÃĒ armazene as chaves do autenticador e gere cÃŗdigos TOTP para fluxos de verificaÃ§ÃŖo de 2 etapas. Saiba mais no site bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Gerenciador de Segredos Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Armazene, gerencie e compartilhe segredos de desenvolvedor com o Gerenciador de segredos do Bitwarden. Saiba mais no site bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Crie experiÃĒncias de login suaves e seguras, livres de senhas tradicionais com Passwordless.dev. Saiba mais no site bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Famílias do Bitwarden GrÃĄtis" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "VocÃĒ ÃŠ elegível para as Famílias do Bitwarden GrÃĄtis. Resgate esta oferta hoje no aplicativo web." + }, "version": { "message": "VersÃŖo" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Editar Pasta" }, + "newFolder": { + "message": "Nova pasta" + }, + "folderName": { + "message": "Nome da pasta" + }, + "folderHintText": { + "message": "Aninhe uma pasta adicionando o nome da pasta pai seguido de um \"/\". Exemplo: Social/FÃŗruns" + }, + "noFoldersAdded": { + "message": "Nenhuma pasta adicionada" + }, + "createFoldersToOrganize": { + "message": "Crie pastas para organizar os itens do seu cofre" + }, + "deleteFolderPermanently": { + "message": "VocÃĒ tem certeza que deseja excluir esta pasta permanentemente?" + }, "deleteFolder": { "message": "Excluir Pasta" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Gerador", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Gere automaticamente senhas fortes e Ãēnicas para as suas credenciais." }, - "bitWebVault": { - "message": "Cofre Web do Bitwarden" + "bitWebVaultApp": { + "message": "Aplicativo Web Bitwarden" }, "importItems": { "message": "Importar Itens" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Gerar Senha" }, + "generatePassphrase": { + "message": "Gerar frase secreta" + }, "regeneratePassword": { "message": "Gerar Nova Senha" }, @@ -244,17 +447,60 @@ "length": { "message": "Comprimento" }, + "passwordMinLength": { + "message": "Tamanho mínimo da senha" + }, "uppercase": { - "message": "MaiÃēsculas (A-Z)" + "message": "MaiÃēsculas (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "MinÃēsculas (a-z)" + "message": "MinÃēsculas (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "NÃēmeros (0-9)" + "message": "NÃēmeros (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caracteres especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Incluir", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Incluir caracteres maiÃēsculos", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Incluir caracteres minÃēsculos", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Incluir nÃēmeros", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0 – 9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Incluir caracteres especiais", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "NÃēmero de Palavras" @@ -276,7 +522,16 @@ "message": "Especiais Mínimos" }, "avoidAmbChar": { - "message": "Evitar Caracteres Ambíguos" + "message": "Evitar Caracteres Ambíguos", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Evitar Caracteres Ambíguos", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Os requisitos de política empresarial foram aplicados nesta configuraÃ§ÃŖo", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Pesquisar no Cofre" @@ -299,15 +554,30 @@ "password": { "message": "Senha" }, + "totp": { + "message": "Senha do autenticador" + }, "passphrase": { "message": "Frase Secreta" }, "favorite": { "message": "Favorito" }, + "unfavorite": { + "message": "Desfavoritar" + }, + "itemAddedToFavorites": { + "message": "Item adicionado aos favoritos" + }, + "itemRemovedFromFavorites": { + "message": "Item removido dos favoritos" + }, "notes": { "message": "Notas" }, + "privateNote": { + "message": "Nota privada" + }, "note": { "message": "Nota" }, @@ -326,6 +596,18 @@ "launch": { "message": "Abrir" }, + "launchWebsite": { + "message": "Abrir site" + }, + "launchWebsiteName": { + "message": "Iniciar site $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Site" }, @@ -338,8 +620,23 @@ "other": { "message": "Outros" }, + "unlockMethods": { + "message": "OpçÃĩes de desbloqueio" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Configure um mÊtodo de desbloqueio para alterar o tempo limite do cofre." + }, + "unlockMethodNeeded": { + "message": "Configure um mÊtodo de desbloqueio nas ConfiguraçÃĩes" + }, + "sessionTimeoutHeader": { + "message": "Tempo limite da sessÃŖo" + }, + "vaultTimeoutHeader": { + "message": "Tempo Limite do Cofre" + }, + "otherOptions": { + "message": "Outras opçÃĩes" }, "rateExtension": { "message": "Avaliar a ExtensÃŖo" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Seu cofre estÃĄ trancado. Verifique sua identidade para continuar." }, + "yourVaultIsLockedV2": { + "message": "Seu cofre estÃĄ bloqueado" + }, + "yourAccountIsLocked": { + "message": "Sua conta estÃĄ bloqueada" + }, + "or": { + "message": "ou" + }, "unlock": { "message": "Desbloquear" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Cofre - tempo esgotado" }, + "vaultTimeout1": { + "message": "Tempo de espera" + }, "lockNow": { "message": "Bloquear Agora" }, + "lockAll": { + "message": "Bloquear tudo" + }, "immediately": { "message": "Imediatamente" }, @@ -426,6 +738,18 @@ "security": { "message": "Segurança" }, + "confirmMasterPassword": { + "message": "Confirme a senha mestra" + }, + "masterPassword": { + "message": "Senha mestra" + }, + "masterPassImportant": { + "message": "Sua senha mestra nÃŖo pode ser recuperada se vocÃĒ a esquecer!" + }, + "masterPassHintLabel": { + "message": "Dica da senha mestra" + }, "errorOccurred": { "message": "Ocorreu um erro" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "A sua nova conta foi criada! Agora vocÃĒ pode iniciar a sessÃŖo." }, + "newAccountCreated2": { + "message": "Sua nova conta foi criada!" + }, + "youHaveBeenLoggedIn": { + "message": "VocÃĒ estÃĄ conectado!" + }, + "youSuccessfullyLoggedIn": { + "message": "VocÃĒ logou na sua conta com sucesso" + }, + "youMayCloseThisWindow": { + "message": "VocÃĒ pode fechar esta janela" + }, "masterPassSent": { "message": "Enviamos um e-mail com a dica da sua senha mestra." }, "verificationCodeRequired": { "message": "O cÃŗdigo de verificaÃ§ÃŖo Ê necessÃĄrio." }, + "webauthnCancelOrTimeout": { + "message": "A autenticaÃ§ÃŖo foi cancelada ou demorou muito. Por favor tente novamente." + }, "invalidVerificationCode": { "message": "CÃŗdigo de verificaÃ§ÃŖo invÃĄlido" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "NÃŖo Ê possível autopreencher o item selecionado nesta pÃĄgina. Em alternativa, copie e cole a informaÃ§ÃŖo." + "message": "NÃŖo Ê possível auto-preencher o item selecionado nesta pÃĄgina. Em alternativa, copie e cole a informaÃ§ÃŖo." + }, + "totpCaptureError": { + "message": "NÃŖo foi possível escanear o cÃŗdigo QR a partir da pÃĄgina atual" + }, + "totpCaptureSuccess": { + "message": "Chave do autenticador adicionada" + }, + "totpCapture": { + "message": "Escaneie o cÃŗdigo QR do autenticador na pÃĄgina atual" + }, + "totpHelperTitle": { + "message": "Tornar a verificaÃ§ÃŖo em duas etapas fÃĄcil" + }, + "totpHelper": { + "message": "O Bitwarden pode armazenar e preencher cÃŗdigos de verificaÃ§ÃŖo de duas etapas. Copie e cole a chave neste campo." + }, + "totpHelperWithCapture": { + "message": "O Bitwarden pode armazenar e preencher cÃŗdigos de verificaÃ§ÃŖo de duas etapas. Selecione o ícone de cÃĸmera para tirar uma captura da tela do cÃŗdigo QR de autenticador deste site, ou copie e cole a chave neste campo." + }, + "learnMoreAboutAuthenticators": { + "message": "Saiba mais sobre os autenticadores" + }, + "copyTOTP": { + "message": "Copiar chave de AutenticaÃ§ÃŖo (TOTP)" }, "loggedOut": { "message": "SessÃŖo encerrada" }, + "loggedOutDesc": { + "message": "VocÃĒ foi desconectado de sua conta." + }, "loginExpired": { "message": "A sua sessÃŖo expirou." }, + "logIn": { + "message": "Fazer login" + }, + "logInToBitwarden": { + "message": "Inicie a sessÃŖo no Bitwarden" + }, + "restartRegistration": { + "message": "Reiniciar registro" + }, + "expiredLink": { + "message": "Link expirado" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Por favor, reinicie o registro ou tente fazer login." + }, + "youMayAlreadyHaveAnAccount": { + "message": "VocÃĒ pode jÃĄ ter uma conta" + }, "logOutConfirmation": { "message": "VocÃĒ tem certeza que deseja sair?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Pasta adicionada" }, - "changeMasterPass": { - "message": "Alterar Senha Mestra" - }, - "changeMasterPasswordConfirmation": { - "message": "VocÃĒ pode alterar a sua senha mestra no cofre web em bitwarden.com. VocÃĒ deseja visitar o site agora?" - }, "twoStepLoginConfirmation": { "message": "O login de duas etapas torna a sua conta mais segura ao exigir que digite um cÃŗdigo de segurança de um aplicativo de autenticaÃ§ÃŖo quando for iniciar a sessÃŖo. O login de duas etapas pode ser ativado no cofre web bitwarden.com. Deseja visitar o site agora?" }, + "twoStepLoginConfirmationContent": { + "message": "Torne sua conta mais segura configurando o 'login' em duas etapas no aplicativo ‘web’ do Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continuar para o aplicativo da ‘web’?" + }, "editedFolder": { "message": "Pasta Editada" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Novo URI" }, + "addDomain": { + "message": "Adicionar domínio", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item adicionado" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Peça para adicionar login" }, + "vaultSaveOptionsTitle": { + "message": "Salvar nas opçÃĩes do cofre" + }, "addLoginNotificationDesc": { "message": "A \"NotificaÃ§ÃŖo de Adicionar Login\" pede para salvar automaticamente novas logins para o seu cofre quando vocÃĒ inicia uma sessÃŖo em um site pela primeira vez." }, + "addLoginNotificationDescAlt": { + "message": "Pedir para adicionar um item se um nÃŖo for encontrado no seu cofre. Aplica-se a todas as contas logadas." + }, + "showCardsInVaultView": { + "message": "Mostrar cartÃĩes como sugestÃĩes de preenchimento automÃĄtico na exibiÃ§ÃŖo do Cofre" + }, "showCardsCurrentTab": { "message": "Mostrar cartÃĩes em pÃĄginas com guias." }, "showCardsCurrentTabDesc": { "message": "Exibir itens de cartÃŖo em pÃĄginas com abas para simplificar o preenchimento automÃĄtico" }, + "showIdentitiesInVaultView": { + "message": "Mostrar identifica como sugestÃĩes de preenchimento automÃĄtico na exibiÃ§ÃŖo do Cofre" + }, "showIdentitiesCurrentTab": { "message": "Exibir Identidades na Aba Atual" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Peça para atualizar a senha de login quando uma mudança for detectada em um site." }, + "changedPasswordNotificationDescAlt": { + "message": "Pedir para atualizar a senha de uma credencial quando uma alteraÃ§ÃŖo for detectada em um site. Aplica-se a todas as contas conectadas." + }, + "enableUsePasskeys": { + "message": "Pedir para salvar e usar chaves de acesso" + }, + "usePasskeysDesc": { + "message": "Pedir para salvar novas chaves de acesso ou entrar com as mesmas armazenadas no seu cofre. Aplica-se a todas as contas conectadas." + }, "notificationChangeDesc": { "message": "VocÃĒ quer atualizar esta senha no Bitwarden?" }, @@ -634,10 +1043,13 @@ "message": "Atualizar" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Desbloqueie o seu cofre do Bitwarden para concluir a solicitaÃ§ÃŖo de autopreenchimento." }, "notificationUnlock": { - "message": "Unlock" + "message": "Desbloquear" + }, + "additionalOptions": { + "message": "OpçÃĩes adicionais" }, "enableContextMenuItem": { "message": "Mostrar opçÃĩes de menu de contexto" @@ -645,9 +1057,12 @@ "contextMenuItemDesc": { "message": "Use um duplo clique para acessar a geraÃ§ÃŖo de usuÃĄrios e senhas correspondentes para o site. " }, + "contextMenuItemDescAlt": { + "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", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Escolha a maneira padrÃŖo pela qual a detecÃ§ÃŖo de correspondÃĒncia de URI Ê manipulada para logins ao executar açÃĩes como preenchimento automÃĄtico." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Altere o tema de cores do aplicativo." }, + "themeDescAlt": { + "message": "Altere o tema de cores da aplicaÃ§ÃŖo. Aplica-se para todas as contas conectadas." + }, "dark": { "message": "Escuro", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized (escuro)", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Exportar de" + }, "exportVault": { "message": "Exportar Cofre" }, "fileFormat": { "message": "Formato de arquivo" }, + "fileEncryptedExportWarningDesc": { + "message": "Esta arquivo de exportaÃ§ÃŖo serÃĄ protegido por senha e precisarÃĄ da mesma para ser descriptografado." + }, + "filePassword": { + "message": "Senha do arquivo" + }, + "exportPasswordDescription": { + "message": "Esta senha serÃĄ usada para exportar e importar este arquivo" + }, + "accountRestrictedOptionDescription": { + "message": "Use sua chave criptogrÃĄfica da conta, derivada do nome de usuÃĄrio e senha mestra da sua conta, para criptografar a exportaÃ§ÃŖo e restringir importaÃ§ÃŖo para apenas a conta atual do Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "Defina uma senha de arquivo para criptografar a exportaÃ§ÃŖo e importÃĄ-la para qualquer conta do Bitwarden usando a senha para descriptografia." + }, + "exportTypeHeading": { + "message": "Tipo da exportaÃ§ÃŖo" + }, + "accountRestricted": { + "message": "Conta restrita" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Senha do arquivo\" e \"ConfirmaÃ§ÃŖo de senha\" nÃŖo correspondem." + }, "warning": { "message": "AVISO", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Compartilhado" }, - "learnOrg": { - "message": "Aprenda mais sobre as OrganizaçÃĩes" - }, - "learnOrgConfirmation": { - "message": "O Bitwarden permite compartilhar os seus itens do cofre com outros ao utilizar uma organizaÃ§ÃŖo. Gostaria de visitar o site bitwarden.com para saber mais?" + "bitwardenForBusinessPageDesc": { + "message": "O Bitwarden para Business permite que vocÃĒ compartilhe os itens do seu cofre com outras pessoas usando uma organizaÃ§ÃŖo. Saiba mais no site bitwarden.com." }, "moveToOrganization": { "message": "Mover para a OrganizaÃ§ÃŖo" @@ -762,6 +1204,9 @@ "file": { "message": "Arquivo" }, + "fileToShare": { + "message": "Arquivo para compartilhar" + }, "selectFile": { "message": "Selecione um arquivo." }, @@ -772,7 +1217,7 @@ "message": "Funcionalidade Indisponível" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "MigraÃ§ÃŖo de chave de criptografia necessÃĄria. Faça login atravÊs do cofre web para atualizar sua chave de criptografia." }, "premiumMembership": { "message": "Assinatura Premium" @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "1 GB de armazenamento de arquivos encriptados." }, + "premiumSignUpEmergency": { + "message": "Acesso de emergÃĒncia." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "OpçÃĩes de login em duas etapas como YubiKey e Duo." }, "ppremiumSignUpReports": { "message": "Higiene de senha, saÃēde da conta, e relatÃŗrios sobre violaÃ§ÃŖo de dados para manter o seu cofre seguro." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "VocÃĒ pode comprar a assinatura premium no cofre web em bitwarden.com. VocÃĒ deseja visitar o site agora?" }, + "premiumPurchaseAlertV2": { + "message": "VocÃĒ pode comprar Premium nas configuraçÃĩes de sua conta no aplicativo web do Bitwarden." + }, "premiumCurrentMember": { "message": "VocÃĒ ÃŠ um membro premium!" }, "premiumCurrentMemberThanks": { "message": "Obrigado por apoiar o Bitwarden." }, + "premiumFeatures": { + "message": "Atualize para a versÃŖo Premium e receba:" + }, "premiumPrice": { "message": "Tudo por apenas %price% /ano!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Tudo por apenas $PRICE$ por ano!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "AtualizaÃ§ÃŖo completa" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Aplicativo de AutenticaÃ§ÃŖo" }, - "authenticatorAppDesc": { - "message": "Utilize um aplicativo de autenticaÃ§ÃŖo (tal como Authy ou Google Authenticator) para gerar cÃŗdigos de verificaÃ§ÃŖo baseados no tempo.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Insira um cÃŗdigo gerado por um aplicativo autenticador como o Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "Chave de Segurança YubiKey OTP" + "yubiKeyTitleV2": { + "message": "Chave de Segurança Yubico OTP" }, "yubiKeyDesc": { "message": "Utilize uma YubiKey para acessar a sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO." }, - "duoDesc": { - "message": "Verifique com o Duo Security utilizando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.", + "duoDescV2": { + "message": "Insira um cÃŗdigo gerado pelo Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-mail" }, - "emailDesc": { - "message": "Os cÃŗdigos de verificaÃ§ÃŖo vÃŖo ser enviados por e-mail para vocÃĒ." + "emailDescV2": { + "message": "Digite o cÃŗdigo enviado para seu e-mail." }, "selfHostedEnvironment": { "message": "Ambiente Auto-hospedado" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Especifique a URL de base da sua instalaÃ§ÃŖo local do Bitwarden." }, + "selfHostedBaseUrlHint": { + "message": "Especifique a URL de base da sua instalaÃ§ÃŖo local do Bitwarden. Exemplo: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Para usuÃĄrios avançados. VocÃĒ pode especificar a URL de base de cada serviço independentemente." + }, + "selfHostedEnvFormInvalid": { + "message": "VocÃĒ deve adicionar um URL do servidor de base ou pelo menos um ambiente personalizado." + }, "customEnvironment": { "message": "Ambiente Personalizado" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL do Servidor" }, + "selfHostBaseUrl": { + "message": "URL do servidor auto-host", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL do Servidor da API" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "As URLs do ambiente foram salvas." }, + "showAutoFillMenuOnFormFields": { + "message": "Exibir o menu de preenchimento automÃĄtico nos campos do formulÃĄrio", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "SugestÃĩes de preenchimento automÃĄtico" + }, + "showInlineMenuLabel": { + "message": "Mostrar sugestÃĩes de preenchimento automÃĄtico nos campos de formulÃĄrios" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Exibir identidades como sugestÃĩes" + }, + "showInlineMenuCardsLabel": { + "message": "Exibir cards como sugestÃĩes" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Exibir sugestÃĩes quando o ícone for selecionado" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Aplica-se a todas as contas conectadas." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Desative as configuraçÃĩes do gerenciador de senhas do seu navegador para evitar conflitos." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Editar configuraçÃĩes do navegador." + }, + "autofillOverlayVisibilityOff": { + "message": "Desligado", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Quando o campo for selecionado (em foco)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Quando o ícone de preenchimento automÃĄtico for selecionado", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Preenchimento automÃĄtico ao carregar a pÃĄgina" + }, "enableAutoFillOnPageLoad": { - "message": "Ativar o Autopreenchimento ao Carregar a PÃĄgina" + "message": "Auto-preencher 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." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Aviso:$CLOSETAG$ Comprometido ou sites nÃŖo confiÃĄveis podem explorar o autopreenchimento ao carregar a pÃĄgina.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Sites comprometidos ou nÃŖo confiÃĄveis podem tomar vantagem do autopreenchimento ao carregar a pÃĄgina." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Saiba mais sobre riscos" + }, "learnMoreAboutAutofill": { "message": "Saiba mais sobre preenchimento automÃĄtico" }, @@ -1003,10 +1538,10 @@ "message": "Usar configuraÃ§ÃŖo padrÃŖo" }, "autoFillOnPageLoadYes": { - "message": "Autopreencher ao carregar a pÃĄgina" + "message": "Auto-preencher ao carregar a pÃĄgina" }, "autoFillOnPageLoadNo": { - "message": "NÃŖo autopreencher ao carregar a pÃĄgina" + "message": "NÃŖo auto-preencher ao carregar a pÃĄgina" }, "commandOpenPopup": { "message": "Abrir pop-up do cofre" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Abrir cofre na barra lateral" }, - "commandAutofillDesc": { - "message": "Autopreencher o Ãēltimo login utilizado para o site atual." + "commandAutofillLoginDesc": { + "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" + }, + "commandAutofillIdentityDesc": { + "message": "Autopreencher a Ãēltima identidade usada para o site atual" }, "commandGeneratePasswordDesc": { "message": "Gerar e copiar uma nova senha aleatÃŗria para a ÃĄrea de transferÃĒncia." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Bloquear o cofre" }, - "privateModeWarning": { - "message": "O suporte para modo privado Ê experimental e alguns recursos sÃŖo limitados." - }, "customFields": { "message": "Campos Personalizados" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeCheckbox": { + "message": "Caixa de seleÃ§ÃŖo" + }, "cfTypeLinked": { "message": "Vinculado", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Mostrar uma imagem reconhecível ao lado de cada login." }, + "faviconDescAlt": { + "message": "Mostre uma imagem reconhecível ao lado de cada login. Aplica-se a todas as contas conectadas." + }, "enableBadgeCounter": { "message": "Mostrar contador de insígnia" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identidade" }, + "typeSshKey": { + "message": "Chave SSH" + }, + "newItemHeader": { + "message": "Nova $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Editar $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Visualizar $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "HistÃŗrico de Senha" }, + "generatorHistory": { + "message": "HistÃŗrico do gerador" + }, + "clearGeneratorHistoryTitle": { + "message": "Limpar histÃŗrico do gerador" + }, + "cleargGeneratorHistoryDescription": { + "message": "Se continuar, todas as entradas serÃŖo permanentemente excluídas do histÃŗrico do gerador. Tem certeza que deseja continuar?" + }, "back": { "message": "Voltar" }, "collections": { "message": "ColeçÃĩes" }, + "nCollections": { + "message": "ColeçÃĩes $COUNT$", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoritos" }, @@ -1257,7 +1849,7 @@ "message": "Credenciais" }, "secureNotes": { - "message": "Notas Seguras" + "message": "Notas seguras" }, "clear": { "message": "Limpar", @@ -1282,6 +1874,10 @@ "message": "Domínio de base", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Domínio de base (recomendado)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Nome do domínio", "description": "Domain name. Ex. website.com" @@ -1301,12 +1897,12 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "DetecÃ§ÃŖo de CorrespondÃĒncia", - "description": "URI match detection for auto-fill." + "message": "DetecÃ§ÃŖo de correspondÃĒncia", + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "DetecÃ§ÃŖo de correspondÃĒncia padrÃŖo", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Alternar OpçÃĩes" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "NÃŖo existem senhas para listar." }, + "clearHistory": { + "message": "Limpar histÃŗrico" + }, + "nothingToShow": { + "message": "Nada para mostrar" + }, + "nothingGeneratedRecently": { + "message": "VocÃĒ nÃŖo gerou nada recentemente" + }, "remove": { "message": "Remover" }, @@ -1378,7 +1983,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Senha Mestra Fraca" + "message": "Senha mestra fraca" }, "weakMasterPasswordDesc": { "message": "A senha mestra que vocÃĒ selecionou estÃĄ fraca. VocÃĒ deve usar uma senha mestra forte (ou uma frase-passe) para proteger a sua conta Bitwarden adequadamente. Tem certeza que deseja usar esta senha mestra?" @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Desbloquear com o PIN" }, + "setYourPinTitle": { + "message": "Definir PIN" + }, + "setYourPinButton": { + "message": "Definir PIN" + }, "setYourPinCode": { "message": "Defina o seu cÃŗdigo PIN para desbloquear o Bitwarden. Suas configuraçÃĩes de PIN serÃŖo redefinidas se alguma vez vocÃĒ encerrar completamente toda a sessÃŖo do aplicativo." }, + "setYourPinCode1": { + "message": "O seu PIN serÃĄ usado para desbloquear o Bitwarden em vez da sua senha mestra. O seu PIN serÃĄ redefinido se terminar sessÃŖo completa do Bitwarden." + }, "pinRequired": { "message": "O cÃŗdigo PIN Ê necessÃĄrio." }, "invalidPin": { "message": "CÃŗdigo PIN invÃĄlido." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Muitas tentativas de entrada de PIN invÃĄlidas. Desconectando." + }, "unlockWithBiometrics": { "message": "Desbloquear com a biometria" }, + "unlockWithMasterPassword": { + "message": "Desbloquear com a senha mestra" + }, "awaitDesktop": { "message": "Aguardando confirmaÃ§ÃŖo do desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Bloquear com senha mestra ao reiniciar o navegador" }, + "lockWithMasterPassOnRestart1": { + "message": "Exigir senha mestra ao reiniciar o navegador" + }, "selectOneCollection": { "message": "VocÃĒ deve selecionar pelo menos uma coleÃ§ÃŖo." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Uma ou mais políticas da organizaÃ§ÃŖo estÃŖo afetando as suas configuraçÃĩes do gerador." }, + "passwordGenerator": { + "message": "Gerador de Senha" + }, + "usernameGenerator": { + "message": "Gerador de usuÃĄrio" + }, + "useThisPassword": { + "message": "Use esta senha" + }, + "useThisUsername": { + "message": "Use este nome de usuÃĄrio" + }, + "securePasswordGenerated": { + "message": "Senha segura gerada! NÃŖo se esqueça de atualizar tambÊm sua senha no site." + }, + "useGeneratorHelpTextPartOne": { + "message": "Usar o gerador", + "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": "para criar uma senha Ãēnica e forte", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "AÃ§ÃŖo de Tempo Limite do Cofre" }, + "vaultTimeoutAction1": { + "message": "AÃ§ÃŖo do tempo" + }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixeira", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item Restaurado" }, + "alreadyHaveAccount": { + "message": "JÃĄ tem uma conta?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Sair irÃĄ remover todo o acesso ao seu cofre e requer autenticaÃ§ÃŖo online apÃŗs o período de tempo limite. Tem certeza de que deseja usar esta configuraÃ§ÃŖo?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Autopreencher e Salvar" }, + "fillAndSave": { + "message": "Preencher e salvar" + }, "autoFillSuccessAndSavedUri": { "message": "Item Auto-Preenchido e URI Salvo" }, @@ -1486,13 +2141,13 @@ } }, "setMasterPassword": { - "message": "Definir Senha Mestra" + "message": "Definir senha mestra" }, "currentMasterPass": { - "message": "Current master password" + "message": "Senha mestra atual" }, "newMasterPass": { - "message": "New master password" + "message": "Nova senha mestra" }, "confirmNewMasterPass": { "message": "Confirme a nova senha mestre" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "A sua nova senha mestra nÃŖo cumpre aos requisitos da política." }, + "receiveMarketingEmailsV2": { + "message": "Obtenha conselhos, novidades, e oportunidades de pesquisa do Bitwarden em sua caixa de entrada." + }, + "unsubscribe": { + "message": "Cancelar subscriÃ§ÃŖo" + }, + "atAnyTime": { + "message": "a qualquer momento." + }, + "byContinuingYouAgreeToThe": { + "message": "Ao continuar, vocÃĒ concorda com os" + }, + "and": { + "message": "e" + }, "acceptPolicies": { "message": "Ao marcar esta caixa, vocÃĒ concorda com o seguinte:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Erro ao Atualizar Token" + }, + "errorRefreshingAccessTokenDesc": { + "message": "Nenhum token de atualizaÃ§ÃŖo ou chave de API foi encontrado. Tente sair e entrar novamente." + }, "desktopSyncVerificationTitle": { "message": "VerificaÃ§ÃŖo de sincronizaÃ§ÃŖo do Desktop" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "A conta nÃŖo confere" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Falta de chave biomÊtrica" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "O desbloqueio biomÊtrico falhou. A chave secreta biomÊtrica nÃŖo conseguiu desbloquear o cofre. Tente configurar os dados biomÊtricos novamente." + }, "biometricsNotEnabledTitle": { "message": "Biometria nÃŖo ativada" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "A biometria com o navegador nÃŖo Ê suportada neste dispositivo." }, + "biometricsNotUnlockedTitle": { + "message": "UsuÃĄrio bloqueado ou desconectado" + }, + "biometricsNotUnlockedDesc": { + "message": "Por favor, desbloqueie esse usuÃĄrio no aplicativo da ÃĄrea de trabalho e tente novamente." + }, + "biometricsNotAvailableTitle": { + "message": "Desbloqueio biomÊtrico indisponível" + }, + "biometricsNotAvailableDesc": { + "message": "O desbloqueio biomÊtrico estÃĄ indisponível no momento. Tente novamente mais tarde." + }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "Biometria falhou" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "A biometria nÃŖo pode ser concluída, considere usar uma senha mestra ou desconectar. Se isso persistir, entre em contato com o suporte do Bitwarden." }, "nativeMessaginPermissionErrorTitle": { "message": "PermissÃŖo nÃŖo fornecida" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Uma política de organizaÃ§ÃŖo estÃĄ afetando suas opçÃĩes de propriedade." }, + "personalOwnershipPolicyInEffectImports": { + "message": "A política da organizaÃ§ÃŖo bloqueou a importaÃ§ÃŖo de itens para o seu cofre." + }, + "domainsTitle": { + "message": "Domínios", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Domínios Excluídos" }, "excludedDomainsDesc": { "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." }, + "excludedDomainsDescAlt": { + "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." + }, + "websiteItemLabel": { + "message": "Site $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nÃŖo Ê um domínio vÃĄlido", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Mudanças de domínios excluídos salvas" + }, + "limitSendViews": { + "message": "Limitar visualizaÃ§ÃŖo" + }, + "limitSendViewsHint": { + "message": "NinguÊm pode visualizar este envio depois que o limite foi atingido.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ VisualizaçÃĩes restantes", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Enviar detalhes", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Pesquisar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Texto" }, + "sendTypeTextToShare": { + "message": "Texto para compartilhar" + }, "sendTypeFile": { "message": "Arquivo" }, @@ -1666,6 +2406,9 @@ "message": "Todos os Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Ocultar texto por padrÃŖo" + }, "maxAccessCountReached": { "message": "NÃēmero mÃĄximo de acessos atingido", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Protegido por senha" }, + "copyLink": { + "message": "Copiar link" + }, "copySendLink": { "message": "Copiar link do Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "VocÃĒ tem certeza que deseja excluir este Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Tem certeza que deseja excluir este campo permanentemente?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Editar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "O Send serÃĄ eliminado permanentemente na data e hora especificadas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "O envio serÃĄ eliminado permanentemente na data e hora especificadas.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data de Validade" }, @@ -1769,6 +2523,10 @@ "message": "Exigir opcionalmente uma senha para os usuÃĄrios acessarem este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Adicione uma senha opcional para os destinatÃĄrios para acessar este Envio.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notas privadas sobre esse Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send Criado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Envio criado com sucesso!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "O envio estarÃĄ disponível para qualquer pessoa com o link para a prÃŗxima 1 hora.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "O envio estarÃĄ disponível para qualquer pessoa com o link para as prÃŗximas $HOURS$ horas.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "O envio estarÃĄ disponível para qualquer pessoa com o link para o prÃŗximo 1 dia.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "O envio estarÃĄ disponível para qualquer pessoa com o link para os prÃŗximos $DAYS$ dias.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Enviar link copiado", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send Editado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Mostrar extensÃŖo?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Para criar um arquivo enviado, vocÃĒ precisa colocar a extensÃŖo em uma nova janela.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Para escolher um arquivo, abra a extensÃŖo na barra lateral (se possível), ou abra uma nova janela clicando neste banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Para escolher um arquivo usando o Safari, abra uma nova janela clicando neste banner." }, + "popOut": { + "message": "Separar da janela" + }, "sendFileCalloutHeader": { "message": "Antes de começar" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Ocultar meu endereço de e-mail dos destinatÃĄrios." }, + "hideYourEmail": { + "message": "Ocultar meu endereço de correio eletrônico dos destinatÃĄrios." + }, "sendOptionsPolicyInEffect": { "message": "Uma ou mais políticas da organizaÃ§ÃŖo estÃŖo afetando as suas opçÃĩes de Send." }, @@ -1871,20 +2679,26 @@ "emailVerificationRequired": { "message": "VerificaÃ§ÃŖo de E-mail NecessÃĄria" }, + "emailVerifiedV2": { + "message": "E-mail verificado" + }, "emailVerificationRequiredDesc": { "message": "VocÃĒ precisa verificar o seu e-mail para usar este recurso. VocÃĒ pode verificar seu e-mail no cofre web." }, "updatedMasterPassword": { - "message": "Senha Mestra Atualizada" + "message": "Senha mestra atualizada" }, "updateMasterPassword": { - "message": "Atualizar Senha Mestra" + "message": "Atualizar senha mestra" }, "updateMasterPasswordWarning": { - "message": "Sua Senha Mestra foi alterada recentemente por um administrador de sua organizaÃ§ÃŖo. Para acessar o cofre, vocÃĒ precisa atualizÃĄ-la agora. O processo desconectarÃĄ vocÃĒ da sessÃŖo atual, exigindo que vocÃĒ inicie a sessÃŖo novamente. SessÃĩes ativas em outros dispositivos podem continuar ativas por atÊ uma hora." + "message": "Sua senha mestra foi alterada recentemente por um administrador de sua organizaÃ§ÃŖo. Para acessar o cofre, vocÃĒ precisa atualizÃĄ-la agora. O processo desconectarÃĄ vocÃĒ da sessÃŖo atual, exigindo que vocÃĒ inicie a sessÃŖo novamente. SessÃĩes ativas em outros dispositivos podem continuar ativas por atÊ uma hora." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "A sua senha mestra nÃŖo atende a uma ou mais das políticas da sua organizaÃ§ÃŖo. Para acessar o cofre, vocÃĒ deve atualizar a sua senha mestra agora. O processo desconectarÃĄ vocÃĒ da sessÃŖo atual, exigindo que vocÃĒ inicie a sessÃŖo novamente. SessÃĩes ativas em outros dispositivos podem continuar ativas por atÊ uma hora." + }, + "tdeDisabledMasterPasswordRequired": { + "message": "Sua organizaÃ§ÃŖo desativou a criptografia confiÃĄvel do dispositivo. Por favor, defina uma senha mestra para acessar o seu cofre." }, "resetPasswordPolicyAutoEnroll": { "message": "InscriÃ§ÃŖo AutomÃĄtica" @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Selecionar pasta..." }, - "ssoCompleteRegistration": { - "message": "Para concluir o login com o SSO, defina uma senha mestra para acessar e proteger o seu cofre." + "noFoldersFound": { + "message": "Nenhuma pasta encontrada", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "As permissÃĩes da sua organizaÃ§ÃŖo foram atualizadas, exigindo que vocÃĒ defina uma senha mestra.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Sua organizaÃ§ÃŖo requer que vocÃĒ defina uma senha mestra.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "fora do $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "VerificaÃ§ÃŖo necessÃĄria", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Horas" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutos" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Os requisitos de política empresarial foram aplicados nesta configuraÃ§ÃŖo" + }, "vaultTimeoutPolicyInEffect": { "message": "As políticas da sua organizaÃ§ÃŖo estÃŖo afetando o tempo limite do seu cofre. O Tempo Limite MÃĄximo permitido do Cofre Ê $HOURS$ hora(s) e $MINUTES$ minuto(s)", "placeholders": { @@ -1917,8 +2756,34 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "MÃĄximo de $HOURS$ hora(s) e $MINUTES$ minuto(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Tempo limite excede a restriÃ§ÃŖo definida pela sua organizaÃ§ÃŖo: mÃĄximo de $HOURS$ hora(s) e $MINUTES$ minuto(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "As políticas da sua organizaÃ§ÃŖo estÃŖo afetando seu cofre tempo limite. Tempo limite mÃĄximo permitido para cofre Ê $HOURS$ hora(s) e $MINUTES$ minuto(s). A aÃ§ÃŖo de tempo limite do seu cofre Ê definida como $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1935,7 +2800,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "As políticas da sua organizaÃ§ÃŖo definiram a aÃ§ÃŖo tempo limite do seu cofre para $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -1971,7 +2836,7 @@ "message": "Sair da OrganizaÃ§ÃŖo" }, "removeMasterPassword": { - "message": "Remover Senha Mestra" + "message": "Remover senha mestra" }, "removedMasterPassword": { "message": "Senha mestra removida." @@ -1992,7 +2857,7 @@ "message": "Exportando o Cofre Pessoal" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Apenas os itens individuais do cofre associados a $EMAIL$ serÃŖo exportados. Os itens do cofre da organizaÃ§ÃŖo nÃŖo serÃŖo incluídos. Apenas as informaçÃĩes de item do cofre serÃŖo exportadas e nÃŖo incluirÃŖo anexos associados.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exportando cofre da organizaÃ§ÃŖo" + }, + "exportingOrganizationVaultDesc": { + "message": "Apenas o cofre da organizaÃ§ÃŖo associado com $ORGANIZATION$ serÃĄ exportado. Itens do cofre pessoal e itens de outras organizaçÃĩes nÃŖo serÃŖo incluídos.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Erro" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Gerar UsuÃĄrio" }, + "generateEmail": { + "message": "Gerar e-mail" + }, + "generatorBoundariesHint": { + "message": "Valor deve ser entre $MIN$ e $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Tipo de usuÃĄrio" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Gere um apelido de e-mail com um serviço de encaminhamento externo." }, + "forwarderDomainName": { + "message": "Domínio de e-mail", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Escolha um domínio que seja suportado pelo serviço selecionado", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Erro $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Site: $WEBSITE$. Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token de API $SERVICENAME$ invÃĄlido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token de API $SERVICENAME$ invÃĄlido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "NÃŖo foi possível obter a mÃĄscara do ID da conta de email $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Domínio $SERVICENAME$ invÃĄlido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL $SERVICENAME$ invÃĄlida.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ocorreu um erro $SERVICENAME$ desconhecido.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Encaminhador desconhecido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome do host", "description": "Part of a URL." @@ -2093,7 +3097,7 @@ "message": "VersÃŖo do servidor" }, "selfHostedServer": { - "message": "self-hosted" + "message": "auto-hospedado" }, "thirdParty": { "message": "Terceiros" @@ -2153,16 +3157,16 @@ "message": "Uma notificaÃ§ÃŖo foi enviada para seu dispositivo." }, "loginInitiated": { - "message": "Login initiated" + "message": "Login iniciado" }, "exposedMasterPassword": { - "message": "Senha Mestra comprometida" + "message": "Senha mestra comprometida" }, "exposedMasterPasswordDesc": { "message": "A senha foi encontrada em um vazamento de dados. Use uma senha Ãēnica para proteger sua conta. Tem certeza de que deseja usar uma senha jÃĄ exposta?" }, "weakAndExposedMasterPassword": { - "message": "Senha Mestra fraca e comprometida" + "message": "Senha mestra fraca e comprometida" }, "weakAndBreachedMasterPasswordDesc": { "message": "Senha fraca identificada e encontrada em um vazamento de dados. Use uma senha forte e Ãēnica para proteger a sua conta. Tem certeza de que deseja usar essa senha?" @@ -2174,7 +3178,7 @@ "message": "Importante:" }, "masterPasswordHint": { - "message": "Sua Senha Mestra nÃŖo pode ser recuperada se vocÃĒ a esquecer!" + "message": "Sua senha mestra nÃŖo pode ser recuperada se vocÃĒ a esquecer!" }, "characterMinimum": { "message": "$LENGTH$ caracteres mínimos", @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Suas políticas de organizaÃ§ÃŖo ativaram o autopreenchimento ao carregar a pÃĄgina." }, "howToAutofill": { "message": "Como autopreencher" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Selecione um item desta tela, use o atalho $COMMAND$, ou explore outras opçÃĩes nas configuraçÃĩes.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Selecione um item desta pÃĄgina ou defina um atalho nas configuraçÃĩes." + "message": "Selecione um item desta tela ou explore outras opçÃĩes nas configuraçÃĩes." }, "gotIt": { "message": "Entendi" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "ConfiguraçÃĩes de autopreenchimento" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Alterar atalho" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Gerenciar atalhos" + }, "autofillShortcut": { "message": "Atalho para autopreenchimento" }, - "autofillShortcutNotSet": { - "message": "O atalho de preenchimento automÃĄtico nÃŖo estÃĄ definido. Altere-o nas configuraçÃĩes do navegador." + "autofillLoginShortcutNotSet": { + "message": "O atalho de acesso ao preenchimento automÃĄtico nÃŖo estÃĄ definido. Altere isso nas configuraçÃĩes do navegador." }, - "autofillShortcutText": { - "message": "O atalho de preenchimento automÃĄtico Ê: $COMMAND$. Altere-o 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.", "placeholders": { "command": { "content": "$1", @@ -2233,87 +3246,107 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Abrir em uma nova janela" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "AprovaÃ§ÃŖo do dispositivo necessÃĄria. Selecione uma opÃ§ÃŖo de aprovaÃ§ÃŖo abaixo:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Lembrar deste dispositivo" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "Desmarque se estiver usando um dispositivo pÃēblico" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Aprovar do seu outro dispositivo" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Solicitar aprovaÃ§ÃŖo do administrador" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Aprovar com senha mestra" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "Identificador SSO da organizaÃ§ÃŖo Ê necessÃĄrio." + }, + "creatingAccountOn": { + "message": "Criando conta em" + }, + "checkYourEmail": { + "message": "Verifique seu e-mail" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Siga o link no e-mail enviado para" + }, + "andContinueCreatingYourAccount": { + "message": "e continue criando a sua conta." + }, + "noEmail": { + "message": "Sem e-mail?" + }, + "goBack": { + "message": "Voltar" + }, + "toEditYourEmailAddress": { + "message": "para editar o seu endereço de e-mail." }, "eu": { - "message": "EU", + "message": "Europa", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Acesso negado. VocÃĒ nÃŖo tem permissÃŖo para ver esta pÃĄgina." }, "general": { - "message": "General" + "message": "Gerais" }, "display": { - "message": "Display" + "message": "Exibir" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "Conta criada com sucesso!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "AprovaÃ§ÃŖo do administrador necessÃĄria" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Seu pedido foi enviado para seu administrador." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "SerÃĄ notificado assim que for aprovado." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "Problemas em efetuar login?" }, "loginApproved": { - "message": "Login approved" + "message": "Login aprovado" }, "userEmailMissing": { - "message": "User email missing" + "message": "E-mail do usuÃĄrio ausente" }, "deviceTrusted": { - "message": "Device trusted" + "message": "Dispositivo confiÃĄvel" + }, + "sendsNoItemsTitle": { + "message": "Nenhum Send ativo", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use o Send para compartilhar informaÃ§ÃŖo criptografa com qualquer um.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "Entrada necessÃĄria." }, "required": { - "message": "required" + "message": "obrigatÃŗrio" }, "search": { - "message": "Search" + "message": "Pesquisar" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "A entrada deve ter pelo menos $COUNT$ caracteres.", "placeholders": { "count": { "content": "$1", @@ -2322,7 +3355,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "A entrada nÃŖo pode exceder $COUNT$ caracteres.", "placeholders": { "count": { "content": "$1", @@ -2331,7 +3364,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "Os seguintes caracteres nÃŖo sÃŖo permitidos: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "O valor de entrada deve ser pelo menos $MIN$.", "placeholders": { "min": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "O valor de entrada nÃŖo deve exceder $MAX$.", "placeholders": { "max": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "1 ou mais e-mails sÃŖo invÃĄlidos" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "A entrada nÃŖo pode conter somente espaços em branco.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "A entrada nÃŖo Ê um endereço de e-mail." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "$COUNT$ campo(s) acima precisam de sua atenÃ§ÃŖo.", "placeholders": { "count": { "content": "$1", @@ -2376,23 +3409,35 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 campo precisa de sua atenÃ§ÃŖo." + }, + "multipleFieldsNeedAttention": { + "message": "Campos $COUNT$ precisam de sua atenÃ§ÃŖo.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Selecione --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- Digite para filtrar --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "Carrgando OpçÃĩes..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "Nenhum item encontrado" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "Limpar todos" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ mais", "placeholders": { "quantity": { "content": "$1", @@ -2404,7 +3449,1379 @@ "message": "Submenu" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Alternar colapso", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Importar seus dados para o Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Proteja seus dados do LastPass e importe para o Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Salvar como arquivo nÃŖo criptografado", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importar para o Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importando...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Dados importados com sucesso!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Erro ao importar. Verifique o console para detalhes.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Erro de rede encontrado durante a importaÃ§ÃŖo.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "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.", + "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.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Desative a re-solicitaÃ§ÃŖo de senha mestra para editar este campo", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Ativar/desativar navegaÃ§ÃŖo lateral" + }, + "skipToContent": { + "message": "Ir para o conteÃēdo" + }, + "bitwardenOverlayButton": { + "message": "BotÃŖo de Menu de Autopreenchimento Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Alternar menu de autopreenchimento do Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Menu de autopreenchimento Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Desbloqueie sua conta para ver os logins correspondentes", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Desbloqueie sua conta para ver as sugestÃĩes de preenchimento automÃĄtico", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Desbloquear conta", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Desbloqueie sua conta, abra em uma nova janela", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Preencha as credenciais para", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Nome parcial", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Nenhum item para mostrar", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Novo item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Adicionar novo item do cofre", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Novo login", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Adicionar novo item de login no cofre, abre em uma nova janela", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Novo cartÃŖo", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Adicione um novo item do cartÃŖo do cofre, abre em uma nova janela", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Nova identidade", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Adicionar novo item de identidade do cofre, abre em uma nova janela", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Ligar" + }, + "ignore": { + "message": "Ignorar" + }, + "importData": { + "message": "Importar dados", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Erro ao importar" + }, + "importErrorDesc": { + "message": "Houve um problema com os dados que vocÃĒ tentou importar. Por favor, resolva os erros listados abaixo em seu arquivo de origem e tente novamente." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolva os erros abaixo e tente novamente." + }, + "description": { + "message": "DescriÃ§ÃŖo" + }, + "importSuccess": { + "message": "Dados importados com sucesso" + }, + "importSuccessNumberOfItems": { + "message": "Um total de $AMOUNT$ itens foram importados.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Tentar novamente" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "VerificaÃ§ÃŖo necessÃĄria para esta aÃ§ÃŖo. Defina um PIN para continuar." + }, + "setPin": { + "message": "Definir PIN" + }, + "verifyWithBiometrics": { + "message": "Verificiar com biometria" + }, + "awaitingConfirmation": { + "message": "Aguardando confirmaÃ§ÃŖo" + }, + "couldNotCompleteBiometrics": { + "message": "NÃŖo foi possível completar a biometria." + }, + "needADifferentMethod": { + "message": "Precisa de um mÊtodo diferente?" + }, + "useMasterPassword": { + "message": "Usar a senha mestra" + }, + "usePin": { + "message": "Usar PIN" + }, + "useBiometrics": { + "message": "Usar biometria" + }, + "enterVerificationCodeSentToEmail": { + "message": "Digite o cÃŗdigo de verificaÃ§ÃŖo que foi enviado para o seu e-mail." + }, + "resendCode": { + "message": "Reenviar cÃŗdigo" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "VocÃĒ estÃĄ importando dados para $ORGANIZATION$. Seus dados podem ser compartilhados com membros desta organizaÃ§ÃŖo. VocÃĒ deseja continuar?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Erro ao se conectar com o serviço Duo. Use um mÊtodo de verificaÃ§ÃŖo de duas etapas diferente ou contate o Duo para assistÃĒncia." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Inicie o Duo e siga os passos para finalizar o login." + }, + "duoRequiredForAccount": { + "message": "A autenticaÃ§ÃŖo em duas etapas do Duo Ê necessÃĄria para sua conta." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Abra a extensÃŖo para concluir o login." + }, + "popoutExtension": { + "message": "ExtensÃŖo pop-out" + }, + "launchDuo": { + "message": "Abrir o Duo" + }, + "importFormatError": { + "message": "Os dados nÃŖo estÃŖo formatados corretamente. Por favor, verifique o seu arquivo de importaÃ§ÃŖo e tente novamente." + }, + "importNothingError": { + "message": "Nada foi importado." + }, + "importEncKeyError": { + "message": "Erro ao descriptografar o arquivo exportado. Sua chave de criptografia nÃŖo corresponde à chave de criptografia usada para exportar os dados." + }, + "invalidFilePassword": { + "message": "Senha do arquivo invÃĄlida, por favor informe a senha utilizada quando criou o arquivo de exportaÃ§ÃŖo." + }, + "destination": { + "message": "Destino" + }, + "learnAboutImportOptions": { + "message": "Saiba mais sobre suas opçÃĩes de importaÃ§ÃŖo" + }, + "selectImportFolder": { + "message": "Selecione uma pasta" + }, + "selectImportCollection": { + "message": "Selecione uma coleÃ§ÃŖo" + }, + "importTargetHint": { + "message": "Selecione esta opÃ§ÃŖo se vocÃĒ quer o conteÃēdo do arquivo importado movido para $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Arquivo contÊm itens nÃŖo atribuídos." + }, + "selectFormat": { + "message": "Selecione o formato do arquivo de importaÃ§ÃŖo" + }, + "selectImportFile": { + "message": "Selecione o arquivo de importaÃ§ÃŖo" + }, + "chooseFile": { + "message": "Selecionar Arquivo" + }, + "noFileChosen": { + "message": "Nenhum arquivo escolhido" + }, + "orCopyPasteFileContents": { + "message": "ou copie/cole o conteÃēdo do arquivo de importaÃ§ÃŖo" + }, + "instructionsFor": { + "message": "$NAME$ instruçÃĩes", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirmar importaÃ§ÃŖo do cofre" + }, + "confirmVaultImportDesc": { + "message": "Este arquivo Ê protegido por senha. Por favor, digite a senha do arquivo para importar os dados." + }, + "confirmFilePassword": { + "message": "Confirmar senha do arquivo" + }, + "exportSuccess": { + "message": "Dados do cofre exportados" + }, + "typePasskey": { + "message": "Chave de acesso" + }, + "accessing": { + "message": "Acessando" + }, + "passkeyNotCopied": { + "message": "A chave de acesso nÃŖo serÃĄ copiada" + }, + "passkeyNotCopiedAlert": { + "message": "A chave de acesso nÃŖo serÃĄ copiada para o item clonado. Deseja continuar clonando este item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "VerificaÃ§ÃŖo requerida pelo site que a iniciou. Esse recurso ainda nÃŖo estÃĄ implementado para contas sem senha mestra." + }, + "logInWithPasskeyQuestion": { + "message": "Fazer ‘login’ com chave de acesso?" + }, + "passkeyAlreadyExists": { + "message": "Uma chave de acesso jÃĄ existe para este aplicativo." + }, + "noPasskeysFoundForThisApplication": { + "message": "Nenhuma chave de acesso encontrada para este aplicativo." + }, + "noMatchingPasskeyLogin": { + "message": "VocÃĒ nÃŖo tem um login correspondente para este site." + }, + "noMatchingLoginsForSite": { + "message": "Sem credenciais correspondentes para este site" + }, + "searchSavePasskeyNewLogin": { + "message": "Pesquisar ou salvar senha como novo login" + }, + "confirm": { + "message": "Confirmar" + }, + "savePasskey": { + "message": "Salvar chave de acesso" + }, + "savePasskeyNewLogin": { + "message": "Salvar chave de acesso como um novo login" + }, + "chooseCipherForPasskeySave": { + "message": "Escolha um ‘login’ para salvar com essa chave de acesso" + }, + "chooseCipherForPasskeyAuth": { + "message": "Escolha uma senha para iniciar sessÃŖo" + }, + "passkeyItem": { + "message": "Item de chave de acesso" + }, + "overwritePasskey": { + "message": "Sobrescrever chave de acesso?" + }, + "overwritePasskeyAlert": { + "message": "Este item jÃĄ contÊm uma chave de acesso. Tem certeza que deseja substituir a atual?" + }, + "featureNotSupported": { + "message": "Recurso ainda nÃŖo suportado" + }, + "yourPasskeyIsLocked": { + "message": "AutenticaÃ§ÃŖo necessÃĄria para usar a chave de acesso. Verifique sua identidade para continuar." + }, + "multifactorAuthenticationCancelled": { + "message": "AutenticaÃ§ÃŖo de mÃēltiplos fatores cancelada" + }, + "noLastPassDataFound": { + "message": "Nenhum dado do LastPass encontrado" + }, + "incorrectUsernameOrPassword": { + "message": "Nome de usuÃĄrio ou senha incorretos" + }, + "incorrectPassword": { + "message": "Senha incorreta" + }, + "incorrectCode": { + "message": "CÃŗdigo incorreto" + }, + "incorrectPin": { + "message": "PIN incorreto" + }, + "multifactorAuthenticationFailed": { + "message": "Falha na autenticaÃ§ÃŖo de mÃēltiplos fatores" + }, + "includeSharedFolders": { + "message": "Incluir pastas compartilhadas" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importando sua conta..." + }, + "lastPassMFARequired": { + "message": "Requer autenticaÃ§ÃŖo multifatores do LastPass" + }, + "lastPassMFADesc": { + "message": "Digite sua senha Ãēnica do app de autenticaÃ§ÃŖo" + }, + "lastPassOOBDesc": { + "message": "Aprove a solicitaÃ§ÃŖo de login no seu aplicativo de autenticaÃ§ÃŖo ou insira cÃŗdigo unico." + }, + "passcode": { + "message": "CÃŗdigo" + }, + "lastPassMasterPassword": { + "message": "Senha mestra do LastPass" + }, + "lastPassAuthRequired": { + "message": "AutenticaÃ§ÃŖo do LastPass necessÃĄria" + }, + "awaitingSSO": { + "message": "Aguardando autenticaÃ§ÃŖo SSO" + }, + "awaitingSSODesc": { + "message": "Por favor, continue a iniciar a sessÃŖo usando as credenciais da sua empresa." + }, + "seeDetailedInstructions": { + "message": "Veja instruçÃĩes detalhadas no nosso site de ajuda em", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importar diretamente do LastPass" + }, + "importFromCSV": { + "message": "Importar de CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Tente novamente ou procure um e-mail do LastPass para verificar que Ê vocÃĒ." + }, + "collection": { + "message": "ColeÃ§ÃŖo" + }, + "lastPassYubikeyDesc": { + "message": "Insira a YubiKey associada com a sua conta do LastPass na porta USB do seu computador, e depois toque no botÃŖo dele." + }, + "switchAccount": { + "message": "Trocar conta" + }, + "switchAccounts": { + "message": "Alternar conta" + }, + "switchToAccount": { + "message": "Mudar para conta" + }, + "activeAccount": { + "message": "Conta ativa" + }, + "availableAccounts": { + "message": "Contas disponíveis" + }, + "accountLimitReached": { + "message": "Limite de contas atingido. Termine a sessÃŖo de uma conta para adicionar outra." + }, + "active": { + "message": "ativo" + }, + "locked": { + "message": "bloqueado" + }, + "unlocked": { + "message": "desbloqueado" + }, + "server": { + "message": "servidor" + }, + "hostedAt": { + "message": "hospedado em" + }, + "useDeviceOrHardwareKey": { + "message": "Use o seu dispositivo ou chave de hardware" + }, + "justOnce": { + "message": "Somente uma vez" + }, + "alwaysForThisSite": { + "message": "Sempre para este site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ adicionado aos domínios excluídos.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Formatos comuns", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continuar nas configuraçÃĩes do navegador?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continuar para o Centro de Ajuda?", + "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.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "VocÃĒ pode ver e definir atalhos de extensÃŖo nas configuraçÃĩes do seu navegador.", + "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.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "VocÃĒ pode ver e definir atalhos de extensÃŖo nas configuraçÃĩes do seu navegador.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Tornar o Bitwarden seu gerenciador de senhas padrÃŖo?", + "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.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Faça do Bitwarden seu gerenciador de senhas padrÃŖo", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "NÃŖo Ê possível definir o Bitwarden como o gerenciador de senhas padrÃŖo", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "VocÃĒ deve conceder permissÃĩes de privacidade do navegador ao Bitwarden para defini-lo como o Gerenciador de Senhas padrÃŖo.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Tornar padrÃŖo", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credenciais salvas com sucesso!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Senha salva!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credenciais atualizadas com sucesso!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Senha atualizada!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Erro ao salvar credenciais. Verifique o console para detalhes.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Sucesso" + }, + "removePasskey": { + "message": "Remover chave de acesso" + }, + "passkeyRemoved": { + "message": "Chave de acesso removida" + }, + "autofillSuggestions": { + "message": "SugestÃĩes de autopreenchimento" + }, + "autofillSuggestionsTip": { + "message": "Salvar um item de login para este site autopreenchimento" + }, + "yourVaultIsEmpty": { + "message": "Seu cofre estÃĄ vazio" + }, + "noItemsMatchSearch": { + "message": "Nenhum item corresponde à sua pesquisa" + }, + "clearFiltersOrTryAnother": { + "message": "Limpar filtros ou tentar outro termo de pesquisa" + }, + "copyInfoTitle": { + "message": "Copiar informaÃ§ÃŖo - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copiar Nota - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Mais opçÃĩes, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Mais opçÃĩes - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Visualizar item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Auto-preenchimento - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "NÃŖo hÃĄ valores para copiar" + }, + "assignToCollections": { + "message": "Atribuir à coleçÃĩes" + }, + "copyEmail": { + "message": "Copiar e-mail" + }, + "copyPhone": { + "message": "Copiar telefone" + }, + "copyAddress": { + "message": "Copiar endereço" + }, + "adminConsole": { + "message": "Painel de administraÃ§ÃŖo" + }, + "accountSecurity": { + "message": "Segurança da conta" + }, + "notifications": { + "message": "NotificaçÃĩes" + }, + "appearance": { + "message": "AparÃĒncia" + }, + "errorAssigningTargetCollection": { + "message": "Erro ao atribuir coleÃ§ÃŖo de destino." + }, + "errorAssigningTargetFolder": { + "message": "Erro ao atribuir pasta de destino." + }, + "viewItemsIn": { + "message": "Visualizar itens em $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Voltar para $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Novo" + }, + "removeItem": { + "message": "Remover $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Itens sem pasta" + }, + "itemDetails": { + "message": "Detalhes dos item" + }, + "itemName": { + "message": "Nome do item" + }, + "cannotRemoveViewOnlyCollections": { + "message": "VocÃĒ nÃŖo pode remover coleçÃĩes com permissÃĩes de Somente leitura: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "A organizaÃ§ÃŖo estÃĄ desativada" + }, + "owner": { + "message": "ProprietÃĄrio" + }, + "selfOwnershipLabel": { + "message": "VocÃĒ", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Itens em organizaçÃĩes desativadas nÃŖo podem ser acessados. Entre em contato com o proprietÃĄrio da sua organizaÃ§ÃŖo para obter assistÃĒncia." + }, + "additionalInformation": { + "message": "InformaÃ§ÃŖo adicional" + }, + "itemHistory": { + "message": "HistÃŗrico do item" + }, + "lastEdited": { + "message": "Última ediÃ§ÃŖo" + }, + "ownerYou": { + "message": "ProprietÃĄrio: VocÃĒ" + }, + "linked": { + "message": "Vinculado" + }, + "copySuccessful": { + "message": "Copiado com Sucesso" + }, + "upload": { + "message": "Fazer upload" + }, + "addAttachment": { + "message": "Adicionar anexo" + }, + "maxFileSizeSansPunctuation": { + "message": "O tamanho mÃĄximo de arquivo Ê de 500 MB" + }, + "deleteAttachmentName": { + "message": "Excluir anexo $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Baixar $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Tem certeza de que deseja excluir este anexo permanentemente?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "OrganizaçÃĩes gratuitas nÃŖo podem usar anexos" + }, + "filters": { + "message": "Filtros" + }, + "personalDetails": { + "message": "Detalhes pessoais" + }, + "identification": { + "message": "IdentificaÃ§ÃŖo" + }, + "contactInfo": { + "message": "InformaÃ§ÃŖo de contato" + }, + "downloadAttachment": { + "message": "Baixar - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "o nÃēmero do cartÃŖo termina com", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Credenciais de login" + }, + "authenticatorKey": { + "message": "Chave do autenticador" + }, + "autofillOptions": { + "message": "OpçÃĩes de autopreenchimento" + }, + "websiteUri": { + "message": "Site (URI)" + }, + "websiteUriCount": { + "message": "Site (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Site adicionado" + }, + "addWebsite": { + "message": "Adicionar site" + }, + "deleteWebsite": { + "message": "Excluir site" + }, + "defaultLabel": { + "message": "PadrÃŖo ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Exibir detecÃ§ÃŖo de correspondÃĒncia $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Ocultar detecÃ§ÃŖo de correspondÃĒncia $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Preenchimento automÃĄtico ao carregar a pÃĄgina?" + }, + "cardExpiredTitle": { + "message": "CartÃŖo expirado" + }, + "cardExpiredMessage": { + "message": "Se vocÃĒ o renovou, atualize as informaçÃĩes do cartÃŖo" + }, + "cardDetails": { + "message": "Detalhes do cartÃŖo" + }, + "cardBrandDetails": { + "message": "Detalhes $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Habilita animaçÃĩes" + }, + "showAnimations": { + "message": "Exibir animaçÃĩes" + }, + "addAccount": { + "message": "Adicionar conta" + }, + "loading": { + "message": "Carregando" + }, + "data": { + "message": "Dado" + }, + "passkeys": { + "message": "Senhas", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Senhas", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Iniciar sessÃŖo com a chave de acesso", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Atribuir" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Apenas membros da organizaÃ§ÃŖo com acesso a essas coleçÃĩes poderÃŖo ver o item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Apenas membros da organizaÃ§ÃŖo com acesso à essas coleçÃĩes poderÃŖo ver os itens." + }, + "bulkCollectionAssignmentWarning": { + "message": "VocÃĒ selecionou $TOTAL_COUNT$ itens. VocÃĒ nÃŖo pode atualizar $READONLY_COUNT$ destes itens porque vocÃĒ nÃŖo tem permissÃŖo de ediÃ§ÃŖo.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Adicionar campo" + }, + "add": { + "message": "Adicionar" + }, + "fieldType": { + "message": "Tipo do campo" + }, + "fieldLabel": { + "message": "RÃŗtulo do campo" + }, + "textHelpText": { + "message": "Utilize campos de texto para dados como questÃĩes de segurança" + }, + "hiddenHelpText": { + "message": "Use campos ocultos para dados confidenciais como uma senha" + }, + "checkBoxHelpText": { + "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." + }, + "linkedLabelHelpText": { + "message": "Digite o Id html do campo, nome, nome aria-label, ou espaço reservado." + }, + "editField": { + "message": "Editar campo" + }, + "editFieldLabel": { + "message": "Editar $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Excluir $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ adicionado", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reordene $LABEL$. Use a tecla de seta para mover o item para cima ou para baixo.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ se moveu para cima, posiÃ§ÃŖo $INDEX$ de $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Selecione as coleçÃĩes para atribuir" + }, + "personalItemTransferWarningSingular": { + "message": "1 item serÃĄ transferido permanentemente para a organizaÃ§ÃŖo selecionada. VocÃĒ nÃŖo irÃĄ mais possuir este item." + }, + "personalItemsTransferWarningPlural": { + "message": "Itens $PERSONAL_ITEMS_COUNT$ serÃŖo transferidos permanentemente para a organizaÃ§ÃŖo selecionada. VocÃĒ nÃŖo irÃĄ mais possuir esses itens.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item serÃĄ transferido permanentemente para $ORG$. VocÃĒ nÃŖo irÃĄ mais possuir este item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "Os itens $PERSONAL_ITEMS_COUNT$ serÃŖo transferidos permanentemente para $ORG$. VocÃĒ nÃŖo irÃĄ mais possuir esses itens.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "ColeçÃĩes atribuídas com sucesso" + }, + "nothingSelected": { + "message": "VocÃĒ selecionou nada." + }, + "movedItemsToOrg": { + "message": "Itens selecionados movidos para $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Itens movidos para $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item movido para $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ se moveu para baixo, posiÃ§ÃŖo $INDEX$ de $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "LocalizaÃ§ÃŖo do Item" + }, + "fileSend": { + "message": "Arquivo enviado" + }, + "fileSends": { + "message": "Arquivos enviados" + }, + "textSend": { + "message": "Enviar texto" + }, + "textSends": { + "message": "Texto enviado" + }, + "bitwardenNewLook": { + "message": "Bitwarden tem uma nova aparÃĒncia!" + }, + "bitwardenNewLookDesc": { + "message": "É mais fÃĄcil e mais intuitivo do que nunca autopreenchimento e pesquise na guia Cofre. DÃĒ uma olhada ao redor!" + }, + "accountActions": { + "message": "AçÃĩes da conta" + }, + "showNumberOfAutofillSuggestions": { + "message": "Mostrar o nÃēmero de sugestÃĩes de preenchimento automÃĄtico de login no ícone da extensÃŖo" + }, + "systemDefault": { + "message": "PadrÃŖo do sistema" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Os requisitos de política empresarial foram aplicados nesta configuraÃ§ÃŖo" + }, + "sshPrivateKey": { + "message": "Chave privada" + }, + "sshPublicKey": { + "message": "Chave pÃēblica" + }, + "sshFingerprint": { + "message": "ImpressÃŖo digital" + }, + "sshKeyAlgorithm": { + "message": "Tipo de chave" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Tente novamente" + }, + "vaultCustomTimeoutMinimum": { + "message": "Tempo limite mínimo personalizado Ê 1 minuto." + }, + "additionalContentAvailable": { + "message": "ConteÃēdo adicional estÃĄ disponível" + }, + "fileSavedToDevice": { + "message": "Arquivo salvo no dispositivo. Gerencie a partir das transferÃĒncias do seu dispositivo." + }, + "showCharacterCount": { + "message": "Mostrar contagem de caracteres" + }, + "hideCharacterCount": { + "message": "Esconder contagem de caracteres" + }, + "itemsInTrash": { + "message": "Itens na lixeira" + }, + "noItemsInTrash": { + "message": "Nenhum item na lixeira" + }, + "noItemsInTrashDesc": { + "message": "Os itens que vocÃĒ excluir aparecerÃŖo aqui e serÃŖo excluídos permanentemente apÃŗs 30 dias" + }, + "trashWarning": { + "message": "Os itens que ficarem na lixeira por mais de 30 dias serÃŖo excluídos automaticamente" + }, + "restore": { + "message": "Restaurar" + }, + "deleteForever": { + "message": "Apagar permanentemente" + }, + "noEditPermissions": { + "message": "VocÃĒ nÃŖo tem permissÃŖo para editar este arquivo" + }, + "authenticating": { + "message": "Autenticando" + }, + "fillGeneratedPassword": { + "message": "Preencher a senha gerada", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Senha regenerada", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Salvar login no Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Espaço", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Linear", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "BastÃŖo", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Ponto de exclamaÃ§ÃŖo", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "Arroba", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Jogo da velha", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "cifrÃŖo", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Porcentagem", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Circunflexo", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "E Comercial", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterísco", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "ParÃĒntese esquerdo", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "ParÃĒnteses direito", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Sublinhado", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hífen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Mais", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "iguais", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Abre chaves", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Fecha chaves", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Abre colchetes", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Fecha colchetes", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Barra Invertida", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Dois Pontos", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Ponto e vírgula", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Aspas duplas", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Aspas simples", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Menor que", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Maior que", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Virgula", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Ponto", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Ponto de interrogaÃ§ÃŖo", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Barra", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Letras minÃēsculas" + }, + "uppercaseAriaLabel": { + "message": "Letras maiÃēsculas" + }, + "generatedPassword": { + "message": "Senha gerada" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 496350bb995..f7197d512d7 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -7,17 +7,35 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Um gestor de palavras-passe seguro e gratuito para todos os seus dispositivos.", - "description": "Extension description" + "message": "Em casa, no trabalho, em todo o lado, o Bitwarden protege todas as suas palavras-passe e informaçÃĩes sensíveis", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Inicie sessÃŖo ou crie uma nova conta para aceder ao seu cofre seguro." }, + "inviteAccepted": { + "message": "Convite aceite" + }, "createAccount": { "message": "Criar conta" }, - "login": { - "message": "Iniciar sessÃŖo" + "newToBitwarden": { + "message": "Novo no Bitwarden?" + }, + "logInWithPasskey": { + "message": "Iniciar sessÃŖo com a chave de acesso" + }, + "useSingleSignOn": { + "message": "Utilizar início de sessÃŖo Ãēnico" + }, + "welcomeBack": { + "message": "Bem-vindo de volta" + }, + "setAStrongPassword": { + "message": "Defina uma palavra-passe forte" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Termine a criaÃ§ÃŖo da sua conta definindo uma palavra-passe" }, "enterpriseSingleSignOn": { "message": "Início de sessÃŖo Ãēnico para empresas" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Uma dica da palavra-passe mestra pode ajudÃĄ-lo a lembrar-se da sua palavra-passe, caso se esqueça dela." }, + "masterPassHintText": { + "message": "Se se esquecer da sua palavra-passe, a dica da palavra-passe pode ser enviada para o seu e-mail. MÃĄximo de $CURRENT$/$MAXIMUM$ caracteres.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Reintroduza a palavra-passe mestra" }, "masterPassHint": { "message": "Dica da palavra-passe mestra (opcional)" }, + "joinOrganization": { + "message": "Aderir à organizaÃ§ÃŖo" + }, + "joinOrganizationName": { + "message": "Aderir a $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Conclua a adesÃŖo a esta organizaÃ§ÃŖo ao definir uma palavra-passe mestra." + }, "tab": { "message": "Separador" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copiar palavra-passe" }, + "copyPassphrase": { + "message": "Copiar frase de acesso" + }, "copyNote": { "message": "Copiar nota" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copiar cÃŗdigo de segurança" }, + "copyName": { + "message": "Copiar nome" + }, + "copyCompany": { + "message": "Copiar empresa" + }, + "copySSN": { + "message": "Copiar nÃēmero de segurança social" + }, + "copyPassportNumber": { + "message": "Copiar nÃēmero do passaporte" + }, + "copyLicenseNumber": { + "message": "Copiar nÃēmero da carta de conduÃ§ÃŖo" + }, + "copyPrivateKey": { + "message": "Copiar chave privada" + }, + "copyPublicKey": { + "message": "Copiar chave pÃēblica" + }, + "copyFingerprint": { + "message": "Copiar impressÃŖo digital" + }, + "copyCustomField": { + "message": "Copiar $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copiar site" + }, + "copyNotes": { + "message": "Copiar notas" + }, + "fill": { + "message": "Preencher", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Preenchimento automÃĄtico" + "message": "Preencher automaticamente" + }, + "autoFillLogin": { + "message": "Preencher automaticamente credencial" + }, + "autoFillCard": { + "message": "Preencher automaticamente cartÃŖo" + }, + "autoFillIdentity": { + "message": "Preencher automaticamente identidade" }, "generatePasswordCopied": { "message": "Gerar palavra-passe (copiada)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Sem credenciais correspondentes" }, + "noCards": { + "message": "Sem cartÃĩes" + }, + "noIdentities": { + "message": "Sem identidades" + }, + "addLoginMenu": { + "message": "Adicionar credencial" + }, + "addCardMenu": { + "message": "Adicionar cartÃŖo" + }, + "addIdentityMenu": { + "message": "Adicionar identidade" + }, "unlockVaultMenu": { "message": "Desbloquear o cofre" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Adicionar item" }, + "accountEmail": { + "message": "E-mail da conta" + }, + "requestHint": { + "message": "Pedir dica" + }, + "requestPasswordHint": { + "message": "Pedir dica da palavra-passe" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Introduza o endereço de e-mail da sua conta e ser-lhe-ÃĄ enviada a sua dica da palavra-passe" + }, "passwordHint": { "message": "Dica da palavra-passe" }, @@ -122,7 +250,7 @@ "message": "Introduza o endereço de e-mail da sua conta para receber a dica da sua palavra-passe mestra." }, "getMasterPasswordHint": { - "message": "Obter dica da palavra-passe mestra" + "message": "Obter a dica da palavra-passe mestra" }, "continue": { "message": "Continuar" @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirme a sua identidade para continuar." }, - "account": { - "message": "Conta" - }, "changeMasterPassword": { "message": "Alterar palavra-passe mestra" }, + "continueToWebApp": { + "message": "Continuar para a aplicaÃ§ÃŖo Web?" + }, + "continueToWebAppDesc": { + "message": "Explore mais funcionalidades da sua conta Bitwarden na aplicaÃ§ÃŖo Web." + }, + "continueToHelpCenter": { + "message": "Continuar para o Centro de ajuda?" + }, + "continueToHelpCenterDesc": { + "message": "Saiba mais sobre como utilizar o Bitwarden no Centro de ajuda." + }, + "continueToBrowserExtensionStore": { + "message": "Continuar para a loja de extensÃĩes do navegador?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Ajude outras pessoas a descobrir se o Bitwarden lhes Ê adequado. Visite a loja de extensÃĩes do seu navegador e deixe uma avaliaÃ§ÃŖo agora." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Pode alterar a sua palavra-passe mestra na aplicaÃ§ÃŖo Web Bitwarden." + }, "fingerprintPhrase": { "message": "Frase de impressÃŖo digital", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Terminar sessÃŖo" }, + "aboutBitwarden": { + "message": "Acerca do Bitwarden" + }, "about": { "message": "Acerca de" }, + "moreFromBitwarden": { + "message": "Mais do Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continuar para bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden para Empresas" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "O Bitwarden Authenticator permite-lhe armazenar chaves de autenticaÃ§ÃŖo e gerar cÃŗdigos TOTP para fluxos de verificaÃ§ÃŖo de 2 passos. Saiba mais no site bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Gestor de Segredos Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Armazene, gira e partilhe segredos de programador de forma segura com o Gestor de Segredos Bitwarden. Saiba mais no site bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Crie experiÃĒncias de início de sessÃŖo suaves e seguras, livre de palavras-passe tradicionais, com o Passwordless.dev. Saiba mais no site bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Plano Familiar gratuito Bitwarden" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "É elegível para o Plano Familiar gratuito Bitwarden. Resgate esta oferta hoje na aplicaÃ§ÃŖo Web." + }, "version": { "message": "VersÃŖo" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Editar pasta" }, + "newFolder": { + "message": "Nova pasta" + }, + "folderName": { + "message": "Nome da pasta" + }, + "folderHintText": { + "message": "Aninhe uma pasta adicionando o nome da pasta principal seguido de um \"/\". Exemplo: Redes Sociais/FÃŗruns" + }, + "noFoldersAdded": { + "message": "Nenhuma pasta adicionada" + }, + "createFoldersToOrganize": { + "message": "Crie pastas para organizar os itens do seu cofre" + }, + "deleteFolderPermanently": { + "message": "Tem a certeza de que pretende eliminar permanentemente esta pasta?" + }, "deleteFolder": { "message": "Eliminar pasta" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Gerador", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Gera automaticamente palavras-passe fortes e Ãēnicas para as suas credenciais." }, - "bitWebVault": { - "message": "Cofre Web Bitwarden" + "bitWebVaultApp": { + "message": "AplicaÃ§ÃŖo Web Bitwarden" }, "importItems": { "message": "Importar itens" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Gerar palavra-passe" }, + "generatePassphrase": { + "message": "Gerar frase de acesso" + }, "regeneratePassword": { "message": "Regenerar palavra-passe" }, @@ -244,17 +447,60 @@ "length": { "message": "Comprimento" }, + "passwordMinLength": { + "message": "Comprimento mínimo da palavra-passe" + }, "uppercase": { - "message": "MaiÃēsculas (A-Z)" + "message": "MaiÃēsculas (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "MinÃēsculas (a-z)" + "message": "MinÃēsculas (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "NÃēmeros (0-9)" + "message": "NÃēmeros (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caracteres especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Incluir", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Incluir caracteres em maiÃēsculas", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Incluir caracteres em minÃēsculas", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Incluir nÃēmeros", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Incluir caracteres especiais", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "NÃēmero de palavras" @@ -270,13 +516,22 @@ "message": "Incluir nÃēmero" }, "minNumbers": { - "message": "NÃēmeros mínimos" + "message": "Mínimo de nÃēmeros" }, "minSpecial": { - "message": "Caracteres especiais minímos" + "message": "Mínimo de caracteres especiais" }, "avoidAmbChar": { - "message": "Evitar caracteres ambíguos" + "message": "Evitar caracteres ambíguos", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Evitar caracteres ambíguos", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Os requisitos da política empresarial foram aplicados às suas opçÃĩes de gerador.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Procurar no cofre" @@ -299,15 +554,30 @@ "password": { "message": "Palavra-passe" }, + "totp": { + "message": "Segredo de autenticaÃ§ÃŖo" + }, "passphrase": { "message": "Frase de acesso" }, "favorite": { "message": "Favorito" }, + "unfavorite": { + "message": "Remover dos favoritos" + }, + "itemAddedToFavorites": { + "message": "Item adicionado aos favoritos" + }, + "itemRemovedFromFavorites": { + "message": "Item removido dos favoritos" + }, "notes": { "message": "Notas" }, + "privateNote": { + "message": "Nota privada" + }, "note": { "message": "Nota" }, @@ -326,6 +596,18 @@ "launch": { "message": "Iniciar" }, + "launchWebsite": { + "message": "Iniciar site" + }, + "launchWebsiteName": { + "message": "Iniciar site $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Site" }, @@ -338,9 +620,24 @@ "other": { "message": "Outros" }, + "unlockMethods": { + "message": "OpçÃĩes de desbloqueio" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Configure um mÊtodo de desbloqueio para alterar a aÃ§ÃŖo de tempo limite do seu cofre." }, + "unlockMethodNeeded": { + "message": "Definir um mÊtodo de desbloqueio nas DefiniçÃĩes" + }, + "sessionTimeoutHeader": { + "message": "Tempo limite da sessÃŖo" + }, + "vaultTimeoutHeader": { + "message": "Tempo limite do cofre" + }, + "otherOptions": { + "message": "Outras opçÃĩes" + }, "rateExtension": { "message": "Avaliar a extensÃŖo" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "O seu cofre estÃĄ bloqueado. Verifique a sua identidade para continuar." }, + "yourVaultIsLockedV2": { + "message": "O seu cofre estÃĄ bloqueado" + }, + "yourAccountIsLocked": { + "message": "A sua conta estÃĄ bloqueada" + }, + "or": { + "message": "ou" + }, "unlock": { "message": "Desbloquear" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Tempo limite do cofre" }, + "vaultTimeout1": { + "message": "Tempo limite" + }, "lockNow": { "message": "Bloquear agora" }, + "lockAll": { + "message": "Bloquear tudo" + }, "immediately": { "message": "Imediatamente" }, @@ -426,17 +738,29 @@ "security": { "message": "Segurança" }, + "confirmMasterPassword": { + "message": "Confirmar a palavra-passe mestra" + }, + "masterPassword": { + "message": "Palavra-passe mestra" + }, + "masterPassImportant": { + "message": "A sua palavra-passe mestra nÃŖo pode ser recuperada se a esquecer!" + }, + "masterPassHintLabel": { + "message": "Dica da palavra-passe mestra" + }, "errorOccurred": { "message": "Ocorreu um erro" }, "emailRequired": { - "message": "É necessÃĄrio o endereço de e-mail." + "message": "O endereço de e-mail Ê obrigatÃŗrio." }, "invalidEmail": { "message": "Endereço de e-mail invÃĄlido." }, "masterPasswordRequired": { - "message": "É necessÃĄria a palavra-passe mestra." + "message": "A palavra-passe mestra Ê obrigatÃŗria." }, "confirmMasterPasswordRequired": { "message": "É necessÃĄrio reescrever a palavra-passe mestra." @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "A sua nova conta foi criada! Pode agora iniciar sessÃŖo." }, + "newAccountCreated2": { + "message": "A sua nova conta foi criada!" + }, + "youHaveBeenLoggedIn": { + "message": "Iniciou sessÃŖo!" + }, + "youSuccessfullyLoggedIn": { + "message": "Iniciou sessÃŖo com sucesso" + }, + "youMayCloseThisWindow": { + "message": "Pode fechar esta janela" + }, "masterPassSent": { "message": "EnviÃĄmos-lhe um e-mail com a dica da sua palavra-passe mestra." }, "verificationCodeRequired": { "message": "É necessÃĄrio o cÃŗdigo de verificaÃ§ÃŖo." }, + "webauthnCancelOrTimeout": { + "message": "A autenticaÃ§ÃŖo foi cancelada ou demorou demasiado tempo. Por favor, tente novamente." + }, "invalidVerificationCode": { "message": "CÃŗdigo de verificaÃ§ÃŖo invÃĄlido" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "NÃŖo Ê possível preencher automaticamente o item selecionado nesta pÃĄgina. Em vez disso, copie e cole as informaçÃĩes." }, + "totpCaptureError": { + "message": "NÃŖo Ê possível digitalizar o cÃŗdigo QR a partir da pÃĄgina Web atual" + }, + "totpCaptureSuccess": { + "message": "Chave de autenticaÃ§ÃŖo adicionada" + }, + "totpCapture": { + "message": "Digitalize o cÃŗdigo QR do autenticador a partir da pÃĄgina Web atual" + }, + "totpHelperTitle": { + "message": "Torne a verificaÃ§ÃŖo de dois passos simples" + }, + "totpHelper": { + "message": "O Bitwarden pode armazenar e preencher cÃŗdigos de verificaÃ§ÃŖo de dois passos. Copie e cole a chave neste campo." + }, + "totpHelperWithCapture": { + "message": "O Bitwarden pode armazenar e preencher cÃŗdigos de verificaÃ§ÃŖo de dois passos. Selecione o ícone da cÃĸmara para tirar uma captura de ecrÃŖ do cÃŗdigo QR do autenticador deste site ou copie e cole a chave neste campo." + }, + "learnMoreAboutAuthenticators": { + "message": "Saiba mais sobre os autenticadores" + }, + "copyTOTP": { + "message": "Copiar Chave de autenticaÃ§ÃŖo (TOTP)" + }, "loggedOut": { "message": "SessÃŖo terminada" }, + "loggedOutDesc": { + "message": "Foi terminada a sessÃŖo da sua conta." + }, "loginExpired": { "message": "A sua sessÃŖo expirou." }, + "logIn": { + "message": "Iniciar sessÃŖo" + }, + "logInToBitwarden": { + "message": "Iniciar sessÃŖo no Bitwarden" + }, + "restartRegistration": { + "message": "Reiniciar registo" + }, + "expiredLink": { + "message": "Link expirado" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Por favor, reinicie o registo ou tente iniciar sessÃŖo." + }, + "youMayAlreadyHaveAnAccount": { + "message": "É possível que jÃĄ tenha uma conta" + }, "logOutConfirmation": { "message": "Tem a certeza de que pretende terminar sessÃŖo?" }, @@ -498,20 +882,20 @@ "message": "Ocorreu um erro inesperado." }, "nameRequired": { - "message": "É necessÃĄrio o nome." + "message": "O nome Ê obrigatÃŗrio." }, "addedFolder": { "message": "Pasta adicionada" }, - "changeMasterPass": { - "message": "Alterar palavra-passe mestra" - }, - "changeMasterPasswordConfirmation": { - "message": "Pode alterar o seu endereço de e-mail no cofre do site bitwarden.com. Deseja visitar o site agora?" - }, "twoStepLoginConfirmation": { "message": "A verificaÃ§ÃŖo de dois passos torna a sua conta mais segura, exigindo que verifique o seu início de sessÃŖo com outro dispositivo, como uma chave de segurança, aplicaÃ§ÃŖo de autenticaÃ§ÃŖo, SMS, chamada telefÃŗnica ou e-mail. A verificaÃ§ÃŖo de dois passos pode ser configurada em bitwarden.com. Pretende visitar o site agora?" }, + "twoStepLoginConfirmationContent": { + "message": "Torne a sua conta mais segura configurando a verificaÃ§ÃŖo de dois passos na aplicaÃ§ÃŖo Web Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continuar para a aplicaÃ§ÃŖo Web?" + }, "editedFolder": { "message": "Pasta guardada" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Novo URI" }, + "addDomain": { + "message": "Adicionar domínio", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item adicionado" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Pedir para adicionar credencial" }, + "vaultSaveOptionsTitle": { + "message": "Guardar nas opçÃĩes do cofre" + }, "addLoginNotificationDesc": { "message": "Pedir para adicionar um item se nÃŖo o encontrar no seu cofre." }, + "addLoginNotificationDescAlt": { + "message": "Pedir para adicionar um item se nÃŖo for encontrado um no seu cofre. Aplica-se a todas as contas com sessÃŖo iniciada." + }, + "showCardsInVaultView": { + "message": "Mostrar cartÃĩes como sugestÃĩes de preenchimento automÃĄtico na vista do cofre" + }, "showCardsCurrentTab": { "message": "Mostrar cartÃĩes na pÃĄgina Separador" }, "showCardsCurrentTabDesc": { "message": "Listar itens de cartÃĩes na pÃĄgina Separador para facilitar o preenchimento automÃĄtico." }, + "showIdentitiesInVaultView": { + "message": "Mostrar identidades como sugestÃĩes de preenchimento automÃĄtico na vista do cofre" + }, "showIdentitiesCurrentTab": { "message": "Mostrar identidades na pÃĄgina Separador" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Pedir para atualizar a palavra-passe de uma credencial quando for detetada uma alteraÃ§ÃŖo num site." }, + "changedPasswordNotificationDescAlt": { + "message": "Pedir para atualizar a palavra-passe de um início de sessÃŖo quando for detetada uma alteraÃ§ÃŖo num site. Aplica-se a todas as contas com sessÃŖo iniciada." + }, + "enableUsePasskeys": { + "message": "Pedir para guardar e utilizar chaves de acesso" + }, + "usePasskeysDesc": { + "message": "Pedir para guardar novas chaves de acesso ou iniciar sessÃŖo com chaves de acesso armazenadas no seu cofre. Aplica-se a todas as contas com sessÃŖo iniciada." + }, "notificationChangeDesc": { "message": "Pretende atualizar esta palavra-passe no Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Desbloquear" }, + "additionalOptions": { + "message": "OpçÃĩes adicionais" + }, "enableContextMenuItem": { "message": "Mostrar opçÃĩes do menu de contexto" }, "contextMenuItemDesc": { - "message": "Utilize um clique secundÃĄrio para aceder à geraÃ§ÃŖo de palavras-passe e às credenciais correspondentes do site. " + "message": "Utilize um clique secundÃĄrio para aceder à geraÃ§ÃŖo de palavras-passe e às credenciais correspondentes do site." + }, + "contextMenuItemDescAlt": { + "message": "Utilize um clique secundÃĄrio para aceder ao gerador de palavras-passe e aos inícios de sessÃŖo correspondentes para o site. Aplica-se a todas as contas com sessÃŖo iniciada." }, "defaultUriMatchDetection": { "message": "DeteÃ§ÃŖo de correspondÃĒncia de URI predefinida", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Escolha a forma predefinida como a deteÃ§ÃŖo de correspondÃĒncia de URI Ê tratada para credenciais ao executar açÃĩes como o preenchimento automÃĄtico." @@ -656,7 +1071,10 @@ "message": "Tema" }, "themeDesc": { - "message": "Alterar o tema de cores da aplicaÃ§ÃŖo." + "message": "Altere o tema de cores da aplicaÃ§ÃŖo." + }, + "themeDescAlt": { + "message": "Altere o tema de cores da aplicaÃ§ÃŖo. Aplica-se a todas as contas com sessÃŖo iniciada." }, "dark": { "message": "Escuro", @@ -670,12 +1088,39 @@ "message": "Solarized (escuro)", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Exportar de" + }, "exportVault": { "message": "Exportar cofre" }, "fileFormat": { "message": "Formato do ficheiro" }, + "fileEncryptedExportWarningDesc": { + "message": "A exportaÃ§ÃŖo deste ficheiro serÃĄ protegida por uma palavra-passe e exigirÃĄ a palavra-passe do ficheiro para ser desencriptada." + }, + "filePassword": { + "message": "Palavra-passe do ficheiro" + }, + "exportPasswordDescription": { + "message": "Esta palavra-passe serÃĄ utilizada para exportar e importar este ficheiro" + }, + "accountRestrictedOptionDescription": { + "message": "Utilize a chave de encriptaÃ§ÃŖo da sua conta, derivada do nome de utilizador e da palavra-passe mestra da sua conta, para encriptar a exportaÃ§ÃŖo e restringir a importaÃ§ÃŖo apenas à conta Bitwarden atual." + }, + "passwordProtectedOptionDescription": { + "message": "Defina uma palavra-passe do ficheiro para encriptar a exportaÃ§ÃŖo e importe-a para qualquer conta Bitwarden utilizando a palavra-passe de desencriptaÃ§ÃŖo." + }, + "exportTypeHeading": { + "message": "Tipo de exportaÃ§ÃŖo" + }, + "accountRestricted": { + "message": "Conta restringida" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Palavra-passe do ficheiro\" e \"Confirmar palavra-passe do ficheiro\" nÃŖo correspondem." + }, "warning": { "message": "AVISO", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Partilhado" }, - "learnOrg": { - "message": "Saiba mais sobre as organizaçÃĩes" - }, - "learnOrgConfirmation": { - "message": "O Bitwarden permite-lhe partilhar os seus itens do cofre com outras pessoas atravÊs da utilizaÃ§ÃŖo de uma organizaÃ§ÃŖo. Gostaria de visitar o site bitwarden.com para saber mais?" + "bitwardenForBusinessPageDesc": { + "message": "O Bitwarden para Empresas permite-lhe partilhar os seus itens do cofre com outras pessoas atravÊs da utilizaÃ§ÃŖo de uma organizaÃ§ÃŖo. Saiba mais no site bitwarden.com." }, "moveToOrganization": { "message": "Mover para a organizaÃ§ÃŖo" @@ -762,6 +1204,9 @@ "file": { "message": "Ficheiro" }, + "fileToShare": { + "message": "Ficheiro a partilhar" + }, "selectFile": { "message": "Selecionar um ficheiro" }, @@ -781,7 +1226,7 @@ "message": "Gerir subscriÃ§ÃŖo" }, "premiumManageAlert": { - "message": "Pode gerir a sua subscriÃ§ÃŖo no cofre Web bitwarden.com. Pretende visitar o site agora?" + "message": "Pode gerir a sua subscriÃ§ÃŖo no cofre web em bitwarden.com. Pretende visitar o site agora?" }, "premiumRefresh": { "message": "Atualizar subscriÃ§ÃŖo" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB de armazenamento encriptado para anexos de ficheiros." }, + "premiumSignUpEmergency": { + "message": "Acesso de emergÃĒncia." + }, "premiumSignUpTwoStepOptions": { "message": "OpçÃĩes proprietÃĄrias de verificaÃ§ÃŖo de dois passos, como YubiKey e Duo." }, @@ -814,7 +1262,10 @@ "message": "Adquirir Premium" }, "premiumPurchaseAlert": { - "message": "Pode adquirir uma subscriÃ§ÃŖo Premium no cofre Web bitwarden.com. Pretende visitar o site agora?" + "message": "Pode adquirir uma subscriÃ§ÃŖo Premium no cofre web em bitwarden.com. Pretende visitar o site agora?" + }, + "premiumPurchaseAlertV2": { + "message": "Pode adquirir o Premium a partir das definiçÃĩes da sua conta na aplicaÃ§ÃŖo Web do Bitwarden." }, "premiumCurrentMember": { "message": "É um membro Premium!" @@ -822,6 +1273,9 @@ "premiumCurrentMemberThanks": { "message": "Obrigado por apoiar o Bitwarden." }, + "premiumFeatures": { + "message": "Atualize para o Premium e receba:" + }, "premiumPrice": { "message": "Tudo por apenas $PRICE$ /ano!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Tudo por apenas $PRICE$ por ano!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "AtualizaÃ§ÃŖo concluída" }, @@ -892,7 +1355,7 @@ "message": "Abrir novo separador" }, "webAuthnAuthenticate": { - "message": "Autenticar WebAuthn" + "message": "Autenticar o WebAuthn" }, "loginUnavailable": { "message": "Início de sessÃŖo indisponível" @@ -915,22 +1378,22 @@ "authenticatorAppTitle": { "message": "AplicaÃ§ÃŖo de autenticaÃ§ÃŖo" }, - "authenticatorAppDesc": { - "message": "Utilize uma aplicaÃ§ÃŖo de autenticaÃ§ÃŖo (como o Authy ou o Google Authenticator) para gerar cÃŗdigos de verificaÃ§ÃŖo baseados no tempo.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Introduza um cÃŗdigo gerado por uma aplicaÃ§ÃŖo de autenticaÃ§ÃŖo como o Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "Chave de segurança YubiKey OTP" + "yubiKeyTitleV2": { + "message": "Chave de segurança Yubico OTP" }, "yubiKeyDesc": { "message": "Utilize uma YubiKey para aceder à sua conta. Funciona com os dispositivos YubiKey 4, 4 Nano, 4C e NEO." }, - "duoDesc": { - "message": "Verifique com a Duo Security utilizando a aplicaÃ§ÃŖo Duo Mobile, SMS, chamada telefÃŗnica ou chave de segurança U2F.", + "duoDescV2": { + "message": "Introduza um cÃŗdigo gerado pelo Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verifique com a Duo Security para a sua organizaÃ§ÃŖo utilizando a aplicaÃ§ÃŖo Duo Mobile, SMS, chamada telefÃŗnica, ou chave de segurança U2F.", + "message": "Proteja a sua organizaÃ§ÃŖo com a Duo Security utilizando a aplicaÃ§ÃŖo Duo Mobile, SMS, chamada telefÃŗnica ou uma chave de segurança U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-mail" }, - "emailDesc": { - "message": "Os cÃŗdigos de verificaÃ§ÃŖo ser-lhe-ÃŖo enviados por e-mail." + "emailDescV2": { + "message": "Introduza um cÃŗdigo enviado para o seu e-mail." }, "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Especifique o URL de base da sua instalaÃ§ÃŖo Bitwarden hospedada no local." }, + "selfHostedBaseUrlHint": { + "message": "Especifique o URL de base da sua instalaÃ§ÃŖo Bitwarden hospedada no local. Exemplo: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Para uma configuraÃ§ÃŖo avançada, pode especificar o URL de base de cada serviço de forma independente." + }, + "selfHostedEnvFormInvalid": { + "message": "Deve adicionar o URL do servidor de base ou pelo menos um ambiente personalizado." + }, "customEnvironment": { "message": "Ambiente personalizado" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL do servidor" }, + "selfHostBaseUrl": { + "message": "URL do servidor auto-hospedado", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL do servidor da API" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "URLs de ambiente guardados" }, + "showAutoFillMenuOnFormFields": { + "message": "Mostrar menu de preenchimento automÃĄtico nos campos do formulÃĄrio", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "SugestÃĩes de preenchimento automÃĄtico" + }, + "showInlineMenuLabel": { + "message": "Mostrar sugestÃĩes de preenchimento automÃĄtico nos campos do formulÃĄrio" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Apresentar as identidades como sugestÃĩes" + }, + "showInlineMenuCardsLabel": { + "message": "Apresentar os cartÃĩes como sugestÃĩes" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Apresentar sugestÃĩes quando o ícone Ê selecionado" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Aplica-se a todas as contas com sessÃŖo iniciada." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Desative as definiçÃĩes do gestor de palavras-passe incorporado do seu navegador para evitar conflitos." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Editar as definiçÃĩes do navegador." + }, + "autofillOverlayVisibilityOff": { + "message": "Desativado", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Se um campo estiver selecionado (em destaque)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Quando o ícone de preenchimento automÃĄtico estÃĄ selecionado", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Preencher automaticamente ao carregar a pÃĄgina" + }, "enableAutoFillOnPageLoad": { "message": "Preencher automaticamente ao carregar a pÃĄgina" }, "enableAutoFillOnPageLoadDesc": { "message": "Se for detetado um formulÃĄrio de início de sessÃŖo, o preenchimento automÃĄtico Ê efetuado quando a pÃĄgina Web Ê carregada." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Aviso:$CLOSETAG$ Aviso: Os sites comprometidos ou nÃŖo confiÃĄveis podem explorar o preenchimento automÃĄtico ao carregar a pÃĄgina.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Os sites comprometidos ou nÃŖo confiÃĄveis podem explorar o preenchimento automÃĄtico ao carregar a pÃĄgina." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Saber mais sobre os riscos" + }, "learnMoreAboutAutofill": { "message": "Saber mais sobre o preenchimento automÃĄtico" }, @@ -997,7 +1532,7 @@ "message": "Pode desativar o preenchimento automÃĄtico ao carregar a pÃĄgina para itens de início de sessÃŖo individuais a partir da vista Editar do item." }, "itemAutoFillOnPageLoad": { - "message": "Preenchimento automÃĄtico ao carregar a pÃĄgina (se configurado nas OpçÃĩes)" + "message": "Preencher automaticamente ao carregar a pÃĄgina (se configurado nas OpçÃĩes)" }, "autoFillOnPageLoadUseDefault": { "message": "Utilizar a predefiniÃ§ÃŖo" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Abrir o cofre na barra lateral" }, - "commandAutofillDesc": { - "message": "Preencher automaticamente o Ãēltimo início de sessÃŖo utilizado no site atual" + "commandAutofillLoginDesc": { + "message": "Preencher automaticamente com a Ãēltima credencial utilizada no site atual" + }, + "commandAutofillCardDesc": { + "message": "Preencher automaticamente com o Ãēltimo cartÃŖo utilizado no site atual" + }, + "commandAutofillIdentityDesc": { + "message": "Preencher automaticamente com a Ãēltima identidade utilizada no site atual" }, "commandGeneratePasswordDesc": { "message": "Gerar e copiar uma nova palavra-passe aleatÃŗria para a ÃĄrea de transferÃĒncia" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Bloquear o cofre" }, - "privateModeWarning": { - "message": "O suporte do modo privado Ê experimental e algumas funcionalidades sÃŖo limitadas." - }, "customFields": { "message": "Campos personalizados" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Associado", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Mostrar uma imagem reconhecível junto a cada credencial." }, + "faviconDescAlt": { + "message": "Mostrar uma imagem reconhecível junto a cada credencial. Aplica-se a todas as contas com sessÃŖo iniciada." + }, "enableBadgeCounter": { "message": "Mostrar distintivo de contador" }, @@ -1092,7 +1636,7 @@ "message": "Ano de validade" }, "expiration": { - "message": "ExpiraÃ§ÃŖo" + "message": "Prazo de validade" }, "january": { "message": "Janeiro" @@ -1158,7 +1702,7 @@ "message": "Nome prÃŗprio" }, "middleName": { - "message": "Segundo nome" + "message": "Nome do meio" }, "lastName": { "message": "Apelido" @@ -1167,7 +1711,7 @@ "message": "Nome completo" }, "identityName": { - "message": "Nome de identidade" + "message": "Nome da identidade" }, "company": { "message": "Empresa" @@ -1179,7 +1723,7 @@ "message": "NÃēmero do passaporte" }, "licenseNumber": { - "message": "NÃēmero da licença" + "message": "NÃēmero da carta de conduÃ§ÃŖo" }, "email": { "message": "E-mail" @@ -1203,7 +1747,7 @@ "message": "Cidade / Localidade" }, "stateProvince": { - "message": "Estado / Província" + "message": "Estado / RegiÃŖo" }, "zipPostalCode": { "message": "CÃŗdigo postal" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identidade" }, + "typeSshKey": { + "message": "Chave SSH" + }, + "newItemHeader": { + "message": "Novo(a) $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Editar $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Ver $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "HistÃŗrico de palavras-passe" }, + "generatorHistory": { + "message": "HistÃŗrico do gerador" + }, + "clearGeneratorHistoryTitle": { + "message": "Limpar o histÃŗrico do gerador" + }, + "cleargGeneratorHistoryDescription": { + "message": "Se continuar, todas as entradas serÃŖo permanentemente eliminadas do histÃŗrico do gerador. Tem a certeza de que pretende continuar?" + }, "back": { - "message": "Retroceder" + "message": "Voltar" }, "collections": { "message": "ColeçÃĩes" }, + "nCollections": { + "message": "$COUNT$ coleçÃĩes", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoritos" }, @@ -1279,7 +1871,11 @@ "message": "Esta palavra-passe nÃŖo foi encontrada em nenhuma violaÃ§ÃŖo de dados conhecida. A sua utilizaÃ§ÃŖo deve ser segura." }, "baseDomain": { - "message": "Domínio base", + "message": "Domínio de base", + "description": "Domain name. Ex. website.com" + }, + "baseDomainOptionRecommended": { + "message": "Domínio base (recomendado)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "DeteÃ§ÃŖo de correspondÃĒncia", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "DeteÃ§ÃŖo de correspondÃĒncia predefinida", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Alternar opçÃĩes" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "NÃŖo existem palavras-passe para listar." }, + "clearHistory": { + "message": "Limpar histÃŗrico" + }, + "nothingToShow": { + "message": "Nada a mostrar" + }, + "nothingGeneratedRecently": { + "message": "NÃŖo gerou nada recentemente" + }, "remove": { "message": "Remover" }, @@ -1343,7 +1948,7 @@ "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Criado a", + "message": "Criado", "description": "ex. Date this item was created" }, "datePasswordUpdated": { @@ -1390,8 +1995,17 @@ "unlockWithPin": { "message": "Desbloquear com PIN" }, + "setYourPinTitle": { + "message": "Definir PIN" + }, + "setYourPinButton": { + "message": "Definir PIN" + }, "setYourPinCode": { - "message": "Defina o seu cÃŗdigo PIN para desbloquear o Bitwarden. As suas definiçÃĩes de PIN serÃŖo redefinidas se alguma vez terminar sessÃŖo completamente da aplicaÃ§ÃŖo." + "message": "Defina o seu cÃŗdigo PIN para desbloquear o Bitwarden. As suas definiçÃĩes de PIN serÃŖo redefinidas se alguma vez terminar sessÃŖo por completo da aplicaÃ§ÃŖo." + }, + "setYourPinCode1": { + "message": "O seu PIN serÃĄ utilizado para desbloquear o Bitwarden em vez da sua palavra-passe mestra. O seu PIN serÃĄ reposto se alguma vez terminar totalmente a sessÃŖo no Bitwarden." }, "pinRequired": { "message": "É necessÃĄrio o cÃŗdigo PIN." @@ -1399,9 +2013,15 @@ "invalidPin": { "message": "CÃŗdigo PIN invÃĄlido." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Demasiadas tentativas de introduÃ§ÃŖo de PINs invÃĄlidos. A terminar a sessÃŖo." + }, "unlockWithBiometrics": { "message": "Desbloquear com biometria" }, + "unlockWithMasterPassword": { + "message": "Desbloquear com a palavra-passe mestra" + }, "awaitDesktop": { "message": "A aguardar confirmaÃ§ÃŖo da aplicaÃ§ÃŖo para computador" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Bloquear com a palavra-passe mestra ao reiniciar o navegador" }, + "lockWithMasterPassOnRestart1": { + "message": "Exigir a palavra-passe mestra ao reiniciar o navegador" + }, "selectOneCollection": { "message": "Deve selecionar pelo menos uma coleÃ§ÃŖo." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Uma ou mais políticas da organizaÃ§ÃŖo estÃŖo a afetar as suas definiçÃĩes do gerador." }, + "passwordGenerator": { + "message": "Gerador de palavras-passe" + }, + "usernameGenerator": { + "message": "Gerador de nomes de utilizador" + }, + "useThisPassword": { + "message": "Utilizar esta palavra-passe" + }, + "useThisUsername": { + "message": "Utilizar este nome de utilizador" + }, + "securePasswordGenerated": { + "message": "Palavra-passe segura gerada! NÃŖo se esqueça de atualizar tambÊm a sua palavra-passe no site." + }, + "useGeneratorHelpTextPartOne": { + "message": "Utilize o gerador", + "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": "para criar uma palavra-passe forte e Ãēnica", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "AÃ§ÃŖo de tempo limite do cofre" }, + "vaultTimeoutAction1": { + "message": "AÃ§ÃŖo de tempo limite" + }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixo", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restaurado" }, + "alreadyHaveAccount": { + "message": "JÃĄ tem uma conta?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Ao terminar sessÃŖo removerÃĄ todo o acesso ao seu cofre e requer autenticaÃ§ÃŖo online apÃŗs o período de tempo limite. Tem a certeza de que pretende utilizar esta definiÃ§ÃŖo?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Preencher automaticamente e guardar" }, + "fillAndSave": { + "message": "Preencher e guardar" + }, "autoFillSuccessAndSavedUri": { "message": "Item preenchido automaticamente e URI guardado" }, @@ -1486,7 +2141,7 @@ } }, "setMasterPassword": { - "message": "Definir palavra-passe mestra" + "message": "Definir a palavra-passe mestra" }, "currentMasterPass": { "message": "Palavra-passe mestra atual" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "A sua nova palavra-passe mestra nÃŖo cumpre os requisitos da política." }, + "receiveMarketingEmailsV2": { + "message": "Receba conselhos, anÃēncios e oportunidades de investigaÃ§ÃŖo do Bitwarden na sua caixa de entrada." + }, + "unsubscribe": { + "message": "Anular subscriÃ§ÃŖo" + }, + "atAnyTime": { + "message": "a qualquer altura." + }, + "byContinuingYouAgreeToThe": { + "message": "Ao continuar, concorda com os" + }, + "and": { + "message": "e" + }, "acceptPolicies": { "message": "Ao marcar esta caixa concorda com o seguinte:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Erro no acesso ao token de atualizaÃ§ÃŖo" + }, + "errorRefreshingAccessTokenDesc": { + "message": "NÃŖo foi encontrado nenhum token de atualizaÃ§ÃŖo ou chaves API. Por favor, tente terminar a sessÃŖo e voltar a iniciÃĄ-la." + }, "desktopSyncVerificationTitle": { "message": "VerificaÃ§ÃŖo da sincronizaÃ§ÃŖo da aplicaÃ§ÃŖo para computador" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Incompatibilidade de contas" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Incompatibilidade da chave biomÊtrica" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "O desbloqueio biomÊtrico falhou. A chave secreta biomÊtrica nÃŖo conseguiu desbloquear o cofre. Por favor, tente configurar a biometria novamente." + }, "biometricsNotEnabledTitle": { "message": "Biometria nÃŖo configurada" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "A biometria do navegador nÃŖo Ê suportada neste dispositivo." }, + "biometricsNotUnlockedTitle": { + "message": "Utilizador bloqueado ou com sessÃŖo terminada" + }, + "biometricsNotUnlockedDesc": { + "message": "Por favor, desbloqueie este utilizador na aplicaÃ§ÃŖo para computador e tente novamente." + }, + "biometricsNotAvailableTitle": { + "message": "Desbloqueio biomÊtrico indisponível" + }, + "biometricsNotAvailableDesc": { + "message": "O desbloqueio biomÊtrico nÃŖo estÃĄ atualmente disponível. Por favor, tente novamente mais tarde." + }, "biometricsFailedTitle": { "message": "Falha na biometria" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Uma política da organizaÃ§ÃŖo estÃĄ a afetar as suas opçÃĩes de propriedade." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Uma política da organizaÃ§ÃŖo bloqueou a importaÃ§ÃŖo de itens para o seu cofre individual." + }, + "domainsTitle": { + "message": "Domínios", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Domínios excluídos" }, "excludedDomainsDesc": { "message": "O Bitwarden nÃŖo pedirÃĄ para guardar os detalhes de início de sessÃŖo destes domínios. É necessÃĄrio atualizar a pÃĄgina para que as alteraçÃĩes tenham efeito." }, + "excludedDomainsDescAlt": { + "message": "O Bitwarden nÃŖo pedirÃĄ para guardar os detalhes de início de sessÃŖo destes domínios para todas as contas com sessÃŖo iniciada. É necessÃĄrio atualizar a pÃĄgina para que as alteraçÃĩes tenham efeito." + }, + "websiteItemLabel": { + "message": "Site $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nÃŖo Ê um domínio vÃĄlido", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "AlteraçÃĩes do domínio excluído guardadas" + }, + "limitSendViews": { + "message": "Limitar visualizaçÃĩes" + }, + "limitSendViewsHint": { + "message": "NinguÊm poderÃĄ ver este Send depois de o limite ser atingido.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ visualizaçÃĩes restantes", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Detalhes do Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Procurar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Texto" }, + "sendTypeTextToShare": { + "message": "Texto a partilhar" + }, "sendTypeFile": { "message": "Ficheiro" }, @@ -1666,6 +2406,9 @@ "message": "Todos os Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Ocultar texto por predefiniÃ§ÃŖo" + }, "maxAccessCountReached": { "message": "NÃēmero mÃĄximo de acessos atingido", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Protegido por palavra-passe" }, + "copyLink": { + "message": "Copiar link" + }, "copySendLink": { "message": "Copiar link do Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Tem a certeza de que pretende eliminar este Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Tem a certeza de que pretende eliminar permanentemente este Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Editar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,8 +2486,12 @@ "message": "O Send serÃĄ permanentemente eliminado na data e hora especificadas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "O Send serÃĄ permanentemente eliminado nesta data.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { - "message": "Data de validade" + "message": "Prazo de validade" }, "expirationDateDesc": { "message": "Se definido, o acesso a este Send expirarÃĄ na data e hora especificadas.", @@ -1769,6 +2523,10 @@ "message": "Opcionalmente, exigir uma palavra-passe para os utilizadores acederem a este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Adicione uma palavra-passe opcional para os destinatÃĄrios acederem a este Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notas privadas sobre este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send criado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send criado com sucesso!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "O Send estarÃĄ disponível para qualquer pessoa que tenha o link durante a prÃŗxima hora.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "O Send estarÃĄ disponível para qualquer pessoa que tenha o link durante as prÃŗximas $HOURS$.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "O Send estarÃĄ disponível para qualquer pessoa que tenha o link durante o prÃŗximo dia.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "O Send estarÃĄ disponível para qualquer pessoa que tenha o link durante os prÃŗximos $DAYS$ dias.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Link do Send copiado", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send editado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Abrir a extensÃŖo numa nova janela?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Para criar um ficheiro Send, precisa de abrir a extensÃŖo para uma nova janela.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Para escolher um ficheiro, abra a extensÃŖo na barra lateral (se possível) ou abra uma nova janela clicando neste banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Para escolher um ficheiro utilizando o Safari, abra uma nova janela clicando neste banner." }, + "popOut": { + "message": "Abrir numa nova janela" + }, "sendFileCalloutHeader": { "message": "Antes de começar" }, @@ -1839,7 +2644,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "SÃŖo necessÃĄrias uma data e uma hora de validade." + "message": "O prazo de validade fornecido nÃŖo Ê vÃĄlido." }, "deletionDateIsInvalid": { "message": "A data de eliminaÃ§ÃŖo fornecida nÃŖo Ê vÃĄlida." @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Ocultar o meu endereço de e-mail dos destinatÃĄrios." }, + "hideYourEmail": { + "message": "Oculte o seu endereço de e-mail dos visualizadores." + }, "sendOptionsPolicyInEffect": { "message": "Uma ou mais políticas da organizaÃ§ÃŖo estÃŖo a afetar as suas opçÃĩes do Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "VerificaÃ§ÃŖo de e-mail necessÃĄria" }, + "emailVerifiedV2": { + "message": "E-mail verificado" + }, "emailVerificationRequiredDesc": { "message": "Tem de verificar o seu e-mail para utilizar esta funcionalidade. Pode verificar o seu e-mail no cofre Web." }, @@ -1878,7 +2689,7 @@ "message": "Palavra-passe mestra atualizada" }, "updateMasterPassword": { - "message": "Atualizar palavra-passe mestra" + "message": "Atualizar a palavra-passe mestra" }, "updateMasterPasswordWarning": { "message": "A sua palavra-passe mestra foi recentemente alterada por um administrador da sua organizaÃ§ÃŖo. Para aceder ao cofre, tem de atualizar a sua palavra-passe mestra agora. Ao prosseguir, terminarÃĄ a sua sessÃŖo atual e terÃĄ de iniciar sessÃŖo novamente. As sessÃĩes ativas noutros dispositivos poderÃŖo continuar ativas atÊ uma hora." @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "A sua palavra-passe mestra nÃŖo cumpre uma ou mais políticas da sua organizaÃ§ÃŖo. Para aceder ao cofre, tem de atualizar a sua palavra-passe mestra agora. Ao prosseguir, terminarÃĄ a sua sessÃŖo atual e terÃĄ de iniciar sessÃŖo novamente. As sessÃĩes ativas noutros dispositivos poderÃŖo continuar ativas atÊ uma hora." }, + "tdeDisabledMasterPasswordRequired": { + "message": "A sua organizaÃ§ÃŖo desativou a encriptaÃ§ÃŖo de dispositivos fiÃĄveis. Por favor, defina uma palavra-passe mestra para aceder ao seu cofre." + }, "resetPasswordPolicyAutoEnroll": { "message": "InscriÃ§ÃŖo automÃĄtica" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Selecionar pasta..." }, - "ssoCompleteRegistration": { - "message": "Para concluir o início de sessÃŖo com SSO, por favor, defina uma palavra-passe mestra para aceder e proteger o seu cofre." + "noFoldersFound": { + "message": "Nenhuma pasta encontrada", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "As permissÃĩes da sua organizaÃ§ÃŖo foram atualizadas, exigindo a definiÃ§ÃŖo de uma palavra-passe mestra.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "A sua organizaÃ§ÃŖo exige a definiÃ§ÃŖo de uma palavra-passe mestra.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "de $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "VerificaÃ§ÃŖo necessÃĄria", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Horas" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutos" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Os requisitos da política empresarial foram aplicados às suas opçÃĩes de tempo limite" + }, "vaultTimeoutPolicyInEffect": { "message": "As políticas da sua organizaÃ§ÃŖo definiram o tempo limite mÃĄximo permitido do cofre de $HOURS$ hora(s) e $MINUTES$ minuto(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hora(s) e $MINUTES$ minuto(s) no mÃĄximo.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "O tempo limite excede a restriÃ§ÃŖo definida pela sua organizaÃ§ÃŖo: $HOURS$ hora(s) e $MINUTES$ minuto(s) no mÃĄximo", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "As políticas da sua organizaÃ§ÃŖo estÃŖo a afetar o tempo limite do cofre. O tempo limite mÃĄximo permitido do cofre Ê de $HOURS$ hora(s) e $MINUTES$ minuto(s). A sua aÃ§ÃŖo de tempo limite do cofre estÃĄ definida para $ACTION$.", "placeholders": { @@ -1968,7 +2833,7 @@ } }, "leaveOrganization": { - "message": "Deixar a organizaÃ§ÃŖo" + "message": "Sair da organizaÃ§ÃŖo" }, "removeMasterPassword": { "message": "Remover palavra-passe mestra" @@ -1977,7 +2842,7 @@ "message": "Palavra-passe mestra removida" }, "leaveOrganizationConfirmation": { - "message": "Tem a certeza de que pretende deixar esta organizaÃ§ÃŖo?" + "message": "Tem a certeza de que pretende sair desta organizaÃ§ÃŖo?" }, "leftOrganization": { "message": "Saiu da organizaÃ§ÃŖo." @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "A exportar o cofre da organizaÃ§ÃŖo" + }, + "exportingOrganizationVaultDesc": { + "message": "Apenas o cofre da organizaÃ§ÃŖo associado a $ORGANIZATION$ serÃĄ exportado. Os itens em cofres individuais ou noutras organizaçÃĩes nÃŖo serÃŖo incluídos.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Erro" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Gerar nome de utilizador" }, + "generateEmail": { + "message": "Gerar e-mail" + }, + "generatorBoundariesHint": { + "message": "O valor deve estar entre $MIN$ e $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Tipo de nome de utilizador" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Gerar um alias de e-mail com um serviço de reencaminhamento externo." }, + "forwarderDomainName": { + "message": "Domínio de e-mail", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Escolha um domínio que seja suportado pelo serviço selecionado", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Erro no $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Site: $WEBSITE$. Gerado pelo Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Token da API de $SERVICENAME$ invÃĄlido", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Token da API de $SERVICENAME$ invÃĄlido: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "NÃŖo foi possível obter o ID da conta de e-mail mascarada de $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Domínio de $SERVICENAME$ invÃĄlido.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "URL de $SERVICENAME$ invÃĄlido.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Ocorreu um erro desconhecido de $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Reencaminhador desconhecido: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nome de domínio", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Como preencher automaticamente" }, "autofillSelectInfoWithCommand": { - "message": "Selecione um item desta pÃĄgina ou utilize o atalho: $COMMAND$", + "message": "Selecione um item a partir deste ecrÃŖ, utilize o atalho $COMMAND$ ou explore outras opçÃĩes nas definiçÃĩes.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Selecione um item desta pÃĄgina ou defina um atalho nas definiçÃĩes." + "message": "Selecione um item a partir deste ecrÃŖ ou explore outras opçÃĩes nas definiçÃĩes." }, "gotIt": { "message": "Percebido" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "DefiniçÃĩes de preenchimento automÃĄtico" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Atalho de preenchimento automÃĄtico" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Alterar atalho" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Gerir atalhos" + }, "autofillShortcut": { "message": "Atalho de teclado de preenchimento automÃĄtico" }, - "autofillShortcutNotSet": { - "message": "O atalho de preenchimento automÃĄtico nÃŖo estÃĄ definido. Altere-o nas definiçÃĩes do navegador." + "autofillLoginShortcutNotSet": { + "message": "O atalho de preenchimento automÃĄtico de credenciais nÃŖo estÃĄ definido. Altere-o nas definiçÃĩes do navegador." }, - "autofillShortcutText": { - "message": "O atalho de preenchimento automÃĄtico Ê: $COMMAND$. Altere-o nas definiçÃĩes do navegador.", + "autofillLoginShortcutText": { + "message": "O atalho de preenchimento automÃĄtico de credenciais Ê $COMMAND$. Gira todos os atalhos nas definidçÃĩes do navegador.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "A iniciar sessÃŖo em" - }, "opensInANewWindow": { "message": "Abrir numa nova janela" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "É necessÃĄrio o identificador de SSO da organizaÃ§ÃŖo." }, + "creatingAccountOn": { + "message": "A criar uma conta em" + }, + "checkYourEmail": { + "message": "Verifique o seu e-mail" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Siga o link no e-mail enviado para" + }, + "andContinueCreatingYourAccount": { + "message": "e continue a criaÃ§ÃŖo da sua conta." + }, + "noEmail": { + "message": "NÃŖo recebeu o e-mail?" + }, + "goBack": { + "message": "Volte atrÃĄs" + }, + "toEditYourEmailAddress": { + "message": "para editar o seu endereço de e-mail." + }, "eu": { "message": "UE", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Acesso negado. NÃŖo tem permissÃŖo para visualizar esta pÃĄgina." }, @@ -2303,11 +3328,19 @@ "deviceTrusted": { "message": "Dispositivo de confiança" }, + "sendsNoItemsTitle": { + "message": "Sem Sends ativos", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Utilize o Send para partilhar de forma segura informaçÃĩes encriptadas com qualquer pessoa.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { - "message": "Campo necessÃĄrio." + "message": "Campo obrigatÃŗrio." }, "required": { - "message": "necessÃĄrio" + "message": "obrigatÃŗrio" }, "search": { "message": "Procurar" @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 campo precisa da sua atenÃ§ÃŖo." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ campos precisam da sua atenÃ§ÃŖo.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Selecionar --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Alternar colapso", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Importar os seus dados para o Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Proteger os seus dados LastPass e importar para o Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Guardar como ficheiro nÃŖo encriptado", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importar para o Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "A importar...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Dados importados com sucesso!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Erro de importaÃ§ÃŖo. Verifique a consola para obter detalhes.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Erro de rede encontrado durante a importaÃ§ÃŖo.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias de domínio" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Os itens que voltem a pedir a palavra-passe mestra nÃŖo podem ser preenchidos automaticamente no carregamento da pÃĄgina. Preenchimento automÃĄtico no carregamento da pÃĄgina desativado.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Preencher automaticamente ao carregar a pÃĄgina definido para utilizar a predefiniÃ§ÃŖo.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Desativar o pedido para reintroduzir a palavra-passe mestra para editar este campo", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Ativar/desativar navegaÃ§ÃŖo lateral" + }, + "skipToContent": { + "message": "Avançar para o conteÃēdo" + }, + "bitwardenOverlayButton": { + "message": "BotÃŖo de menu de preenchimento automÃĄtico do Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Alternar o menu de preenchimento automÃĄtico do Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Menu de preenchimento automÃĄtico do Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Desbloqueie a sua conta para ver as credenciais correspondentes", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Desbloqueie a sua conta para ver sugestÃĩes de preenchimento automÃĄtico", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Desbloquear a conta", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Desbloqueie a sua conta, abre numa nova janela", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Preencher as credenciais para", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Nome de utilizador parcial", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Nenhum item para mostrar", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Novo item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Adicionar novo item do cofre", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Nova credencial", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Adicione uma nova credencial ao cofre, abre numa nova janela", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Novo cartÃŖo", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Adicione um novo cartÃŖo ao cofre, abre numa nova janela", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Nova identidade", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Adicione uma nova identidade ao cofre, abre numa nova janela", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Menu de preenchimento automÃĄtico do Bitwarden disponível. Prima a tecla de seta para baixo para selecionar.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Ativar" + }, + "ignore": { + "message": "Ignorar" + }, + "importData": { + "message": "Importar dados", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Erro de importaÃ§ÃŖo" + }, + "importErrorDesc": { + "message": "Ocorreu um problema com os dados que tentou importar. Por favor, resolva os erros indicados abaixo no seu ficheiro de origem e tente novamente." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolva os erros abaixo e tente novamente." + }, + "description": { + "message": "DescriÃ§ÃŖo" + }, + "importSuccess": { + "message": "Dados importados com sucesso" + }, + "importSuccessNumberOfItems": { + "message": "Foi importado um total de $AMOUNT$ itens.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Tentar novamente" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "É necessÃĄria uma verificaÃ§ÃŖo para esta aÃ§ÃŖo. Defina um PIN para continuar." + }, + "setPin": { + "message": "Definir PIN" + }, + "verifyWithBiometrics": { + "message": "Verificar com biometria" + }, + "awaitingConfirmation": { + "message": "A aguardar confirmaÃ§ÃŖo" + }, + "couldNotCompleteBiometrics": { + "message": "NÃŖo foi possível concluir a biometria." + }, + "needADifferentMethod": { + "message": "Precisa de um mÊtodo diferente?" + }, + "useMasterPassword": { + "message": "Utilizar a palavra-passe mestra" + }, + "usePin": { + "message": "Utilizar PIN" + }, + "useBiometrics": { + "message": "Utilizar biometria" + }, + "enterVerificationCodeSentToEmail": { + "message": "Introduza o cÃŗdigo de verificaÃ§ÃŖo que foi enviado para o seu e-mail." + }, + "resendCode": { + "message": "Reenviar cÃŗdigo" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "EstÃĄ a importar dados para a $ORGANIZATION$. Os seus dados podem ser partilhados com membros desta organizaÃ§ÃŖo. Deseja prosseguir?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Erro ao ligar ao serviço Duo. Utilize um mÊtodo de verificaÃ§ÃŖo de dois passos diferente ou contacte o Duo para obter assistÃĒncia." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Inicie o Duo e siga os passos para concluir o início de sessÃŖo." + }, + "duoRequiredForAccount": { + "message": "A verificaÃ§ÃŖo de dois passos Duo Ê necessÃĄria para a sua conta." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Abra a extensÃŖo para concluir o início de sessÃŖo." + }, + "popoutExtension": { + "message": "ExtensÃŖo popout" + }, + "launchDuo": { + "message": "Iniciar o Duo" + }, + "importFormatError": { + "message": "Os dados nÃŖo estÃŖo formatados corretamente. Por favor, verifique o seu ficheiro de importaÃ§ÃŖo e tente novamente." + }, + "importNothingError": { + "message": "Nada foi importado." + }, + "importEncKeyError": { + "message": "Erro ao desencriptar o ficheiro exportado. A sua chave de encriptaÃ§ÃŖo nÃŖo corresponde à chave de encriptaÃ§ÃŖo utilizada para exportar os dados." + }, + "invalidFilePassword": { + "message": "Palavra-passe de ficheiro invÃĄlida, utilize a palavra-passe que introduziu quando criou o ficheiro de exportaÃ§ÃŖo." + }, + "destination": { + "message": "Destino" + }, + "learnAboutImportOptions": { + "message": "Saiba mais sobre as suas opçÃĩes de importaÃ§ÃŖo" + }, + "selectImportFolder": { + "message": "Selecionar uma pasta" + }, + "selectImportCollection": { + "message": "Selecionar uma coleÃ§ÃŖo" + }, + "importTargetHint": { + "message": "Selecione esta opÃ§ÃŖo se pretender que o conteÃēdo do ficheiro importado seja transferido para $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "O ficheiro contÊm itens nÃŖo atribuídos." + }, + "selectFormat": { + "message": "Selecione o formato do ficheiro a importar" + }, + "selectImportFile": { + "message": "Selecione o ficheiro a importar" + }, + "chooseFile": { + "message": "Escolher ficheiro" + }, + "noFileChosen": { + "message": "Nenhum ficheiro escolhido" + }, + "orCopyPasteFileContents": { + "message": "ou faça copiar/colar o conteÃēdo do ficheiro de importaÃ§ÃŖo" + }, + "instructionsFor": { + "message": "InstruçÃĩes para $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirmar a importaÃ§ÃŖo do cofre" + }, + "confirmVaultImportDesc": { + "message": "Este ficheiro estÃĄ protegido por palavra-passe. Introduza a palavra-passe do ficheiro para importar os dados." + }, + "confirmFilePassword": { + "message": "Confirmar a palavra-passe do ficheiro" + }, + "exportSuccess": { + "message": "Dados do cofre exportados" + }, + "typePasskey": { + "message": "Chave de acesso" + }, + "accessing": { + "message": "A aceder" + }, + "passkeyNotCopied": { + "message": "A chave de acesso nÃŖo serÃĄ copiada" + }, + "passkeyNotCopiedAlert": { + "message": "A chave de acesso nÃŖo serÃĄ copiada para o item duplicado. Pretende ainda assim duplicar este item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "VerificaÃ§ÃŖo exigida pelo site inicial. Esta funcionalidade ainda nÃŖo estÃĄ implementada para contas sem palavra-passe mestra." + }, + "logInWithPasskeyQuestion": { + "message": "Iniciar sessÃŖo com a chave de acesso?" + }, + "passkeyAlreadyExists": { + "message": "JÃĄ existe uma chave de acesso para esta aplicaÃ§ÃŖo." + }, + "noPasskeysFoundForThisApplication": { + "message": "NÃŖo foram encontradas chaves de acesso para esta aplicaÃ§ÃŖo." + }, + "noMatchingPasskeyLogin": { + "message": "NÃŖo tem uma credencial correspondente para este site." + }, + "noMatchingLoginsForSite": { + "message": "Sem credenciais correspondentes para este site" + }, + "searchSavePasskeyNewLogin": { + "message": "Procure ou guarde a chave de acesso como uma nova credencial" + }, + "confirm": { + "message": "Confirmar" + }, + "savePasskey": { + "message": "Guardar a chave de acesso" + }, + "savePasskeyNewLogin": { + "message": "Guarde a chave de acesso como uma nova credencial" + }, + "chooseCipherForPasskeySave": { + "message": "Escolha uma credencial para guardar esta chave de acesso" + }, + "chooseCipherForPasskeyAuth": { + "message": "Escolha uma chave de acesso para iniciar sessÃŖo" + }, + "passkeyItem": { + "message": "Item da chave de acesso" + }, + "overwritePasskey": { + "message": "Substituir chave de acesso?" + }, + "overwritePasskeyAlert": { + "message": "Este item jÃĄ contÊm uma chave de acesso. Tem a certeza de que pretende substituir a chave de acesso atual?" + }, + "featureNotSupported": { + "message": "Funcionalidade ainda nÃŖo suportada" + }, + "yourPasskeyIsLocked": { + "message": "É necessÃĄria a autenticaÃ§ÃŖo para utilizar a chave de acesso. Verifique a sua identidade para continuar." + }, + "multifactorAuthenticationCancelled": { + "message": "AutenticaÃ§ÃŖo multifator cancelada" + }, + "noLastPassDataFound": { + "message": "NÃŖo foram encontrados dados do LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "Nome de utilizador ou palavra-passe incorretos" + }, + "incorrectPassword": { + "message": "Palavra-passe incorreta" + }, + "incorrectCode": { + "message": "CÃŗdigo incorreto" + }, + "incorrectPin": { + "message": "PIN incorreto" + }, + "multifactorAuthenticationFailed": { + "message": "Falha na autenticaÃ§ÃŖo multifator" + }, + "includeSharedFolders": { + "message": "Incluir pastas partilhadas" + }, + "lastPassEmail": { + "message": "E-mail do LastPass" + }, + "importingYourAccount": { + "message": "A importar a sua conta..." + }, + "lastPassMFARequired": { + "message": "AutenticaÃ§ÃŖo multifator do LastPass necessÃĄria" + }, + "lastPassMFADesc": { + "message": "Introduza o seu cÃŗdigo de acesso Ãēnico a partir da sua aplicaÃ§ÃŖo de autenticaÃ§ÃŖo" + }, + "lastPassOOBDesc": { + "message": "Aprove o pedido de início de sessÃŖo na sua aplicaÃ§ÃŖo de autenticaÃ§ÃŖo ou introduza um cÃŗdigo de acesso Ãēnico." + }, + "passcode": { + "message": "CÃŗdigo de acesso" + }, + "lastPassMasterPassword": { + "message": "Palavra-passe mestra do LastPass" + }, + "lastPassAuthRequired": { + "message": "AutenticaÃ§ÃŖo do LastPass necessÃĄria" + }, + "awaitingSSO": { + "message": "A aguardar autenticaÃ§ÃŖo SSO" + }, + "awaitingSSODesc": { + "message": "Por favor, continue a iniciar sessÃŖo utilizando as credenciais da sua empresa." + }, + "seeDetailedInstructions": { + "message": "Consulte as instruçÃĩes detalhadas no nosso site de ajuda em", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importar diretamente do LastPass" + }, + "importFromCSV": { + "message": "Importar de CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Tente novamente ou procure um e-mail do LastPass para verificar a sua identidade." + }, + "collection": { + "message": "ColeÃ§ÃŖo" + }, + "lastPassYubikeyDesc": { + "message": "Insira a YubiKey associada à sua conta LastPass na porta USB do seu computador e, em seguida, toque no respetivo botÃŖo." + }, + "switchAccount": { + "message": "Mudar de conta" + }, + "switchAccounts": { + "message": "Mudar de conta" + }, + "switchToAccount": { + "message": "Mudar para conta" + }, + "activeAccount": { + "message": "Conta ativa" + }, + "availableAccounts": { + "message": "Contas disponíveis" + }, + "accountLimitReached": { + "message": "Limite de contas atingido. Termine a sessÃŖo de uma das contas para adicionar outra." + }, + "active": { + "message": "ativa" + }, + "locked": { + "message": "bloqueado" + }, + "unlocked": { + "message": "desbloqueado" + }, + "server": { + "message": "servidor" + }, + "hostedAt": { + "message": "hospedado em" + }, + "useDeviceOrHardwareKey": { + "message": "Utilize o seu dispositivo ou chave de hardware" + }, + "justOnce": { + "message": "Apenas uma vez" + }, + "alwaysForThisSite": { + "message": "Sempre para este site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ adicionado aos domínios excluídos.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Formatos comuns", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continuar para as definiçÃĩes do navegador?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continuar para o Centro de ajuda?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Altere as definiçÃĩes de preenchimento automÃĄtico e de gestÃŖo de palavras-passe 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": { + "message": "Pode ver e definir atalhos de extensÃŖo nas definiçÃĩes do seu navegador.", + "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": "Altere as definiçÃĩes de preenchimento automÃĄtico e de gestÃŖo de palavras-passe 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": { + "message": "Pode ver e definir atalhos de extensÃŖo nas definiçÃĩes do seu navegador.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Tornar o Bitwarden o seu gestor de palavras-passe predefinido?", + "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 as sugestÃĩes de preenchimento automÃĄtico do Bitwarden e as do seu navegador.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Tornar o Bitwarden o seu gestor de palavras-passe predefinido", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "NÃŖo Ê possível definir o Bitwarden como o gestor de palavras-passe predefinido", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "É necessÃĄrio conceder permissÃĩes de privacidade do navegador ao Bitwarden para defini-lo como o gestor de palavras-passe predefinido.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Tornar predefinido", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credenciais guardadas com sucesso!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Palavra-passe guardada!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credenciais atualizadas com sucesso!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Palavra passe atualizada!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Erro ao guardar as credenciais. Verifique a consola para obter detalhes.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Com sucesso" + }, + "removePasskey": { + "message": "Remover chave de acesso" + }, + "passkeyRemoved": { + "message": "Chave de acesso removida" + }, + "autofillSuggestions": { + "message": "SugestÃĩes de preenchimento automÃĄtico" + }, + "autofillSuggestionsTip": { + "message": "Guarde uma credencial deste site para preenchimento automÃĄtico" + }, + "yourVaultIsEmpty": { + "message": "O seu cofre estÃĄ vazio" + }, + "noItemsMatchSearch": { + "message": "Nenhum item corresponde à sua pesquisa" + }, + "clearFiltersOrTryAnother": { + "message": "Limpe os filtros ou tente outro termo de pesquisa" + }, + "copyInfoTitle": { + "message": "Copiar informaçÃĩes - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copiar nota - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Mais opçÃĩes, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Mais opçÃĩes - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Ver item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Preencher automaticamente - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "NÃŖo hÃĄ valores a copiar" + }, + "assignToCollections": { + "message": "Atribuir às coleçÃĩes" + }, + "copyEmail": { + "message": "Copiar e-mail" + }, + "copyPhone": { + "message": "Copiar telefone" + }, + "copyAddress": { + "message": "Copiar endereço" + }, + "adminConsole": { + "message": "Consola de administraÃ§ÃŖo" + }, + "accountSecurity": { + "message": "Segurança da conta" + }, + "notifications": { + "message": "NotificaçÃĩes" + }, + "appearance": { + "message": "AparÃĒncia" + }, + "errorAssigningTargetCollection": { + "message": "Erro ao atribuir a coleÃ§ÃŖo de destino." + }, + "errorAssigningTargetFolder": { + "message": "Erro ao atribuir a pasta de destino." + }, + "viewItemsIn": { + "message": "Ver itens em $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Voltar a $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Novo" + }, + "removeItem": { + "message": "Remover $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Itens sem pasta" + }, + "itemDetails": { + "message": "Detalhes do item" + }, + "itemName": { + "message": "Nome do item" + }, + "cannotRemoveViewOnlyCollections": { + "message": "NÃŖo Ê possível remover coleçÃĩes com permissÃĩes de Apenas visualizaÃ§ÃŖo: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "A organizaÃ§ÃŖo estÃĄ desativada" + }, + "owner": { + "message": "ProprietÃĄrio" + }, + "selfOwnershipLabel": { + "message": "Eu", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "NÃŖo Ê possível aceder aos itens de organizaçÃĩes desativadas. Contacte o proprietÃĄrio da organizaÃ§ÃŖo para obter assistÃĒncia." + }, + "additionalInformation": { + "message": "InformaçÃĩes adicionais" + }, + "itemHistory": { + "message": "HistÃŗrico do item" + }, + "lastEdited": { + "message": "Última ediÃ§ÃŖo" + }, + "ownerYou": { + "message": "ProprietÃĄrio: Eu" + }, + "linked": { + "message": "Associado" + }, + "copySuccessful": { + "message": "CÃŗpia bem-sucedida" + }, + "upload": { + "message": "Carregar" + }, + "addAttachment": { + "message": "Adicionar anexo" + }, + "maxFileSizeSansPunctuation": { + "message": "O tamanho mÃĄximo do ficheiro Ê de 500 MB" + }, + "deleteAttachmentName": { + "message": "Eliminar o anexo $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Transferir $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Tem a certeza de que pretende eliminar permanentemente este anexo?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "As organizaçÃĩes gratuitas nÃŖo podem utilizar anexos" + }, + "filters": { + "message": "Filtros" + }, + "personalDetails": { + "message": "Dados pessoais" + }, + "identification": { + "message": "IdentificaÃ§ÃŖo" + }, + "contactInfo": { + "message": "InformaçÃĩes de contacto" + }, + "downloadAttachment": { + "message": "Transferir - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "o nÃēmero do cartÃŖo termina com", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Credenciais de início de sessÃŖo" + }, + "authenticatorKey": { + "message": "Chave de autenticaÃ§ÃŖo" + }, + "autofillOptions": { + "message": "OpçÃĩes de preenchimento automÃĄtico" + }, + "websiteUri": { + "message": "Site (URI)" + }, + "websiteUriCount": { + "message": "Site (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Site adicionado" + }, + "addWebsite": { + "message": "Adicionar site" + }, + "deleteWebsite": { + "message": "Eliminar site" + }, + "defaultLabel": { + "message": "Predefinido ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Mostrar deteÃ§ÃŖo de correspondÃĒncia para $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Ocultar deteÃ§ÃŖo de correspondÃĒncia para $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Preencher automaticamente ao carregar a pÃĄgina?" + }, + "cardExpiredTitle": { + "message": "CartÃŖo expirado" + }, + "cardExpiredMessage": { + "message": "Se o renovou, atualize as informaçÃĩes do cartÃŖo" + }, + "cardDetails": { + "message": "Detalhes do cartÃŖo" + }, + "cardBrandDetails": { + "message": "Detalhes do $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Ativar animaçÃĩes" + }, + "showAnimations": { + "message": "Mostrar animaçÃĩes" + }, + "addAccount": { + "message": "Adicionar conta" + }, + "loading": { + "message": "A carregar" + }, + "data": { + "message": "Dados" + }, + "passkeys": { + "message": "Chaves de acesso", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Palavras-passe", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Iniciar sessÃŖo com a chave de acesso", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Atribuir" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Apenas os membros da organizaÃ§ÃŖo com acesso a estas coleçÃĩes poderÃŖo ver o item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Apenas os membros da organizaÃ§ÃŖo com acesso a estas coleçÃĩes poderÃŖo ver os itens." + }, + "bulkCollectionAssignmentWarning": { + "message": "Selecionou $TOTAL_COUNT$ itens. NÃŖo pode atualizar $READONLY_COUNT$ dos itens porque nÃŖo tem permissÃĩes de ediÃ§ÃŖo.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Adicionar campo" + }, + "add": { + "message": "Adicionar" + }, + "fieldType": { + "message": "Tipo de campo" + }, + "fieldLabel": { + "message": "Etiqueta do campo" + }, + "textHelpText": { + "message": "Utilize campos de texto para dados como perguntas de segurança" + }, + "hiddenHelpText": { + "message": "Utilize campos ocultos para dados sensíveis como uma palavra-passe" + }, + "checkBoxHelpText": { + "message": "Utilize caixas de verificaÃ§ÃŖo se pretender preencher automaticamente uma caixa de verificaÃ§ÃŖo de um formulÃĄrio, como um e-mail de memorizaÃ§ÃŖo" + }, + "linkedHelpText": { + "message": "Utilize um campo ligado quando tiver problemas de preenchimento automÃĄtico para um site específico." + }, + "linkedLabelHelpText": { + "message": "Introduza o ID do HTML, o nome, a aria-label ou o placeholder do campo." + }, + "editField": { + "message": "Editar campo" + }, + "editFieldLabel": { + "message": "Editar $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Eliminar $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ adicionado", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reordenar $LABEL$. Utilize a tecla de seta para mover o item para cima ou para baixo.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ movido para cima, posiÃ§ÃŖo $INDEX$ de $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Selecione as coleçÃĩes a atribuir" + }, + "personalItemTransferWarningSingular": { + "message": "1 serÃĄ permanentemente transferido para a organizaÃ§ÃŖo selecionada. Este item deixarÃĄ de lhe pertencer." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ itens serÃŖo permanentemente transferidos para a organizaÃ§ÃŖo selecionada. Estes itens deixarÃŖo de lhe pertencer.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 serÃĄ permanentemente transferido para a $ORG$. Este item deixarÃĄ de lhe pertencer.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ itens serÃŖo permanentemente transferidos para $ORG$. Estes itens deixarÃŖo de lhe pertencer.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "ColeçÃĩes atribuídas com sucesso" + }, + "nothingSelected": { + "message": "NÃŖo selecionou nada." + }, + "movedItemsToOrg": { + "message": "Itens selecionados movidos para $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Itens movidos para $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item movido para $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ movido para baixo, posiÃ§ÃŖo $INDEX$ de $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "LocalizaÃ§ÃŖo do item" + }, + "fileSend": { + "message": "Send de ficheiro" + }, + "fileSends": { + "message": "Sends de ficheiros" + }, + "textSend": { + "message": "Send de texto" + }, + "textSends": { + "message": "Sends de texto" + }, + "bitwardenNewLook": { + "message": "O Bitwarden tem um novo visual!" + }, + "bitwardenNewLookDesc": { + "message": "É mais fÃĄcil e mais intuitivo do que nunca preencher automaticamente e pesquisar a partir do separador Cofre. DÃĒ uma vista de olhos!" + }, + "accountActions": { + "message": "AçÃĩes da conta" + }, + "showNumberOfAutofillSuggestions": { + "message": "Mostrar o nÃēmero de sugestÃĩes de preenchimento automÃĄtico de credenciais no ícone da extensÃŖo" + }, + "systemDefault": { + "message": "PredefiniÃ§ÃŖo do sistema" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Os requisitos da política empresarial foram aplicados a esta definiÃ§ÃŖo" + }, + "sshPrivateKey": { + "message": "Chave privada" + }, + "sshPublicKey": { + "message": "Chave pÃēblica" + }, + "sshFingerprint": { + "message": "ImpressÃŖo digital" + }, + "sshKeyAlgorithm": { + "message": "Tipo de chave" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Tentar novamente" + }, + "vaultCustomTimeoutMinimum": { + "message": "O tempo limite mínimo personalizado Ê de 1 minuto." + }, + "additionalContentAvailable": { + "message": "EstÃŖo disponíveis conteÃēdos adicionais" + }, + "fileSavedToDevice": { + "message": "Ficheiro guardado no dispositivo. Gira-o a partir das transferÃĒncias do seu dispositivo." + }, + "showCharacterCount": { + "message": "Mostrar contagem de caracteres" + }, + "hideCharacterCount": { + "message": "Ocultar contagem de caracteres" + }, + "itemsInTrash": { + "message": "Itens no lixo" + }, + "noItemsInTrash": { + "message": "Nenhum item no lixo" + }, + "noItemsInTrashDesc": { + "message": "Os itens que eliminar aparecerÃŖo aqui e serÃŖo permanentemente eliminados apÃŗs 30 dias" + }, + "trashWarning": { + "message": "Os itens que estiverem no lixo hÃĄ mais de 30 dias serÃŖo automaticamente eliminados" + }, + "restore": { + "message": "Restaurar" + }, + "deleteForever": { + "message": "Eliminar para sempre" + }, + "noEditPermissions": { + "message": "NÃŖo tem permissÃŖo para editar este item" + }, + "authenticating": { + "message": "A autenticar" + }, + "fillGeneratedPassword": { + "message": "Preencher a palavra-passe gerada", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Palavra-passe gerada novamente", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Guardar credencial no Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Espaço", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Til", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Plicas", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Ponto de exclamaÃ§ÃŖo", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "Arroba", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Cardinal", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "DÃŗlar", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percentagem", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Acento circunflexo", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "E comercial", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisco", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "ParÃĒntesis esquerdo", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "ParÃĒntesis direito", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hífen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Mais", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Igual", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Chaveta esquerda", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Chaveta direita", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "ParÃĒntesis reto esquerdo", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "ParÃĒntesis reto direito", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Barra vertical", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Barra invertida", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Dois pontos", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Ponto e vírgula", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Aspas", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Aspas simples", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Menor", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Maior", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Vírgula", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Ponto final", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Ponto de interrogaÃ§ÃŖo", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Barra oblíqua", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "MinÃēsculas" + }, + "uppercaseAriaLabel": { + "message": "MaiÃēsculas" + }, + "generatedPassword": { + "message": "Palavra-passe gerada" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index cf8acef767b..29ee5bf4b49 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Manager de parole gratuit", + "message": "Bitwarden - Manager Gratuit de Parole", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Un manager de parole sigur și gratuit pentru toate dispozitivele dvs.", - "description": "Extension description" + "message": "Acasă, la serviciu sau ÃŽn deplasare, Bitwarden vă protejează toate parolele și informațiile sensibile", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Autentificați-vă sau creați un cont nou pentru a accesa seiful dvs. securizat." }, + "inviteAccepted": { + "message": "Invitație acceptată" + }, "createAccount": { "message": "Creare cont" }, - "login": { - "message": "Conectare" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Setați o parolă puternică" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finalizați crearea contului prin setarea unei parole" }, "enterpriseSingleSignOn": { "message": "Conectare unică organizație" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Un indiciu pentru parola principală vă poate ajuta să v-o reamintiți dacă o uitați." }, + "masterPassHintText": { + "message": "Dacă vă uitați parola, indiciul parolei poate fi trimis la adresa dvs. de e-mail. $CURRENT$/$MAXIMUM$ de caractere maxim.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Reintroducere parolă principală" }, "masterPassHint": { "message": "Indiciu pentru parola principală (opțional)" }, + "joinOrganization": { + "message": "Alăturați-vă organizației" + }, + "joinOrganizationName": { + "message": "Alătură-te $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finalizați aderarea la această organizație prin setarea unei parole principale." + }, "tab": { "message": "Filă" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copiere parolă" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copiere notă" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Copiere cod de securitate" }, + "copyName": { + "message": "Copiați numele" + }, + "copyCompany": { + "message": "Copiați firma" + }, + "copySSN": { + "message": "Copiați numărul de securitate socială" + }, + "copyPassportNumber": { + "message": "Copiați numărul pașaportului" + }, + "copyLicenseNumber": { + "message": "Copiați numărul de licență" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copiază $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copiază site-ul" + }, + "copyNotes": { + "message": "Copiază notițele" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Auto-completare" }, + "autoFillLogin": { + "message": "Autocompletare date de autentificare" + }, + "autoFillCard": { + "message": "Autocompletare card" + }, + "autoFillIdentity": { + "message": "Autocompletare identitate" + }, "generatePasswordCopied": { "message": "Generare parolă (s-a copiat)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Nu există potrivire de autentificări" }, + "noCards": { + "message": "Niciun card" + }, + "noIdentities": { + "message": "Nicio identitate" + }, + "addLoginMenu": { + "message": "Adăugare date de autentificare" + }, + "addCardMenu": { + "message": "Adăugare card" + }, + "addIdentityMenu": { + "message": "Adăugare identitate" + }, "unlockVaultMenu": { "message": "Deblocați-vă seiful" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Adăugare articol" }, + "accountEmail": { + "message": "Adresa de email a contului" + }, + "requestHint": { + "message": "Solicită indiciu" + }, + "requestPasswordHint": { + "message": "Solicită indiciu parolă" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Introduceți adresa de e-mail a contului și indiciul pentru parolă va fi trimis pe email" + }, "passwordHint": { "message": "Indiciu parolă" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirmați-vă identitatea pentru a continua." }, - "account": { - "message": "Cont" - }, "changeMasterPassword": { "message": "Schimbare parolă principală" }, + "continueToWebApp": { + "message": "Continuați către aplicația web?" + }, + "continueToWebAppDesc": { + "message": "Explorați mai multe caracteristici ale contului Bitwarden ÃŽn aplicația web." + }, + "continueToHelpCenter": { + "message": "Continuați la Centrul de Ajutor?" + }, + "continueToHelpCenterDesc": { + "message": "Aflați mai multe despre cum să utilizați Bitwarden ÃŽn Centrul de Ajutor." + }, + "continueToBrowserExtensionStore": { + "message": "Continuați la magazinul de extensii al browser-ului?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Ajutați-i pe alții să afle dacă Bitwarden este potrivit pentru ei. Vizitați magazinul de extensii al browser-ului dvs. și lăsați o evaluare acum." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Puteți schimba parola principală ÃŽn aplicația web Bitwarden." + }, "fingerprintPhrase": { "message": "Fraza amprentă", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Deconectare" }, + "aboutBitwarden": { + "message": "Despre Bitwarden" + }, "about": { "message": "Despre" }, + "moreFromBitwarden": { + "message": "Mai multe de la Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continuați la bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden pentru Business" + }, + "bitwardenAuthenticator": { + "message": "Autentificator Bitwarden" + }, + "continueToAuthenticatorPageDesc": { + "message": "Autentificatorul Bitwarden vă permite să stocați chei de autentificare și să generați coduri TOTP pentru fluxurile de verificare ÃŽn doi pași. Aflați mai multe de pe site-ul bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Manager de secrete Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "Stocați, gestionați și partajați ÃŽn siguranță secretele dezvoltatorilor cu Bitwarden Secrets Manager. Aflați mai multe pe site-ul bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Creați experiențe de conectare fluide și sigure, fără parole tradiționale, cu Passwordless.dev. Aflați mai multe pe site-ul bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Families gratuit" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "Sunteți eligibil pentru Bitwarden Families gratuit. Răscumpărați această ofertă astăzi ÃŽn aplicația web." + }, "version": { "message": "Versiune" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Editare dosar" }, + "newFolder": { + "message": "Folder nou" + }, + "folderName": { + "message": "Numele folderului" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Ștergere dosar" }, @@ -199,7 +399,7 @@ "message": "Centrul de Ajutor Bitwarden" }, "communityForums": { - "message": "Explorează forumurile comunității Bitwarden" + "message": "Explorați forumurile comunității Bitwarden" }, "contactSupport": { "message": "Contactați asistența Bitwarden" @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Generează automat parole unice și puternice pentru autentificările dvs." }, - "bitWebVault": { - "message": "Seif web Bitwarden" + "bitWebVaultApp": { + "message": "Aplicația web Bitwarden" }, "importItems": { "message": "Import de articole" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generare parolă" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerare parolă" }, @@ -244,17 +447,60 @@ "length": { "message": "Lungime" }, + "passwordMinLength": { + "message": "Lungimea minimă a parolei" + }, "uppercase": { - "message": "Litere mari (A-Z)" + "message": "Litere mari (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Litere mici (a-z)" + "message": "Litere mici (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numere (0-9)" + "message": "Numere (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caractere speciale (!@#$%^&*)" + "message": "Caractere speciale (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Număr de cuvinte" @@ -276,7 +522,16 @@ "message": "Minim de caractere speciale" }, "avoidAmbChar": { - "message": "Se evită caracterele ambigue" + "message": "Se evită caracterele ambigue", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Căutare ÃŽn seif" @@ -299,15 +554,30 @@ "password": { "message": "Parolă" }, + "totp": { + "message": "Cheie de autentificare" + }, "passphrase": { "message": "Frază de acces" }, "favorite": { "message": "Favorit" }, + "unfavorite": { + "message": "Elimină din favorite" + }, + "itemAddedToFavorites": { + "message": "Item adăugat ÃŽn favorite" + }, + "itemRemovedFromFavorites": { + "message": "Item eliminat din favorite" + }, "notes": { "message": "Note" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Notă" }, @@ -326,6 +596,18 @@ "launch": { "message": "Lansare" }, + "launchWebsite": { + "message": "Lansați siteul web" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Sait web" }, @@ -338,8 +620,23 @@ "other": { "message": "Altele" }, + "unlockMethods": { + "message": "Deblocați opțiunile" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Configurați metoda de deblocare care să schimbe acțiunea de expirare a seifului." + }, + "unlockMethodNeeded": { + "message": "Setați o metodă de deblocare in setări" + }, + "sessionTimeoutHeader": { + "message": "Expirarea sesiunii" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Alte opțiuni" }, "rateExtension": { "message": "Evaluare extensie" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Seiful dvs. este blocat. Verificați-vă identitatea pentru a continua." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Deblocare" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Expirare seif" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Blocare imediată" }, + "lockAll": { + "message": "Blochează toate" + }, "immediately": { "message": "Imediat" }, @@ -426,6 +738,18 @@ "security": { "message": "Securitate" }, + "confirmMasterPassword": { + "message": "Confirmați parola principală" + }, + "masterPassword": { + "message": "Parola principală" + }, + "masterPassImportant": { + "message": "Parola principală nu poate fi recuperată dacă este uitată!" + }, + "masterPassHintLabel": { + "message": "Indiciu pentru parola principală" + }, "errorOccurred": { "message": "S-a produs o eroare" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Noul dvs. cont a fost creat! Acum vă puteți autentifica." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "V-ați conectat cu succes" + }, + "youMayCloseThisWindow": { + "message": "Puteți ÃŽnchide această fereastră" + }, "masterPassSent": { "message": "V-am trimis un e-mail cu indiciul parolei principale." }, "verificationCodeRequired": { "message": "Este necesar codul de verificare." }, + "webauthnCancelOrTimeout": { + "message": "Autentificarea a fost anulată sau a luat prea mult. Încercați din nou." + }, "invalidVerificationCode": { "message": "Cod de verificare nevalid" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Nu se pot auto-completa datele de conectare pentru această pagină. În schimb, puteți copia și lipi aceste date." }, + "totpCaptureError": { + "message": "Nu se poate scana codul QR din pagina web curentă" + }, + "totpCaptureSuccess": { + "message": "Cheie autentificare adăugată" + }, + "totpCapture": { + "message": "Scanează codul QR pentru autentificator din pagina web curentă" + }, + "totpHelperTitle": { + "message": "Faceți autentificarea in 2 pași mai ușoară" + }, + "totpHelper": { + "message": "Bitwarden poate stoca și completa coduri de verificare ÃŽn doi pași. Copiați și lipiți cheia ÃŽn acest cÃĸmp." + }, + "totpHelperWithCapture": { + "message": "Bitwarden poate stoca și completa coduri de verificare ÃŽn doi pași. Selectați pictograma camerei foto pentru a face o captură de ecran a codului QR de autentificare al acestui site, sau copiați și lipiți cheia ÃŽn acest cÃĸmp." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copiați cheia de autentificare (TOTP)" + }, "loggedOut": { "message": "Deconectat" }, + "loggedOutDesc": { + "message": "Ați fost deconectat din contul dvs." + }, "loginExpired": { "message": "Sesiunea de autentificare a expirat." }, + "logIn": { + "message": "Autentificare" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Reporniți ÃŽnregistrarea" + }, + "expiredLink": { + "message": "Link expirat" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Vă rugăm să reporniți ÃŽnregistrarea sau să ÃŽncercați să vă conectați." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Este posibil să aveți deja un cont" + }, "logOutConfirmation": { "message": "Sigur doriți să vă deconectați?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Dosar adăugat" }, - "changeMasterPass": { - "message": "Schimbare parolă principală" - }, - "changeMasterPasswordConfirmation": { - "message": "Puteți modifica parola principală ÃŽn seiful web bitwarden.com. Doriți să vizitați saitul acum?" - }, "twoStepLoginConfirmation": { "message": "Autentificarea ÃŽn două etape vă face contul mai sigur, prin solicitarea unei verificări de autentificare cu un alt dispozitiv, cum ar fi o cheie de securitate, o aplicație de autentificare, un SMS, un apel telefonic sau un e-mail. Autentificarea ÃŽn două etape poate fi configurată ÃŽn seiful web bitwarden.com. Doriți să vizitați site-ul web acum?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Dosar salvat" }, @@ -552,6 +936,10 @@ "newUri": { "message": "URI nou" }, + "addDomain": { + "message": "Adăugați un domeniu", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Articol adăugat" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Solicitare de adăugare cont" }, + "vaultSaveOptionsTitle": { + "message": "Salvare ÃŽn opțiuni seif" + }, "addLoginNotificationDesc": { "message": "Solicitați adăugarea unui element dacă nu se găsește unul ÃŽn seif." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Afișați cardurile pe pagina Filă" }, "showCardsCurrentTabDesc": { "message": "Listați elementele cardului pe pagina Filă pentru a facilita completarea automată." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Afișați identitățile pe pagina Filă" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Solicitați actualizarea unei parole de autentificare atunci cÃĸnd este detectată o modificare pe un site web." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Doriți să actualizați această parolă ÃŽn Bitwarden?" }, @@ -634,20 +1043,26 @@ "message": "Actualizare" }, "notificationUnlockDesc": { - "message": "Deblochează seiful Bitwarden pentru a finaliza solicitarea de completare automată." + "message": "Deblocați seiful Bitwarden pentru a finaliza solicitarea de auto-completare." }, "notificationUnlock": { "message": "Deblocare" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Afișați opțiunile meniului contextual" }, "contextMenuItemDesc": { "message": "Utilizați un clic secundar pentru a accesa generarea de parole și conectările potrivite pentru site-ul web." }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Detectare implicită a potrivirii URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Alege modul implicit de gestionare a detectării de potrivire URI pentru conectări cÃĸnd se efectuează acțiuni precum auto-completarea." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Schimbă tema de culori a aplicației." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Întunecat", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Întuneric solarizat", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export seif" }, "fileFormat": { "message": "Format fișier" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "AVERTISMENT", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Partajat" }, - "learnOrg": { - "message": "Aflați despre organizații" - }, - "learnOrgConfirmation": { - "message": "Bitwarden vă permite să vă partajați articolele seifului cu alte persoane utilizÃĸnd o organizație. Doriți să vizitați site-ul bitwarden.com pentru a afla mai multe?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Mutare la organizație" @@ -762,6 +1204,9 @@ "file": { "message": "Fișier" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Selectare fișier" }, @@ -772,7 +1217,7 @@ "message": "Funcție indisponibilă" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Este necesară migrarea cheilor de criptare. Autentificați-vă prin intermediul seifului web pentru a vă actualiza cheia de criptare." }, "premiumMembership": { "message": "Abonament Premium" @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "1 GB spațiu de stocare criptat pentru atașamente de fișiere." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "Opțiuni brevetate de conectare cu doi factori, cum ar fi YubiKey și Duo." }, "ppremiumSignUpReports": { "message": "Rapoarte privind igiena parolelor, sănătatea contului și breșele de date pentru a vă păstra seiful ÃŽn siguranță." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Puteți achiziționa un abonament Premium pe website-ul bitwarden.com. Doriți să vizitați site-ul acum?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Sunteți un membru Premium!" }, "premiumCurrentMemberThanks": { "message": "Vă mulțumim pentru susținerea Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "Totul pentru doar %price% /an!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Actualizare completă" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Aplicația Authenticator" }, - "authenticatorAppDesc": { - "message": "Utilizați o aplicație de autentificare (cum ar fi Authy sau Google Authenticator) pentru a genera codurile de verificare bazate pe timp.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "Cheie de securitate YubiKey OTP" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Utilizați YubiKey pentru a accesa contul dvs. Funcționează cu dispozitivele YubiKey 4, 4 Nano, 4C și NEO." }, - "duoDesc": { - "message": "Verificați cu Duo Security utilizÃĸnd aplicația Duo Mobile, SMS, apel telefonic sau cheia de securitate U2F.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-mail" }, - "emailDesc": { - "message": "Codurile de verificare vor fi trimise prin e-mail." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Mediu autogăzduit" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specificați URL-ul de bază al implementări Bitwarden găzduită local." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Mediu personalizat" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL server" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL server API" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "URL-urile mediului au fost salvate" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Completare automată la ÃŽncărcarea paginii" }, "enableAutoFillOnPageLoadDesc": { "message": "Dacă se detectează un formular de autentificare, completați-l automat la ÃŽncărcarea paginii web." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Site-urile web compromise sau nesigure pot exploata funcția de autocompletare la ÃŽncărcarea paginii." + "message": "Site-urile web compromise sau nesigure pot profita de auto-completarea la ÃŽncărcare." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Mai multe informații despre auto-completare" }, "defaultAutoFillOnPageLoad": { "message": "Setarea implicită de completare automată pentru articole de conectare" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Deschidere seif ÃŽn bara laterală" }, - "commandAutofillDesc": { - "message": "Auto-completare a ultimei autentificări utilizate pe saitul web curent" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generare parolă aleatorie și copiere ÃŽn clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Blocare seif" }, - "privateModeWarning": { - "message": "Suportul pentru modul privat este experimental, iar unele caracteristici sunt limitate." - }, "customFields": { "message": "CÃĸmpuri particularizate" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Valoare logică" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Conectat", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Afișează o imagine ușor de recunoscut lÃĸngă fiecare autentificare." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Afișați contorul de insigne" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitate" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Istoric parole" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Înapoi" }, "collections": { "message": "Colecții" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorite" }, @@ -1282,6 +1874,10 @@ "message": "Domeniu de bază", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Nume de domeniu", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Detectare de potrivire", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Detectare de potrivire implicită", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Comutare opțiuni" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Nicio parolă de afișat." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Ștergere" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Deblocare cu codul PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Stabiliți codul PIN de deblocare Bitwarden. Setările codului PIN vor fi reinițializate dacă vă deconectați vreodată din aplicație." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Codul PIN este necesar." }, "invalidPin": { "message": "Codul PIN este invalid." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Deblocare folosind biometria" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Se așteaptă confirmarea de la desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Blocare cu parola principală la repornirea browserului" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Trebuie să selectați cel puțin o colecție." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Una sau mai multe politici organizaționale vă afectează setările generatorului." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Acțiune la expirarea seifului" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Blocare", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Coș de reciclare", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Articol restabilit" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "După expirare, accesul la seiful dvs. va fi restricționat și va fi necesară autentificarea online. Sigur doriți să utilizați această setare?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Completare automată și salvare" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Articol completat automat și URI salvat" }, @@ -1468,16 +2123,16 @@ "message": "Articolul s-a completat automat " }, "insecurePageWarning": { - "message": "Avertisment: Aceasta este o pagină HTTP nesecurizată și orice informație pe care o trimiteți poate fi văzută și modificată de alte persoane. Această Parolă a fost salvată inițial pe o pagină securizată (HTTPS)." + "message": "Avertisment: Acesta este un site HTTP nesecurizat. Orice informație transmisă poate fi vizualizată și modificată de alte persoane. Această autentificare a fost salvată inițial pe un site securizat (HTTPS)." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "Încă mai doriți să completați acest login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "Formularul este găzduit pe un alt domeniu decÃĸt adresa URI de autentificare salvată. Alegeți OK pentru completarea automată oricum sau Anulare pentru a opri." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "Pe viitor, pentru a evita acest avertisment, ÃŽnregistrați acest URI, $HOSTNAME$, ÃŽn login-ul Bitwarden pentru acest site.", "placeholders": { "hostname": { "content": "$1", @@ -1489,13 +2144,13 @@ "message": "Setare parolă principală" }, "currentMasterPass": { - "message": "Current master password" + "message": "Parola principală actuală" }, "newMasterPass": { - "message": "New master password" + "message": "Noua parolă principală" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "Confirmați noua parolă principală" }, "masterPasswordPolicyInEffect": { "message": "Una sau mai multe politici ale organizației necesită ca parola principală să ÃŽndeplinească următoarele cerințe:" @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Noua dvs. parolă principală nu ÃŽndeplinește cerințele politicii." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "Dacă bifați această casetă sunteți de acord cu următoarele:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Verificare sincronizare desktop" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Eroare de cont" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Datele biometrice nu sunt configurate" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "Biometria browserului nu este acceptată pe acest dispozitiv." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "Biometrica a eșuat" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "Verificarea biometrică nu poate fi finalizată. Încercați parola principală sau deconectați-vă. Dacă problema persistă, vă rugăm să contactați serviciul de asistență Bitwarden." }, "nativeMessaginPermissionErrorTitle": { "message": "Permisiunea nu a fost furnizată" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "O politică de organizație vă afectează opțiunile de proprietate." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Domenii excluse" }, "excludedDomainsDesc": { "message": "Bitwarden nu va cere să salveze detaliile de conectare pentru aceste domenii. Trebuie să reÃŽmprospătați pagina pentru ca modificările să intre ÃŽn vigoare." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nu este un domeniu valid", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Căutare Send-uri", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fișier" }, @@ -1666,6 +2406,9 @@ "message": "Toate Send-urile", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "S-a atins numărul maxim de accesări", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Protejat cu parolă" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copiere link Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Sigur doriți să ștergeți acest Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Editare Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send-ul va fi șters definitiv la data și ora specificate.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data expirării" }, @@ -1769,6 +2523,10 @@ "message": "Opțional, este necesară o parolă pentru ca utilizatorii să acceseze acest Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Note private despre acest Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send creat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send salvat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Pentru a alege un fișier, deschideți extensia ÃŽn bara laterală (dacă este posibil) sau deschideți-o ÃŽntr-o fereastră nouă, făcÃĸnd clic pe acest banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Pentru a alege un fișier folosind Safari, deschideți o fereastră nouă făcÃĸnd clic pe acest banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Înainte de a ÃŽncepe" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Ascundeți adresa mea de e-mail de la destinatari." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Una sau mai multe politici organizaționale vă afectează opțiunile Send-ului." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Verificare e-mail necesară" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "Trebuie să vă verificați e-mailul pentru a utiliza această caracteristică. Puteți verifica e-mailul ÃŽn seiful web." }, @@ -1884,7 +2695,10 @@ "message": "Parola principală a fost schimbată recent de către un administrator din organizație. Pentru a accesa seiful, trebuie să o actualizați acum. Continuarea vă va deconecta de la sesiunea curentă, cerÃĸndu-vă să vă conectați din nou. Sesiunile active de pe alte dispozitive pot continua să rămÃĸnă active timp de pÃĸnă la o oră." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Parola dvs. principală nu respectă una sau mai multe politici ale organizației. Pentru a accesa seiful, parola principală trebuie actualizată acum. În cazul ÃŽn care continuați, veți fi deconectat din sesiunea curentă și va trebui să vă conectați din nou. Sesiunile active de pe alte dispozitive pot rămÃĸne active timp de pÃĸnă la o oră." + }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." }, "resetPasswordPolicyAutoEnroll": { "message": "Înscrierea automată" @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Selectare folder..." }, - "ssoCompleteRegistration": { - "message": "Pentru a finaliza conectarea cu SSO, vă rugăm să setați o parolă principală pentru a vă accesa și proteja seiful." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Ore" @@ -1904,8 +2740,37 @@ "minutes": { "message": "Minute" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { - "message": "Politicile organizației dvs vă afectează expirarea seifului. Timpul maxim permis de expirare a seifului este $HOURS$ oră (ore) și $MINUTES$ minut(e)", + "message": "Politicile organizației dvs. au stabilit timpul maxim de expirare permis pentru seif la $HOURS$ oră/ore și $MINUTES$ de minut(e).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", "placeholders": { "hours": { "content": "$1", @@ -1918,7 +2783,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "Politicile organizației dvs. afectează timpul de expirare al seifului. Timpul maxim de așteptare permis pentru seif este de $HOURS$ oră(e) și $MINUTES$ minut(e). Acțiunea de temporizare a seifului este setată la $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1935,7 +2800,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "Politicile organizației dvs. au setat acțiunea de expirare a seifului la $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -1992,7 +2857,7 @@ "message": "Exportul seifului individual" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Se exportă numai intrările din seiful personal asociate cu $EMAIL$. Nu sunt incluse intrările de seif ale organizației. Se exportă numai informațiile despre intrările din seif. Acestea nu includ atașamentele asociate.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Eroare" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generare nume de utilizator" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Tip de nume de utilizator" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generați un alias de e-mail cu un serviciu de redirecționare extern." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Nume server", "description": "Part of a URL." @@ -2093,7 +3097,7 @@ "message": "Versiune server" }, "selfHostedServer": { - "message": "self-hosted" + "message": "auto-găzduit" }, "thirdParty": { "message": "Parte terță" @@ -2132,52 +3136,52 @@ "message": "Memorare e-mail" }, "loginWithDevice": { - "message": "Log in with device" + "message": "Conectați-vă cu dispozitivul" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "Conectarea cu dispozitivul trebuie să fie configurată ÃŽn setările aplicației Bitwarden. Aveți nevoie de o altă opțiune?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Fraza amprentă" }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + "message": "Asigurați-vă că seiful este deblocat și că fraza amprentă se potrivește cu cea de pe celălalt dispozitiv." }, "resendNotification": { - "message": "Resend notification" + "message": "ReÃŽntoarceți notificarea" }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "Afișați toate opțiunile de conectare" }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "O notificare a fost trimisă pe dispozitivul dvs." }, "loginInitiated": { - "message": "Login initiated" + "message": "Conectare inițiată" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Parolă principală compromisă" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Parola găsită ÃŽn scurgerea de date. Folosiți o parolă unică pentru a vă proteja contul. Sunteți sigur că doriți să folosiți o parolă compromisă?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Parolă principală slabă și compromisă" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Parolă slabă identificată și găsită ÃŽntr-o scurgere de date. Folosiți o parolă puternică și unică pentru a vă proteja contul. Sunteți sigur că doriți să utilizați această parolă?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Verificați scurgerile de date cunoscute pentru această parolă" }, "important": { "message": "Important:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Parola principală nu poate fi recuperată dacă este uitată!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Minim $LENGTH$ caractere", "placeholders": { "length": { "content": "$1", @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Politicile organizației dvs. au activat auto-completarea la ÃŽncărcarea paginii." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "Instrucțiuni de auto-completare" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { - "message": "Got it" + "message": "Am ÃŽnțeles" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Setări de auto-completare" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Scurtătură de tastatură pentru auto-completare" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Scurtătură implicită de auto-completare: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,87 +3246,107 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "Se deschide ÃŽntr-o nouă fereastră" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "Este necesară aprobarea dispozitivului. Selectați o opțiune de autorizare de mai jos:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Memorizează acest dispozitiv" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "Debifați dacă utilizați un dispozitiv public" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Aprobați de pe celălalt dispozitiv" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Cereți aprobarea administratorului" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "Aprobați cu parola principală" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "Identificatorul SSO al organizației este necesar." + }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { - "message": "Access denied. You do not have permission to view this page." + "message": "Acces refuzat. Nu aveți permisiunea de a vizualiza această pagină." }, "general": { "message": "General" }, "display": { - "message": "Display" + "message": "Afișare" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "Cont creat cu succes!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "Autorizație administrativă solicitată" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Cererea dvs. a fost trimisă administratorului." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "Veți primi o notificare după aprobare." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "Aveți probleme la logare?" }, "loginApproved": { - "message": "Login approved" + "message": "Autentificare aprobată" }, "userEmailMissing": { - "message": "User email missing" + "message": "Lipsește e-mailul utilizatorului" }, "deviceTrusted": { - "message": "Device trusted" + "message": "Dispozitiv de ÃŽncredere" + }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "Este necesară o intrare." }, "required": { - "message": "required" + "message": "necesar" }, "search": { - "message": "Search" + "message": "Căutare" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "Intrarea trebuie să aibă o lungime de cel puțin $COUNT$ caractere.", "placeholders": { "count": { "content": "$1", @@ -2322,7 +3355,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "Intrarea nu trebuie să fie mai lungă de $COUNT$ caractere.", "placeholders": { "count": { "content": "$1", @@ -2331,7 +3364,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "Următoarele caractere nu sunt permise: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "Valoarea de intrare trebuie să fie cel puțin $MIN$.", "placeholders": { "min": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "Valoarea de intrare nu trebuie să depășească $MAX$.", "placeholders": { "max": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "1 sau mai multe e-mailuri sunt invalide" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "Datele introduse nu trebuie să conțină numai spații.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "Intrarea nu este o adresă de e-mail." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "$COUNT$ cÃĸmp(uri) de mai sus necesită atenție.", "placeholders": { "count": { "content": "$1", @@ -2376,23 +3409,35 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Selectați --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- Scrieți pentru a filtra --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "Recuperarea opțiunilor..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "Niciun element găsit" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "Ștergeți tot" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ mai mult", "placeholders": { "quantity": { "content": "$1", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "Submeniu" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Comutare restrÃĸngere", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Elementele ÃŽn care parola principală este solicitată din nou nu pot fi completate automat la ÃŽncărcarea paginii. Completarea automată la ÃŽncărcarea paginii este dezactivată.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Completarea automată la ÃŽncărcarea paginii este setată la valoarea implicită.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Dezactivați reintroducerea parolei principale pentru a edita acest cÃĸmp", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 5dfbe64abc8..dd6f067f114 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - ĐąĐĩҁĐŋĐģĐ°Ņ‚ĐŊŅ‹Đš ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ĐŋĐ°Ņ€ĐžĐģĐĩĐš", + "message": "Bitwarden - МĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ĐŋĐ°Ņ€ĐžĐģĐĩĐš", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Đ—Đ°Ņ‰Đ¸Ņ‰ĐĩĐŊĐŊŅ‹Đš и ĐąĐĩҁĐŋĐģĐ°Ņ‚ĐŊŅ‹Đš ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ĐŋĐ°Ņ€ĐžĐģĐĩĐš Đ´ĐģŅ Đ˛ŅĐĩŅ… Đ˛Đ°ŅˆĐ¸Ņ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛.", - "description": "Extension description" + "message": "ДоĐŧа, ĐŊа Ņ€Đ°ĐąĐžŅ‚Đĩ иĐģи в ĐŋŅƒŅ‚Đ¸ - Bitwarden Đ˛ŅĐĩĐŗĐ´Đ° ĐˇĐ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚ Đ˛Đ°ŅˆĐ¸ ĐŋĐ°Ņ€ĐžĐģи, passkeys и ĐēĐžĐŊŅ„Đ¸Đ´ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Đ’ĐžĐšĐ´Đ¸Ņ‚Đĩ иĐģи ŅĐžĐˇĐ´Đ°ĐšŅ‚Đĩ ĐŊĐžĐ˛Ņ‹Đš аĐēĐēĐ°ŅƒĐŊŅ‚ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ˛Đ°ŅˆĐĩĐŧ҃ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊĐŊĐžĐŧ҃ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Ņƒ." }, + "inviteAccepted": { + "message": "ĐŸŅ€Đ¸ĐŗĐģĐ°ŅˆĐĩĐŊиĐĩ ĐŋŅ€Đ¸ĐŊŅŅ‚Đž" + }, "createAccount": { "message": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚" }, - "login": { - "message": "Đ’ĐžĐšŅ‚Đ¸" + "newToBitwarden": { + "message": "ВĐŋĐĩŅ€Đ˛Ņ‹Đĩ ĐŊа Bitwarden?" + }, + "logInWithPasskey": { + "message": "Đ’ĐžĐšŅ‚Đ¸ ҁ passkey" + }, + "useSingleSignOn": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐĩдиĐŊŅ‹Đš Đ˛Ņ…ĐžĐ´" + }, + "welcomeBack": { + "message": "ĐĄ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰ĐĩĐŊиĐĩĐŧ" + }, + "setAStrongPassword": { + "message": "Đ—Đ°Đ´Đ°ĐšŅ‚Đĩ ĐŊадĐĩĐļĐŊŅ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "ЗавĐĩŅ€ŅˆĐ¸Ņ‚Đĩ ŅĐžĐˇĐ´Đ°ĐŊиĐĩ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°, Садав ĐŋĐ°Ņ€ĐžĐģҌ" }, "enterpriseSingleSignOn": { "message": "ЕдиĐŊĐ°Ņ ĐēĐžŅ€ĐŋĐžŅ€Đ°Ņ‚Đ¸Đ˛ĐŊĐ°Ņ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Ņ" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ĐŸĐžĐ´ŅĐēаСĐēа Đē ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅŽ ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŧĐžŅ‡ŅŒ ваĐŧ ĐĩĐŗĐž Đ˛ŅĐŋĐžĐŧĐŊĐ¸Ņ‚ŅŒ." }, + "masterPassHintText": { + "message": "Đ•ŅĐģи Đ˛Ņ‹ ĐˇĐ°ĐąŅƒĐ´ĐĩŅ‚Đĩ ŅĐ˛ĐžĐš ĐŋĐ°Ņ€ĐžĐģҌ, ĐŊа Đ˛Đ°Ņˆ email ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊа ĐŋĐžĐ´ŅĐēаСĐēа Đ´ĐģŅ ĐŋĐ°Ņ€ĐžĐģŅ. МаĐēŅĐ¸ĐŧаĐģҌĐŊĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ŅĐ¸ĐŧвОĐģОв $CURRENT$/$MAXIMUM$.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž" }, "masterPassHint": { "message": "ĐŸĐžĐ´ŅĐēаСĐēа Đē ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅŽ (ĐŊĐĩĐžĐąŅĐˇ.)" }, + "joinOrganization": { + "message": "ĐŸŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ Đē ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸" + }, + "joinOrganizationName": { + "message": "ĐŸŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ Đē $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "ЗавĐĩŅ€ŅˆĐ¸Ņ‚Đĩ ĐŋŅ€Đ¸ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ Đē ŅŅ‚ĐžĐš ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸, ŅƒŅŅ‚Đ°ĐŊОвив ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ." + }, "tab": { "message": "ВĐēĐģадĐēа" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ" }, + "copyPassphrase": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌĐŊŅƒŅŽ Ņ„Ņ€Đ°ĐˇŅƒ" + }, "copyNote": { "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ СаĐŧĐĩŅ‚Đē҃" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēОд ĐąĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚Đ¸" }, + "copyName": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊаСваĐŊиĐĩ" + }, + "copyCompany": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐŧĐŋаĐŊĐ¸ŅŽ" + }, + "copySSN": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐžĐŧĐĩŅ€ ŅĐžŅ†Đ¸Đ°ĐģҌĐŊĐžĐŗĐž ŅŅ‚Ņ€Đ°Ņ…ĐžĐ˛Đ°ĐŊĐ¸Ņ" + }, + "copyPassportNumber": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐžĐŧĐĩŅ€ ĐŋĐ°ŅĐŋĐžŅ€Ņ‚Đ°" + }, + "copyLicenseNumber": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐžĐŧĐĩŅ€ ĐģĐ¸Ņ†ĐĩĐŊСии" + }, + "copyPrivateKey": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Đš ĐēĐģŅŽŅ‡" + }, + "copyPublicKey": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš ĐēĐģŅŽŅ‡" + }, + "copyFingerprint": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚ĐžĐē" + }, + "copyCustomField": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐ°ĐšŅ‚" + }, + "copyNotes": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ СаĐŧĐĩŅ‚Đēи" + }, + "fill": { + "message": "ЗаĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ" }, + "autoFillLogin": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐģĐžĐŗĐ¸ĐŊа" + }, + "autoFillCard": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐēĐ°Ņ€Ņ‚Ņ‹" + }, + "autoFillIdentity": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Đ¸" + }, "generatePasswordCopied": { "message": "ĐĄĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ (ҁ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩĐŧ)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "НĐĩŅ‚ ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰Đ¸Ņ… ĐģĐžĐŗĐ¸ĐŊОв." }, + "noCards": { + "message": "НĐĩŅ‚ ĐēĐ°Ņ€Ņ‚" + }, + "noIdentities": { + "message": "НĐĩŅ‚ ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚ĐĩĐš" + }, + "addLoginMenu": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐžĐŗĐ¸ĐŊ" + }, + "addCardMenu": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐēĐ°Ņ€Ņ‚Ņƒ" + }, + "addIdentityMenu": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚ŅŒ" + }, "unlockVaultMenu": { "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ŅĐģĐĩĐŧĐĩĐŊŅ‚" }, + "accountEmail": { + "message": "Email аĐēĐēĐ°ŅƒĐŊŅ‚Đ°" + }, + "requestHint": { + "message": "ЗаĐŋŅ€ĐžŅĐ¸Ņ‚ŅŒ ĐŋĐžĐ´ŅĐēаСĐē҃" + }, + "requestPasswordHint": { + "message": "ЗаĐŋŅ€ĐžŅĐ¸Ņ‚ŅŒ ĐŋĐžĐ´ŅĐēаСĐē҃ Đē ĐŋĐ°Ņ€ĐžĐģŅŽ" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "ВвĐĩĐ´Đ¸Ņ‚Đĩ email Đ˛Đ°ŅˆĐĩĐŗĐž аĐēĐēĐ°ŅƒĐŊŅ‚Đ°, и ваĐŧ ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊа ĐŋĐžĐ´ŅĐēаСĐēа Đ´ĐģŅ ĐŋĐ°Ņ€ĐžĐģŅ" + }, "passwordHint": { "message": "ĐŸĐžĐ´ŅĐēаСĐēа Đē ĐŋĐ°Ņ€ĐžĐģŅŽ" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ Đ˛Đ°ŅˆŅƒ ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚ŅŒ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ." }, - "account": { - "message": "АĐēĐēĐ°ŅƒĐŊŅ‚" - }, "changeMasterPassword": { "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ" }, + "continueToWebApp": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ Đē вĐĩĐą-ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸ŅŽ?" + }, + "continueToWebAppDesc": { + "message": "Đ˜ĐˇŅƒŅ‡Đ¸Ņ‚Đĩ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ вОСĐŧĐžĐļĐŊĐžŅŅ‚Đ¸ Đ˛Đ°ŅˆĐĩĐŗĐž аĐēĐēĐ°ŅƒĐŊŅ‚Đ° Bitwarden в вĐĩĐą-ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊии." + }, + "continueToHelpCenter": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ в ҁĐŋŅ€Đ°Đ˛ĐžŅ‡ĐŊŅ‹Đš ҆ĐĩĐŊ҂Ҁ?" + }, + "continueToHelpCenterDesc": { + "message": "ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ Đž Ņ‚ĐžĐŧ, ĐēаĐē Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Bitwarden, ĐŧĐžĐļĐŊĐž ŅƒĐˇĐŊĐ°Ņ‚ŅŒ в ҁĐŋŅ€Đ°Đ˛ĐžŅ‡ĐŊĐžĐŧ ҆ĐĩĐŊ҂ҀĐĩ." + }, + "continueToBrowserExtensionStore": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ в ĐŧĐ°ĐŗĐ°ĐˇĐ¸ĐŊ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиК Đ´ĐģŅ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "ПоĐŧĐžĐŗĐ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸Đŧ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ, ĐŋĐžĐ´Ņ…ĐžĐ´Đ¸Ņ‚ Đģи иĐŧ Bitwarden. ĐŸĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ĐŧĐ°ĐŗĐ°ĐˇĐ¸ĐŊ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиК Đ˛Đ°ŅˆĐĩĐŗĐž ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ° и ĐžŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐžŅ‚ĐˇŅ‹Đ˛ ĐŋŅ€ŅĐŧĐž ҁĐĩĐšŅ‡Đ°Ņ." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ ĐŧĐžĐļĐŊĐž в вĐĩĐą-ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊии Bitwarden." + }, "fingerprintPhrase": { "message": "Đ¤Ņ€Đ°ĐˇĐ° ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚Đēа", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Đ’Ņ‹Ņ…ĐžĐ´" }, + "aboutBitwarden": { + "message": "О Bitwarden" + }, "about": { "message": "О Bitwarden" }, + "moreFromBitwarden": { + "message": "БоĐģҌ҈Đĩ ĐžŅ‚ Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "ĐŸŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ ĐŊа bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden Đ´ĐģŅ йиСĐŊĐĩŅĐ°" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator ĐŋОСвОĐģŅĐĩŅ‚ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐēĐģŅŽŅ‡Đ¸ и ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžĐ´Ņ‹ TOTP Đ´ĐģŅ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊОК Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸. ĐŖĐˇĐŊĐ°ĐšŅ‚Đĩ йОĐģҌ҈Đĩ ĐŊа bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "МĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ҁĐĩĐēŅ€ĐĩŅ‚ĐžĐ˛ Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "ĐĨŅ€Đ°ĐŊĐ¸Ņ‚Đĩ, ҃ĐŋŅ€Đ°Đ˛ĐģŅĐšŅ‚Đĩ и Đ´ĐĩĐģĐ¸Ņ‚ĐĩҁҌ ҁĐĩĐēŅ€ĐĩŅ‚Đ°Đŧи Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Ņ‡Đ¸ĐēОв ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€Đ° ҁĐĩĐēŅ€ĐĩŅ‚ĐžĐ˛ Bitwarden. ĐŖĐˇĐŊĐ°ĐšŅ‚Đĩ йОĐģҌ҈Đĩ ĐŊа bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "ĐĄĐžĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ŅƒĐ´ĐžĐąĐŊŅƒŅŽ и ĐąĐĩСОĐŋĐ°ŅĐŊŅƒŅŽ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸ŅŽ ĐąĐĩС Ņ‚Ņ€Đ°Đ´Đ¸Ņ†Đ¸ĐžĐŊĐŊҋ҅ ĐŋĐ°Ņ€ĐžĐģĐĩĐš ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Passwordless.dev. ĐŖĐˇĐŊĐ°ĐšŅ‚Đĩ йОĐģҌ҈Đĩ ĐŊа bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "БĐĩҁĐŋĐģĐ°Ņ‚ĐŊŅ‹Đš ĐŋĐģаĐŊ Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "ВаĐŧ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž ĐąĐĩҁĐŋĐģĐ°Ņ‚ĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩ Bitwarden Families. Đ’ĐžŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚ĐĩҁҌ ŅŅ‚Đ¸Đŧ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩĐŧ ҁĐĩĐŗĐžĐ´ĐŊŅ в вĐĩĐą-ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊии." + }, "version": { "message": "ВĐĩŅ€ŅĐ¸Ņ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋаĐŋĐē҃" }, + "newFolder": { + "message": "ĐĐžĐ˛Ņ‹Đš ĐŋаĐŋĐēа" + }, + "folderName": { + "message": "НазваĐŊиĐĩ ĐŋаĐŋĐēи" + }, + "folderHintText": { + "message": "ĐĄĐžĐˇĐ´Đ°ĐšŅ‚Đĩ вĐģĐžĐļĐĩĐŊĐŊŅƒŅŽ ĐŋаĐŋĐē҃, дОйавив ĐŊаСваĐŊиĐĩ Ņ€ĐžĐ´Đ¸Ņ‚ĐĩĐģҌҁĐēОК ĐŋаĐŋĐēи и ŅĐ¸ĐŧвОĐģ \"/\". ĐŸŅ€Đ¸ĐŧĐĩŅ€: ĐĄĐžĐžĐąŅ‰ĐĩŅŅ‚Đ˛Đ°/Đ¤ĐžŅ€ŅƒĐŧŅ‹" + }, + "noFoldersAdded": { + "message": "НĐĩŅ‚ дОйавĐģĐĩĐŊĐŊҋ҅ ĐŋаĐŋĐžĐē" + }, + "createFoldersToOrganize": { + "message": "ĐĄĐžĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐŋаĐŋĐēи Đ´ĐģŅ ҃ĐŋĐžŅ€ŅĐ´ĐžŅ‡Đ¸Đ˛Đ°ĐŊĐ¸Ņ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" + }, + "deleteFolderPermanently": { + "message": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐąĐĩĐˇĐ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚ĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚Ņƒ ĐŋаĐŋĐē҃?" + }, "deleteFolder": { "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋаĐŋĐē҃" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐ°Ņ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Đ¸Ņ ŅĐ¸ĐģҌĐŊҋ҅ и ҃ĐŊиĐēаĐģҌĐŊҋ҅ ĐŋĐ°Ņ€ĐžĐģĐĩĐš Đ´ĐģŅ Đ˛Đ°ŅˆĐ¸Ņ… ĐģĐžĐŗĐ¸ĐŊОв." }, - "bitWebVault": { - "message": "ВĐĩĐą-Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ Bitwarden" + "bitWebVaultApp": { + "message": "ВĐĩĐą-ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Bitwarden" }, "importItems": { "message": "ИĐŧĐŋĐžŅ€Ņ‚ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛" @@ -235,6 +435,9 @@ "generatePassword": { "message": "ĐĄĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ" }, + "generatePassphrase": { + "message": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌĐŊŅƒŅŽ Ņ„Ņ€Đ°ĐˇŅƒ" + }, "regeneratePassword": { "message": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ" }, @@ -244,17 +447,60 @@ "length": { "message": "ДĐģиĐŊа" }, + "passwordMinLength": { + "message": "МиĐŊиĐŧаĐģҌĐŊĐ°Ņ Đ´ĐģиĐŊа ĐŋĐ°Ņ€ĐžĐģŅ" + }, "uppercase": { - "message": "ĐŸŅ€ĐžĐŋĐ¸ŅĐŊŅ‹Đĩ ĐąŅƒĐēĐ˛Ņ‹ (A-Z)" + "message": "ĐŸŅ€ĐžĐŋĐ¸ŅĐŊŅ‹Đĩ ĐąŅƒĐēĐ˛Ņ‹ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "ĐĄŅ‚Ņ€ĐžŅ‡ĐŊŅ‹Đĩ ĐąŅƒĐēĐ˛Ņ‹ (a-z)" + "message": "ĐĄŅ‚Ņ€ĐžŅ‡ĐŊŅ‹Đĩ ĐąŅƒĐēĐ˛Ņ‹ (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "ĐĻĐ¸Ņ„Ņ€Ņ‹ (0-9)" + "message": "ĐĻĐ¸Ņ„Ņ€Ņ‹ (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ĐĄĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģŅ‹ (!@#$%^&*)" + "message": "ĐĄĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģŅ‹ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐˇĐ°ĐŗĐģавĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģŅ‹", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅŅ‚Ņ€ĐžŅ‡ĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģŅ‹", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ†Đ¸Ņ„Ņ€Ņ‹", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ҁĐŋĐĩŅ†Đ¸Đ°ĐģҌĐŊŅ‹Đĩ ŅĐ¸ĐŧвОĐģŅ‹", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ҁĐģОв" @@ -276,7 +522,16 @@ "message": "МиĐŊиĐŧ҃Đŧ ŅĐ¸ĐŧвОĐģОв" }, "avoidAmbChar": { - "message": "ИСйĐĩĐŗĐ°Ņ‚ŅŒ ĐŊĐĩОдĐŊОСĐŊĐ°Ņ‡ĐŊҋ҅ ŅĐ¸ĐŧвОĐģОв" + "message": "ИСйĐĩĐŗĐ°Ņ‚ŅŒ ĐŊĐĩОдĐŊОСĐŊĐ°Ņ‡ĐŊҋ҅ ŅĐ¸ĐŧвОĐģОв", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "ИСйĐĩĐŗĐ°Ņ‚ŅŒ ĐŊĐĩОдĐŊОСĐŊĐ°Ņ‡ĐŊҋ҅ ŅĐ¸ĐŧвОĐģОв", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "К ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēаĐŧ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° ĐąŅ‹Đģи ĐŋŅ€Đ¸ĐŧĐĩĐŊĐĩĐŊŅ‹ ҂ҀĐĩйОваĐŊĐ¸Ņ ĐēĐžŅ€ĐŋĐžŅ€Đ°Ņ‚Đ¸Đ˛ĐŊОК ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ĐŸĐžĐ¸ŅĐē в Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" @@ -299,15 +554,30 @@ "password": { "message": "ĐŸĐ°Ņ€ĐžĐģҌ" }, + "totp": { + "message": "ĐĄĐĩĐēŅ€ĐĩŅ‚ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ°" + }, "passphrase": { "message": "ĐŸĐ°Ņ€ĐžĐģҌĐŊĐ°Ņ Ņ„Ņ€Đ°ĐˇĐ°" }, "favorite": { "message": "Đ˜ĐˇĐąŅ€Đ°ĐŊĐŊŅ‹Đš" }, + "unfavorite": { + "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ иС Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž" + }, + "itemAddedToFavorites": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ дОйавĐģĐĩĐŊ в Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐĩ" + }, + "itemRemovedFromFavorites": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊ иС Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž" + }, "notes": { "message": "ЗаĐŧĐĩŅ‚Đēи" }, + "privateNote": { + "message": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐ°Ņ СаĐŧĐĩŅ‚Đēа" + }, "note": { "message": "ЗаĐŧĐĩŅ‚Đēа" }, @@ -326,6 +596,18 @@ "launch": { "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸" }, + "launchWebsite": { + "message": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ŅĐ°ĐšŅ‚" + }, + "launchWebsiteName": { + "message": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ŅĐ°ĐšŅ‚ $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ĐĄĐ°ĐšŅ‚" }, @@ -338,9 +620,24 @@ "other": { "message": "ĐŸŅ€ĐžŅ‡ĐĩĐĩ" }, + "unlockMethods": { + "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēи" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšŅ‚Đĩ ҁĐŋĐžŅĐžĐą Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēи Đ´ĐģŅ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŋĐž Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚Ņƒ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°." }, + "unlockMethodNeeded": { + "message": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ҁĐŋĐžŅĐžĐą Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēи в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ…" + }, + "sessionTimeoutHeader": { + "message": "ĐĸаКĐŧ-Đ°ŅƒŅ‚ ҁĐĩŅŅĐ¸Đ¸" + }, + "vaultTimeoutHeader": { + "message": "ĐĸаКĐŧ-Đ°ŅƒŅ‚ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" + }, + "otherOptions": { + "message": "ĐŸŅ€ĐžŅ‡Đ¸Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи" + }, "rateExtension": { "message": "ĐžŅ†ĐĩĐŊĐ¸Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Đ’Đ°ŅˆĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ СайĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž. ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ŅĐ˛ĐžŅŽ ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚ŅŒ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ" }, + "yourVaultIsLockedV2": { + "message": "Đ’Đ°ŅˆĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ СайĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž" + }, + "yourAccountIsLocked": { + "message": "Đ’Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚ СайĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊ" + }, + "or": { + "message": "иĐģи" + }, "unlock": { "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "ĐĸаКĐŧ-Đ°ŅƒŅ‚ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" }, + "vaultTimeout1": { + "message": "ĐĸаКĐŧ-Đ°ŅƒŅ‚" + }, "lockNow": { "message": "ЗабĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ" }, + "lockAll": { + "message": "ЗабĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ" + }, "immediately": { "message": "НĐĩĐŧĐĩĐ´ĐģĐĩĐŊĐŊĐž" }, @@ -426,6 +738,18 @@ "security": { "message": "БĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚ŅŒ" }, + "confirmMasterPassword": { + "message": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "masterPassword": { + "message": "ĐœĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "masterPassImportant": { + "message": "Đ’Đ°Ņˆ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩвОСĐŧĐžĐļĐŊĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ, ĐĩҁĐģи Đ˛Ņ‹ ĐĩĐŗĐž ĐˇĐ°ĐąŅƒĐ´ĐĩŅ‚Đĩ!" + }, + "masterPassHintLabel": { + "message": "ĐŸĐžĐ´ŅĐēаСĐēа Đē ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅŽ" + }, "errorOccurred": { "message": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐžŅˆĐ¸ĐąĐēа" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Đ’Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚ ŅĐžĐˇĐ´Đ°ĐŊ! ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžĐšŅ‚Đ¸ в ŅĐ¸ŅŅ‚ĐĩĐŧ҃." }, + "newAccountCreated2": { + "message": "Đ’Đ°Ņˆ ĐŊĐžĐ˛Ņ‹Đš аĐēĐēĐ°ŅƒĐŊŅ‚ ŅĐžĐˇĐ´Đ°ĐŊ!" + }, + "youHaveBeenLoggedIn": { + "message": "Đ’Ņ‹ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐģĐ¸ŅŅŒ!" + }, + "youSuccessfullyLoggedIn": { + "message": "Đ’Ņ‹ ҃ҁĐŋĐĩ҈ĐŊĐž Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐģĐ¸ŅŅŒ" + }, + "youMayCloseThisWindow": { + "message": "МоĐļĐĩŅ‚Đĩ СаĐēŅ€Ņ‹Ņ‚ŅŒ ŅŅ‚Đž ĐžĐēĐŊĐž" + }, "masterPassSent": { "message": "ĐœŅ‹ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Đģи ваĐŧ ĐŋĐ¸ŅŅŒĐŧĐž ҁ ĐŋĐžĐ´ŅĐēаСĐēОК Đē ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅŽ." }, "verificationCodeRequired": { "message": "НĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ввĐĩŅŅ‚Đ¸ ĐēОд ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ." }, + "webauthnCancelOrTimeout": { + "message": "ĐŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ ĐąŅ‹Đģа ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊа иĐģи СаĐŊŅĐģа ҁĐģĐ¸ŅˆĐēĐžĐŧ ĐŧĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đĩ҉Đĩ Ņ€Đ°Đˇ." + }, "invalidVerificationCode": { "message": "НĐĩвĐĩŅ€ĐŊŅ‹Đš ĐēОд ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи СаĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đš ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа ŅŅ‚ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ. ĐĄĐēĐžĐŋĐ¸Ņ€ŅƒĐšŅ‚Đĩ и Đ˛ŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐģĐžĐŗĐ¸ĐŊ/ĐŋĐ°Ņ€ĐžĐģҌ иС ŅĐ˛ĐžĐĩĐŗĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°." }, + "totpCaptureError": { + "message": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ŅĐžŅĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ QR-ĐēОд ҁ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐš вĐĩĐą-ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹" + }, + "totpCaptureSuccess": { + "message": "КĐģŅŽŅ‡ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ° дОйавĐģĐĩĐŊ" + }, + "totpCapture": { + "message": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ QR-ĐēОд Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ° ҁ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐš вĐĩĐą-ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹" + }, + "totpHelperTitle": { + "message": "ĐĄĐ´ĐĩĐģĐ°ĐšŅ‚Đĩ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊŅƒŅŽ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŽ ĐŋŅ€ĐžŅŅ‚ĐžĐš и ŅƒĐ´ĐžĐąĐŊОК" + }, + "totpHelper": { + "message": "Bitwarden ĐŧĐžĐļĐĩŅ‚ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ и СаĐŋĐžĐģĐŊŅŅ‚ŅŒ ĐēĐžĐ´Ņ‹ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊОК Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸. ĐĄĐēĐžĐŋĐ¸Ņ€ŅƒĐšŅ‚Đĩ и Đ˛ŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐēĐģŅŽŅ‡ в ŅŅ‚Đž ĐŋĐžĐģĐĩ." + }, + "totpHelperWithCapture": { + "message": "Bitwarden ĐŧĐžĐļĐĩŅ‚ Ņ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ и СаĐŋĐžĐģĐŊŅŅ‚ŅŒ ĐēĐžĐ´Ņ‹ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊОК Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸. Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ СĐŊĐ°Ņ‡ĐžĐē ĐēаĐŧĐĩҀҋ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ ҁĐēŅ€Đ¸ĐŊŅˆĐžŅ‚ QR-ĐēОда ŅŅ‚ĐžĐŗĐž ŅĐ°ĐšŅ‚Đ°, иĐģи ҁĐēĐžĐŋĐ¸Ņ€ŅƒĐšŅ‚Đĩ и Đ˛ŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ĐēĐģŅŽŅ‡ в ŅŅ‚Đž ĐŋĐžĐģĐĩ." + }, + "learnMoreAboutAuthenticators": { + "message": "ĐŖĐˇĐŊĐ°ĐšŅ‚Đĩ йОĐģҌ҈Đĩ Ой Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ°Ņ…" + }, + "copyTOTP": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐģŅŽŅ‡ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ° (TOTP)" + }, "loggedOut": { "message": "Đ’Ņ‹ Đ˛Ņ‹ŅˆĐģи иС Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" }, + "loggedOutDesc": { + "message": "Đ’Ņ‹ Đ˛Ņ‹ŅˆĐģи иС ŅĐ˛ĐžĐĩĐŗĐž аĐēĐēĐ°ŅƒĐŊŅ‚Đ°." + }, "loginExpired": { "message": "Đ˜ŅŅ‚ĐĩĐē ŅŅ€ĐžĐē Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ Đ˛Đ°ŅˆĐĩĐŗĐž ҁĐĩаĐŊŅĐ°." }, + "logIn": { + "message": "Đ’ĐžĐšŅ‚Đ¸" + }, + "logInToBitwarden": { + "message": "Đ’ĐžĐšŅ‚Đ¸ в Bitwarden" + }, + "restartRegistration": { + "message": "ПĐĩŅ€ĐĩСаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŽ" + }, + "expiredLink": { + "message": "Đ˜ŅŅ‚ĐĩĐēŅˆĐ°Ņ ҁҁҋĐģĐēа" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸ŅŽ иĐģи ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ." + }, + "youMayAlreadyHaveAnAccount": { + "message": "ВозĐŧĐžĐļĐŊĐž, ҃ Đ˛Đ°Ņ ҃ĐļĐĩ ĐĩŅŅ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚" + }, "logOutConfirmation": { "message": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛Ņ‹ĐšŅ‚Đ¸?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "ПаĐŋĐēа дОйавĐģĐĩĐŊа" }, - "changeMasterPass": { - "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ" - }, - "changeMasterPasswordConfirmation": { - "message": "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅĐ˛ĐžĐš ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ ĐŊа bitwarden.com. ПĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа ŅĐ°ĐšŅ‚ ҁĐĩĐšŅ‡Đ°Ņ?" - }, "twoStepLoginConfirmation": { "message": "Đ”Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊĐ°Ņ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ Đ´ĐĩĐģаĐĩŅ‚ аĐēĐēĐ°ŅƒĐŊŅ‚ йОĐģĐĩĐĩ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊĐŊŅ‹Đŧ, ĐŋĐžŅĐēĐžĐģҌĐē҃ ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ Đ˛Ņ…ĐžĐ´Đ° ĐŋŅ€Đ¸ ĐŋĐžĐŧĐžŅ‰Đ¸ Đ´Ņ€ŅƒĐŗĐžĐŗĐž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐēĐģŅŽŅ‡Đ° ĐąĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚Đ¸, ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ-Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ°, SMS, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊĐžĐŗĐž СвОĐŊĐēа иĐģи ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹. Đ”Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊĐ°Ņ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ вĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ŅŅ ĐŊа bitwarden.com. ПĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа ŅĐ°ĐšŅ‚ ҁĐĩĐšŅ‡Đ°Ņ?" }, + "twoStepLoginConfirmationContent": { + "message": "ĐĄĐ´ĐĩĐģĐ°ĐšŅ‚Đĩ Đ˛Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚ йОĐģĐĩĐĩ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊĐŊŅ‹Đŧ, ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Đ˛ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊŅƒŅŽ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŽ в вĐĩĐą-ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊии Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ Đē вĐĩĐą-ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸ŅŽ?" + }, "editedFolder": { "message": "ПаĐŋĐēа ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊа" }, @@ -552,6 +936,10 @@ "newUri": { "message": "ĐĐžĐ˛Ņ‹Đš URI" }, + "addDomain": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Đ´ĐžĐŧĐĩĐŊ", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ дОйавĐģĐĩĐŊ" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "ĐĄĐŋŅ€Đ°ŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ¸ дОйавĐģĐĩĐŊии ĐģĐžĐŗĐ¸ĐŊа" }, + "vaultSaveOptionsTitle": { + "message": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ в Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" + }, "addLoginNotificationDesc": { "message": "ЗаĐŋŅ€ĐžŅĐ¸Ņ‚ŅŒ дОйавĐģĐĩĐŊиĐĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°, ĐĩҁĐģи ĐĩĐŗĐž ĐŊĐĩŅ‚ в Đ˛Đ°ŅˆĐĩĐŧ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ." }, + "addLoginNotificationDescAlt": { + "message": "ЗаĐŋŅ€ĐžŅ ĐŊа дОйавĐģĐĩĐŊиĐĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°, ĐĩҁĐģи ĐžĐŊ ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ в Đ˛Đ°ŅˆĐĩĐŧ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ. ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ ĐēĐž Đ˛ŅĐĩĐŧ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°Đŧ." + }, + "showCardsInVaultView": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐēĐ°Ņ€Ņ‚Ņ‹ ĐēаĐē ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đĩ ĐĨŅ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" + }, "showCardsCurrentTab": { "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐēĐ°Ņ€Ņ‚Ņ‹ ĐŊа вĐēĐģадĐēĐĩ" }, "showCardsCurrentTabDesc": { "message": "ĐšĐ°Ņ€Ņ‚Ņ‹ ĐąŅƒĐ´ŅƒŅ‚ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐĩĐŊŅ‹ ĐŊа вĐēĐģадĐēĐĩ Đ´ĐģŅ ŅƒĐ´ĐžĐąĐŊĐžĐŗĐž Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ." }, + "showIdentitiesInVaultView": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Đ¸ ĐēаĐē ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиĐĩ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đĩ ĐĨŅ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" + }, "showIdentitiesCurrentTab": { "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Đ›Đ¸Ņ‡ĐŊĐžŅŅ‚Đ¸ ĐŊа вĐēĐģадĐēĐĩ" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "ĐĄĐŋŅ€Đ°ŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ОйĐŊОвĐģĐĩĐŊиĐĩ ĐŋĐ°Ņ€ĐžĐģŅ ĐģĐžĐŗĐ¸ĐŊа ĐŋŅ€Đ¸ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊии иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊа ŅĐ°ĐšŅ‚Đĩ." }, + "changedPasswordNotificationDescAlt": { + "message": "ЗаĐŋŅ€ĐžŅ ĐŊа ОйĐŊОвĐģĐĩĐŊиĐĩ ĐŋĐ°Ņ€ĐžĐģŅ ĐģĐžĐŗĐ¸ĐŊа ĐŋŅ€Đ¸ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊии иСĐŧĐĩĐŊĐĩĐŊиК ĐŊа ŅĐ°ĐšŅ‚Đĩ. ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ ĐēĐž Đ˛ŅĐĩĐŧ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°Đŧ." + }, + "enableUsePasskeys": { + "message": "ЗаĐŋŅ€ĐžŅ ĐŊа ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ и Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ passkey" + }, + "usePasskeysDesc": { + "message": "ЗаĐŋŅ€ĐžŅ ĐŊа ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ ĐŊĐžĐ˛Ņ‹Ņ… passkey иĐģи в Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Ņ ҁ passkey, Ņ…Ņ€Đ°ĐŊŅŅ‰Đ¸ĐŧĐ¸ŅŅ в Đ˛Đ°ŅˆĐĩĐŧ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ. ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ ĐēĐž Đ˛ŅĐĩĐŧ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°Đŧ." + }, "notificationChangeDesc": { "message": "ОбĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ĐŋĐ°Ņ€ĐžĐģҌ в Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ" }, + "additionalOptions": { + "message": "ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи" + }, "enableContextMenuItem": { "message": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐžĐŋŅ†Đ¸Đ¸ ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐžĐŗĐž ĐŧĐĩĐŊŅŽ" }, "contextMenuItemDesc": { "message": "ĐĄ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ двОКĐŊĐžĐŗĐž ҉ĐĩĐģ҇Đēа ĐŧĐžĐļĐŊĐž ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋ Đē ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŋĐ°Ņ€ĐžĐģĐĩĐš и ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸ŅŽ ĐģĐžĐŗĐ¸ĐŊОв Đ´ĐģŅ ŅĐ°ĐšŅ‚Đ°." }, + "contextMenuItemDescAlt": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ двОКĐŊОК ҉ĐĩĐģŅ‡ĐžĐē Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŋĐ°Ņ€ĐžĐģĐĩĐš и ŅĐžĐŋĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊĐ¸ŅŽ ĐģĐžĐŗĐ¸ĐŊОв Đ´ĐģŅ ŅĐ°ĐšŅ‚Đ°. ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ ĐēĐž Đ˛ŅĐĩĐŧ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°Đŧ." + }, "defaultUriMatchDetection": { "message": "ОбĐŊĐ°Ņ€ŅƒĐļĐĩĐŊиĐĩ ŅĐžĐ˛ĐŋадĐĩĐŊĐ¸Ņ URI ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ‹Đš ҁĐŋĐžŅĐžĐą ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ¸Ņ URI Đ´ĐģŅ ĐģĐžĐŗĐ¸ĐŊОв ĐŋŅ€Đ¸ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊии Ņ‚Đ°ĐēĐ¸Ņ… Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đš, ĐēаĐē Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐžĐĩ СаĐŋĐžĐģĐŊĐĩĐŊиĐĩ." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ИСĐŧĐĩĐŊĐĩĐŊиĐĩ Ņ†Đ˛ĐĩŅ‚ĐžĐ˛ĐžĐš Ņ‚ĐĩĐŧŅ‹ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ." }, + "themeDescAlt": { + "message": "ИСĐŧĐĩĐŊĐĩĐŊиĐĩ Ņ†Đ˛ĐĩŅ‚ĐžĐ˛ĐžĐš Ņ‚ĐĩĐŧŅ‹ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ. ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ ĐēĐž Đ˛ŅĐĩĐŧ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°Đŧ." + }, "dark": { "message": "ĐĸĐĩĐŧĐŊĐ°Ņ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Đ­ĐēҁĐŋĐžŅ€Ņ‚ иС" + }, "exportVault": { "message": "Đ­ĐēҁĐŋĐžŅ€Ņ‚ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" }, "fileFormat": { "message": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ Ņ„Đ°ĐšĐģа" }, + "fileEncryptedExportWarningDesc": { + "message": "Đ­ĐēҁĐŋĐžŅ€Ņ‚ ŅŅ‚ĐžĐŗĐž Ņ„Đ°ĐšĐģа ĐąŅƒĐ´ĐĩŅ‚ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ, и Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đēи ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŋĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģа." + }, + "filePassword": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ Đē Ņ„Đ°ĐšĐģ҃" + }, + "exportPasswordDescription": { + "message": "Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€ĐžĐģҌ ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ ŅĐēҁĐŋĐžŅ€Ņ‚Đ° и иĐŧĐŋĐžŅ€Ņ‚Đ° ŅŅ‚ĐžĐŗĐž Ņ„Đ°ĐšĐģа" + }, + "accountRestrictedOptionDescription": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐģŅŽŅ‡ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛Đ°ŅˆĐĩĐŗĐž аĐēĐēĐ°ŅƒĐŊŅ‚Đ°, ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊŅ‹Đš иС иĐŧĐĩĐŊи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ и ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅ, Đ´ĐģŅ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅĐēҁĐŋĐžŅ€Ņ‚Đ° и ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ иĐŧĐŋĐžŅ€Ņ‚Đ° Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž аĐēĐēĐ°ŅƒĐŊŅ‚Đ° Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģа Đ´ĐģŅ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅĐēҁĐŋĐžŅ€Ņ‚Đ° и иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐšŅ‚Đĩ ĐĩĐŗĐž в ĐģŅŽĐąŅƒŅŽ ŅƒŅ‡ĐĩŅ‚ĐŊŅƒŅŽ СаĐŋĐ¸ŅŅŒ Bitwarden, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đēи." + }, + "exportTypeHeading": { + "message": "ĐĸиĐŋ ŅĐēҁĐŋĐžŅ€Ņ‚Đ°" + }, + "accountRestricted": { + "message": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐž аĐēĐēĐ°ŅƒĐŊŅ‚ĐžĐŧ" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"ĐŸĐ°Ņ€ĐžĐģҌ Đē Ņ„Đ°ĐšĐģ҃\" и \"ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŋĐ°Ņ€ĐžĐģŅ Đē Ņ„Đ°ĐšĐģ҃\" ĐŊĐĩ ŅĐžĐ˛ĐŋĐ°Đ´Đ°ŅŽŅ‚." + }, "warning": { "message": "ВНИМАНИЕ", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ĐžĐąŅ‰Đ¸Đĩ" }, - "learnOrg": { - "message": "ĐŖĐˇĐŊĐ°Ņ‚ŅŒ Ой ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ…" - }, - "learnOrgConfirmation": { - "message": "Bitwarden ĐŋОСвОĐģŅĐĩŅ‚ Đ´ĐĩĐģĐ¸Ņ‚ŅŒŅŅ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧи Đ˛Đ°ŅˆĐĩĐŗĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧи ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. ĐĨĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚ŅŒ ŅĐ°ĐšŅ‚ bitwarden.com, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ йОĐģҌ҈Đĩ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden Đ´ĐģŅ БизĐŊĐĩŅĐ° ĐŋОСвОĐģŅĐĩŅ‚ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅŅ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧ Đ˛Đ°ŅˆĐĩĐŗĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° Đ´Ņ€ŅƒĐŗĐ¸Đŧ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. БоĐģĐĩĐĩ ĐŋĐžĐ´Ņ€ĐžĐąĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ ĐŧĐžĐļĐŊĐž ĐŊĐ°ĐšŅ‚Đ¸ ĐŊа ŅĐ°ĐšŅ‚Đĩ bitwarden.com." }, "moveToOrganization": { "message": "ПĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ в ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŽ" @@ -762,6 +1204,9 @@ "file": { "message": "ФаКĐģ" }, + "fileToShare": { + "message": "ФаКĐģ Đ´ĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи" + }, "selectFile": { "message": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 ГБ ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŗĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° Đ´ĐģŅ вĐģĐžĐļĐĩĐŊĐŊҋ҅ Ņ„Đ°ĐšĐģОв." }, + "premiumSignUpEmergency": { + "message": "Đ­Đēҁ҂ҀĐĩĐŊĐŊŅ‹Đš Đ´ĐžŅŅ‚ŅƒĐŋ" + }, "premiumSignUpTwoStepOptions": { "message": "ĐŸŅ€ĐžĐŋŅ€Đ¸ĐĩŅ‚Đ°Ņ€ĐŊŅ‹Đĩ Đ˛Đ°Ņ€Đ¸Đ°ĐŊ҂ҋ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊОК Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸, Ņ‚Đ°ĐēиĐĩ ĐēаĐē YubiKey иĐģи Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đē҃ĐŋĐ¸Ņ‚ŅŒ ĐŸŅ€ĐĩĐŧĐ¸ŅƒĐŧ ĐŊа bitwarden.com. ПĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа ŅĐ°ĐšŅ‚ ҁĐĩĐšŅ‡Đ°Ņ?" }, + "premiumPurchaseAlertV2": { + "message": "ĐŸŅ€ĐĩĐŧĐ¸ŅƒĐŧ ĐŧĐžĐļĐŊĐž ĐŋŅ€Đ¸ĐžĐąŅ€ĐĩŅŅ‚Đ¸ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… аĐēĐēĐ°ŅƒĐŊŅ‚Đ° в вĐĩĐą-вĐĩŅ€ŅĐ¸Đ¸ Bitwarden." + }, "premiumCurrentMember": { "message": "ĐŖ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ĐŸŅ€ĐĩĐŧĐ¸ŅƒĐŧ!" }, "premiumCurrentMemberThanks": { "message": "БĐģĐ°ĐŗĐžĐ´Đ°Ņ€Đ¸Đŧ Đ˛Đ°Ņ Са ĐŋОддĐĩŅ€ĐļĐē҃ Bitwarden." }, + "premiumFeatures": { + "message": "ПĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ ĐŊа ĐŸŅ€ĐĩĐŧĐ¸ŅƒĐŧ и ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚Đĩ:" + }, "premiumPrice": { "message": "Đ’ŅĐĩĐŗĐž ĐģĐ¸ŅˆŅŒ $PRICE$ в ĐŗĐžĐ´!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Đ’ŅĐĩĐŗĐž ĐģĐ¸ŅˆŅŒ $PRICE$ в ĐŗĐžĐ´!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ОбĐŊОвĐģĐĩĐŊиĐĩ СавĐĩŅ€ŅˆĐĩĐŊĐž" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "ĐŸŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ-Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€" }, - "authenticatorAppDesc": { - "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ-Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, Authy иĐģи Google Authenticator) Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ ĐēОдОв ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ĐŊа ĐžŅĐŊОвĐĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊи.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐēОд, ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩĐŧ-Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ĐžĐŧ, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "КĐģŅŽŅ‡ ĐąĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚Đ¸ YubiKey OTP" + "yubiKeyTitleV2": { + "message": "КĐģŅŽŅ‡ ĐąĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚Đ¸ Yubico OTP" }, "yubiKeyDesc": { "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ YubiKey Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ˛Đ°ŅˆĐĩĐš ŅƒŅ‡ĐĩŅ‚ĐŊОК СаĐŋĐ¸ŅĐ¸. Đ Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ҁ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Đŧи YubiKey 4 ҁĐĩŅ€Đ¸Đ¸, 5 ҁĐĩŅ€Đ¸Đ¸ и NEO." }, - "duoDesc": { - "message": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Duo Security, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Duo Mobile, SMS, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊŅ‹Đš СвОĐŊĐžĐē иĐģи ĐēĐģŅŽŅ‡ ĐąĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚Đ¸ U2F.", + "duoDescV2": { + "message": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐēОд, ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "ĐšĐžĐ´Ņ‹ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ ĐąŅƒĐ´ŅƒŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊŅ‹ ваĐŧ ĐŋĐž ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Đĩ." + "emailDescV2": { + "message": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐēОд, ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ‹Đš ĐŊа Đ˛Đ°Ņˆ email." }, "selfHostedEnvironment": { "message": "ОĐēŅ€ŅƒĐļĐĩĐŊиĐĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐžĐŗĐž Ņ…ĐžŅŅ‚Đ¸ĐŊĐŗĐ°" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ URL Bitwarden ĐŊа Đ˛Đ°ŅˆĐĩĐŧ ҁĐĩŅ€Đ˛ĐĩŅ€Đĩ." }, + "selfHostedBaseUrlHint": { + "message": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ ĐąĐ°ĐˇĐžĐ˛Ņ‹Đš URL Đ˛Đ°ŅˆĐĩĐŗĐž ĐģĐžĐēаĐģҌĐŊĐžĐŗĐž Ņ…ĐžŅŅ‚Đ¸ĐŊĐŗĐ° Bitwarden. ĐŸŅ€Đ¸ĐŧĐĩŅ€: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "ДĐģŅ ĐŋŅ€ĐžĐ´Đ˛Đ¸ĐŊŅƒŅ‚ĐžĐš ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸ ĐŧĐžĐļĐŊĐž ҃ĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐąĐ°ĐˇĐžĐ˛Ņ‹Đš URL ĐēаĐļдОК ҁĐģ҃ĐļĐąŅ‹ ĐžŅ‚Đ´ĐĩĐģҌĐŊĐž." + }, + "selfHostedEnvFormInvalid": { + "message": "Đ’Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģийО ĐąĐ°ĐˇĐžĐ˛Ņ‹Đš URL ҁĐĩŅ€Đ˛ĐĩŅ€Đ°, ĐģийО Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊĐž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐžĐĩ ĐžĐēŅ€ŅƒĐļĐĩĐŊиĐĩ." + }, "customEnvironment": { "message": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēĐžĐĩ ĐžĐēŅ€ŅƒĐļĐĩĐŊиĐĩ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL ҁĐĩŅ€Đ˛ĐĩŅ€Đ°" }, + "selfHostBaseUrl": { + "message": "URL ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐŊĐžĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL API ҁĐĩŅ€Đ˛ĐĩŅ€Đ°" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "URL ĐžĐēŅ€ŅƒĐļĐĩĐŊĐ¸Ņ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹" }, + "showAutoFillMenuOnFormFields": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŧĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ в ĐŋĐžĐģŅŅ… Ņ„ĐžŅ€ĐŧŅ‹", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "ĐŸŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŋĐž Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸ŅŽ" + }, + "showInlineMenuLabel": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ в ĐŋĐžĐģŅŅ… Ņ„ĐžŅ€ĐŧŅ‹" + }, + "showInlineMenuIdentitiesLabel": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Đ›Đ¸Ņ‡ĐŊĐžŅŅ‚Đ¸ ĐēаĐē ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ" + }, + "showInlineMenuCardsLabel": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐšĐ°Ņ€Ņ‚Ņ‹ ĐēаĐē ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžĐ´ŅĐēаСĐēи ĐŋŅ€Đ¸ Đ˛Ņ‹ĐąĐžŅ€Đĩ СĐŊĐ°Ņ‡Đēа" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ ĐēĐž Đ˛ŅĐĩĐŧ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°Đŧ." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ Đ˛ŅŅ‚Ņ€ĐžĐĩĐŊĐŊŅ‹Đš в ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ĐŋĐ°Ņ€ĐžĐģĐĩĐš, Ņ‡Ņ‚ĐžĐąŅ‹ иСйĐĩĐļĐ°Ņ‚ŅŒ ĐēĐžĐŊŅ„ĐģиĐēŅ‚ĐžĐ˛." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°." + }, + "autofillOverlayVisibilityOff": { + "message": "Đ’Ņ‹ĐēĐģ", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "ĐšĐžĐŗĐ´Đ° ĐŋĐžĐģĐĩ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐž (в Ņ„ĐžĐē҃ҁĐĩ)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Đ•ŅĐģи Đ˛Ņ‹ĐąŅ€Đ°ĐŊ СĐŊĐ°Ņ‡ĐžĐē Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹" + }, "enableAutoFillOnPageLoad": { "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹" }, "enableAutoFillOnPageLoadDesc": { "message": "Đ•ŅĐģи ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊа Ņ„ĐžŅ€Đŧа Đ˛Ņ…ĐžĐ´Đ°, Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ Đ˛Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ вĐĩĐą-ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$ĐŸŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊиĐĩ:$CLOSETAG$ вСĐģĐžĐŧаĐŊĐŊŅ‹Đĩ иĐģи ĐŊĐĩдОвĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ ŅĐ°ĐšŅ‚Ņ‹ ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "ВзĐģĐžĐŧаĐŊĐŊŅ‹Đĩ иĐģи ĐŊĐĩдОвĐĩŅ€ĐĩĐŊĐŊŅ‹Đĩ ŅĐ°ĐšŅ‚Ņ‹ ĐŧĐžĐŗŅƒŅ‚ вĐŊĐĩĐ´Ņ€Đ¸Ņ‚ŅŒ Đ˛Ņ€ĐĩĐ´ĐžĐŊĐžŅĐŊŅ‹Đš ĐēОд вО Đ˛Ņ€ĐĩĐŧŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "ĐŖĐˇĐŊĐ°ĐšŅ‚Đĩ йОĐģҌ҈Đĩ Đž Ņ€Đ¸ŅĐēĐ°Ņ…" + }, "learnMoreAboutAutofill": { "message": "ĐŖĐˇĐŊĐ°Ņ‚ŅŒ йОĐģҌ҈Đĩ Ой Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊии" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ в йОĐēОвОК ĐŋаĐŊĐĩĐģи" }, - "commandAutofillDesc": { - "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊĐžĐŗĐž ĐģĐžĐŗĐ¸ĐŊа Đ´ĐģŅ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ŅĐ°ĐšŅ‚Đ°." + "commandAutofillLoginDesc": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊĐžĐŗĐž ĐģĐžĐŗĐ¸ĐŊа Đ´ĐģŅ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ŅĐ°ĐšŅ‚Đ°" + }, + "commandAutofillCardDesc": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊОК ĐēĐ°Ņ€Ņ‚Ņ‹ Đ´ĐģŅ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ŅĐ°ĐšŅ‚Đ°" + }, + "commandAutofillIdentityDesc": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐš Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊОК ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Đ¸ Đ´ĐģŅ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ŅĐ°ĐšŅ‚Đ°" }, "commandGeneratePasswordDesc": { "message": "ĐĄĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ и ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš ҁĐģŅƒŅ‡Đ°ĐšĐŊŅ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ в ĐąŅƒŅ„ĐĩŅ€ ОйĐŧĐĩĐŊа." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "ЗабĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ" }, - "privateModeWarning": { - "message": "Đ§Đ°ŅŅ‚ĐŊŅ‹Đš Ņ€ĐĩĐļиĐŧ - ŅĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊŅ‹Đš, ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊŅ‹." - }, "customFields": { "message": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиĐĩ ĐŋĐžĐģŅ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Đ›ĐžĐŗĐ¸Ņ‡ĐĩҁĐēĐžĐĩ" }, + "cfTypeCheckbox": { + "message": "ФĐģаĐļĐžĐē" + }, "cfTypeLinked": { "message": "ĐĄĐ˛ŅĐˇĐ°ĐŊĐž", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°Ņ‚ŅŒ ŅƒĐˇĐŊаваĐĩĐŧĐžĐĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ Ņ€ŅĐ´ĐžĐŧ ҁ ĐēаĐļĐ´Ņ‹Đŧ ĐģĐžĐŗĐ¸ĐŊĐžĐŧ." }, + "faviconDescAlt": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ŅƒĐˇĐŊаваĐĩĐŧĐžĐĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ Ņ€ŅĐ´ĐžĐŧ ҁ ĐēаĐļĐ´Ņ‹Đŧ ĐģĐžĐŗĐ¸ĐŊĐžĐŧ. ĐŸŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ ĐēĐž Đ˛ŅĐĩĐŧ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°Đŧ." + }, "enableBadgeCounter": { "message": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ҁ҇ĐĩŅ‚Ņ‡Đ¸Đē ĐŊа СĐŊĐ°Ņ‡ĐēĐĩ" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Đ›Đ¸Ņ‡ĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ" }, + "typeSshKey": { + "message": "КĐģŅŽŅ‡ SSH" + }, + "newItemHeader": { + "message": "ĐĐžĐ˛Ņ‹Đš $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ ĐŋĐ°Ņ€ĐžĐģĐĩĐš" }, + "generatorHistory": { + "message": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°" + }, + "clearGeneratorHistoryTitle": { + "message": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Đ¸ŅŅ‚ĐžŅ€Đ¸ŅŽ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°" + }, + "cleargGeneratorHistoryDescription": { + "message": "Đ•ŅĐģи Đ˛Ņ‹ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚Đĩ, Đ˛ŅĐĩ СаĐŋĐ¸ŅĐ¸ ĐąŅƒĐ´ŅƒŅ‚ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹ иС Đ¸ŅŅ‚ĐžŅ€Đ¸Đ¸ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°. Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ?" + }, "back": { "message": "Назад" }, "collections": { "message": "КоĐģĐģĐĩĐēŅ†Đ¸Đ¸" }, + "nCollections": { + "message": "КоĐģĐģĐĩĐēŅ†Đ¸Đš: $COUNT$", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Đ˜ĐˇĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ" }, @@ -1282,6 +1874,10 @@ "message": "ĐžŅĐŊОвĐŊОК Đ´ĐžĐŧĐĩĐŊ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "ĐžŅĐŊОвĐŊОК Đ´ĐžĐŧĐĩĐŊ (Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ДоĐŧĐĩĐŊĐŊĐžĐĩ иĐŧŅ", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ОбĐŊĐ°Ņ€ŅƒĐļĐĩĐŊиĐĩ ŅĐžĐ˛ĐŋадĐĩĐŊиК", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "МĐĩŅ‚ĐžĐ´ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊĐ¸Ņ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŋĐĩŅ€ĐĩĐąĐžŅ€Đ°" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "НĐĩŅ‚ ĐŋĐ°Ņ€ĐžĐģĐĩĐš Đ´ĐģŅ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ." }, + "clearHistory": { + "message": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Đ¸ŅŅ‚ĐžŅ€Đ¸ŅŽ" + }, + "nothingToShow": { + "message": "НĐĩ҇ĐĩĐŗĐž ĐŋĐžĐēĐ°ĐˇĐ°Ņ‚ŅŒ" + }, + "nothingGeneratedRecently": { + "message": "Đ’Ņ‹ ĐŊĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ ŅĐžĐˇĐ´Đ°Đ˛Đ°Đģи в ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ Đ˛Ņ€ĐĩĐŧŅ" + }, "remove": { "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ" }, @@ -1354,7 +1959,7 @@ "message": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đē҃ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°? В ŅŅ‚ĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐēĐģŅŽŅ‡ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ˛Đ°ŅˆĐĩĐŗĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ĐąŅƒĐ´ĐĩŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊ ĐŊа Đ˛Đ°ŅˆĐĩĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đĩ. ĐžŅ‚ĐēĐģŅŽŅ‡Đ°Ņ ĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đē҃, Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ŅƒĐąĐĩĐ´Đ¸Ņ‚ŅŒŅŅ, Ņ‡Ņ‚Đž Đ˛Đ°ŅˆĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž ĐŊадĐĩĐļĐŊĐž ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊĐž." }, "noOrganizationsList": { - "message": "Đ’Ņ‹ ĐŊĐĩ ŅĐ˛ĐģŅĐĩŅ‚ĐĩҁҌ ҇ĐģĐĩĐŊĐžĐŧ ĐēаĐēОК-ĐģийО ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŋОСвОĐģŅŅŽŅ‚ ĐąĐĩСОĐŋĐ°ŅĐŊĐž ОйĐŧĐĩĐŊĐ¸Đ˛Đ°Ņ‚ŅŒŅŅ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧи ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧи." + "message": "Đ’Ņ‹ ĐŊĐĩ ŅĐ˛ĐģŅĐĩŅ‚ĐĩҁҌ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēĐžĐŧ ĐēаĐēОК-ĐģийО ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŋОСвОĐģŅŅŽŅ‚ ĐąĐĩСОĐŋĐ°ŅĐŊĐž ОйĐŧĐĩĐŊĐ¸Đ˛Đ°Ņ‚ŅŒŅŅ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧи ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧи." }, "noCollectionsInList": { "message": "НĐĩŅ‚ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đš Đ´ĐģŅ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ." @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ PIN-ĐēОда" }, + "setYourPinTitle": { + "message": "ĐŖŅŅ‚Đ°ĐŊОвĐēа PIN" + }, + "setYourPinButton": { + "message": "Đ—Đ°Đ´Đ°Ņ‚ŅŒ PIN-ĐēОд" + }, "setYourPinCode": { "message": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ PIN-ĐēОд Đ´ĐģŅ Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēи Bitwarden. ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи PIN-ĐēОда ĐąŅƒĐ´ŅƒŅ‚ ŅĐąŅ€ĐžŅˆĐĩĐŊŅ‹, ĐĩҁĐģи Đ˛Ņ‹ ĐēĐžĐŗĐ´Đ°-ĐģийО ĐŋĐžĐģĐŊĐžŅŅ‚ŅŒŅŽ Đ˛Ņ‹ĐšĐ´ĐĩŅ‚Đĩ иС ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ." }, + "setYourPinCode1": { + "message": "Đ’Đ°Ņˆ PIN-ĐēОд ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ Đ´ĐģŅ Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēи Bitwarden вĐŧĐĩŅŅ‚Đž ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅ. PIN-ĐēОд ĐąŅƒĐ´ĐĩŅ‚ ŅĐąŅ€ĐžŅˆĐĩĐŊ, ĐĩҁĐģи Đ˛Ņ‹ Đ˛Ņ‹ĐšĐ´ĐĩŅ‚Đĩ иС Bitwarden." + }, "pinRequired": { "message": "НĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧ PIN-ĐēОд." }, "invalidPin": { "message": "НĐĩвĐĩŅ€ĐŊŅ‹Đš PIN-ĐēОд." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "ĐĄĐģĐ¸ŅˆĐēĐžĐŧ ĐŧĐŊĐžĐŗĐž ĐŊĐĩвĐĩŅ€ĐŊҋ҅ ĐŋĐžĐŋŅ‹Ņ‚ĐžĐē ввОда PIN-ĐēОда. Đ’Ņ‹ĐŋĐžĐģĐŊŅĐĩŅ‚ŅŅ Đ˛Ņ‹Ņ…ĐžĐ´." + }, "unlockWithBiometrics": { "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ йиОĐŧĐĩŅ‚Ņ€Đ¸Đ¸" }, + "unlockWithMasterPassword": { + "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ" + }, "awaitDesktop": { "message": "ОĐļидаĐŊиĐĩ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ ҁ ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đ°" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "БĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ ĐŋŅ€Đ¸ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐēĐĩ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°" }, + "lockWithMasterPassOnRestart1": { + "message": "ĐĸŅ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ ĐŋŅ€Đ¸ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐēĐĩ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°" + }, "selectOneCollection": { "message": "НĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊ҃ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "На ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° вĐģĐ¸ŅŅŽŅ‚ ОдĐŊа иĐģи ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸." }, + "passwordGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ ĐŋĐ°Ņ€ĐžĐģĐĩĐš" + }, + "usernameGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ иĐŧĐĩĐŊи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ" + }, + "useThisPassword": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "useThisUsername": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚Đž иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ" + }, + "securePasswordGenerated": { + "message": "БĐĩСОĐŋĐ°ŅĐŊŅ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊ! НĐĩ ĐˇĐ°ĐąŅƒĐ´ŅŒŅ‚Đĩ Ņ‚Đ°ĐēĐļĐĩ ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅĐ˛ĐžĐš ĐŋĐ°Ņ€ĐžĐģҌ ĐŊа ŅĐ°ĐšŅ‚Đĩ." + }, + "useGeneratorHelpTextPartOne": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ ĐŊадĐĩĐļĐŊĐžĐŗĐž ҃ĐŊиĐēаĐģҌĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ДĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŋĐž Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚Ņƒ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" }, + "vaultTimeoutAction1": { + "message": "ĐĸаКĐŧ-Đ°ŅƒŅ‚ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ" + }, "lock": { "message": "БĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēа", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ĐšĐžŅ€ĐˇĐ¸ĐŊа", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ" }, + "alreadyHaveAccount": { + "message": "ĐŖĐļĐĩ ĐˇĐ°Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹?" + }, "vaultTimeoutLogOutConfirmation": { "message": "По Đ¸ŅŅ‚Đĩ҇ĐĩĐŊии Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚Đ° ĐąŅƒĐ´ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊ Đ˛Ņ‹Ņ…ĐžĐ´, Ņ‡Ņ‚Đž ĐŋŅ€Đ¸Đ˛ĐĩĐ´ĐĩŅ‚ Đē ĐžŅ‚ĐŧĐĩĐŊĐĩ Đ˛ŅĐĩŅ… ĐŋŅ€Đ°Đ˛ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ˛Đ°ŅˆĐĩĐŧ҃ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Ņƒ и ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ ĐžĐŊĐģаКĐŊ-Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸. Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ?" }, @@ -1461,8 +2113,11 @@ "autoFillAndSave": { "message": "ЗаĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ и ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ" }, + "fillAndSave": { + "message": "ЗаĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ и ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ" + }, "autoFillSuccessAndSavedUri": { - "message": "URI ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ° СаĐŋĐžĐģĐŊĐĩĐŊ и ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊ" + "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ СаĐŋĐžĐģĐŊĐĩĐŊ, URI ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊ" }, "autoFillSuccess": { "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ СаĐŋĐžĐģĐŊĐĩĐŊ " @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Đ’Đ°Ņˆ ĐŊĐžĐ˛Ņ‹Đš ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ҂ҀĐĩйОваĐŊĐ¸ŅĐŧ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи." }, + "receiveMarketingEmailsV2": { + "message": "ПоĐģŅƒŅ‡Đ°ĐšŅ‚Đĩ ŅĐžĐ˛Đĩ҂ҋ, аĐŊĐžĐŊҁҋ и вОСĐŧĐžĐļĐŊĐžŅŅ‚Đ¸ Đ´ĐģŅ Đ¸ŅŅĐģĐĩдОваĐŊиК ĐžŅ‚ Bitwarden ĐŊа ŅĐ˛ĐžĐš email." + }, + "unsubscribe": { + "message": "ĐžŅ‚ĐŋĐ¸ŅĐ°Ņ‚ŅŒŅŅ" + }, + "atAnyTime": { + "message": "в ĐģŅŽĐąĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ." + }, + "byContinuingYouAgreeToThe": { + "message": "ĐŸŅ€ĐžĐ´ĐžĐģĐļĐ°Ņ, Đ˛Ņ‹ ŅĐžĐŗĐģĐ°ŅˆĐ°ĐĩŅ‚ĐĩҁҌ ҁ" + }, + "and": { + "message": "и" + }, "acceptPolicies": { "message": "ĐžŅ‚ĐŧĐĩŅ‚Đ¸Đ˛ ŅŅ‚ĐžŅ‚ Ņ„ĐģаĐļĐžĐē, Đ˛Ņ‹ ŅĐžĐŗĐģĐ°ŅˆĐ°ĐĩŅ‚ĐĩҁҌ ŅĐž ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧ:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "ĐžŅˆĐ¸ĐąĐēа ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Ņ‚ĐžĐēĐĩĐŊа Đ´ĐžŅŅ‚ŅƒĐŋа" + }, + "errorRefreshingAccessTokenDesc": { + "message": "НĐĩ ĐŊаКдĐĩĐŊŅ‹ Ņ‚ĐžĐēĐĩĐŊ ОйĐŊОвĐģĐĩĐŊĐ¸Ņ иĐģи ĐēĐģŅŽŅ‡Đ¸ API. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ Đ˛Ņ‹Ņ…ĐžĐ´ и ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ." + }, "desktopSyncVerificationTitle": { "message": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŊа ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đĩ" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "НĐĩŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ¸Đĩ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "НĐĩŅĐžĐ˛ĐŋадĐĩĐŊиĐĩ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐĩҁĐēĐžĐŗĐž ĐēĐģŅŽŅ‡Đ°" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐĩҁĐēĐ°Ņ Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēа ĐŊĐĩ ŅƒĐ´Đ°ĐģĐ°ŅŅŒ. БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐĩҁĐēиК ҁĐĩĐēŅ€ĐĩŅ‚ĐŊŅ‹Đš ĐēĐģŅŽŅ‡ ĐŊĐĩ ҁĐŧĐžĐŗ Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ йиОĐŧĐĩŅ‚Ņ€Đ¸ŅŽ Đĩ҉Đĩ Ņ€Đ°Đˇ." + }, "biometricsNotEnabledTitle": { "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ ĐŊĐĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐŊа" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ в ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ ŅŅ‚ĐžĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đĩ." }, + "biometricsNotUnlockedTitle": { + "message": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ СайĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊ иĐģи ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸ĐģŅŅ" + }, + "biometricsNotUnlockedDesc": { + "message": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ŅƒĐšŅ‚Đĩ ŅŅ‚ĐžĐŗĐž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ в ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊии Đ´ĐģŅ ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đ° и ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐŋҋ҂Đē҃." + }, + "biometricsNotAvailableTitle": { + "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēа йиОĐŧĐĩŅ‚Ņ€Đ¸ĐĩĐš ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊа" + }, + "biometricsNotAvailableDesc": { + "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đēа йиОĐŧĐĩŅ‚Ņ€Đ¸ĐĩĐš в ĐŊĐ°ŅŅ‚ĐžŅŅ‰ĐĩĐĩ Đ˛Ņ€ĐĩĐŧŅ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊа. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐŋҋ҂Đē҃ ĐŋОСĐļĐĩ." + }, "biometricsFailedTitle": { "message": "ХйОК йиОĐŧĐĩŅ‚Ņ€Đ¸Đ¸" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ПоĐģĐ¸Ņ‚Đ¸Đēа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ вĐģĐ¸ŅĐĩŅ‚ ĐŊа Đ˛Đ°ŅˆĐ¸ Đ˛Đ°Ņ€Đ¸Đ°ĐŊ҂ҋ вĐģадĐĩĐŊĐ¸Ņ." }, + "personalOwnershipPolicyInEffectImports": { + "message": "ИĐŧĐŋĐžŅ€Ņ‚ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ в Đ˛Đ°ŅˆĐĩ ĐģĐ¸Ņ‡ĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēОК ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸." + }, + "domainsTitle": { + "message": "ДоĐŧĐĩĐŊŅ‹", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Đ˜ŅĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ‹Đĩ Đ´ĐžĐŧĐĩĐŊŅ‹" }, "excludedDomainsDesc": { "message": "Bitwarden ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐĩĐ´ĐģĐ°ĐŗĐ°Ņ‚ŅŒ ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐģĐžĐŗĐ¸ĐŊŅ‹ Đ´ĐģŅ ŅŅ‚Đ¸Ņ… Đ´ĐžĐŧĐĩĐŊОв. ДĐģŅ Đ˛ŅŅ‚ŅƒĐŋĐģĐĩĐŊĐ¸Ņ иСĐŧĐĩĐŊĐĩĐŊиК в ŅĐ¸Đģ҃ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐĩĐ´ĐģĐ°ĐŗĐ°Ņ‚ŅŒ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ ĐģĐžĐŗĐ¸ĐŊОв Đ´ĐģŅ ŅŅ‚Đ¸Ņ… Đ´ĐžĐŧĐĩĐŊОв Đ´ĐģŅ Đ˛ŅĐĩŅ… Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐžĐ˛Đ°ĐŊĐŊҋ҅ аĐēĐēĐ°ŅƒĐŊŅ‚ĐžĐ˛. ДĐģŅ Đ˛ŅŅ‚ŅƒĐŋĐģĐĩĐŊĐ¸Ņ иСĐŧĐĩĐŊĐĩĐŊиК в ŅĐ¸Đģ҃ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ." + }, + "websiteItemLabel": { + "message": "ĐĄĐ°ĐšŅ‚ $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ – ĐŊĐĩĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊĐž ҃ĐēаСаĐŊĐŊŅ‹Đš Đ´ĐžĐŧĐĩĐŊ", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "ИСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ в Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐŊĐžĐŧ Đ´ĐžĐŧĐĩĐŊĐĩ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹" + }, + "limitSendViews": { + "message": "ЛиĐŧĐ¸Ņ‚ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐžĐ˛" + }, + "limitSendViewsHint": { + "message": "НиĐēŅ‚Đž ĐŊĐĩ ҁĐŧĐžĐļĐĩŅ‚ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ ŅŅ‚Ņƒ Send ĐŋĐžŅĐģĐĩ ĐģиĐŧĐ¸Ņ‚Đ° ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐžĐ˛.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "ĐžŅŅ‚Đ°ĐģĐžŅŅŒ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐžĐ˛: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Đž Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ĐŸĐžĐ¸ŅĐē Send’ов", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ĐĸĐĩĐēҁ҂" }, + "sendTypeTextToShare": { + "message": "ĐĸĐĩĐēҁ҂ Đ´ĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи" + }, "sendTypeFile": { "message": "ФаКĐģ" }, @@ -1666,6 +2406,9 @@ "message": "Đ’ŅĐĩ Sendâ€™Ņ‹", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ Ņ‚ĐĩĐēҁ҂ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ" + }, "maxAccessCountReached": { "message": "Đ”ĐžŅŅ‚Đ¸ĐŗĐŊŅƒŅ‚ ĐŧаĐēŅĐ¸Đŧ҃Đŧ ĐžĐąŅ€Đ°Ņ‰ĐĩĐŊиК", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Đ—Đ°Ņ‰Đ¸Ņ‰ĐĩĐŊĐž ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ" }, + "copyLink": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁҁҋĐģĐē҃" + }, "copySendLink": { "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁҁҋĐģĐē҃ ĐŊа Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚Ņƒ Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐąĐĩĐˇĐ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚ĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚Ņƒ Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Đ­Ņ‚Đ° Send ĐąŅƒĐ´ĐĩŅ‚ ĐžĐēĐžĐŊŅ‡Đ°Ņ‚ĐĩĐģҌĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊа в ҃ĐēаСаĐŊĐŊŅ‹Đĩ Đ´Đ°Ņ‚Ņƒ и Đ˛Ņ€ĐĩĐŧŅ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "ĐĄ ŅŅ‚ĐžĐš Đ´Đ°Ņ‚Ņ‹ Send ĐąŅƒĐ´ĐĩŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊа ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Đ”Đ°Ņ‚Đ° Đ¸ŅŅ‚Đĩ҇ĐĩĐŊĐ¸Ņ" }, @@ -1769,6 +2523,10 @@ "message": "По вОСĐŧĐžĐļĐŊĐžŅŅ‚Đ¸ СаĐŋŅ€Đ°ŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ҃ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ŅŅ‚ĐžĐš Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Đ”ĐžĐąĐ°Đ˛ŅŒŅ‚Đĩ ĐžĐŋŅ†Đ¸ĐžĐŊаĐģҌĐŊŅ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ĐĩĐģĐĩĐš Đē ŅŅ‚ĐžĐš Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Đ›Đ¸Ņ‡ĐŊŅ‹Đĩ СаĐŧĐĩŅ‚Đēи Ой ŅŅ‚ĐžĐš Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send ŅĐžĐˇĐ´Đ°ĐŊа", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžĐˇĐ´Đ°ĐŊа!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа Đ˛ŅĐĩĐŧ, ĐēŅ‚Đž ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ ҁҁҋĐģĐē҃ в Ņ‚Đĩ҇ĐĩĐŊиĐĩ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŗĐž 1 Ņ‡Đ°ŅĐ°.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Send ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа Đ˛ŅĐĩĐŧ, ĐēŅ‚Đž ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ ҁҁҋĐģĐē҃ в Ņ‚Đĩ҇ĐĩĐŊиĐĩ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Ņ… $HOURS$ Ņ‡Đ°ŅĐžĐ˛.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа Đ˛ŅĐĩĐŧ, ĐēŅ‚Đž ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ ҁҁҋĐģĐē҃ в Ņ‚Đĩ҇ĐĩĐŊиĐĩ ҁĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐŗĐž 1 Đ´ĐŊŅ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Send ĐąŅƒĐ´ĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа Đ˛ŅĐĩĐŧ, ĐēŅ‚Đž ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ ҁҁҋĐģĐē҃ в Ņ‚Đĩ҇ĐĩĐŊиĐĩ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Ņ… $DAYS$ Đ´ĐŊĐĩĐš.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "ĐĄŅŅ‹ĐģĐēа ĐŊа Send ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊа", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊа", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "ĐžŅ‚ĐēŅ€ĐĩĐŋĐ¸Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Đ§Ņ‚ĐžĐąŅ‹ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ Send, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ в ĐŊОвОĐŧ ĐžĐēĐŊĐĩ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "ДĐģŅ Đ˛Ņ‹ĐąĐžŅ€Đ° Ņ„Đ°ĐšĐģа ĐžŅ‚ĐēŅ€ĐžĐšŅ‚Đĩ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ в йОĐēОвОК ĐŋаĐŊĐĩĐģи (ĐĩҁĐģи вОСĐŧĐžĐļĐŊĐž) иĐģи ĐŋĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ в ĐŊОвОĐĩ ĐžĐēĐŊĐž, ĐŊаĐļав ĐŊа ŅŅ‚ĐžŅ‚ йаĐŊĐŊĐĩŅ€." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "ДĐģŅ Đ˛Ņ‹ĐąĐžŅ€Đ° Ņ„Đ°ĐšĐģа ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Safari, ĐŋĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ в ĐŊОвОĐĩ ĐžĐēĐŊĐž, ĐŊаĐļав ĐŊа ŅŅ‚ĐžŅ‚ йаĐŊĐŊĐĩŅ€." }, + "popOut": { + "message": "ĐžŅ‚ĐēŅ€ĐĩĐŋĐ¸Ņ‚ŅŒ" + }, "sendFileCalloutHeader": { "message": "ПĐĩŅ€ĐĩĐ´ Ņ‚ĐĩĐŧ, ĐēаĐē ĐŊĐ°Ņ‡Đ°Ņ‚ŅŒ" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐŧОК Đ°Đ´Ņ€Đĩҁ email ĐžŅ‚ ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ĐĩĐģĐĩĐš." }, + "hideYourEmail": { + "message": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ Đ˛Đ°Ņˆ email ĐžŅ‚ ĐŋŅ€ĐžŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°ŅŽŅ‰Đ¸Ņ…." + }, "sendOptionsPolicyInEffect": { "message": "На ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ Send вĐģĐ¸ŅŅŽŅ‚ ОдĐŊа иĐģи ĐŊĐĩҁĐēĐžĐģҌĐēĐž ĐŋĐžĐģĐ¸Ņ‚Đ¸Đē ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹" }, + "emailVerifiedV2": { + "message": "Email ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊ" + }, "emailVerificationRequiredDesc": { "message": "ДĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ ŅŅ‚ĐžĐš Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ Đ˛Đ°Ņˆ email. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ŅŅ‚Đž ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ в вĐĩĐą-Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Đ’Đ°Ņˆ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ҂ҀĐĩйОваĐŊĐ¸ŅĐŧ ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи Đ˛Đ°ŅˆĐĩĐš ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Ņƒ Đ˛Ņ‹ Đ´ĐžĐģĐļĐŊŅ‹ ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅĐ˛ĐžĐš ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ ĐŋŅ€ŅĐŧĐž ҁĐĩĐšŅ‡Đ°Ņ. ĐŸŅ€Đ¸ ŅŅ‚ĐžĐŧ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš ҁĐĩаĐŊҁ ĐąŅƒĐ´ĐĩŅ‚ СавĐĩŅ€ŅˆĐĩĐŊ и ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐ°Ņ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Ņ. ĐĄĐĩаĐŊҁҋ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Ņ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ… ĐŧĐžĐŗŅƒŅ‚ ĐžŅŅ‚Đ°Đ˛Đ°Ņ‚ŅŒŅŅ аĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đŧи в Ņ‚Đĩ҇ĐĩĐŊиĐĩ Ņ‡Đ°ŅĐ°." }, + "tdeDisabledMasterPasswordRequired": { + "message": "В Đ˛Đ°ŅˆĐĩĐš ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊĐž ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊиĐĩ дОвĐĩŅ€ĐĩĐŊĐŊҋ҅ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ˛Đ°ŅˆĐĩĐŧ҃ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Ņƒ." + }, "resetPasswordPolicyAutoEnroll": { "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐžĐĩ Ņ€Đ°ĐˇĐ˛ĐĩŅ€Ņ‚Ņ‹Đ˛Đ°ĐŊиĐĩ" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŋаĐŋĐē҃..." }, - "ssoCompleteRegistration": { - "message": "ДĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŋŅ€Đ¸ ĐŋĐžĐŧĐžŅ‰Đ¸ SSO, ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋа Đē Đ˛Đ°ŅˆĐĩĐŧ҃ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Ņƒ и ĐĩĐŗĐž ĐˇĐ°Ņ‰Đ¸Ņ‚Ņ‹." + "noFoldersFound": { + "message": "ПаĐŋĐēи ĐŊĐĩ ĐŊаКдĐĩĐŊŅ‹", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "ĐŸŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐąŅ‹Đģи ОйĐŊОвĐģĐĩĐŊŅ‹, ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "НĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "иС $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Đ§Đ°Ņ." @@ -1904,6 +2740,9 @@ "minutes": { "message": "МиĐŊ." }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "К ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēаĐŧ Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚Đ° ĐąŅ‹Đģи ĐŋŅ€Đ¸ĐŧĐĩĐŊĐĩĐŊŅ‹ ҂ҀĐĩйОваĐŊĐ¸Ņ ĐēĐžŅ€ĐŋĐžŅ€Đ°Ņ‚Đ¸Đ˛ĐŊОК ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи" + }, "vaultTimeoutPolicyInEffect": { "message": "В ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ¸Đ¸ ҁ ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēаĐŧи Đ˛Đ°ŅˆĐĩĐš ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅ‹Đš Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ŅĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ $HOURS$ Ņ‡Đ°Ņ. и $MINUTES$ ĐŧиĐŊ.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "МаĐēŅĐ¸Đŧ҃Đŧ $HOURS$ Ņ‡Đ°Ņ. $MINUTES$ ĐŧиĐŊ.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Đ’Ņ€ĐĩĐŧŅ ĐžĐļидаĐŊĐ¸Ņ ĐŋŅ€ĐĩĐ˛Ņ‹ŅˆĐ°ĐĩŅ‚ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊĐžĐĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ĐĩĐš ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐžĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ: $HOURS$ Ņ‡Đ°Ņ. $MINUTES$ ĐŧиĐŊ.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "ПоĐģĐ¸Ņ‚Đ¸Đēи Đ˛Đ°ŅˆĐĩĐš ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ вĐģĐ¸ŅŅŽŅ‚ ĐŊа Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°. МаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅ‹Đš Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ŅĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ $HOURS$ Ņ‡Đ°Ņ. и $MINUTES$ ĐŧиĐŊ. ДĐģŅ Đ˛Đ°ŅˆĐĩĐŗĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° СадаĐŊ Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚ $ACTION$.", "placeholders": { @@ -1959,7 +2824,7 @@ "message": "ĐŖĐŊиĐēаĐģҌĐŊŅ‹Đš идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ĐŊĐĩ ĐŊаКдĐĩĐŊ." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ SSO ҁ ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đŧ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐŧ ĐēĐģŅŽŅ‡ĐĩĐš. ДĐģŅ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸ ҇ĐģĐĩĐŊаĐŧ ŅŅ‚ĐžĐš ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ йОĐģҌ҈Đĩ ĐŊĐĩ ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ.", + "message": "$ORGANIZATION$ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ SSO ҁ ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐŊŅ‹Đŧ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐŧ ĐēĐģŅŽŅ‡ĐĩĐš. ДĐģŅ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧ ŅŅ‚ĐžĐš ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ йОĐģҌ҈Đĩ ĐŊĐĩ ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ.", "placeholders": { "organization": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Đ­ĐēҁĐŋĐžŅ€Ņ‚ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸" + }, + "exportingOrganizationVaultDesc": { + "message": "Đ‘ŅƒĐ´ĐĩŅ‚ ŅĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž Ņ‚ĐžĐģҌĐēĐž Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸, ŅĐ˛ŅĐˇĐ°ĐŊĐŊĐžĐĩ ҁ $ORGANIZATION$. Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ иС ĐģĐ¸Ņ‡ĐŊҋ҅ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰ и иС Đ´Ņ€ŅƒĐŗĐ¸Ņ… ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đš вĐēĐģŅŽŅ‡ĐĩĐŊŅ‹ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "ĐžŅˆĐ¸ĐąĐēа" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ" }, + "generateEmail": { + "message": "ĐĄĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ email" + }, + "generatorBoundariesHint": { + "message": "ЗĐŊĐ°Ņ‡ĐĩĐŊиĐĩ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŧĐĩĐļĐ´Ņƒ $MIN$ и $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "ĐĸиĐŋ иĐŧĐĩĐŊи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŋҁĐĩвдОĐŊиĐŧ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹ Đ´ĐģŅ вĐŊĐĩ҈ĐŊĐĩĐš ҁĐģ҃ĐļĐąŅ‹ ĐŋĐĩŅ€ĐĩҁҋĐģĐēи." }, + "forwarderDomainName": { + "message": "ДоĐŧĐĩĐŊ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Đ´ĐžĐŧĐĩĐŊ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đŧ ҁĐĩŅ€Đ˛Đ¸ŅĐžĐŧ", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "ĐžŅˆĐ¸ĐąĐēа $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "ХОСдаĐŊĐž Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "ĐĄĐ°ĐšŅ‚: $WEBSITE$. ХОСдаĐŊĐž Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "НĐĩвĐĩŅ€ĐŊŅ‹Đš Ņ‚ĐžĐēĐĩĐŊ API $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "НĐĩвĐĩŅ€ĐŊŅ‹Đš Ņ‚ĐžĐēĐĩĐŊ $SERVICENAME$ API: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ҁĐēŅ€Ņ‹Ņ‚Ņ‹Đš идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ email аĐēĐēĐ°ŅƒĐŊŅ‚Đ° $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "НĐĩĐ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅ‹Đš Đ´ĐžĐŧĐĩĐŊ $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "НĐĩĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đš URL $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐŊĐĩиСвĐĩҁ҂ĐŊĐ°Ņ ĐžŅˆĐ¸ĐąĐēа $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "НĐĩиСвĐĩҁ҂ĐŊŅ‹Đš Ņ„ĐžŅ€Đ˛Đ°Ņ€Đ´ĐĩŅ€: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ИĐŧŅ Ņ…ĐžŅŅ‚Đ°", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "КаĐē Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ" }, "autofillSelectInfoWithCommand": { - "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа ŅŅ‚ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ иĐģи Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ŅĐžŅ‡ĐĩŅ‚Đ°ĐŊиĐĩ ĐēĐģĐ°Đ˛Đ¸Ņˆ: $COMMAND$", + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа ŅŅ‚ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ŅĐžŅ‡ĐĩŅ‚Đ°ĐŊиĐĩ ĐēĐģĐ°Đ˛Đ¸Ņˆ: $COMMAND$ иĐģи ОСĐŊаĐēĐžĐŧŅŒŅ‚ĐĩҁҌ ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧи ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°Đŧи в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ….", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа ŅŅ‚ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ иĐģи ĐˇĐ°Đ´Đ°ĐšŅ‚Đĩ ŅĐžŅ‡ĐĩŅ‚Đ°ĐŊиĐĩ ĐēĐģĐ°Đ˛Đ¸Ņˆ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ…." + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐŊа ŅŅ‚ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ иĐģи Đ¸ĐˇŅƒŅ‡Đ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ…." }, "gotIt": { "message": "ПоĐŊŅŅ‚ĐŊĐž" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Đ¯Ņ€ĐģŅ‹Đē Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ€ĐģŅ‹Đē" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ŅŅ€ĐģŅ‹ĐēаĐŧи" + }, "autofillShortcut": { "message": "ĐĄĐžŅ‡ĐĩŅ‚Đ°ĐŊиĐĩ ĐēĐģĐ°Đ˛Đ¸Ņˆ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ" }, - "autofillShortcutNotSet": { - "message": "ĐĄĐžŅ‡ĐĩŅ‚Đ°ĐŊиĐĩ ĐēĐģĐ°Đ˛Đ¸Ņˆ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž. ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐĩĐŗĐž в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°." + "autofillLoginShortcutNotSet": { + "message": "ĐĄĐžŅ‡ĐĩŅ‚Đ°ĐŊиĐĩ ĐēĐģĐ°Đ˛Đ¸Ņˆ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐģĐžĐŗĐ¸ĐŊа ĐŊĐĩ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž. ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đĩ ĐĩĐŗĐž в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°." }, - "autofillShortcutText": { - "message": "ĐĄĐžŅ‡ĐĩŅ‚Đ°ĐŊиĐĩ ĐēĐģĐ°Đ˛Đ¸Ņˆ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ: $COMMAND$. ИСĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐĩĐŗĐž в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "autofillLoginShortcutText": { + "message": "ĐĄĐžŅ‡ĐĩŅ‚Đ°ĐŊиĐĩ ĐēĐģĐ°Đ˛Đ¸Ņˆ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐģĐžĐŗĐ¸ĐŊа - $COMMAND$. ĐŖĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒ Đ˛ŅĐĩĐŧи ŅĐžŅ‡ĐĩŅ‚Đ°ĐŊĐ¸ŅĐŧи ĐŧĐžĐļĐŊĐž в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Đ’ĐžĐšŅ‚Đ¸ ĐŊа" - }, "opensInANewWindow": { "message": "ĐžŅ‚ĐēŅ€ĐžĐĩŅ‚ŅŅ в ĐŊОвОĐŧ ĐžĐēĐŊĐĩ" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ SSO ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸." }, + "creatingAccountOn": { + "message": "ХОСдаĐŊиĐĩ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°" + }, + "checkYourEmail": { + "message": "ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ ŅĐ˛ĐžŅŽ ĐŋĐžŅ‡Ņ‚Ņƒ" + }, + "followTheLinkInTheEmailSentTo": { + "message": "ПĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ ĐŋĐž ҁҁҋĐģĐēĐĩ иС ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊĐžĐŗĐž ĐŋĐ¸ŅŅŒĐŧа" + }, + "andContinueCreatingYourAccount": { + "message": "и ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚Đĩ ŅĐžĐˇĐ´Đ°ĐŊиĐĩ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°." + }, + "noEmail": { + "message": "НĐĩŅ‚ ĐŋĐ¸ŅŅŒĐŧа?" + }, + "goBack": { + "message": "ВĐĩŅ€ĐŊŅƒŅ‚ŅŒŅŅ" + }, + "toEditYourEmailAddress": { + "message": "Đ´ĐģŅ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ Đ°Đ´Ņ€ĐĩŅĐ° email." + }, "eu": { "message": "Đ•Đ˛Ņ€ĐžĐŋа", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Đ”ĐžŅŅ‚ŅƒĐŋ СаĐŋŅ€Đĩ҉ĐĩĐŊ. ĐŖ Đ˛Đ°Ņ ĐŊĐĩŅ‚ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ ĐŊа ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ ŅŅ‚ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "ДовĐĩŅ€ĐĩĐŊĐŊĐžĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž" }, + "sendsNoItemsTitle": { + "message": "НĐĩŅ‚ аĐēŅ‚Đ¸Đ˛ĐŊҋ҅ Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ Send Đ´ĐģŅ ĐąĐĩСОĐŋĐ°ŅĐŊĐžĐŗĐž ОйĐŧĐĩĐŊа ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐĩĐš ҁ ĐēĐĩĐŧ ŅƒĐŗĐžĐ´ĐŊĐž.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "НĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ввĐĩŅŅ‚Đ¸ даĐŊĐŊŅ‹Đĩ." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 ĐŋĐžĐģĐĩ ҂ҀĐĩĐąŅƒĐĩŅ‚ Đ˛Đ°ŅˆĐĩĐŗĐž вĐŊиĐŧаĐŊĐ¸Ņ." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ ĐŋĐžĐģĐĩĐš ҂ҀĐĩĐąŅƒŅŽŅ‚ Đ˛Đ°ŅˆĐĩĐŗĐž вĐŊиĐŧаĐŊĐ¸Ņ.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "ХвĐĩŅ€ĐŊŅƒŅ‚ŅŒ/Ņ€Đ°ĐˇĐ˛ĐĩŅ€ĐŊŅƒŅ‚ŅŒ", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ в Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Đ—Đ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ LastPass и иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ¸Ņ… в Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐēаĐē ĐŊĐĩĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš Ņ„Đ°ĐšĐģ", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ в Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ИĐŧĐŋĐžŅ€Ņ‚...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "ДаĐŊĐŊŅ‹Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "ĐžŅˆĐ¸ĐąĐēа иĐŧĐŋĐžŅ€Ņ‚Đ°. ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ ĐēĐžĐŊŅĐžĐģҌ Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ ĐŋĐžĐ´Ņ€ĐžĐąĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Во Đ˛Ņ€ĐĩĐŧŅ иĐŧĐŋĐžŅ€Ņ‚Đ° вОСĐŊиĐēĐģа ҁĐĩŅ‚ĐĩĐ˛Đ°Ņ ĐžŅˆĐ¸ĐąĐēа.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "ĐŸŅĐĩвдОĐŊиĐŧ Đ´ĐžĐŧĐĩĐŊа" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ ҁ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊŅ‹Đŧ СаĐŋŅ€ĐžŅĐžĐŧ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи СаĐŋĐžĐģĐŊĐĩĐŊŅ‹ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹. ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹ Đ˛Ņ‹ĐēĐģŅŽŅ‡ĐĩĐŊĐž.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐē҃ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "ДĐģŅ Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅŅ‚ĐžĐŗĐž ĐŋĐžĐģŅ ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊŅ‹Đš СаĐŋŅ€ĐžŅ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅ", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ йОĐēĐžĐ˛ŅƒŅŽ ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ŅŽ" + }, + "skipToContent": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ Đē ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐŧ҃" + }, + "bitwardenOverlayButton": { + "message": "КĐŊĐžĐŋĐēа ĐŧĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "ВĐēĐģ/Đ˛Ņ‹ĐēĐģ ĐŧĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "МĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "РаСйĐģĐžĐēĐ¸Ņ€ŅƒĐšŅ‚Đĩ Đ˛Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚ Đ´ĐģŅ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đ° ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰Đ¸Ņ… ĐģĐžĐŗĐ¸ĐŊОв", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "РаСйĐģĐžĐēĐ¸Ņ€ŅƒĐšŅ‚Đĩ Đ˛Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚ Đ´ĐģŅ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đ° ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊиК ĐŋĐž Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸ŅŽ", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "РаСйĐģĐžĐēĐ¸Ņ€ŅƒĐšŅ‚Đĩ Đ˛Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚, ĐžŅ‚ĐēŅ€ĐžĐĩŅ‚ŅŅ в ĐŊОвОĐŧ ĐžĐēĐŊĐĩ", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "ЗаĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ ŅƒŅ‡ĐĩŅ‚ĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Đ§Đ°ŅŅ‚ŅŒ иĐŧĐĩĐŊи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "НĐĩŅ‚ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ Đ´ĐģŅ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "ĐĐžĐ˛Ņ‹Đš ŅĐģĐĩĐŧĐĩĐŊŅ‚", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš ŅĐģĐĩĐŧĐĩĐŊŅ‚ в Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "ĐĐžĐ˛Ņ‹Đš ĐģĐžĐŗĐ¸ĐŊ", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "ДобавĐģĐĩĐŊиĐĩ ĐŊĐžĐ˛ĐžĐŗĐž ĐģĐžĐŗĐ¸ĐŊа в Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ, ĐžŅ‚ĐēŅ€ĐžĐĩŅ‚ŅŅ в ĐŊОвОĐŧ ĐžĐēĐŊĐĩ", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "ĐĐžĐ˛Đ°Ņ ĐēĐ°Ņ€Ņ‚Đ°", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "ДобавĐģĐĩĐŊиĐĩ ĐŊОвОК ĐēĐ°Ņ€Ņ‚Ņ‹ в Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ, ĐžŅ‚ĐēŅ€ĐžĐĩŅ‚ŅŅ в ĐŊОвОĐŧ ĐžĐēĐŊĐĩ", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "ĐĐžĐ˛Đ°Ņ ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚ŅŒ", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "ДобавĐģĐĩĐŊиĐĩ ĐŊОвОК ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Đ¸ в Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ, ĐžŅ‚ĐēŅ€ĐžĐĩŅ‚ŅŅ в ĐŊОвОĐŧ ĐžĐēĐŊĐĩ", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊĐž ĐŧĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ Bitwarden. ДĐģŅ Đ˛Ņ‹ĐąĐžŅ€Đ° ĐŊаĐļĐŧĐ¸Ņ‚Đĩ ĐēĐģĐ°Đ˛Đ¸ŅˆŅƒ ŅĐž ҁ҂ҀĐĩĐģĐēОК вĐŊиС.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ" + }, + "ignore": { + "message": "Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ" + }, + "importData": { + "message": "ИĐŧĐŋĐžŅ€Ņ‚ даĐŊĐŊҋ҅", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "ĐžŅˆĐ¸ĐąĐēа иĐŧĐŋĐžŅ€Ņ‚Đ°" + }, + "importErrorDesc": { + "message": "ВозĐŊиĐēĐģа ĐŋŅ€ĐžĐąĐģĐĩĐŧа ҁ даĐŊĐŊŅ‹Đŧи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ ĐŋŅ‹Ņ‚Đ°ĐģĐ¸ŅŅŒ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ. Đ˜ŅĐŋŅ€Đ°Đ˛ŅŒŅ‚Đĩ в Đ¸ŅŅ…ĐžĐ´ĐŊĐžĐŧ Ņ„Đ°ĐšĐģĐĩ ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ‹Đĩ ĐŊиĐļĐĩ ĐžŅˆĐ¸ĐąĐēи и ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đĩ҉Đĩ Ņ€Đ°Đˇ." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "ĐŖŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‚Đĩ ҃ĐēаСаĐŊĐŊŅ‹Đĩ ĐŊиĐļĐĩ ĐžŅˆĐ¸ĐąĐēи и ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐŋҋ҂Đē҃." + }, + "description": { + "message": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ" + }, + "importSuccess": { + "message": "ДаĐŊĐŊŅ‹Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹" + }, + "importSuccessNumberOfItems": { + "message": "Đ’ŅĐĩĐŗĐž иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛: $AMOUNT$.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "ПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ҁĐŊОва" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "ДĐģŅ ŅŅ‚ĐžĐŗĐž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ. ДĐģŅ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐĩĐŊĐ¸Ņ ввĐĩĐ´Đ¸Ņ‚Đĩ PIN-ĐēОд." + }, + "setPin": { + "message": "Đ—Đ°Đ´Đ°Ņ‚ŅŒ PIN-ĐēОд" + }, + "verifyWithBiometrics": { + "message": "ВĐĩŅ€Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ йиОĐŧĐĩŅ‚Ņ€Đ¸Đ¸" + }, + "awaitingConfirmation": { + "message": "ОĐļидаĐŊиĐĩ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ" + }, + "couldNotCompleteBiometrics": { + "message": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ŅŽ йиОĐŧĐĩŅ‚Ņ€Đ¸ĐĩĐš." + }, + "needADifferentMethod": { + "message": "ĐŅƒĐļĐĩĐŊ Đ´Ņ€ŅƒĐŗĐžĐš ĐŧĐĩŅ‚ĐžĐ´?" + }, + "useMasterPassword": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "usePin": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ PIN-ĐēОд" + }, + "useBiometrics": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ йиОĐŧĐĩŅ‚Ņ€Đ¸ŅŽ" + }, + "enterVerificationCodeSentToEmail": { + "message": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐēОд ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ, ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ‹Đš ваĐŧ ĐŊа ĐŋĐžŅ‡Ņ‚Ņƒ." + }, + "resendCode": { + "message": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐēОд ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž" + }, + "total": { + "message": "Đ’ŅĐĩĐŗĐž" + }, + "importWarning": { + "message": "Đ’Ņ‹ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩŅ‚Đĩ даĐŊĐŊŅ‹Đĩ в $ORGANIZATION$. ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи ŅŅ‚ĐžĐš ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŧĐžĐŗŅƒŅ‚ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ Đē ĐŊиĐŧ Đ´ĐžŅŅ‚ŅƒĐŋ. ĐŸŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ĐŋОдĐēĐģŅŽŅ‡ĐĩĐŊии Đē ҁĐĩŅ€Đ˛Đ¸ŅŅƒ Duo. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ Đ´Ņ€ŅƒĐŗĐžĐš ĐŧĐĩŅ‚ĐžĐ´ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊОК Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ иĐģи ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Са ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ в Duo." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ Duo и ҁĐģĐĩĐ´ŅƒĐšŅ‚Đĩ ŅˆĐ°ĐŗĐ°Đŧ Đ´ĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐ¸Ņ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸." + }, + "duoRequiredForAccount": { + "message": "ДĐģŅ Đ˛Đ°ŅˆĐĩĐŗĐž аĐēĐēĐ°ŅƒĐŊŅ‚Đ° ҂ҀĐĩĐąŅƒĐĩŅ‚ŅŅ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊĐ°Ņ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ Duo." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ Đ´ĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐ¸Ņ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸." + }, + "popoutExtension": { + "message": "ĐžŅ‚ĐēŅ€ĐĩĐŋĐ¸Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ" + }, + "launchDuo": { + "message": "ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ Duo" + }, + "importFormatError": { + "message": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ даĐŊĐŊҋ҅ ĐŊĐĩĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐĩĐŊ. ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩĐŧŅ‹Đš Ņ„Đ°ĐšĐģ и ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐŋҋ҂Đē҃." + }, + "importNothingError": { + "message": "ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ ĐąŅ‹ĐģĐž иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž." + }, + "importEncKeyError": { + "message": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ Ņ€Đ°ŅŅˆĐ¸Ņ„Ņ€ĐžĐ˛ĐēĐĩ ŅĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģа. Đ’Đ°Ņˆ ĐēĐģŅŽŅ‡ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ĐŊĐĩ ŅĐžĐ˛ĐŋадаĐĩŅ‚ ҁ ĐēĐģŅŽŅ‡ĐžĐŧ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ, Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧ ĐŋŅ€Đ¸ ŅĐēҁĐŋĐžŅ€Ņ‚Đĩ даĐŊĐŊҋ҅." + }, + "invalidFilePassword": { + "message": "НĐĩвĐĩŅ€ĐŊŅ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ Đē Ņ„Đ°ĐšĐģ҃. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ, ввĐĩĐ´ĐĩĐŊĐŊŅ‹Đš ĐŋŅ€Đ¸ ŅĐžĐˇĐ´Đ°ĐŊии Ņ„Đ°ĐšĐģа ŅĐēҁĐŋĐžŅ€Ņ‚Đ°." + }, + "destination": { + "message": "НазĐŊĐ°Ņ‡ĐĩĐŊиĐĩ" + }, + "learnAboutImportOptions": { + "message": "ĐŖĐˇĐŊĐ°ĐšŅ‚Đĩ Đž вОСĐŧĐžĐļĐŊĐžŅŅ‚ŅŅ… иĐŧĐŋĐžŅ€Ņ‚Đ°" + }, + "selectImportFolder": { + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŋаĐŋĐē҃" + }, + "selectImportCollection": { + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅŽ" + }, + "importTargetHint": { + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅŅ‚Ņƒ ĐžĐŋŅ†Đ¸ŅŽ, ĐĩҁĐģи Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģа ĐąŅ‹ĐģĐž ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž в $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "ФаКĐģ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ĐŊĐĩĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ‹Đĩ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ." + }, + "selectFormat": { + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩĐŧĐžĐŗĐž Ņ„Đ°ĐšĐģа" + }, + "selectImportFile": { + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩĐŧŅ‹Đš Ņ„Đ°ĐšĐģ" + }, + "chooseFile": { + "message": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ" + }, + "noFileChosen": { + "message": "ФаКĐģ ĐŊĐĩ Đ˛Ņ‹ĐąŅ€Đ°ĐŊ" + }, + "orCopyPasteFileContents": { + "message": "иĐģи ҁĐēĐžĐŋĐ¸Ņ€ŅƒĐšŅ‚Đĩ и Đ˛ŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩĐŧĐžĐŗĐž Ņ„Đ°ĐšĐģа" + }, + "instructionsFor": { + "message": "ИĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đ¸ Đ´ĐģŅ $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ иĐŧĐŋĐžŅ€Ņ‚ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°" + }, + "confirmVaultImportDesc": { + "message": "Đ­Ņ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ‰Đ¸Ņ‰ĐĩĐŊ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ. ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ иĐŧĐŋĐžŅ€Ņ‚Đ° даĐŊĐŊҋ҅." + }, + "confirmFilePassword": { + "message": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ Đē Ņ„Đ°ĐšĐģ҃" + }, + "exportSuccess": { + "message": "ДаĐŊĐŊŅ‹Đĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ŅĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋ" + }, + "passkeyNotCopied": { + "message": "Passkey ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊ" + }, + "passkeyNotCopiedAlert": { + "message": "Passkey ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊ в ĐēĐģĐžĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš ŅĐģĐĩĐŧĐĩĐŊŅ‚. ĐŸŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ ĐēĐģĐžĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ŅŅ‚ĐžĐŗĐž ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "НĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧа вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ ŅĐž ŅŅ‚ĐžŅ€ĐžĐŊŅ‹ иĐŊĐ¸Ņ†Đ¸Đ¸Ņ€ŅƒŅŽŅ‰ĐĩĐŗĐž ŅĐ°ĐšŅ‚Đ°. ДĐģŅ аĐēĐēĐ°ŅƒĐŊŅ‚ĐžĐ˛ ĐąĐĩС ĐŧĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģŅ ŅŅ‚Đ° вОСĐŧĐžĐļĐŊĐžŅŅ‚ŅŒ ĐŋĐžĐēа ĐŊĐĩ Ņ€ĐĩаĐģиСОваĐŊа." + }, + "logInWithPasskeyQuestion": { + "message": "Đ’ĐžĐšŅ‚Đ¸ ҁ passkey?" + }, + "passkeyAlreadyExists": { + "message": "ДĐģŅ даĐŊĐŊĐžĐŗĐž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚ passkey." + }, + "noPasskeysFoundForThisApplication": { + "message": "ДĐģŅ даĐŊĐŊĐžĐŗĐž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŊĐĩ ĐŊаКдĐĩĐŊ passkey." + }, + "noMatchingPasskeyLogin": { + "message": "ĐŖ Đ˛Đ°Ņ ĐŊĐĩŅ‚ ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰ĐĩĐŗĐž ĐģĐžĐŗĐ¸ĐŊа Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ŅĐ°ĐšŅ‚Đ°." + }, + "noMatchingLoginsForSite": { + "message": "НĐĩŅ‚ ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰Đ¸Ņ… ĐģĐžĐŗĐ¸ĐŊОв Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ŅĐ°ĐšŅ‚Đ°" + }, + "searchSavePasskeyNewLogin": { + "message": "ĐĐ°ĐšŅ‚Đ¸ иĐģи ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ passkey ĐēаĐē ĐŊĐžĐ˛Ņ‹Đš ĐģĐžĐŗĐ¸ĐŊ" + }, + "confirm": { + "message": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ" + }, + "savePasskey": { + "message": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ passkey" + }, + "savePasskeyNewLogin": { + "message": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ passkey ĐēаĐē ĐŊĐžĐ˛Ņ‹Đš ĐģĐžĐŗĐ¸ĐŊ" + }, + "chooseCipherForPasskeySave": { + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐģĐžĐŗĐ¸ĐŊ, Đ´ĐģŅ ĐēĐžŅ‚ĐžŅ€ĐžĐŗĐž ĐąŅƒĐ´ĐĩŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊ даĐŊĐŊŅ‹Đš passkey" + }, + "chooseCipherForPasskeyAuth": { + "message": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ passkey Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸" + }, + "passkeyItem": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ passkey" + }, + "overwritePasskey": { + "message": "ПĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°Ņ‚ŅŒ passkey?" + }, + "overwritePasskeyAlert": { + "message": "Đ­Ņ‚ĐžŅ‚ ŅĐģĐĩĐŧĐĩĐŊŅ‚ ҃ĐļĐĩ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ passkey. Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°Ņ‚ŅŒ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš passkey?" + }, + "featureNotSupported": { + "message": "Đ¤ŅƒĐŊĐēŅ†Đ¸Ņ ĐŋĐžĐēа ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ" + }, + "yourPasskeyIsLocked": { + "message": "ДĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ passkey ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧа Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ. ДĐģŅ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐĩĐŊĐ¸Ņ Ņ€Đ°ĐąĐžŅ‚Ņ‹ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ŅĐ˛ĐžŅŽ ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚ŅŒ." + }, + "multifactorAuthenticationCancelled": { + "message": "МĐŊĐžĐŗĐžŅ„Đ°ĐēŅ‚ĐžŅ€ĐŊĐ°Ņ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊа" + }, + "noLastPassDataFound": { + "message": "ДаĐŊĐŊŅ‹Đĩ LastPass ĐŊĐĩ ĐŊаКдĐĩĐŊŅ‹" + }, + "incorrectUsernameOrPassword": { + "message": "НĐĩвĐĩŅ€ĐŊĐžĐĩ иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ иĐģи ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "incorrectPassword": { + "message": "НĐĩвĐĩŅ€ĐŊŅ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "incorrectCode": { + "message": "НĐĩвĐĩŅ€ĐŊŅ‹Đš ĐēОд" + }, + "incorrectPin": { + "message": "НĐĩвĐĩŅ€ĐŊŅ‹Đš PIN-ĐēОд" + }, + "multifactorAuthenticationFailed": { + "message": "ХйОК ĐŧĐŊĐžĐŗĐžŅ„Đ°ĐēŅ‚ĐžŅ€ĐŊОК Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸" + }, + "includeSharedFolders": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đĩ ĐŋаĐŋĐēи" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "ИĐŧĐŋĐžŅ€Ņ‚ Đ˛Đ°ŅˆĐĩĐŗĐž аĐēĐēĐ°ŅƒĐŊŅ‚Đ°..." + }, + "lastPassMFARequired": { + "message": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŧĐŊĐžĐŗĐžŅ„Đ°ĐēŅ‚ĐžŅ€ĐŊĐ°Ņ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ LastPass" + }, + "lastPassMFADesc": { + "message": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ОдĐŊĐžŅ€Đ°ĐˇĐžĐ˛Ņ‹Đš ĐēОд иС ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ Đ´ĐģŅ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸" + }, + "lastPassOOBDesc": { + "message": "ĐžĐ´ĐžĐąŅ€Đ¸Ņ‚Đĩ СаĐŋŅ€ĐžŅ ĐŊа Đ˛Ņ…ĐžĐ´ в ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊии иĐģи ввĐĩĐ´Đ¸Ņ‚Đĩ ОдĐŊĐžŅ€Đ°ĐˇĐžĐ˛Ņ‹Đš ĐēОд." + }, + "passcode": { + "message": "Код Đ´ĐžŅŅ‚ŅƒĐŋа" + }, + "lastPassMasterPassword": { + "message": "ĐœĐ°ŅŅ‚ĐĩŅ€-ĐŋĐ°Ņ€ĐžĐģҌ LastPass" + }, + "lastPassAuthRequired": { + "message": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ LastPass" + }, + "awaitingSSO": { + "message": "ОĐļидаĐŊиĐĩ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ SSO" + }, + "awaitingSSODesc": { + "message": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚Đĩ Đ˛Ņ…ĐžĐ´, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅ ŅƒŅ‡ĐĩŅ‚ĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ Đ˛Đ°ŅˆĐĩĐš ĐēĐžĐŧĐŋаĐŊии." + }, + "seeDetailedInstructions": { + "message": "ĐŸĐžĐ´Ņ€ĐžĐąĐŊŅ‹Đĩ иĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đ¸ ҁĐŧ. ĐŊа ĐŊĐ°ŅˆĐĩĐŧ ҁĐŋŅ€Đ°Đ˛ĐžŅ‡ĐŊĐžĐŧ ŅĐ°ĐšŅ‚Đĩ ĐŋĐž Đ°Đ´Ņ€Đĩҁ҃", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "ИĐŧĐŋĐžŅ€Ņ‚ ĐŊĐĩĐŋĐžŅŅ€ĐĩĐ´ŅŅ‚Đ˛ĐĩĐŊĐŊĐž иС LastPass" + }, + "importFromCSV": { + "message": "ИĐŧĐŋĐžŅ€Ņ‚ иС CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐŋҋ҂Đē҃ иĐģи ĐŊĐ°ĐšĐ´Đ¸Ņ‚Đĩ email ĐžŅ‚ LastPass, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ, Ņ‡Ņ‚Đž ŅŅ‚Đž Đ˛Ņ‹." + }, + "collection": { + "message": "КоĐģĐģĐĩĐēŅ†Đ¸Ņ" + }, + "lastPassYubikeyDesc": { + "message": "Đ’ŅŅ‚Đ°Đ˛ŅŒŅ‚Đĩ YubiKey, ŅĐ˛ŅĐˇĐ°ĐŊĐŊŅ‹Đš ҁ аĐēĐēĐ°ŅƒĐŊŅ‚ĐžĐŧ LastPass, в USB-ĐŋĐžŅ€Ņ‚ ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đ° и ĐŊаĐļĐŧĐ¸Ņ‚Đĩ ĐŊа ĐĩĐŗĐž ĐēĐŊĐžĐŋĐē҃." + }, + "switchAccount": { + "message": "ĐĄĐŧĐĩĐŊĐ¸Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚" + }, + "switchAccounts": { + "message": "ĐĄĐŧĐĩĐŊĐ¸Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊ҂ҋ" + }, + "switchToAccount": { + "message": "ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒŅŅ ĐŊа аĐēĐēĐ°ŅƒĐŊŅ‚" + }, + "activeAccount": { + "message": "АĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đš аĐēĐēĐ°ŅƒĐŊŅ‚" + }, + "availableAccounts": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đĩ аĐēĐēĐ°ŅƒĐŊ҂ҋ" + }, + "accountLimitReached": { + "message": "Đ”ĐžŅŅ‚Đ¸ĐŗĐŊŅƒŅ‚ ĐģиĐŧĐ¸Ņ‚ аĐēĐēĐ°ŅƒĐŊŅ‚ĐžĐ˛. Đ’Ņ‹ĐšĐ´Đ¸Ņ‚Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐš." + }, + "active": { + "message": "аĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đš" + }, + "locked": { + "message": "СайĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊ" + }, + "unlocked": { + "message": "Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊ" + }, + "server": { + "message": "ҁĐĩŅ€Đ˛ĐĩŅ€" + }, + "hostedAt": { + "message": "ĐŋОд ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩĐŧ" + }, + "useDeviceOrHardwareKey": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ Đ˛Đ°ŅˆĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž иĐģи аĐŋĐŋĐ°Ņ€Đ°Ņ‚ĐŊŅ‹Đš ĐēĐģŅŽŅ‡" + }, + "justOnce": { + "message": "ĐĸĐžĐģҌĐēĐž ҁĐĩĐšŅ‡Đ°Ņ" + }, + "alwaysForThisSite": { + "message": "Đ’ŅĐĩĐŗĐ´Đ° Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ŅĐ°ĐšŅ‚Đ°" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ дОйавĐģĐĩĐŊ в Đ¸ŅĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ‹Đĩ Đ´ĐžĐŧĐĩĐŊŅ‹.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "ĐžŅĐŊОвĐŊŅ‹Đĩ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ‹", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ Đē ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēаĐŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ в ҁĐŋŅ€Đ°Đ˛ĐžŅ‡ĐŊŅ‹Đš ҆ĐĩĐŊ҂Ҁ?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ и ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐŋĐ°Ņ€ĐžĐģŅĐŧи в ŅĐ˛ĐžĐĩĐŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°Ņ‚ŅŒ и ŅƒŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°Ņ‚ŅŒ ŅŅ€ĐģŅ‹Đēи Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиК в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "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": "ИСĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ и ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ ĐŋĐ°Ņ€ĐžĐģŅĐŧи в ŅĐ˛ĐžĐĩĐŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°Ņ‚ŅŒ и ŅƒŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°Ņ‚ŅŒ ŅŅ€ĐģŅ‹Đēи Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиК в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "ĐĄĐ´ĐĩĐģĐ°Ņ‚ŅŒ Bitwarden ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ĐžĐŧ ĐŋĐ°Ņ€ĐžĐģĐĩĐš ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ŅŅ‚ĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ĐĩŅŅ‚Đ¸ Đē ĐēĐžĐŊŅ„ĐģиĐēŅ‚Ņƒ ĐŧĐĩĐļĐ´Ņƒ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸ŅĐŧи Bitwarden и Đ˛Đ°ŅˆĐĩĐŗĐž ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "ĐĄĐ´ĐĩĐģĐ°Ņ‚ŅŒ Bitwarden ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ĐžĐŧ ĐŋĐ°Ņ€ĐžĐģĐĩĐš ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "НĐĩвОСĐŧĐžĐļĐŊĐž ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Bitwarden в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€Đ° ĐŋĐ°Ņ€ĐžĐģĐĩĐš ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Đ§Ņ‚ĐžĐąŅ‹ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Bitwarden в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€Đ° ĐŋĐ°Ņ€ĐžĐģĐĩĐš ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ, ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ Bitwarden ĐŋŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋа Đē ĐēĐžĐŊŅ„Đ¸Đ´ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊĐžŅŅ‚Đ¸ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "ĐŖŅ‡ĐĩŅ‚ĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊ!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "ĐŖŅ‡ĐĩŅ‚ĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊŅ‹!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ ОйĐŊОвĐģĐĩĐŊ!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "ĐžŅˆĐ¸ĐąĐēа ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ŅƒŅ‡ĐĩŅ‚ĐŊҋ҅ даĐŊĐŊҋ҅. ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ ĐēĐžĐŊŅĐžĐģҌ Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ ĐŋĐžĐ´Ņ€ĐžĐąĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "ĐŖŅĐŋĐĩ҈ĐŊĐž" + }, + "removePasskey": { + "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ passkey" + }, + "passkeyRemoved": { + "message": "Passkey ŅƒĐ´Đ°ĐģĐĩĐŊ" + }, + "autofillSuggestions": { + "message": "ĐŸŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ ĐŋĐž Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸ŅŽ" + }, + "autofillSuggestionsTip": { + "message": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐģĐžĐŗĐ¸ĐŊ Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ŅĐ°ĐšŅ‚Đ° Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ" + }, + "yourVaultIsEmpty": { + "message": "Đ’Đ°ŅˆĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ ĐŋŅƒŅŅ‚Đž" + }, + "noItemsMatchSearch": { + "message": "НĐĩŅ‚ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛, ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Ņ… Đ˛Đ°ŅˆĐĩĐŧ҃ СаĐŋŅ€ĐžŅŅƒ" + }, + "clearFiltersOrTryAnother": { + "message": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đĩ Ņ„Đ¸ĐģŅŒŅ‚Ņ€Ņ‹ иĐģи ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đ´Ņ€ŅƒĐŗĐžĐš ĐŋĐžĐ¸ŅĐēĐžĐ˛Ņ‹Đš СаĐŋŅ€ĐžŅ" + }, + "copyInfoTitle": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ СаĐŧĐĩŅ‚Đē҃ - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "БоĐģҌ҈Đĩ ĐžĐŋŅ†Đ¸Đš, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "БоĐģҌ҈Đĩ ĐžĐŋŅ†Đ¸Đš - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ° - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "НĐĩŅ‚ СĐŊĐ°Ņ‡ĐĩĐŊиК Đ´ĐģŅ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ" + }, + "assignToCollections": { + "message": "НазĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅĐŧ" + }, + "copyEmail": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ email" + }, + "copyPhone": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊ" + }, + "copyAddress": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ°Đ´Ņ€Đĩҁ" + }, + "adminConsole": { + "message": "ĐēĐžĐŊŅĐžĐģи адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ°" + }, + "accountSecurity": { + "message": "БĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚Đ°" + }, + "notifications": { + "message": "ĐŖĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ" + }, + "appearance": { + "message": "ВĐŊĐĩ҈ĐŊиК вид" + }, + "errorAssigningTargetCollection": { + "message": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊии ҆ĐĩĐģĐĩвОК ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đ¸." + }, + "errorAssigningTargetFolder": { + "message": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊии ҆ĐĩĐģĐĩвОК ĐŋаĐŋĐēи." + }, + "viewItemsIn": { + "message": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ в $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "ВĐĩŅ€ĐŊŅƒŅ‚ŅŒŅŅ Đē $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "ĐĐžĐ˛Ņ‹Đš" + }, + "removeItem": { + "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ ĐąĐĩС ĐŋаĐŋĐēи" + }, + "itemDetails": { + "message": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Ой ŅĐģĐĩĐŧĐĩĐŊŅ‚Đĩ" + }, + "itemName": { + "message": "НазваĐŊиĐĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Đ’Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đ¸ ҁ ĐŋŅ€Đ°Đ˛Đ°Đŧи Ņ‚ĐžĐģҌĐēĐž ĐŊа ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊа" + }, + "owner": { + "message": "ВĐģадĐĩĐģĐĩ҆" + }, + "selfOwnershipLabel": { + "message": "Đ’Ņ‹", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋ Đē ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧ в Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ… ĐŊĐĩвОСĐŧĐžĐļĐĩĐŊ. ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Са ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Đē вĐģадĐĩĐģŅŒŅ†Ņƒ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸." + }, + "additionalInformation": { + "message": "ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ" + }, + "itemHistory": { + "message": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "lastEdited": { + "message": "ĐŸĐžŅĐģĐĩĐ´ĐŊĐĩĐĩ иСĐŧĐĩĐŊĐĩĐŊиĐĩ" + }, + "ownerYou": { + "message": "ВĐģадĐĩĐģĐĩ҆: Đ˛Ņ‹" + }, + "linked": { + "message": "ĐĄĐ˛ŅĐˇĐ°ĐŊĐž" + }, + "copySuccessful": { + "message": "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž ҃ҁĐŋĐĩ҈ĐŊĐž" + }, + "upload": { + "message": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ" + }, + "addAttachment": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ вĐģĐžĐļĐĩĐŊиĐĩ" + }, + "maxFileSizeSansPunctuation": { + "message": "МаĐēŅĐ¸ĐŧаĐģҌĐŊŅ‹Đš Ņ€Đ°ĐˇĐŧĐĩŅ€ Ņ„Đ°ĐšĐģа 500 МБ" + }, + "deleteAttachmentName": { + "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐģĐžĐļĐĩĐŊиĐĩ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚Đž вĐģĐžĐļĐĩĐŊиĐĩ?" + }, + "premium": { + "message": "ĐŸŅ€ĐĩĐŧĐ¸ŅƒĐŧ" + }, + "freeOrgsCannotUseAttachments": { + "message": "БĐĩҁĐŋĐģĐ°Ņ‚ĐŊŅ‹Đĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ вĐģĐžĐļĐĩĐŊĐ¸Ņ" + }, + "filters": { + "message": "ФиĐģŅŒŅ‚Ņ€Ņ‹" + }, + "personalDetails": { + "message": "Đ›Đ¸Ņ‡ĐŊŅ‹Đĩ даĐŊĐŊŅ‹Đĩ" + }, + "identification": { + "message": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ" + }, + "contactInfo": { + "message": "КоĐŊŅ‚Đ°ĐēŅ‚ĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ" + }, + "downloadAttachment": { + "message": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "ĐŊĐžĐŧĐĩŅ€ ĐēĐ°Ņ€Ņ‚Ņ‹ СаĐēаĐŊŅ‡Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ ĐŊа", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "ДаĐŊĐŊŅ‹Đĩ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸" + }, + "authenticatorKey": { + "message": "КĐģŅŽŅ‡ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ°" + }, + "autofillOptions": { + "message": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ" + }, + "websiteUri": { + "message": "ĐĄĐ°ĐšŅ‚ (URI)" + }, + "websiteUriCount": { + "message": "ВĐĩĐą-ŅĐ°ĐšŅ‚ (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "ĐĄĐ°ĐšŅ‚ дОйавĐģĐĩĐŊ" + }, + "addWebsite": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ŅĐ°ĐšŅ‚" + }, + "deleteWebsite": { + "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅĐ°ĐšŅ‚" + }, + "defaultLabel": { + "message": "По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊиĐĩ ŅĐžĐ˛ĐŋадĐĩĐŊиК $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ОйĐŊĐ°Ņ€ŅƒĐļĐĩĐŊиĐĩ ŅĐžĐ˛ĐŋадĐĩĐŊиК $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹?" + }, + "cardExpiredTitle": { + "message": "Đ˜ŅŅ‚ĐĩĐē ŅŅ€ĐžĐē Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐēĐ°Ņ€Ņ‚Ņ‹" + }, + "cardExpiredMessage": { + "message": "Đ•ŅĐģи Đ˛Ņ‹ СаĐŧĐĩĐŊиĐģи ĐēĐ°Ņ€Ņ‚Ņƒ, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Đž ĐŊĐĩĐš" + }, + "cardDetails": { + "message": "Đ ĐĩĐēĐ˛Đ¸ĐˇĐ¸Ņ‚Ņ‹ ĐēĐ°Ņ€Ņ‚Ņ‹" + }, + "cardBrandDetails": { + "message": "Đ ĐĩĐēĐ˛Đ¸ĐˇĐ¸Ņ‚Ņ‹ $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ аĐŊиĐŧĐ°Ņ†Đ¸ŅŽ" + }, + "showAnimations": { + "message": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ аĐŊиĐŧĐ°Ņ†Đ¸ŅŽ" + }, + "addAccount": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚" + }, + "loading": { + "message": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēа" + }, + "data": { + "message": "ДаĐŊĐŊŅ‹Đĩ" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "ĐŸĐ°Ņ€ĐžĐģи", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Đ’ĐžĐšŅ‚Đ¸ ҁ passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "НазĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "ĐĸĐžĐģҌĐēĐž ҇ĐģĐĩĐŊŅ‹ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸, иĐŧĐĩŅŽŅ‰Đ¸Đĩ Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅŅ‚Đ¸Đŧ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅĐŧ, ҁĐŧĐžĐŗŅƒŅ‚ видĐĩŅ‚ŅŒ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "ĐĸĐžĐģҌĐēĐž ҇ĐģĐĩĐŊŅ‹ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸, иĐŧĐĩŅŽŅ‰Đ¸Đĩ Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅŅ‚Đ¸Đŧ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸ŅĐŧ, ҁĐŧĐžĐŗŅƒŅ‚ видĐĩŅ‚ŅŒ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ." + }, + "bulkCollectionAssignmentWarning": { + "message": "Đ’Ņ‹ Đ˛Ņ‹ĐąŅ€Đ°Đģи $TOTAL_COUNT$ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°(-Ов). Đ’Ņ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ $READONLY_COUNT$ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°(-Ов), ĐŋĐžŅĐēĐžĐģҌĐē҃ ҃ Đ˛Đ°Ņ ĐŊĐĩŅ‚ ĐŋŅ€Đ°Đ˛ ĐŊа Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģĐĩ" + }, + "add": { + "message": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ" + }, + "fieldType": { + "message": "ĐĸиĐŋ ĐŋĐžĐģŅ" + }, + "fieldLabel": { + "message": "МĐĩŅ‚Đēа ĐŋĐžĐģŅ" + }, + "textHelpText": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Ņ‹Đĩ ĐŋĐžĐģŅ Đ´ĐģŅ ĐŋŅ€ĐžŅŅ‚Ņ‹Ņ… даĐŊĐŊҋ҅, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đĩ вОĐŋŅ€ĐžŅŅ‹" + }, + "hiddenHelpText": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ҁĐēҀҋ҂ҋĐĩ ĐŋĐžĐģŅ Đ´ĐģŅ ĐēĐžĐŊŅ„Đ¸Đ´ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊҋ҅ даĐŊĐŊҋ҅, Ņ‚Đ°ĐēĐ¸Ņ… ĐēаĐē ĐŋĐ°Ņ€ĐžĐģи" + }, + "checkBoxHelpText": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ Ņ„ĐģаĐļĐēи, ĐĩҁĐģи Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи СаĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ ĐŋĐžĐģĐĩ Ņ„ĐžŅ€ĐŧŅ‹, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, email" + }, + "linkedHelpText": { + "message": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ŅĐ˛ŅĐˇĐ°ĐŊĐŊĐžĐĩ ĐŋĐžĐģĐĩ, ĐĩҁĐģи ҃ Đ˛Đ°Ņ вОСĐŊиĐēĐģи ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹ ҁ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩĐŧ Đ´ĐģŅ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐžĐŗĐž ŅĐ°ĐšŅ‚Đ°." + }, + "linkedLabelHelpText": { + "message": "ВвĐĩĐ´Đ¸Ņ‚Đĩ HTML-идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ĐŋĐžĐģŅ, иĐŧŅ, aria-label, иĐģи ĐŋĐģĐĩĐšŅŅ…ĐžĐģĐ´ĐĩŅ€." + }, + "editField": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐžĐģĐĩ" + }, + "editFieldLabel": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ дОйавĐģĐĩĐŊ(Đž)", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐžŅ€ŅĐ´ĐžĐē $LABEL$. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐēĐģĐ°Đ˛Đ¸ŅˆĐ¸ ĐēŅƒŅ€ŅĐžŅ€Đ° Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐ¸Ņ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ° ввĐĩҀ҅ иĐģи вĐŊиС.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž ввĐĩҀ҅, ĐŋĐžĐˇĐ¸Ņ†Đ¸Ņ $INDEX$ $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Đ¸ Đ´ĐģŅ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ" + }, + "personalItemTransferWarningSingular": { + "message": "1 ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐąŅƒĐ´ĐĩŅ‚ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ĐŋĐĩŅ€ĐĩдаĐŊ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊОК ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ’Ņ‹ йОĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐģадĐĩĐģŅŒŅ†ĐĩĐŧ ŅŅ‚Đ¸Ņ… ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ ĐąŅƒĐ´ŅƒŅ‚ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ĐŋĐĩŅ€ĐĩдаĐŊŅ‹ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊОК ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ’Ņ‹ йОĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐģадĐĩĐģŅŒŅ†ĐĩĐŧ ŅŅ‚Đ¸Ņ… ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 ŅĐģĐĩĐŧĐĩĐŊŅ‚ ĐąŅƒĐ´ĐĩŅ‚ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ĐŋĐĩŅ€ĐĩдаĐŊ $ORG$. Đ’Ņ‹ йОĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐģадĐĩĐģŅŒŅ†ĐĩĐŧ ŅŅ‚Đ¸Ņ… ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ ĐąŅƒĐ´ŅƒŅ‚ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ĐŋĐĩŅ€ĐĩдаĐŊŅ‹ $ORG$. Đ’Ņ‹ йОĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐģадĐĩĐģŅŒŅ†ĐĩĐŧ ŅŅ‚Đ¸Ņ… ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "КоĐģĐģĐĩĐēŅ†Đ¸Đ¸ ҃ҁĐŋĐĩ҈ĐŊĐž ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊŅ‹" + }, + "nothingSelected": { + "message": "Đ’Ņ‹ ĐŊĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ Đ˛Ņ‹ĐąŅ€Đ°Đģи." + }, + "movedItemsToOrg": { + "message": "Đ’Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊŅ‹ в $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊŅ‹ в $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊŅ‚ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊ в $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž вĐŊиС, ĐŋĐžĐˇĐ¸Ņ†Đ¸Ņ $INDEX$ $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Đ Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "fileSend": { + "message": "ФаКĐģĐžĐ˛Đ°Ņ Send" + }, + "fileSends": { + "message": "ФаКĐģĐžĐ˛Đ°Ņ Send" + }, + "textSend": { + "message": "ĐĸĐĩĐēŅŅ‚ĐžĐ˛Đ°Ņ Send" + }, + "textSends": { + "message": "ĐĸĐĩĐēŅŅ‚ĐžĐ˛Đ°Ņ Send" + }, + "bitwardenNewLook": { + "message": "ĐŖ Bitwarden ĐŊĐžĐ˛Ņ‹Đš ОйĐģиĐē!" + }, + "bitwardenNewLookDesc": { + "message": "ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊиĐĩ и ĐŋĐžĐ¸ŅĐē ĐŊа вĐēĐģадĐēĐĩ ĐĨŅ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ ŅŅ‚Đ°Đģи ĐŋŅ€ĐžŅ‰Đĩ и иĐŊŅ‚ŅƒĐ¸Ņ‚Đ¸Đ˛ĐŊĐž ĐŋĐžĐŊŅŅ‚ĐŊĐĩĐĩ, ҇ĐĩĐŧ ĐēĐžĐŗĐ´Đ°-ĐģийО. ĐžŅĐŧĐžŅ‚Ņ€Đ¸Ņ‚ĐĩҁҌ!" + }, + "accountActions": { + "message": "ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ ҁ аĐēĐēĐ°ŅƒĐŊŅ‚ĐžĐŧ" + }, + "showNumberOfAutofillSuggestions": { + "message": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚ĐžĐ˛ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ ĐģĐžĐŗĐ¸ĐŊа ĐŊа СĐŊĐ°Ņ‡ĐēĐĩ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐ¸Ņ" + }, + "systemDefault": { + "message": "ĐĄĐ¸ŅŅ‚ĐĩĐŧĐŊŅ‹Đš" + }, + "enterprisePolicyRequirementsApplied": { + "message": "К ŅŅ‚ĐžĐš ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐĩ ĐąŅ‹Đģи ĐŋŅ€Đ¸ĐŧĐĩĐŊĐĩĐŊŅ‹ ҂ҀĐĩйОваĐŊĐ¸Ņ ĐēĐžŅ€ĐŋĐžŅ€Đ°Ņ‚Đ¸Đ˛ĐŊОК ĐŋĐžĐģĐ¸Ņ‚Đ¸Đēи" + }, + "sshPrivateKey": { + "message": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Đš ĐēĐģŅŽŅ‡" + }, + "sshPublicKey": { + "message": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš ĐēĐģŅŽŅ‡" + }, + "sshFingerprint": { + "message": "ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚ĐžĐē" + }, + "sshKeyAlgorithm": { + "message": "ĐĸиĐŋ ĐēĐģŅŽŅ‡Đ°" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ" + }, + "vaultCustomTimeoutMinimum": { + "message": "МиĐŊиĐŧаĐģҌĐŊŅ‹Đš ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК Ņ‚Đ°ĐšĐŧ-Đ°ŅƒŅ‚ ŅĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ 1 ĐŧиĐŊŅƒŅ‚Ņƒ." + }, + "additionalContentAvailable": { + "message": "ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ" + }, + "fileSavedToDevice": { + "message": "ФаКĐģ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊ ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đĩ. ĐŖĐŋŅ€Đ°Đ˛ĐģŅĐšŅ‚Đĩ иĐŧ иС ĐˇĐ°ĐŗŅ€ŅƒĐˇĐžĐē ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°." + }, + "showCharacterCount": { + "message": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ŅĐ¸ĐŧвОĐģОв" + }, + "hideCharacterCount": { + "message": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ŅĐ¸ĐŧвОĐģОв" + }, + "itemsInTrash": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ в ĐēĐžŅ€ĐˇĐ¸ĐŊĐĩ" + }, + "noItemsInTrash": { + "message": "НĐĩŅ‚ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ в ĐēĐžŅ€ĐˇĐ¸ĐŊĐĩ" + }, + "noItemsInTrashDesc": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ˛Ņ‹ ŅƒĐ´Đ°ĐģŅĐĩŅ‚Đĩ, ĐŋĐžŅĐ˛ŅŅ‚ŅŅ СдĐĩҁҌ и ĐąŅƒĐ´ŅƒŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ҇ĐĩŅ€ĐĩС 30 Đ´ĐŊĐĩĐš" + }, + "trashWarning": { + "message": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐąŅ‹Đģи в ĐēĐžŅ€ĐˇĐ¸ĐŊĐĩ йОĐģĐĩĐĩ 30 Đ´ĐŊĐĩĐš, ĐąŅƒĐ´ŅƒŅ‚ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹" + }, + "restore": { + "message": "Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ" + }, + "deleteForever": { + "message": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°" + }, + "noEditPermissions": { + "message": "ĐŖ Đ˛Đ°Ņ ĐŊĐĩŅ‚ Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ ĐŊа Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ŅŅ‚ĐžĐŗĐž ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°" + }, + "authenticating": { + "message": "ĐŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ" + }, + "fillGeneratedPassword": { + "message": "ЗаĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ ŅĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊ", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐģĐžĐŗĐ¸ĐŊ в Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "ĐŸŅ€ĐžĐąĐĩĐģ", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "ĐĸиĐģŅŒĐ´Đ°", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "ĐšĐ°Đ˛Ņ‹Ņ‡Đēа", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Đ’ĐžŅĐēĐģĐ¸Ņ†Đ°Ņ‚ĐĩĐģҌĐŊŅ‹Đš СĐŊаĐē", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "ХиĐŧвОĐģ At", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "ХиĐŧвОĐģ Ņ…ŅŅˆĐ°", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "ХиĐŧвОĐģ Đ´ĐžĐģĐģĐ°Ņ€Đ°", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "ХиĐŧвОĐģ ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚Đ°", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "ĐšĐ°Ņ€Đĩ", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "АĐŧĐŋĐĩŅ€ŅĐ°ĐŊĐ´", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "ЗвĐĩĐˇĐ´ĐžŅ‡Đēа", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "ЛĐĩĐ˛Đ°Ņ ĐēŅ€ŅƒĐŗĐģĐ°Ņ ҁĐēОйĐēа", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "ĐŸŅ€Đ°Đ˛Đ°Ņ ĐēŅ€ŅƒĐŗĐģĐ°Ņ ҁĐēОйĐēа", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "ĐŸĐžĐ´Ņ‡ĐĩŅ€ĐēиваĐŊиĐĩ", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "ДĐĩŅ„Đ¸Ņ", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "ПĐģŅŽŅ", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "РавĐŊĐž", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "ЛĐĩĐ˛Đ°Ņ Ņ„Đ¸ĐŗŅƒŅ€ĐŊĐ°Ņ ҁĐēОйĐēа", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "ĐŸŅ€Đ°Đ˛Đ°Ņ Ņ„Đ¸ĐŗŅƒŅ€ĐŊĐ°Ņ ҁĐēОйĐēа", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "ЛĐĩĐ˛Đ°Ņ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊĐ°Ņ ҁĐēОйĐēа", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "ĐŸŅ€Đ°Đ˛Đ°Ņ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊĐ°Ņ ҁĐēОйĐēа", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "ВĐĩŅ€Ņ‚Đ¸ĐēаĐģҌĐŊĐ°Ņ ҇ĐĩŅ€Ņ‚Đ°", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "ĐžĐąŅ€Đ°Ņ‚ĐŊŅ‹Đš ҁĐģŅŅˆ", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "ДвоĐĩŅ‚ĐžŅ‡Đ¸Đĩ", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "ĐĸĐžŅ‡Đēа ҁ СаĐŋŅŅ‚ĐžĐš", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "ДвойĐŊŅ‹Đĩ ĐēĐ°Đ˛Ņ‹Ņ‡Đēи", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "ОдиĐŊĐ°Ņ€ĐŊĐ°Ņ ĐēĐ°Đ˛Ņ‹Ņ‡Đēа", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "МĐĩĐŊҌ҈Đĩ", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "БоĐģҌ҈Đĩ", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "ЗаĐŋŅŅ‚Đ°Ņ", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "ĐĸĐžŅ‡Đēа", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "ВоĐŋŅ€ĐžŅĐ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš СĐŊаĐē", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "ĐĄĐģŅŅˆ", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "ĐĄŅ‚Ņ€ĐžŅ‡ĐŊŅ‹Đĩ ĐąŅƒĐēĐ˛Ņ‹" + }, + "uppercaseAriaLabel": { + "message": "Đ—Đ°ĐŗĐģавĐŊŅ‹Đĩ ĐąŅƒĐēĐ˛Ņ‹" + }, + "generatedPassword": { + "message": "ĐĄĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 2c9a44b2afe..d642e31ba28 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -3,21 +3,39 @@ "message": "āļļ⎒āļ§āˇŠāˇ€āˇāļŠāļąāˇŠ" }, "extName": { - "message": "āļļ⎒āļ§āˇŠāˇ€āˇāļŠāļąāˇŠ - āļąāˇœāļ¸āˇ’āļŊ⎚ āļ¸āˇ”āļģāļ´āļ¯āļē āļšāˇ…āļ¸āļąāˇāļšāļģ⎔", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "āļ”āļļāļœāˇš āˇƒāˇ’āļēāļŊ⎔ āļ‹āļ´āˇāļ‚āļœ āˇƒāļŗāˇ„āˇ āļ†āļģāļšāˇŠāˇ‚⎒āļ­ āˇƒāˇ„ āļąāˇœāļ¸āˇ’āļŊ⎚ āļ¸āˇ”āļģāļ´āļ¯ āļšāˇ…āļ¸āļĢāˇāļšāļģ⎔⎀⎙āļšāˇ”.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "āļ”āļļāļœāˇš āļ†āļģāļšāˇŠāˇ‚⎒āļ­ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē ⎀⎙āļ­ āļ´āˇ’āˇ€āˇ’āˇƒāˇ“āļ¸āļ§ āˇ„āˇ āļąāˇ€ āļœāˇ’āļĢ⎔āļ¸āļšāˇŠ āļąāˇ’āļģ⎊āļ¸āˇāļĢāļē āļšāļģāļąāˇŠāļą." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "āļœāˇ’āļĢ⎔āļ¸āļšāˇŠ āˇƒāˇāļ¯āļąāˇŠāļą" }, - "login": { - "message": "āļ´āˇ’āˇ€āˇ’āˇƒāˇ™āļąāˇŠāļą" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "āˇ€āˇŠāļēāˇ€āˇƒāˇāļē āļ­āļąāˇ’ ⎃āļ‚āļĨāˇ āļ¸āļ­" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "āļ”āļļ āļ‘āļē āļ…āļ¸āļ­āļš āļąāļ¸āˇŠ āļ”āļļ⎚ āļ¸āˇ”āļģāļ´āļ¯āļē āļ¸āļ­āļš āļ­āļļāˇ āļœāˇāļąāˇ“āļ¸āļ§ āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯ āļ‰āļŸāˇ’āļēāļšāˇŠ āļ”āļļāļ§ āļ‹āļ´āļšāˇāļģ āļšāˇ… ⎄⎐āļšāˇ’āļē." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "āļąāˇāˇ€āļ­ āˇ€āļģ⎊āļœāļē āļ¸āˇāˇƒāˇŠāļ§āļģ⎊ āļ¸āˇ”āļģāļ´āļ¯āļē" }, "masterPassHint": { "message": "āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯āļē āļ‰āļŸāˇ’āļēāļšāˇŠ (⎀⎒āļšāļŊ⎊āļ´)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "āļ§āˇāļļ⎊" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "āļ¸āˇ”āļģāļ´āļ¯āļē āļ´āˇ’āļ§āļ´āļ­āˇŠ āļšāļģāļąāˇŠāļą" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "⎃āļ§āˇ„āļą āļ´āˇ’āļ§āļ´āļ­āˇŠ āļšāļģāļąāˇŠāļą" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "āļ†āļģāļšāˇŠāˇ‚āļš āļšāˇšāļ­āļē āļ´āˇ’āļ§āļ´āļ­āˇŠ āļšāļģāļąāˇŠāļą" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "āˇƒāˇŠāˇ€āļēāļ‚-āļ´āˇ’āļģ⎀⎓āļ¸" }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" + }, "generatePasswordCopied": { "message": "āļ¸āˇ”āļģāļ´āļ¯āļē āļĸāļąāļąāļē (āļ´āˇ’āļ§āļ´āļ­āˇŠ)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "āļœāˇāļŊāļ´āˇ™āļą āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸āˇŠ āļąāˇœāļ¸āˇāļ­." }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -115,6 +231,18 @@ "addItem": { "message": "āļ…āļē⎒āļ­āļ¸āļē āļ‘āļšāļ­āˇ” āļšāļģāļąāˇŠāļą" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "āļ¸āˇ”āļģāļ´āļ¯āļē āļ‰āļŸāˇ’āļē" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "āļ¯āˇ’āļœāļ§āļ¸ āļšāļģāļœāˇ™āļą āļēāˇāļ¸āļ§ āļ”āļļāļœāˇš āļ…āļąāļąāˇŠāļēāļ­āˇāˇ€āļē āļ­āˇ„⎀⎔āļģ⎔ āļšāļģāļąāˇŠāļą." }, - "account": { - "message": "āļœāˇ’āļĢ⎔āļ¸" - }, "changeMasterPassword": { "message": "āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯āļē ⎀⎙āļąāˇƒāˇŠ" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "āļ‡āļŸāˇ’āļŊ⎒ ⎃āļŊāļšāˇ”āļĢ⎔ āˇ€āˇāļšāˇŠāļē āļ›āļĢ⎊āļŠāļē", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "āļąāˇ’āļšāˇŠāļ¸āˇ™āļąāˇŠāļą" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "āļ´āˇ’āļŊ⎒āļļāļŗāˇ€" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "āļ…āļąāˇ”āˇ€āˇāļ¯āļē" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "āļļāˇ„āˇāļŊ⎔āļ¸ āˇƒāļ‚āˇƒāˇŠāļšāļģāļĢāļē" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "āˇ†āˇāļŊ⎊āļŠāļģāļē āļ¸āļšāļąāˇŠāļą" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "āļ‹āļ­āˇŠāļ´āˇāļ¯āļš āļēāļąāˇŠāļ­āˇŠāļģāļē", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "āļ”āļļ⎚ āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸āˇŠ ⎃āļŗāˇ„āˇ ⎁āļšāˇŠāļ­āˇ’āļ¸āļ­āˇŠ, āļ…āļ¯āˇŠāˇ€āˇ’āļ­āˇ“āļē āļ¸āˇ”āļģāļ´āļ¯ āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē⎀ āļĸāļąāļąāļē āļšāļģāļąāˇŠāļą." }, - "bitWebVault": { - "message": "āļļ⎒āļ§āˇŠāˇ€āļģ⎊āļŠāļąāˇŠ ⎀⎙āļļ⎊ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "āļ†āļąāļēāļą āļ…āļē⎒āļ­āļ¸" @@ -235,6 +435,9 @@ "generatePassword": { "message": "āļ¸āˇ”āļģāļ´āļ¯āļē āļĸāļąāļąāļē āļšāļģāļąāˇŠāļą" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "āļ¸āˇ”āļģāļ´āļ¯āļē āļ´āˇŠāļģāļ­āˇ’āļĸāļąāļąāļē" }, @@ -244,17 +447,60 @@ "length": { "message": "āļ¯āˇ’āļœ" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "⎀āļ āļą āļœāļĢāļą" @@ -276,7 +522,16 @@ "message": "āļ…⎀āļ¸ āˇ€āˇ’āˇāˇšāˇ‚" }, "avoidAmbChar": { - "message": "āļ…āļ´āˇāˇ„⎐āļ¯āˇ’āļŊ⎒ āļ āļģ⎒āļ­ āˇ€āļŊ⎒āļąāˇŠ ⎀⎅āļšāˇ’āļąāˇŠāļą" + "message": "āļ…āļ´āˇāˇ„⎐āļ¯āˇ’āļŊ⎒ āļ āļģ⎒āļ­ āˇ€āļŊ⎒āļąāˇŠ ⎀⎅āļšāˇ’āļąāˇŠāļą", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē ⎃⎜āļēāļąāˇŠāļą" @@ -299,15 +554,30 @@ "password": { "message": "āļ¸āˇ”āļģāļ´āļ¯āļē" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "āļ´āˇāˇƒāˇŠāļ´āˇŠāļģ⎃⎊" }, "favorite": { "message": "āļ´āˇŠâ€āļģ⎒āļēāļ­āļ¸āļē" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "⎃āļ§āˇ„āļąāˇŠ" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "⎃āļ§āˇ„āļą" }, @@ -326,6 +596,18 @@ "launch": { "message": "āļ¯āˇ’āļēāļ­āˇŠāļšāļģāļąāˇŠāļą" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "⎀⎒āļēāļ¸āļą āļ…āļŠāˇ€āˇ’āļē" }, @@ -338,9 +620,24 @@ "other": { "message": "⎀⎙āļąāļ­āˇŠ" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "āļ¯āˇ’āļœāˇ”⎀ āļ…āļąāˇ”āļ´āˇāļ­āļē" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "āļ”āļļ⎚ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē āļ…āļœāˇ”⎅⎔ āļ¯āļ¸āˇ āļ‡āļ­. āļ¯āˇ’āļœāļ§āļ¸ āļšāļģāļœāˇ™āļą āļēāˇāļ¸āļ§ āļ”āļļ⎚ āļ…āļąāļąāˇŠāļēāļ­āˇāˇ€āļē ⎃āļ­āˇŠāļēāˇāļ´āļąāļē āļšāļģāļąāˇŠāļą." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "āļ…āļœāˇ”āļŊ⎔⎄āļģ⎒āļąāˇŠāļą" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē āˇ€āˇšāļŊāˇāˇ€" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "āļ¯āˇāļąāˇŠ āļ…āļœāˇ”āļŊ⎔āļ¯āļ¸āļąāˇŠāļą" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "āˇ€āˇ„āˇāļ¸" }, @@ -426,6 +738,18 @@ "security": { "message": "āļ†āļģāļšāˇŠāˇ‚āˇāˇ€" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "āļ¯āˇāˇ‚āļēāļšāˇŠ āˇƒāˇ’āļ¯āˇ”⎀⎓ āļ‡āļ­" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "āļ”āļļāļœāˇš āļąāˇ€ āļœāˇ’āļĢ⎔āļ¸ āļąāˇ’āļģ⎊āļ¸āˇāļĢāļē āļšāļģ āļ‡āļ­! āļ”āļļāļ§ āļ¯āˇāļąāˇŠ āļŊ⎜āļœāˇŠ ⎀⎒āļē ⎄⎐āļšāˇ’āļē." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "āļ”āļļāļœāˇš āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯āļē āļ‰āļŸāˇ’āļēāļšāˇŠ ⎃āļ¸āļŸ āļ…āļ´āˇ’ āļ”āļļāļ§ āˇ€āˇ’āļ¯āˇŠāļē⎔āļ­āˇŠ āļ­āˇāļ´āˇ‘āļŊāļšāˇŠ āļēāˇ€āˇ āļ‡āļ­āˇŠāļ­āˇ™āļ¸āˇ”." }, "verificationCodeRequired": { "message": "⎃āļ­āˇŠāļēāˇāļ´āļą āļšāˇšāļ­āļē āļ…āˇ€āˇāˇŠāļē āˇ€āˇš." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "⎀āļŊāļ‚āļœāˇ” āļąāˇœāˇ€āļą āˇƒāļ­āˇŠāļēāˇāļ´āļą āļšāˇšāļ­āļē" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "āļ¸āˇ™āļ¸ āļ´āˇ’āļ§āˇ”āˇ€āˇš āļ­āˇāļģāˇāļœāļ­āˇŠ āļ…āļē⎒āļ­āļ¸āļē āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē⎀ āļ´āˇ’āļģ⎀⎒āļē āļąāˇœāˇ„⎐āļš. āļ’ āˇ€āˇ™āļąāˇ”⎀āļ§ āļ­āˇœāļģāļ­āˇ”āļģ⎔ āļ´āˇ’āļ§āļ´āļ­āˇŠ āļšāļģ āļ…āļŊ⎀āļąāˇŠāļą." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "āļŊ⎜āļœāˇ’āļąāˇŠ ⎀⎓" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "āļ”āļļāļœāˇš āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸āˇŠ āˇƒāˇāˇƒāˇ’āļē āļšāļŊ⎊ āļ‰āļšāˇ”āļ­āˇŠ ⎀⎓ āļ‡āļ­." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "āļ”āļļāļ§ āļŊ⎜āļœāˇŠ ⎀⎓āļ¸āļ§ āļ…āˇ€āˇāˇŠāļē āļļ⎀ āļ”āļļāļ§ āˇ€āˇ’āˇāˇŠāˇ€āˇāˇƒāļ¯?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "āļ‘āļšāļ­āˇ” āļšāļģāļą āļŊāļ¯ āˇ†āˇāļŊ⎊āļŠāļģāļē" }, - "changeMasterPass": { - "message": "āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯āļē ⎀⎙āļąāˇƒāˇŠ" - }, - "changeMasterPasswordConfirmation": { - "message": "bitwarden.com ⎀⎙āļļ⎊ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē⎚ āļ”āļļ⎚ āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯āļē ⎀⎙āļąāˇƒāˇŠ āļšāˇ… ⎄⎐āļšāˇ’āļē. āļ”āļļāļ§ āļ¯āˇāļąāˇŠ ⎀⎙āļļ⎊ āļ…āļŠāˇ€āˇ’āļēāļ§ āļ´āˇ’āˇ€āˇ’āˇƒāˇ“āļ¸āļ§ āļ…āˇ€āˇāˇŠāļēāļ¯?" - }, "twoStepLoginConfirmation": { "message": "āļ†āļģāļšāˇŠāˇ‚āļš āļēāļ­āˇ”āļģāļšāˇŠ, ⎃āļ­āˇŠāļēāˇāļ´āļą āļē⎙āļ¯āˇ”āļ¸, āļšāˇ™āļ§āˇ’ āļ´āļĢ⎒⎀⎔āļŠ, āļ¯āˇ”āļģāļšāļŽāļą āļ‡āļ¸āļ­āˇ”āļ¸āļšāˇŠ āˇ„āˇ ⎀⎒āļ¯āˇŠāļē⎔āļ­āˇŠ āļ­āˇāļ´āˇ‘āļŊ ⎀⎐āļąāˇ’ ⎀⎙āļąāļ­āˇŠ āļ‹āļ´āˇāļ‚āļœāļēāļšāˇŠ ⎃āļ¸āļŸ āļ”āļļ⎚ āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸ āˇƒāļ­āˇŠāļēāˇāļ´āļąāļē āļšāˇ’āļģ⎓āļ¸āļ§ āļ”āļļāļ§ āļ…āˇ€āˇāˇŠāļē ⎀⎓āļ¸āˇ™āļąāˇŠ āļ¯āˇŠāˇ€āˇ’-āļ´āˇ’āļē⎀āļģ āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸ āļ”āļļāļœāˇš āļœāˇ’āļĢ⎔āļ¸ āˇ€āļŠāˇāļ­āˇŠ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­ āļšāļģāļē⎒. āļļ⎒āļ§āˇŠāˇ€āˇœāļąāˇŠ.com ⎀⎙āļļ⎊ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē⎚ āļ¯āˇŠāˇ€āˇ’-āļ´āˇ’āļē⎀āļģ āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸ āˇƒāļšāˇŠāļģ⎓āļē āļšāˇ… ⎄⎐āļšāˇ’āļē. āļ”āļļāļ§ āļ¯āˇāļąāˇŠ ⎀⎙āļļ⎊ āļ…āļŠāˇ€āˇ’āļēāļ§ āļ´āˇ’āˇ€āˇ’āˇƒāˇ“āļ¸āļ§ āļ…āˇ€āˇāˇŠāļēāļ¯?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "⎃āļ‚āˇƒāˇŠāļšāļģāļĢāļē āˇ†āˇāļŊ⎊āļŠāļģāļē" }, @@ -552,6 +936,10 @@ "newUri": { "message": "āļąāˇ€ ⎀āļģ⎊āļœāļē" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "āļ‘āļšāļ­āˇ” āļšāļģāļą āļŊāļ¯ āļ…āļē⎒āļ­āļ¸āļē" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "āļ¸āˇ™āļ¸ â€œāļŊ⎜āļœāˇ’āļąāˇŠ ⎀āļąāˇŠāļą āļąāˇ’āˇ€āˇšāļ¯āļąāļē āļ‘āļšāļ­āˇ” āļšāļģāļąāˇŠāļąâ€ āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē⎀ āļ”āļļ āļ´āˇ…āļ¸āˇ” ⎀āļģāļ§ āļ”⎀⎔āļąāˇŠ āļ­āˇ”āļŊāļ§ āļ´āˇŠāļģāˇ€āˇ’āˇ‚āˇŠāļ§ āˇƒāˇ‘āļ¸ āļ…āˇ€āˇƒāˇŠāļŽāˇāˇ€āļšāļ¯āˇ“āļ¸ āļ”āļļāļœāˇš āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē āļąāˇ€ āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸āˇŠ āļļ⎚āļģāˇ āļœāˇāļąāˇ“āļ¸āļ§ āļ”āļļ⎙āļąāˇŠ ⎀⎒āļ¸āˇƒāļąāˇ”." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "āļ´āˇƒāˇ”āļģ⎔ āļ´āˇ”⎀āļģ⎔⎀āļ§ āļ´āˇāˇ„⎐āļ¯āˇ’āļŊ⎒", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Bitwarden ⎄⎒ āļ¸āˇ™āļ¸ āļ¸āˇ”āļģāļ´āļ¯āļē āļēāˇāˇ€āļ­āˇŠāļšāˇāļŊ⎓āļą āļšāˇ’āļģ⎓āļ¸āļ§ āļ”āļļāļ§ āļ…āˇ€āˇāˇŠāļēāļ¯?" }, @@ -634,20 +1043,26 @@ "message": "āļēāˇāˇ€āļ­āˇŠāļšāˇāļŊ" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "āļ´āˇ™āļģāļąāˇ’āļ¸āˇ’ URI āļ­āļģāļœ āˇ„āļŗāˇ”āļąāˇ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "āļ‘⎀⎐āļąāˇ’ āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē-āļ´āˇ’āļģ⎀⎓āļ¸ āļŊāˇ™āˇƒ āļšāˇŠāļģ⎒āļēāˇ āˇƒāˇ’āļ¯āˇ” āļšāļģāļą āˇ€āˇ’āļ§ URI āļ­āļģāļœāļē ⎄āļŗāˇ”āļąāˇ āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸āˇŠ ⎃āļŗāˇ„āˇ āļšāļ§āļē⎔āļ­āˇ” āļšāļģāļą āļļ⎀ āļ´āˇ™āļģāļąāˇ’āļ¸āˇ’ āļ¸āˇāļģ⎊āļœāļē āļ­āˇāļģāļąāˇŠāļą." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "āļē⎙āļ¯āˇ”āļ¸āˇš ⎀āļģ⎊āļĢ āļ­āˇšāļ¸āˇāˇ€ ⎀⎙āļąāˇƒāˇŠ āļšāļģāļąāˇŠāļą." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "āļ…āļŗāˇ”āļģ⎔", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "āļ…āļŗāˇ”āļģ⎔ āļ…āļŗāˇ”āļģ⎔", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "āļ…āļ´āļąāļēāļą āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē" }, "fileFormat": { "message": "āļœāˇœāļąāˇ” āļ†āļšāˇ˜āļ­āˇ’āļē" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "āļ…āˇ€āˇ€āˇāļ¯āļēāļē⎒", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "āļļ⎙āļ¯āˇāļœāļ­āˇŠ" }, - "learnOrg": { - "message": "⎃āļ‚⎀⎒āļ°āˇāļą āļœāˇāļą āļ‰āļœāˇ™āļą āļœāļąāˇŠāļą" - }, - "learnOrgConfirmation": { - "message": "⎃āļ‚⎀⎒āļ°āˇāļąāļēāļšāˇŠ āļˇāˇāˇ€āˇ’āļ­āˇ āļšāˇ’āļģ⎓āļ¸āˇ™āļąāˇŠ āļ”āļļ⎚ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē āļ…āļē⎒āļ­āļ¸ āļ…āļąāˇŠ āļ…āļē ⎃āļ¸āļŸ āļļ⎙āļ¯āˇ āļœāˇāļąāˇ“āļ¸āļ§ Bitwarden āļ”āļļāļ§ āļ‰āļŠ āļ¯āˇ™āļē⎒. ⎀⎐āļŠāˇ’ āˇ€āˇ’āˇƒāˇŠāļ­āļģ āļ¯āˇāļąāļœāˇāļąāˇ“āļ¸ āˇƒāļŗāˇ„āˇ bitwarden.com ⎀⎙āļļ⎊ āļ…āļŠāˇ€āˇ’āļēāļ§ āļ´āˇ’āˇ€āˇ’āˇƒāˇ“āļ¸āļ§ āļ”āļļ āļšāˇāļ¸āļ­āˇ’āļ¯?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "⎃āļ‚⎀⎒āļ°āˇāļąāļē ⎀⎙āļ­ āļœāˇ™āļąāļēāļąāˇŠāļą" @@ -762,6 +1204,9 @@ "file": { "message": "āļœāˇœāļąāˇ”⎀" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "āļœāˇœāļąāˇ”⎀āļšāˇŠ āļ­āˇāļģāļąāˇŠāļą." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "āļœāˇœāļąāˇ” āļ‡āļ¸āˇ”āļĢ⎔āļ¸āˇŠ ⎃āļŗāˇ„āˇ 1 GB ⎃āļ‚āļšāˇšāļ­āˇāļ­āˇŠāļ¸āļš āļœāļļāļŠāˇ." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "āļ”āļļāļ§ bitwarden.com ⎀⎙āļļ⎊ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē⎚ āˇ€āˇāļģ⎒āļš āˇƒāˇāļ¸āˇāļĸ⎒āļšāļ­āˇŠāˇ€āļē āļ¸āˇ’āļŊāļ¯āˇ“ āļœāļ­ āˇ„āˇāļšāˇ’āļē. āļ”āļļāļ§ āļ¯āˇāļąāˇŠ ⎀⎙āļļ⎊ āļ…āļŠāˇ€āˇ’āļēāļ§ āļ´āˇ’āˇ€āˇ’āˇƒāˇ“āļ¸āļ§ āļ…āˇ€āˇāˇŠāļēāļ¯?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "āļ”āļļ āˇ€āˇāļģ⎒āļš āˇƒāˇāļ¸āˇāļĸ⎒āļšāļē⎙āļšāˇŠ!" }, "premiumCurrentMemberThanks": { "message": "āļļ⎒āļ§āˇŠāˇ€āļģ⎊āļŠāļąāˇŠāļ§ āˇƒāˇ„āˇāļē ⎀⎓āļ¸ āļœāˇāļą āˇƒāˇŠāļ­āˇ–āļ­āˇ’āļē⎒." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "āˇƒāˇ’āļēāļŊ⎊āļŊ $PRICE$ /āļ…⎀⎔āļģ⎔āļ¯āˇŠāļ¯ āˇƒāļŗāˇ„āˇ!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "⎃āļ¸āˇŠāļ´āˇ–āļģ⎊āļĢ āļąāˇāˇ€āˇ”āļ¸āˇŠ āļšāļģāļąāˇŠāļą" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "⎃āļ­āˇŠāļēāˇāļ´āļą āļē⎙āļ¯āˇ”āļ¸" }, - "authenticatorAppDesc": { - "message": "āļšāˇāļŊāļē āļ¸āļ­ āļ´āļ¯āļąāļ¸āˇŠ ⎀⎖ ⎃āļ­āˇŠāļēāˇāļ´āļą āļšāˇšāļ­ āļĸāļąāļąāļē āļšāˇ’āļģ⎓āļ¸ āˇƒāļŗāˇ„āˇ ⎃āļ­āˇŠāļēāˇāļ´āļą āļē⎙āļ¯āˇ”āļ¸āļšāˇŠ (⎃āļ­āˇŠāļēāˇāļ´āļą āˇ„āˇ āļœāˇ–āļœāļŊ⎊ ⎃āļ­āˇŠāļēāˇāļ´āļą āˇ€āˇāļąāˇ’) āļˇāˇāˇ€āˇ’āļ­āˇ āļšāļģāļąāˇŠāļą.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP āļ†āļģāļšāˇŠāˇ‚āļš āļēāļ­āˇ”āļģ" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "āļ”āļļāļœāˇš āļœāˇ’āļĢ⎔āļ¸āļ§ āļ´āˇŠāļģāˇ€āˇšāˇ ⎀⎓āļ¸āļ§ YuBiKey āļˇāˇāˇ€āˇ’āļ­āˇ āļšāļģāļąāˇŠāļą. YuBiKey 4, 4 āļąāˇāļąāˇ, 4C, āˇƒāˇ„ NEO āļ‹āļ´āˇāļ‚āļœ āˇƒāļ¸āļŸ āļšāˇŠāļģ⎒āļēāˇ āļšāļģāļē⎒." }, - "duoDesc": { - "message": "Duo āļĸāļ‚āļœāļ¸ āļē⎙āļ¯āˇ”āļ¸, āļšāˇ™āļ§āˇ’ āļ´āļĢ⎒⎀⎔āļŠ, āļ¯āˇ”āļģāļšāļŽāļą āļ‡āļ¸āļ­āˇ”āļ¸āļšāˇŠ, āˇ„āˇ U2F āļ†āļģāļšāˇŠāˇ‚āļš āļēāļ­āˇ”āļģ āļˇāˇāˇ€āˇ’āļ­āˇ āļšāļģāļ¸āˇ’āļąāˇŠ Duo āļ†āļģāļšāˇŠāˇ‚āļš āˇƒāļ¸āļŸ āļ­āˇ„⎀⎔āļģ⎔ āļšāļģāļąāˇŠāļą.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "āļŠ-āļ­āˇāļ´āˇāļŊ⎊" }, - "emailDesc": { - "message": "⎃āļ­āˇŠāļēāˇāļ´āļą āļšāˇšāļ­ āļ”āļļāļ§ āˇ€āˇ’āļ¯āˇŠāļē⎔āļ­āˇŠ āļ­āˇāļ´āˇāļŊ⎊ āļšāļģāļąāˇ” āļ‡āļ­." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "āˇƒāˇŠāˇ€āļēāļ‚ āˇƒāļ­āˇŠāļšāˇāļģāļš āļ´āļģāˇ’āˇƒāļģāļē" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "āļļ⎒āļ§āˇŠāˇ€āļģ⎊āļŠāļąāˇŠ ⎃⎊āļŽāˇāļ´āļąāļē ⎃āļ­āˇŠāļšāˇāļģāļšāļ­āˇŠāˇ€āļē āļ¯āļģāļąāˇ” āļŊāļļāļą āļ”āļļāļœāˇš āļ´āļģāˇ’āˇāˇŠāļģāļē⎚ āļ¸āˇ–āļŊ⎒āļš URL āļ‘āļš āˇƒāļŗāˇ„āļąāˇŠ āļšāļģāļąāˇŠāļą." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "āļ…āļˇāˇ’āļģ⎔āļ āˇ’ āļ´āļģāˇ’āˇƒāļģāļē" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "āˇƒāˇšāˇ€āˇāļ¯āˇāļēāļšāļē URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API āˇƒāˇšāˇ€āˇāļ¯āˇāļēāļšāļē URL" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "āļ´āļģāˇ’āˇƒāļģ URL āˇƒāˇ”āļģāļšāˇ’āļąāˇ” āļ‡āļ­." }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "āļ´āˇ’āļ§āˇ” āļ´āˇāļ§āˇ€āˇ”āļ¸āˇŠ āļ¸āļ­ āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē-āļ´āˇ’āļģ⎀⎓āļ¸ āˇƒāļšāˇŠāļģ⎓āļē" }, "enableAutoFillOnPageLoadDesc": { "message": "āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸āˇŠ āļ´āˇāļģāļ¸āļēāļšāˇŠ āļ…āļąāˇāˇ€āļģāļĢāļē āļšāļģ āļ‡āļ­āˇŠāļąāļ¸āˇŠ, ⎀⎙āļļ⎊ āļ´āˇ’āļ§āˇ”⎀ āļ´āˇāļ§āˇ€āˇ”āļ¸āˇŠ āļšāļģāļą āˇ€āˇ’āļ§ āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē⎀ āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē⎀ āļ´āˇ’āļģ⎀⎓āļ¸ āˇƒāˇ’āļ¯āˇ” āļšāļģāļąāˇŠāļą." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸āˇŠ āļ…āļē⎒āļ­āļ¸ āˇƒāļŗāˇ„āˇ āļ´āˇ™āļģāļąāˇ’āļ¸āˇ’ autofill ⎃⎐āļšāˇƒāˇ”āļ¸" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "āļ´āˇāļ­āˇ’ āļ­āˇ“āļģāˇ”āˇ€āˇš āˇ€āˇ’āˇ€āˇ˜āļ­ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē" }, - "commandAutofillDesc": { - "message": "⎀āļ­āˇŠāļ¸āļąāˇŠ ⎀⎙āļļ⎊ āļ…āļŠāˇ€āˇ’āļē ⎃āļŗāˇ„āˇ āļ…āˇ€āˇƒāļąāˇŠ ⎀āļģāļ§ āļˇāˇāˇ€āˇ’āļ­āˇ āļšāļģāļą āļŊāļ¯ āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸ āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē-āļ´āˇ”āļģ⎀āļąāˇŠāļą" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "āļ´āˇƒāˇ”āļģ⎔ āļ´āˇ”⎀āļģ⎔⎀āļ§ āļąāˇ€ āļ…⎄āļšāˇ” āļ¸āˇ”āļģāļ´āļ¯āļēāļšāˇŠ āļĸāļąāļąāļē āļšāļģ āļ´āˇ’āļ§āļ´āļ­āˇŠ āļšāļģāļąāˇŠāļą" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē āļŊ⎜āļšāˇŠ āļšāļģāļąāˇŠāļą" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "āļ…āļˇāˇ’āļģ⎔āļ āˇ’ āļšāˇŠāˇ‚āˇšāļ­āˇŠāļģ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "āļļ⎖āļŊ⎒āļēāļąāˇŠ" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "⎃āļ¸āˇŠāļļāļąāˇŠāļ°āˇ’āļ­", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "āļ…āļąāļąāˇŠāļēāļ­āˇāˇ€āļē" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "āļ¸āˇ”āļģāļ´āļ¯ āļ‰āļ­āˇ’āˇ„āˇāˇƒāļē" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "āļ†āļ´āˇƒāˇ”" }, "collections": { "message": "āļ‘āļšāļ­āˇ”⎀" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "āļ´āˇŠāļģ⎒āļēāļ­āļ¸ āļ¯āˇāļąāˇŠāˇ€āˇ“āļ¸āˇŠ" }, @@ -1282,6 +1874,10 @@ "message": "āļ¸āˇ–āļŊ⎒āļš āˇ€āˇƒāļ¸", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "āļ­āļģāļœāļē ⎄āļŗāˇ”āļąāˇ", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "āļ´āˇ™āļģāļąāˇ’āļ¸āˇ’ āļ­āļģāļœāļē ⎄āļŗāˇ”āļąāˇ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "āļ§āˇœāļœāļŊ⎊ āļšāļģāļąāˇŠāļą āˇ€āˇ’āļšāļŊ⎊āļ´" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "āļŊ⎐āļēāˇ’āˇƒāˇŠāļ­āˇ” āļœāļ­ āļšāˇ’āļģ⎓āļ¸āļ§ āļ¸āˇ”āļģāļ´āļ¯ āļąāˇœāļ¸āˇāļ­." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "āļ‰āˇ€āļ­āˇŠ āļšāļģāļąāˇŠāļą" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "PIN āļ…āļ‚āļšāļē ⎃āļ¸āļŸ āˇ€āˇ’āˇ€āˇ˜āļ­" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "āļļ⎒āļ§āˇŠāˇ€āļģ⎊āļŠāļąāˇŠ āļ…āļœāˇ”⎅⎔ āļ‡āļģ⎓āļ¸āļ§ āļ”āļļ⎚ PIN āļ…āļ‚āļšāļē āļšāˇšāļ­āļē ⎃āļšāˇƒāļąāˇŠāļą. āļ”āļļ āļšāˇ€āļ¯āˇ āˇ„āˇ āļē⎙āļ¯āˇ”āļ¸āˇ™āļąāˇŠ ⎃āļ¸āˇŠāļ´āˇ–āļģ⎊āļĢāļē⎙āļąāˇŠāļ¸ āļ´āˇ”āļģāļąāļē ⎀⎓ āļ‡āļ­āˇŠāļąāļ¸āˇŠ āļ”āļļāļœāˇš PIN ⎃⎐āļšāˇƒāˇ”āļ¸āˇŠ āļąāˇāˇ€āļ­ āˇƒāļšāˇƒāļąāˇ” āļ‡āļ­." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN āļšāˇšāļ­āļē āļ…āˇ€āˇāˇŠāļē āˇ€āˇš." }, "invalidPin": { "message": "⎀āļŊāļ‚āļœāˇ” āļąāˇœāˇ€āļą PIN āļšāˇšāļ­āļē." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "āļĸ⎛⎀ ⎀⎒āļ¯āˇŠāļēāˇāˇ€ ⎃āļ¸āļŸ āļ…āļœāˇ”⎅⎔ āļ‡āļģ⎓āļ¸" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "āļŠāˇ™āˇƒāˇŠāļšāˇŠāļ§āˇœāļ´āˇŠ āˇƒāˇ’āļ§ āļ­āˇ„⎀⎔āļģ⎔ āļšāˇ’āļģ⎓āļ¸ āļļāļŊāˇāļ´āˇœāļģ⎜āļ­āˇŠāļ­āˇ”⎀⎙āļąāˇŠ" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "āļļ⎊āļģāˇ€āˇŠāˇƒāļģāļē āļąāˇāˇ€āļ­ āļ†āļģāļ¸āˇŠāļˇ āļ¸āļ­ āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯āļē ⎃āļ¸āļœ āļ…āļœāˇ”⎅⎔" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "āļ”āļļ āļ…⎀āļ¸ āˇ€āˇāļē⎙āļąāˇŠ āļ‘āļšāˇŠ āļ‘āļšāļ­āˇ”⎀āļšāˇŠāˇ€āļ­āˇŠ āļ­āˇāļģāˇ āļœāļ­ āļē⎔āļ­āˇ”āļē." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "⎃āļ‚⎀⎒āļ°āˇāļą āļ´āˇŠāļģāļ­āˇ’āļ´āļ­āˇŠāļ­āˇ’ āļ‘āļšāļšāˇŠ āˇ„āˇ ⎀⎐āļŠāˇ’ āļœāļĢāļąāļšāˇŠ āļ”āļļ⎚ āļ‹āļ­āˇŠāļ´āˇāļ¯āļš āˇƒāˇāļšāˇƒāˇ”āļ¸āˇŠ ⎀āļŊāļ§ āļļāļŊāļ´āˇāļē⎒." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē āļšāˇāļŊāļē āļšāˇŠāļģ⎒āļēāˇāļšāˇāļģ⎓" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "āļ…āļœāˇ”āļŊ", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "āļšāˇ”āļĢ⎔ āļšāˇ–āļŠāļēāļ§", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "āļ´āˇŠāļģāļ­āˇ’āˇ‚āˇŠāļ¨āˇāļ´āļąāļē āļ…āļē⎒āļ­āļ¸āļē" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "āļ´āˇ’āļ§āļ­āļ§ āļ´āˇ’āˇ€āˇ’āˇƒāˇ“āļ¸āˇ™āļąāˇŠ āļ”āļļāļœāˇš āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē ⎀⎙āļ­ āļ‡āļ­āˇ’ āˇƒāˇ’āļēāļŊ⎔āļ¸ āļ´āˇŠāļģāˇ€āˇšāˇāļē āļ‰āˇ€āļ­āˇŠ āļšāļģāļąāˇ” āļ‡āļ­āˇ’ āļ…āļ­āļģ āļšāˇāļŊ āˇƒāˇ“āļ¸āˇāˇ€ āļ´āˇƒāˇ” āļ¸āˇāļģ⎊āļœāļœāļ­ āˇƒāļ­āˇŠāļēāˇāļ´āļąāļē āļ…āˇ€āˇāˇŠāļē āˇ€āˇš. āļ”āļļāļ§ āļ¸āˇ™āļ¸ āˇƒāˇāļšāˇƒāˇ”āļ¸ āļˇāˇāˇ€āˇ’āļ­āˇ āļšāˇ’āļģ⎓āļ¸āļ§ āļ…āˇ€āˇāˇŠāļē āļļ⎀ āļ”āļļāļ§ āˇ€āˇ’āˇāˇŠāˇ€āˇāˇƒāļ¯?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē-āļ´āˇ’āļģ⎀⎓āļ¸ āˇƒāˇ„ āˇƒāˇ”āļģāļšāˇ’āļąāˇŠāļą" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē-āļ´āˇ’āļģ⎀⎖ āļ…āļē⎒āļ­āļ¸āļē āˇƒāˇ„ āˇƒāˇ”āļģāļšāˇ’āļą āļŊāļ¯ URI" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "āļ”āļļāļœāˇš āļąāˇ€ āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯āļē āļ´āˇŠāļģāļ­āˇ’āļ´āļ­āˇŠāļ­āˇ’ āļ…āˇ€āˇāˇŠāļēāļ­āˇ ⎃āļ´āˇ”āļģāˇāļŊāļąāˇŠāļąāˇš āļąāˇāļ­." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "āļ¸āˇ™āļ¸ āļšāˇœāļ§āˇ”⎀ āļ´āļģ⎓āļšāˇŠāˇ‚āˇ āļšāˇ’āļģ⎓āļ¸āˇ™āļąāˇŠ āļ”āļļ āļ´āˇ„āļ­ āˇƒāļŗāˇ„āļąāˇŠ āļ¯āˇ‘ ⎀āļŊāļ§ āļ‘āļšāļŸ āˇ€āˇš:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "⎄āļģ⎒" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "āļŠāˇ™āˇƒāˇŠāļšāˇŠāļ§āˇœāļ´āˇŠ ⎃āļ¸āļ¸āˇ”⎄⎔āļģ⎊āļ­ āˇƒāļ­āˇŠāļēāˇāļ´āļąāļē" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "āļœāˇ’āļĢ⎔āļ¸ āļ¸āˇ’āˇƒāˇŠāļœāˇāļŊāļ āˇŠ" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "āļĸ⎓⎀ ⎀⎒āļ¯āˇŠāļēāˇāˇ€ ⎃āļšāˇŠāļģ⎓āļē āļšāļģ āļąāˇāļ­" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "āļļ⎊āļģāˇ€āˇŠāˇƒāļģ⎊ biometrics āļ¸āˇ™āļ¸ āļ‹āļ´āˇāļ‚āļœāļē āļ¸āļ­ āˇƒāˇ„āļē āļąāˇœāļ¯āļšāˇŠāˇ€āļē⎒." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "⎃āļ‚⎀⎒āļ°āˇāļą āļ´āˇŠāļģāļ­āˇ’āļ´āļ­āˇŠāļ­āˇ’āļēāļšāˇŠ āļ”āļļ⎚ ⎄⎒āļ¸āˇ’āļšāˇāļģ⎒āļ­āˇŠāˇ€ ⎀⎒āļšāļŊ⎊āļ´āļēāļąāˇŠ āļšāˇ™āļģ⎙⎄⎒ āļļāļŊāļ´āˇāļē⎒." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "āļļ⎐⎄⎐āļģ āˇ€āˇƒāļ¸āˇŠ" }, "excludedDomainsDesc": { "message": "āļļ⎒āļ§āˇŠāˇ€āļģ⎊āļŠāļąāˇŠ āļ¸āˇ™āļ¸ āˇ€āˇƒāļ¸āˇŠ ⎃āļŗāˇ„āˇ āļ´āˇ’āˇ€āˇ’āˇƒāˇ”āļ¸āˇŠ āļ­āˇœāļģāļ­āˇ”āļģ⎔ āˇƒāˇ”āļģ⎐āļšāˇ“āļ¸āļ§ āļ‰āļŊ⎊āļŊāˇ āļąāˇœāˇƒāˇ’āļ§āˇ’āļąāˇ” āļ‡āļ­. āļļāļŊāˇāļ­āˇŠāļ¸āļš āļšāˇ’āļģ⎓āļ¸ āˇƒāļŗāˇ„āˇ ⎀⎙āļąāˇƒāˇŠāļšāļ¸āˇŠ ⎃āļŗāˇ„āˇ āļ”āļļ āļ´āˇ’āļ§āˇ”⎀ āļąāˇāˇ€āˇ”āļ¸āˇŠ āļšāˇ… āļē⎔āļ­āˇ”āļē." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ⎀āļŊāļ‚āļœāˇ” āˇ€āˇƒāļ¸āļšāˇŠ āļąāˇœāˇ€āˇš", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "āļē⎀āļąāˇŠāļą", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "āˇƒāˇ™āˇ€āˇ”āļ¸āˇŠ āļē⎀āļē⎒", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "āļ´āˇ™āˇ…" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "āļœāˇœāļąāˇ”⎀" }, @@ -1666,6 +2406,9 @@ "message": "āˇƒāˇ’āļēāļŊ⎔ āļē⎀āļē⎒", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "āļ¸āˇāļšāˇŠāˇƒāˇŠ āļ´āˇŠāļģāˇ€āˇšāˇ āļœāļĢāļą āˇ…āļŸāˇ", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "āļ¸āˇ”āļģāļ´āļ¯āļē āļ†āļģāļšāˇŠāˇ‚āˇ" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "⎃āļļ⎐āļŗāˇ’āļē āļē⎀āļąāˇŠāļą āļ´āˇ’āļ§āļ´āļ­āˇŠ āļšāļģāļąāˇŠāļą", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "āļ”āļļāļ§ āļ¸āˇ™āļē āļ¸āļšāˇ āļ¯āˇāļ¸āˇ“āļ¸āļ§ āļ…āˇ€āˇāˇŠāļē āļļ⎀ āļ”āļļāļ§ āˇ€āˇ’āˇāˇŠāˇ€āˇāˇƒāļ¯?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "āļē⎐⎀⎓āļ¸ āˇƒāļ‚āˇƒāˇŠāļšāļģāļĢāļē", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "āļąāˇ’āļēāļ¸ āļšāļģāļą āļŊāļ¯ āļ¯āˇ’āļąāļē āˇ„āˇ āˇ€āˇšāļŊāˇāˇ€ āļ¸āļ­ Send ⎃⎊āļŽāˇ’āļģ⎀āļ¸ āļ¸āļšāˇ āļ¯āļ¸āļąāˇ” āļŊ⎐āļļ⎚.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "āļšāļŊ⎊ āļ‰āļšāˇ”āļ­āˇŠāˇ€āļą āļ¯āˇ’āļąāļē" }, @@ -1769,6 +2523,10 @@ "message": "⎀⎒āļšāļŊ⎊āļ´āļēāļšāˇŠ āļŊāˇ™āˇƒ āļ´āļģ⎒⎁⎓āļŊāļšāļē⎒āļąāˇŠāļ§ āļ¸āˇ™āļ¸ āļē⎀āļąāˇŠāļą āˇ€āˇ™āļ­ āļ´āˇŠāļģāˇ€āˇšāˇ ⎀⎓āļ¸āļ§ āļ¸āˇ”āļģāļ´āļ¯āļēāļšāˇŠ āļ…āˇ€āˇāˇŠāļē āˇ€āˇš.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "āļ¸āˇš āļœāˇāļą āļ´āˇžāļ¯āˇŠāļœāļŊ⎒āļš āˇƒāļ§āˇ„āļąāˇŠ āļē⎀āļąāˇŠāļą.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "āļąāˇ’āļģ⎊āļ¸āˇāļĢāļē āļē⎀āļąāˇŠāļą", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "⎃āļ‚āˇƒāˇŠāļšāļģāļĢāļē āļē⎀āļąāˇŠāļą", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "āļœāˇœāļąāˇ”⎀āļšāˇŠ āļ­āˇāļģāˇ āļœāˇāļąāˇ“āļ¸ āˇƒāļŗāˇ„āˇ, āļ´āˇāļ­āˇ’ āļ­āˇ“āļģāˇ”āˇ€āˇš āļ¯āˇ’āļœāˇ”⎀ āˇ€āˇ’āˇ€āˇ˜āļ­ āļšāļģāļąāˇŠāļą (⎄⎐āļšāˇ’ āļąāļ¸āˇŠ) āˇ„āˇ āļ¸āˇ™āļ¸ āļļ⎐āļąāļģāļē āļšāˇŠāļŊ⎒āļšāˇŠ āļšāˇ’āļģ⎓āļ¸āˇ™āļąāˇŠ āļąāˇ€ āļšāˇ€āˇ”⎅⎔⎀āļšāļ§ āļ´āˇœāļ´āˇŠ āļšāļģāļąāˇŠāļą." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "āˇƒāˇ†āˇāļģ⎒ āļˇāˇāˇ€āˇ’āļ­āˇ āļœāˇœāļąāˇ”⎀āļšāˇŠ āļ­āˇāļģāˇ āļœāˇāļąāˇ“āļ¸ āˇƒāļŗāˇ„āˇ, āļ¸āˇ™āļ¸ āļļ⎐āļąāļģāļē āļšāˇŠāļŊ⎒āļšāˇŠ āļšāˇ’āļģ⎓āļ¸āˇ™āļąāˇŠ āļąāˇ€ āļšāˇ€āˇ”⎅⎔⎀āļšāļ§ āļ¯āˇ’āˇƒāˇŠāˇ€āˇš." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "āļ”āļļ āļ†āļģāļ¸āˇŠāļˇ āļšāˇ’āļģ⎓āļ¸āļ§ āļ´āˇ™āļģ" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "āļŊāļļāļąāˇŠāļąāļąāˇŠāļœāˇ™āļąāˇŠ āļ¸āļœāˇš ⎀⎒āļ¯āˇŠāļē⎔āļ­āˇŠ āļ­āˇāļ´āˇāļŊ⎊ āļŊ⎒āļ´āˇ’āļąāļē ⎃āļŸāˇ€āļąāˇŠāļą." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "⎃āļ‚⎀⎒āļ°āˇāļą āļ´āˇŠāļģāļ­āˇ’āļ´āļ­āˇŠāļ­āˇ’ āļ‘āļšāļšāˇŠ āˇ„āˇ āļšāˇ’⎄⎒āļ´āļēāļšāˇŠ āļ”āļļāļœāˇš Send ⎀⎒āļšāļŊ⎊āļ´āļēāļąāˇŠāļ§ āļļāļŊāļ´āˇāļē⎒." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "āļŠāļ¸āˇšāļŊ⎊ ⎃āļ­āˇŠāļēāˇāļ´āļąāļē āļ…āˇ€āˇāˇŠāļē āˇ€āˇš" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "āļ¸āˇ™āļ¸ āļ…āļ‚āļœāļē āļˇāˇāˇ€āˇ’āļ­āˇ āļšāˇ’āļģ⎓āļ¸ āˇƒāļŗāˇ„āˇ āļ”āļļ⎚ ⎀⎒āļ¯āˇŠāļē⎔āļ­āˇŠ āļ­āˇāļ´āˇ‘āļŊ ⎃āļ­āˇŠāļēāˇāļ´āļąāļē āļšāˇ… āļē⎔āļ­āˇ”āļē. ⎀⎙āļļ⎊ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē⎚ āļ”āļļāļœāˇš ⎀⎒āļ¯āˇŠāļē⎔āļ­āˇŠ āļ­āˇāļ´āˇ‘āļŊ ⎃āļ­āˇŠāļēāˇāļ´āļąāļē āļšāˇ… ⎄⎐āļšāˇ’āļē." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "āˇƒāˇŠāˇ€āļēāļ‚āļšāˇŠāļģ⎓āļē āļļāļŗāˇ€āˇ āļœāˇāļąāˇ“āļ¸" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "āˇ†āˇāļŊ⎊āļŠāļģāļē āļ­āˇāļģāļąāˇŠāļą..." }, - "ssoCompleteRegistration": { - "message": "SSG ⎃āļ¸āļœ āļŊ⎜āļœāˇŠ ⎀⎓āļ¸ āˇƒāļ¸āˇŠāļ´āˇ–āļģ⎊āļĢ āļšāˇ’āļģ⎓āļ¸ āˇƒāļŗāˇ„āˇ, āļšāļģ⎔āļĢāˇāļšāļģ āļ”āļļ⎚ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē ⎀⎙āļ­ āļ´āˇŠāļģāˇ€āˇšāˇ ⎀⎓āļ¸āļ§ āˇƒāˇ„ āļ†āļģāļšāˇŠāˇ‚āˇ āļšāˇ’āļģ⎓āļ¸āļ§ āļ´āˇŠāļģāļ°āˇāļą āļ¸āˇ”āļģāļ´āļ¯āļēāļšāˇŠ ⎃āļšāˇƒāļąāˇŠāļą." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "āļ´āˇāļē" @@ -1904,6 +2740,9 @@ "minutes": { "message": "⎀⎒āļąāˇāļŠāˇ’" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "āļ”āļļ⎚ ⎃āļ‚⎀⎒āļ°āˇāļą āļ´āˇŠāļģāļ­āˇ’āļ´āļ­āˇŠāļ­āˇ’ āļ”āļļāļœāˇš āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē āļšāˇāļŊāļē āļšāˇ™āļģ⎙⎄⎒ āļļāļŊāļ´āˇāļē⎒. āļ‹āļ´āļģ⎒āļ¸ āļ…āˇ€āˇƒāļģ āļŊāļ­āˇŠ āˇƒāˇ”āļģāļšāˇŠāˇ‚⎒āļ­āˇāļœāˇāļģāļē āļšāˇāļŊāļē āļ´āˇāļē $HOURS$ (āļē) āˇƒāˇ„ ⎀⎒āļąāˇāļŠāˇ’ $MINUTES$ (āļē)", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 405402ccac7..9c8a3031164 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - BezplatnÃŊ sprÃĄvca hesiel", + "message": "Bitwarden – BezplatnÃŊ sprÃĄvca hesiel", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "bitwarden je bezpečnÃŊ a bezplatnÃŊ sprÃĄvca hesiel pre vÅĄetky vaÅĄe zariadenia.", - "description": "Extension description" + "message": "Bitwarden zabezpečí vÅĄetky vaÅĄe heslÃĄ, prístupovÊ kÄžÃēče a citlivÊ informÃĄcie doma, v prÃĄci alebo na cestÃĄch", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "PrihlÃĄste sa, alebo vytvorte novÃŊ Ãēčet pre prístup k vÃĄÅĄmu bezpečnÊmu trezoru." }, + "inviteAccepted": { + "message": "PozvÃĄnka prijatÃĄ" + }, "createAccount": { "message": "VytvoriÅĨ Ãēčet" }, - "login": { - "message": "PrihlÃĄsiÅĨ sa" + "newToBitwarden": { + "message": "Ste noví na Bitwardene?" + }, + "logInWithPasskey": { + "message": "PrihlÃĄsiÅĨ sa s prístupovÃŊm kÄžÃēčom" + }, + "useSingleSignOn": { + "message": "PouÅžiÅĨ jednotnÊ prihlÃĄsenie" + }, + "welcomeBack": { + "message": "Vitajte späÅĨ" + }, + "setAStrongPassword": { + "message": "Nastavte silnÊ heslo" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Zdajte heslo na vytvorenie Ãēčtu" }, "enterpriseSingleSignOn": { "message": "JednotnÊ prihlÃĄsenie pre podniky (SSO)" @@ -43,11 +61,39 @@ "masterPassHintDesc": { "message": "NÃĄpoveda k hlavnÊmu heslu vÃĄm môŞe pomôcÅĨ spomenÃēÅĨ si na heslo, ak ho zabudnete." }, + "masterPassHintText": { + "message": "Ak zabudnete heslo, na vÃĄÅĄ e-mail vÃĄm môŞe zaslaÅĨ nÃĄpoveď k heslu. ZadanÃŊch $CURRENT$ znakov, limit je $MAXIMUM$.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Znovu zadajte hlavnÊ heslo" }, "masterPassHint": { - "message": "NÃĄpoveda k hlavnÊmu heslu (voliteÄžnÊ)" + "message": "NÃĄpoveď k hlavnÊmu heslu (voliteÄžnÊ)" + }, + "joinOrganization": { + "message": "Pripojte sa k organizÃĄcii" + }, + "joinOrganizationName": { + "message": "PripojiÅĨ sa k $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Dokončite pripojenie k tejto organizÃĄcii nastavením hlavnÊho hesla." }, "tab": { "message": "Karta" @@ -73,6 +119,9 @@ "copyPassword": { "message": "KopírovaÅĨ heslo" }, + "copyPassphrase": { + "message": "KopírovaÅĨ prístupovÃē frÃĄzu" + }, "copyNote": { "message": "KopírovaÅĨ poznÃĄmku" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "KopírovaÅĨ bezpečnostnÃŊ kÃŗd" }, + "copyName": { + "message": "KopírovaÅĨ nÃĄzov" + }, + "copyCompany": { + "message": "KopírovaÅĨ spoločnosÅĨ" + }, + "copySSN": { + "message": "KopírovaÅĨ číslo poistenca sociÃĄlnej poisÅĨovne" + }, + "copyPassportNumber": { + "message": "KopírovaÅĨ číslo pasu" + }, + "copyLicenseNumber": { + "message": "KopírovaÅĨ číslo licencie" + }, + "copyPrivateKey": { + "message": "KopírovaÅĨ sÃēkromnÃŊ kÄžÃēč" + }, + "copyPublicKey": { + "message": "KopírovaÅĨ verejnÃŊ kÄžÃēč" + }, + "copyFingerprint": { + "message": "KopírovaÅĨ odtlačok" + }, + "copyCustomField": { + "message": "KopírovaÅĨ $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "KopírovaÅĨ webstrÃĄnku" + }, + "copyNotes": { + "message": "KopírovaÅĨ poznÃĄmky" + }, + "fill": { + "message": "VyplniÅĨ", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "AutomatickÊ vypÄēňanie" }, + "autoFillLogin": { + "message": "AutomatickÊ vyplnenie prihlasovacích Ãēdajov" + }, + "autoFillCard": { + "message": "AutomatickÊ vyplnenie karty" + }, + "autoFillIdentity": { + "message": "AutomatickÊ vyplnenie identity" + }, "generatePasswordCopied": { "message": "VygenerovaÅĨ heslo (skopírovanÊ)" }, @@ -98,7 +199,22 @@ "message": "KopírovaÅĨ nÃĄzov vlastnÊho poÄža" }, "noMatchingLogins": { - "message": "ÅŊiadne zodpovedajÃēce prihlasovacie Ãēdaje." + "message": "ÅŊiadne zodpovedajÃēce prihlasovacie Ãēdaje" + }, + "noCards": { + "message": "ÅŊiadne karty" + }, + "noIdentities": { + "message": "ÅŊiadne identity" + }, + "addLoginMenu": { + "message": "PridaÅĨ prihlasovacie Ãēdaje" + }, + "addCardMenu": { + "message": "PridaÅĨ kartu" + }, + "addIdentityMenu": { + "message": "PridaÅĨ identitu" }, "unlockVaultMenu": { "message": "OdomknÃēÅĨ trezor" @@ -107,7 +223,7 @@ "message": "PrihlÃĄste sa do trezora" }, "autoFillInfo": { - "message": "Nie sÃē prístupnÊ Åžiadne prihlasovacie Ãēdaje na automatickÊ vyplnenie pre aktuÃĄlnu kartu." + "message": "Nie sÃē k dispozícii Åžiadne prihlasovacie Ãēdaje na automatickÊ vyplnenie pre aktuÃĄlnu kartu." }, "addLogin": { "message": "PridaÅĨ prihlasovacie Ãēdaje" @@ -115,14 +231,26 @@ "addItem": { "message": "PridaÅĨ poloÅžku" }, + "accountEmail": { + "message": "E-mail Ãēčtu" + }, + "requestHint": { + "message": "PoÅžiadaÅĨ o nÃĄpoveď" + }, + "requestPasswordHint": { + "message": "PoÅžiadaÅĨ o nÃĄpoveď k heslu" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Zadajte e-mailovÃē adresu Ãēčtu a zaÅĄleme vÃĄm nÃĄpoveď k heslu" + }, "passwordHint": { - "message": "NÃĄpoveda k heslu" + "message": "NÃĄpoveď k heslu" }, "enterEmailToGetHint": { - "message": "Zadajte emailovÃē adresu na zaslanie nÃĄpovedy pre vaÅĄe hlavnÊ heslo." + "message": "Zadajte emailovÃē adresu na zaslanie nÃĄpovede pre vaÅĄe hlavnÊ heslo." }, "getMasterPasswordHint": { - "message": "ZískaÅĨ nÃĄpovedu k hlavnÊmu heslu" + "message": "ZískaÅĨ nÃĄpoveď k hlavnÊmu heslu" }, "continue": { "message": "PokračovaÅĨ" @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Ak chcete pokračovaÅĨ, potvrďte svoju identitu." }, - "account": { - "message": "Účet" - }, "changeMasterPassword": { "message": "ZmeniÅĨ hlavnÊ heslo" }, + "continueToWebApp": { + "message": "PokračovaÅĨ vo webovej aplikÃĄcii?" + }, + "continueToWebAppDesc": { + "message": "PreskÃēmajte ďalÅĄie funkcie svojho Ãēčtu na Bitwarden vo webovej aplikÃĄcii." + }, + "continueToHelpCenter": { + "message": "PokračovaÅĨ v centre pomoci?" + }, + "continueToHelpCenterDesc": { + "message": "Viac informÃĄcií o pouŞívaní Bitwardenu nÃĄjdete v centre pomoci." + }, + "continueToBrowserExtensionStore": { + "message": "PokračovaÅĨ do obchodu s rozÅĄÃ­reniami pre prehliadače?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "PomôŞte ostatnÃŊm zistiÅĨ, či je Bitwarden pre nich vhodnÃŊ. NavÅĄtívte obchod s rozÅĄÃ­reniami pre prehliadače a pridajte hodnotenie." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "HlavnÊ heslo si môŞete zmeniÅĨ vo webovej aplikÃĄcii Bitwarden." + }, "fingerprintPhrase": { "message": "FrÃĄza odtlačku", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "OdhlÃĄsiÅĨ sa" }, + "aboutBitwarden": { + "message": "O Bitwarden" + }, "about": { "message": "O aplikÃĄcii" }, + "moreFromBitwarden": { + "message": "Viac od spoločnosti Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "PokračovaÅĨ na bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden pre podniky" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator umoŞňuje uloÅžiÅĨ overovacie kÄžÃēče a generovaÅĨ kÃŗdy TOTP pre dvojstupňovÊ overovanie. Viac informÃĄcií nÃĄjdete na webovej strÃĄnke bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Bezpečne ukladajte, spravujte a zdieÄžajte vÃŊvojÃĄrske tajomstvÃĄ s Bitwarden Secrets Manager. Viac sa môŞete dozvedieÅĨ na strÃĄnke bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Vytvorte plynulÊ a bezpečnÊ prihlÃĄsenie bez tradičnÃŊch hesiel s Passwordless.dev. Viac sa môŞete dozvedieÅĨ na strÃĄnke bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden pre Rodiny zadarmo" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "MÃĄte nÃĄrok na bezplatnÃē sluÅžbu Bitwarden pre Rodiny. VyuÅžite tÃēto ponuku eÅĄte dnes vo webovej aplikÃĄcii." + }, "version": { "message": "Verzia" }, @@ -178,11 +360,29 @@ "message": "PridaÅĨ priečinok" }, "name": { - "message": "Meno" + "message": "NÃĄzov" }, "editFolder": { "message": "UpraviÅĨ priečinok" }, + "newFolder": { + "message": "NovÃŊ priečinok" + }, + "folderName": { + "message": "NÃĄzov priečinka" + }, + "folderHintText": { + "message": "Vnorte priečinok pridaním nÃĄzvu nadradenÊho priečinka a znaku \"/\". Príklad: SociÃĄlne siete/FÃŗra" + }, + "noFoldersAdded": { + "message": "Neboli pridanÊ Åžiadne priečinky" + }, + "createFoldersToOrganize": { + "message": "Vytvorte priečinky na usporiadanie poloÅžiek trezoru" + }, + "deleteFolderPermanently": { + "message": "Naozaj chcete natrvalo odstrÃĄniÅĨ tento priečinok?" + }, "deleteFolder": { "message": "OdstrÃĄniÅĨ priečinok" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "GenerÃĄtor", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automaticky generovaÅĨ silnÊ a unikÃĄtne heslÃĄ k prihlasovacím Ãēdajom." }, - "bitWebVault": { - "message": "WebovÃŊ trezor Bitwarden" + "bitWebVaultApp": { + "message": "WebovÃĄ aplikÃĄcia Bitwarden" }, "importItems": { "message": "ImportovaÅĨ poloÅžky" @@ -235,6 +435,9 @@ "generatePassword": { "message": "GenerovaÅĨ heslo" }, + "generatePassphrase": { + "message": "GenerovaÅĨ prístupovÃē frÃĄzu" + }, "regeneratePassword": { "message": "VygenerovaÅĨ novÊ heslo" }, @@ -244,17 +447,60 @@ "length": { "message": "DÄēÅžka" }, + "passwordMinLength": { + "message": "MinimÃĄlna dÄēÅžka hesla" + }, "uppercase": { - "message": "VeÄžkÊ písmenÃĄ (A-Z)" + "message": "VeÄžkÊ písmenÃĄ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "MalÊ písmenÃĄ (a-z)" + "message": "MalÊ písmenÃĄ (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Čísla (0-9)" + "message": "Čísla (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Å peciÃĄlne znaky (!@#$%^&*)" + "message": "Å peciÃĄlne znaky (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "ZahrnÃēÅĨ", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "ZahrnÃēÅĨ veÄžkÊ písmenÃĄ", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "ZahrnÃēÅĨ malÊ písmenÃĄ", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "ZahrnÃēÅĨ čísla", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "ZahrnÃēÅĨ ÅĄpeciÃĄlne znaky", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Počet slov" @@ -273,10 +519,19 @@ "message": "Minimum číslic" }, "minSpecial": { - "message": "Minimum ÅĄpec. znakov" + "message": "Minimum ÅĄpeciÃĄlnych znakov" }, "avoidAmbChar": { - "message": "VyhnÃēÅĨ sa zameniteÄžnÃŊm znakom" + "message": "VyhnÃēÅĨ sa zameniteÄžnÃŊm znakom", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "VyhnÃēÅĨ sa zameniteÄžnÃŊm znakom", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Na nastavenie generÃĄtora boli uplatnenÊ poÅžiadavky pravidiel spoločnosti.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "PrehÄžadÃĄvaÅĨ trezor" @@ -299,15 +554,30 @@ "password": { "message": "Heslo" }, + "totp": { + "message": "KÄžÃēč z aplikÃĄcie Authenticator" + }, "passphrase": { "message": "PrístupovÃĄ frÃĄza" }, "favorite": { "message": "ObÄžÃēbenÊ" }, + "unfavorite": { + "message": "OdstrÃĄniÅĨ z obÄžÃēbenÃŊch" + }, + "itemAddedToFavorites": { + "message": "PoloÅžka pridanÃĄ medzi obÄžÃēbenÊ" + }, + "itemRemovedFromFavorites": { + "message": "PoloÅžka odobranÃĄ z obÄžÃēbenÃŊch" + }, "notes": { "message": "PoznÃĄmky" }, + "privateNote": { + "message": "SÃēkromnÃĄ poznÃĄmka" + }, "note": { "message": "PoznÃĄmka" }, @@ -326,6 +596,18 @@ "launch": { "message": "SpustiÅĨ" }, + "launchWebsite": { + "message": "OtvoriÅĨ strÃĄnku" + }, + "launchWebsiteName": { + "message": "OtvoriÅĨ strÃĄnku $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "WebstrÃĄnka" }, @@ -338,9 +620,24 @@ "other": { "message": "OstatnÊ" }, + "unlockMethods": { + "message": "MoÅžnosti odomknutia" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Nastavte metÃŗdu odomknutia, aby ste zmenili akciu pri vyprÅĄaní času trezoru." }, + "unlockMethodNeeded": { + "message": "Nastavte metÃŗdu odomknutia v Nastaveniach" + }, + "sessionTimeoutHeader": { + "message": "ČasovÃŊ limit relÃĄcie" + }, + "vaultTimeoutHeader": { + "message": "ČasovÃŊ limit pre trezor" + }, + "otherOptions": { + "message": "ĎalÅĄie moÅžnosti" + }, "rateExtension": { "message": "OhodnotiÅĨ rozÅĄÃ­renie" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "VÃĄÅĄ trezor je uzamknutÃŊ. Ak chcete pokračovaÅĨ, overte svoju identitu." }, + "yourVaultIsLockedV2": { + "message": "VÃĄÅĄ trezor je zamknutÃŊ" + }, + "yourAccountIsLocked": { + "message": "VÃĄÅĄ Ãēčet je zamknutÃŊ" + }, + "or": { + "message": "alebo" + }, "unlock": { "message": "OdomknÃēÅĨ" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "ČasovÃŊ limit pre trezor" }, + "vaultTimeout1": { + "message": "ČasovÃŊ limit" + }, "lockNow": { "message": "UzamknÃēÅĨ teraz" }, + "lockAll": { + "message": "UzamknÃēÅĨ vÅĄetky" + }, "immediately": { "message": "OkamÅžite" }, @@ -426,6 +738,18 @@ "security": { "message": "Zabezpečenie" }, + "confirmMasterPassword": { + "message": "PotvrdiÅĨ hlavnÊ heslo" + }, + "masterPassword": { + "message": "HlavnÊ heslo" + }, + "masterPassImportant": { + "message": "VaÅĄe hlavnÊ heslo sa nebude daÅĨ obnoviÅĨ, ak ho zabudnete!" + }, + "masterPassHintLabel": { + "message": "NÃĄpoveď k hlavnÊmu heslu" + }, "errorOccurred": { "message": "Vyskytla sa chyba" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "VÃĄÅĄ novÃŊ Ãēčet bol vytvorenÃŊ! Teraz sa môŞete prihlÃĄsiÅĨ." }, + "newAccountCreated2": { + "message": "VÃĄÅĄ novÃŊ Ãēčet bol vytvorenÃŊ!" + }, + "youHaveBeenLoggedIn": { + "message": "Boli ste prihlÃĄsenÃŊ!" + }, + "youSuccessfullyLoggedIn": { + "message": "ÚspeÅĄne ste sa prihlÃĄsili" + }, + "youMayCloseThisWindow": { + "message": "Toto okno môŞete zavrieÅĨ" + }, "masterPassSent": { - "message": "Poslali sme vÃĄm email s nÃĄpovedou k hlavnÊmu heslu." + "message": "Poslali sme vÃĄm email s nÃĄpoveďou k hlavnÊmu heslu." }, "verificationCodeRequired": { "message": "Overovací kÃŗd je povinnÃŊ." }, + "webauthnCancelOrTimeout": { + "message": "Overenie bolo zruÅĄenÊ alebo trvalo príliÅĄ dlho. SkÃēste to znova." + }, "invalidVerificationCode": { "message": "NeplatnÃŊ verifikačnÃŊ kÃŗd" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Na tejto strÃĄnke sa nedajÃē automaticky vyplniÅĨ prihlasovacie Ãēdaje. Namiesto toho skopírujte/vloÅžte prihlasovacie Ãēdaje manuÃĄlne." }, + "totpCaptureError": { + "message": "Nie je moÅžnÊ naskenovaÅĨ QR kÃŗd z aktuÃĄlnej webovej strÃĄnky" + }, + "totpCaptureSuccess": { + "message": "KÄžÃēč overovateÄža pridanÃŊ" + }, + "totpCapture": { + "message": "NaskenovaÅĨ QR kÃŗd overovateÄža z aktuÃĄlnej webovej strÃĄnky" + }, + "totpHelperTitle": { + "message": "Spravte dvojstupňovÊ overenie bezproblÊmovÃŊm" + }, + "totpHelper": { + "message": "Bitwarden umoŞňuje uloÅžiÅĨ a vyplniÅĨ kÃŗdy dvojstupňovÊho overenia. Skopírujte a vloÅžte kÄžÃēč do tohto poÄža." + }, + "totpHelperWithCapture": { + "message": "Bitwarden umoŞňuje uloÅžiÅĨ a vyplniÅĨ kÃŗdy dvojstupňovÊho overenia. Vyberte ikonu fotoaparÃĄtu a zosnímajte obrazovku QR kÃŗdu overovacej aplikÃĄcie tejto webovej strÃĄnky alebo skopírujte a vloÅžte kÄžÃēč do tohto poÄža." + }, + "learnMoreAboutAuthenticators": { + "message": "Viac informÃĄcií o overovateÄžoch" + }, + "copyTOTP": { + "message": "KopírovaÅĨ kÄžÃēč overovateÄža (TOTP)" + }, "loggedOut": { "message": "OdhlÃĄsenÃŊ" }, + "loggedOutDesc": { + "message": "Boli ste odhlÃĄsení zo svojho Ãēčtu." + }, "loginExpired": { "message": "VaÅĄa relÃĄcia vyprÅĄala." }, + "logIn": { + "message": "PrihlÃĄsiÅĨ sa" + }, + "logInToBitwarden": { + "message": "PrihlÃĄsenie do Bitwardenu" + }, + "restartRegistration": { + "message": "ZopakovaÅĨ registrÃĄciu" + }, + "expiredLink": { + "message": "PlatnosÅĨ odkazu vyprÅĄala" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Prosím zopakujte registrÃĄciu alebo sa pokÃēste prihlÃĄsiÅĨ." + }, + "youMayAlreadyHaveAnAccount": { + "message": "MoÅžno uÅž mÃĄte Ãēčet" + }, "logOutConfirmation": { "message": "Naozaj sa chcete odhlÃĄsiÅĨ?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "PridanÃŊ priečinok" }, - "changeMasterPass": { - "message": "ZmeniÅĨ hlavnÊ heslo" - }, - "changeMasterPasswordConfirmation": { - "message": "Teraz si môŞete zmeniÅĨ svoje hlavnÊ heslo vo webovom trezore bitwarden.com. Chcete navÅĄtíviÅĨ tÃēto strÃĄnku teraz?" - }, "twoStepLoginConfirmation": { "message": "DvojstupňovÊ prihlasovanie robí vÃĄÅĄ Ãēčet bezpečnejÅĄÃ­m vďaka vyÅžadovaniu bezpečnostnÊho kÃŗdu z overovacej aplikÃĄcie vÅždy, keď sa prihlÃĄsite. DvojstupňovÊ prihlasovanie môŞete povoliÅĨ vo webovom trezore bitwarden.com. Chcete navÅĄtíviÅĨ tÃēto strÃĄnku teraz?" }, + "twoStepLoginConfirmationContent": { + "message": "Zabezpečte svoj Ãēčet nastavením dvojstupňovÊho prihlasovania vo webovej aplikÃĄcii Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "PokračovaÅĨ vo webovej aplikÃĄcii?" + }, "editedFolder": { "message": "Priečinok upravenÃŊ" }, @@ -525,7 +909,7 @@ "message": "Začiatočnícka príručka" }, "gettingStartedTutorialVideo": { - "message": "Sledujte naÅĄu začiatočnícku príručku, aby ste sa naučili, ako získaÅĨ maximum z nÃĄÅĄho rozÅĄÃ­renia prehliadača." + "message": "Pozrite naÅĄu príručku pre začiatočníkov, v ktorej sa dozviete, ako získaÅĨ maximum z nÃĄÅĄho rozÅĄÃ­renia pre prehliadač." }, "syncingComplete": { "message": "SynchronizÃĄcia kompletnÃĄ" @@ -552,6 +936,10 @@ "newUri": { "message": "NovÊ URI" }, + "addDomain": { + "message": "PridaÅĨ domÊnu", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "PridanÃĄ poloÅžka" }, @@ -580,7 +968,7 @@ "message": "PrehÄžadÃĄvaÅĨ priečinok" }, "searchCollection": { - "message": "VyhÄžadaÅĨ zbierku" + "message": "HÄžadaÅĨ v zbierke" }, "searchType": { "message": "Typ vyhÄžadÃĄvania" @@ -592,8 +980,17 @@ "enableAddLoginNotification": { "message": "PoÅžiadaÅĨ o pridanie prihlÃĄsenia" }, + "vaultSaveOptionsTitle": { + "message": "UloÅžiÅĨ do nastavení trezora" + }, "addLoginNotificationDesc": { - "message": "OpÃŊtaÅĨ sa na pridanie prihlasovacích Ãēdajov ak ich eÅĄte nemÃĄte v trezore." + "message": "OpÃŊtaÅĨ sa na pridanie prihlasovacích Ãēdajov, ak ich eÅĄte nemÃĄte v trezore." + }, + "addLoginNotificationDescAlt": { + "message": "PoÅžiada o pridanie poloÅžky, ak sa v trezore nenachÃĄdza. Platí pre vÅĄetky prihlÃĄsenÊ Ãēčty." + }, + "showCardsInVaultView": { + "message": "ZobraziÅĨ karty ako nÃĄvrhy automatickÊho vypÄēňania v zobrazení trezora" }, "showCardsCurrentTab": { "message": "ZobraziÅĨ karty na strÃĄnke \"AktuÃĄlna karta\"" @@ -601,6 +998,9 @@ "showCardsCurrentTabDesc": { "message": "Zoznam poloÅžiek karty na strÃĄnke \"AktuÃĄlna karta\" na jednoduchÊ automatickÊ vyplnenie." }, + "showIdentitiesInVaultView": { + "message": "ZobraziÅĨ identity ako nÃĄvrhy automatickÊho vypÄēňania v zobrazení trezora" + }, "showIdentitiesCurrentTab": { "message": "ZobraziÅĨ identity na strÃĄnke \"AktuÃĄlna karta\"" }, @@ -616,7 +1016,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "MÃĄ si pre vÃĄs Bitwarden zapamätaÅĨ toto heslo?" + "message": "MÃĄ si Bitwarden zapamätaÅĨ toto heslo?" }, "notificationAddSave": { "message": "UloÅžiÅĨ" @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "PoÅžiadaÅĨ o aktualizÃĄciu prihlasovacieho hesla, ak sa zistí zmena na strÃĄnke." }, + "changedPasswordNotificationDescAlt": { + "message": "PoÅžiada o aktualizÃĄciu hesla na prihlÃĄsenie, keď sa zistí zmena na webe. Platí pre vÅĄetky prihlÃĄsenÊ Ãēčty." + }, + "enableUsePasskeys": { + "message": "PoÅžiadaÅĨ o uloÅženie a pouŞívanie prístupovÃŊch kÄžÃēčov" + }, + "usePasskeysDesc": { + "message": "PoÅžiadaÅĨ o uloÅženie novÃŊch prístupovÃŊch kÄžÃēčov alebo prihlÃĄsenie s prístupovÃŊmi kÄžÃēčmi uloÅženÃŊmi v trezore. Platí pre vÅĄetky prihlÃĄsenÊ Ãēčty." + }, "notificationChangeDesc": { "message": "Chcete aktualizovaÅĨ toto heslo v Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "OdomknÃēÅĨ" }, + "additionalOptions": { + "message": "ĎalÅĄie moÅžnosti" + }, "enableContextMenuItem": { "message": "ZobraziÅĨ moÅžnosti kontextovej ponuky" }, "contextMenuItemDesc": { "message": "SekundÃĄrnym kliknutím získate prístup k vygenerovaniu hesiel a zodpovedajÃēcim prihlÃĄseniam pre webovÃē strÃĄnku. " }, + "contextMenuItemDescAlt": { + "message": "SekundÃĄrnym kliknutím získate prístup k vygenerovaniu hesiel a zodpovedajÃēcim prihlÃĄseniam pre webovÃē strÃĄnku. Platí pre vÅĄetky prihlÃĄsenÊ Ãēčty." + }, "defaultUriMatchDetection": { "message": "PredvolenÊ mapovanie", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Vyberte si predvolenÃŊ spôsob mapovania, ktorÃŊ bude pouÅžitÃŊ pre prihlasovacie Ãēdaje pri vyuÅžití funkcí ako je napríklad automatickÊ vypÄēňanie hesiel." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ZmeniÅĨ motív aplikÃĄcie." }, + "themeDescAlt": { + "message": "Zmení farebnÃŊ motív aplikÃĄcie. Platí pre vÅĄetky prihlÃĄsenÊ Ãēčty." + }, "dark": { "message": "TmavÃŊ", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized –⁠ tmavÃŊ", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "ExportovaÅĨ z" + }, "exportVault": { "message": "Export trezoru" }, "fileFormat": { "message": "FormÃĄt SÃēboru" }, + "fileEncryptedExportWarningDesc": { + "message": "Tento exportovanÃŊ sÃēbor bude chrÃĄnenÃŊ heslom a na deÅĄifrovanie bude potrebnÊ heslo sÃēboru." + }, + "filePassword": { + "message": "Heslo sÃēboru" + }, + "exportPasswordDescription": { + "message": "Toto heslo sa pouÅžije na export a import tohto sÃēboru" + }, + "accountRestrictedOptionDescription": { + "message": "Na zaÅĄifrovanie exportu a obmedzenie importu len na aktuÃĄlny Ãēčet Bitwarden pouÅžite ÅĄifrovací kÄžÃēč Ãēčtu odvodenÃŊ z pouŞívateÄžskÊho mena a hlavnÊho hesla Ãēčtu." + }, + "passwordProtectedOptionDescription": { + "message": "Nastavte heslo sÃēboru na zaÅĄifrovanie exportu a importujte ho do akÊhokoÄžvek Ãēčtu Bitwarden pomocou hesla na deÅĄifrovanie." + }, + "exportTypeHeading": { + "message": "Typ exportu" + }, + "accountRestricted": { + "message": "ObmedzenÃŊ Ãēčet" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Heslo sÃēboru\" a \"PotvrdiÅĨ heslo sÃēboru\" sa nezhodujÃē." + }, "warning": { "message": "UPOZORNENIE", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ZdieÄžanÊ" }, - "learnOrg": { - "message": "ZistiÅĨ viac o organizÃĄciÃĄch" - }, - "learnOrgConfirmation": { - "message": "Bitwarden vÃĄm umoŞňuje zdieÄžaÅĨ vaÅĄe poloÅžky trezora s ostatnÃŊmi pomocou organizÃĄcie. Chcete navÅĄtíviÅĨ webovÃē strÃĄnku bitwarden.com a dozvedieÅĨ sa viac?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden pre podniky vÃĄm umoŞňuje zdieÄžaÅĨ poloÅžky trezoru s ostatnÃŊmi pomocou organizÃĄcie. Viac informÃĄcií nÃĄjdete na webovej strÃĄnke bitwarden.com." }, "moveToOrganization": { "message": "PresunÃēÅĨ do organizÃĄcie" @@ -762,8 +1204,11 @@ "file": { "message": "SÃēbor" }, + "fileToShare": { + "message": "SÃēbor, ktorÃŊ chcete zdieÄžaÅĨ" + }, "selectFile": { - "message": "VybraÅĨ sÃēbor." + "message": "Vyberte sÃēbor" }, "maxFileSize": { "message": "MaximÃĄlna veÄžkosÅĨ sÃēboru je 500 MB." @@ -793,7 +1238,10 @@ "message": "Zaregistrujte sa pre prÊmiovÊ členstvo a získajte:" }, "ppremiumSignUpStorage": { - "message": "1 GB ÅĄifrovanÊho ÃēloÅžiska." + "message": "1 GB ÅĄifrovanÊho ÃēloÅžiska na prílohy." + }, + "premiumSignUpEmergency": { + "message": "NÃēdzovÃŊ prístup" }, "premiumSignUpTwoStepOptions": { "message": "ProprietÃĄrne moÅžnosti dvojstupňovÊho prihlÃĄsenia ako napríklad YubiKey a Duo." @@ -814,7 +1262,10 @@ "message": "ZakÃēpiÅĨ PrÊmiovÃŊ Ãēčet" }, "premiumPurchaseAlert": { - "message": "Svoje prÊmiovÊ členstvo môŞete zakÃēpiÅĨ vo webovom trezore bitwarden.com. Chcete navÅĄtíviÅĨ tÃēto strÃĄnku teraz?" + "message": "Svoje prÊmiovÊ členstvo si môŞete zakÃēpiÅĨ vo webovom trezore bitwarden.com. Chcete navÅĄtíviÅĨ tÃēto strÃĄnku teraz?" + }, + "premiumPurchaseAlertV2": { + "message": "PrÊmiovÊ členstvo si môŞete zakÃēpiÅĨ v nastaveniach svojho Ãēčtu vo webovej aplikÃĄcii Bitwarden." }, "premiumCurrentMember": { "message": "Ste prÊmiovÃŊm členom!" @@ -822,6 +1273,9 @@ "premiumCurrentMemberThanks": { "message": "Ďakujeme, Åže podporujete Bitwarden." }, + "premiumFeatures": { + "message": "PovÃŊÅĄte na premium a získajte:" + }, "premiumPrice": { "message": "VÅĄetko len za %price% /rok!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "VÅĄetko len za $PRICE$ ročne!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Obnova kompletnÃĄ" }, @@ -895,7 +1358,7 @@ "message": "OveriÅĨ cez WebAuthn" }, "loginUnavailable": { - "message": "Prihlasovací Ãēdaj nedostupnÃŊ" + "message": "PrihlÃĄsenie nie je dispozícii" }, "noTwoStepProviders": { "message": "Tento Ãēčet mÃĄ povolenÊ dvojstupňovÊ prihlÃĄsenie, ale Åžiadny z nakonfigurovanÃŊch poskytovateÄžov nie je podporovanÃŊ tÃŊmto prehliadačom." @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Overovacia aplikÃĄcia" }, - "authenticatorAppDesc": { - "message": "PouÅžite overovaciu aplikÃĄciu (napríklad Authy alebo Google Authenticator) na generovanie časovo obmedzenÃŊch overovacích kÃŗdov.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Zadajte kÃŗd vygenerovanÃŊ overovacou aplikÃĄciou akou je napríklad Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP bezpečnostnÃŊ kÄžÃēč" + "yubiKeyTitleV2": { + "message": "BezpečnostnÃŊ kÄžÃēč Yubico OTP" }, "yubiKeyDesc": { - "message": "PouÅžiÅĨ YubiKey pre prístup k vÃĄÅĄmu Ãēčtu. Pracuje s YubiKey 4, 4 Nano, 4C a s NEO zariadeniami." + "message": "PouÅžiÅĨ YubiKey na prístup k vÃĄÅĄmu Ãēčtu. Pracuje s YubiKey 4, 4 Nano, 4C a s NEO zariadeniami." }, - "duoDesc": { - "message": "OveriÅĨ s Duo Security pouÅžitím Duo Mobile aplikÃĄcie, SMS, telefonÃĄtu alebo U2F bezpečnostnÃŊm kÄžÃēčom.", + "duoDescV2": { + "message": "Zadajte kÃŗd vygenerovanÃŊ aplikÃĄciou Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,24 +1405,37 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "VerifikačnÊ kÃŗdy vÃĄm budÃē zaslanÊ emailom." + "emailDescV2": { + "message": "Zadajte kÃŗd zaslanÃŊ na vÃĄÅĄ e-mail." }, "selfHostedEnvironment": { - "message": "Sebou hosÅĨovanÊ prostredie" + "message": "Prostredie s vlastnÃŊm hostingom" }, "selfHostedEnvironmentFooter": { "message": "Zadajte zÃĄkladnÃē URL adresu lokÃĄlne hosÅĨovanej inÅĄtalÃĄcie Bitwarden." }, + "selfHostedBaseUrlHint": { + "message": "Zadajte zÃĄkladnÃē URL adresu lokÃĄlne hosÅĨovanej inÅĄtalÃĄcie Bitwarden. Napríklad: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Pre rozÅĄÃ­renÃē konfigurÃĄciu môŞete zadaÅĨ zÃĄkladnÃē adresu URL kaÅždej sluÅžby nezÃĄvisle." + }, + "selfHostedEnvFormInvalid": { + "message": "Musíte pridaÅĨ buď zÃĄkladnÃē adresu URL servera, alebo aspoň jedno vlastnÊ prostredie." + }, "customEnvironment": { "message": "VlastnÊ prostredie" }, "customEnvironmentFooter": { - "message": "Pre pokročilÃŊch pouŞívateÄžov. MôŞete ÅĄpecifikovaÅĨ zÃĄkladnÃē URL pre kaÅždÃē sluÅžbu nezÃĄvisle." + "message": "Pre pokročilÃŊch pouŞívateÄžov. ZÃĄkladnÃē adresu URL kaÅždej sluÅžby môŞete určiÅĨ samostatne." }, "baseUrl": { "message": "URL servera" }, + "selfHostBaseUrl": { + "message": "Adresa URL vlastnÊho hostingu", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL API servera" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "URL prostredia boli uloÅženÊ." }, + "showAutoFillMenuOnFormFields": { + "message": "ZobraziÅĨ ponuku automatickÊho vypÄēňania na poliach formulÃĄra", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "NÃĄvrhy automatickÊho vypÄēňania" + }, + "showInlineMenuLabel": { + "message": "ZobraziÅĨ nÃĄvrhy automatickÊho vypÄēňania v poliach formulÃĄra" + }, + "showInlineMenuIdentitiesLabel": { + "message": "ZobrazovaÅĨ identity ako nÃĄvrhy" + }, + "showInlineMenuCardsLabel": { + "message": "ZobrazovaÅĨ karty ako nÃĄvrhy" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "ZobraziÅĨ nÃĄvrhy, keď je vybratÃĄ ikona" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Platí pre vÅĄetky prihlÃĄsenÊ Ãēčty." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Aby sa prediÅĄlo konfliktom, vypnite vstavanÊho sprÃĄvcu hesiel." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "UpraviÅĨ nastavenia prehliadača." + }, + "autofillOverlayVisibilityOff": { + "message": "VypnutÊ", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Keď je vybranÊ pole (zameranÊ)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Keď je vybratÃĄ ikona automatickÊho vypÄēňania", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "PovoliÅĨ automatickÊ vypÄēňanie pri načítaní strÃĄnky" + }, "enableAutoFillOnPageLoad": { "message": "PovoliÅĨ automatickÊ vypÄēňanie pri načítaní strÃĄnky" }, "enableAutoFillOnPageLoadDesc": { "message": "Ak je detekovanÃŊ prihlasovací formulÃĄr, automaticky vykonaÅĨ vypÄēňanie pri načítaní strÃĄnky." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Upozornenie:$CLOSETAG$ KompromitovanÊ alebo nedôveryhodnÊ webovÊ strÃĄnky môŞu vyuŞívaÅĨ automatickÊ vypÄēňanie pri načítaní strÃĄnky.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "SkompromitovanÊ alebo nedôveryhodnÊ strÃĄnky môŞu pri svojom načítaní zneuÅžiÅĨ automatickÊ dopÄēňanie." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Viac informÃĄcií o rizikÃĄch" + }, "learnMoreAboutAutofill": { "message": "DozvedieÅĨ sa viac o automatickom dopÄēňaní" }, @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "OtvoriÅĨ trezor v bočnom paneli" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "Automaticky vyplniÅĨ naposledy pouÅžitÊ prihlasovacie Ãēdaje pre tÃēto strÃĄnku" }, + "commandAutofillCardDesc": { + "message": "Automaticky vyplniÅĨ naposledy pouÅžitÃē kartu pre tÃēto strÃĄnku" + }, + "commandAutofillIdentityDesc": { + "message": "Automaticky vyplniÅĨ naposledy pouÅžitÃē identitu pre tÃēto strÃĄnku" + }, "commandGeneratePasswordDesc": { "message": "VygenerovaÅĨ a skopírovaÅĨ novÊ nÃĄhodnÊ heslo do schrÃĄnky" }, "commandLockVaultDesc": { "message": "ZamknÃēÅĨ trezor" }, - "privateModeWarning": { - "message": "Podpora privÃĄtneho reÅžimu je experimentÃĄlna a niektorÊ funkcie sÃē obmedzenÊ." - }, "customFields": { "message": "VlastnÊ polia" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Začiarkavacie políčko" + }, "cfTypeLinked": { "message": "PrepojenÊ", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Pri kaÅždom prihlÃĄsení zobrazí rozpoznateÄžnÃŊ obrÃĄzok." }, + "faviconDescAlt": { + "message": "VedÄža kaÅždÊho Ãēčtu zobraziÅĨ rozpoznateÄžnÃŊ obrÃĄzok. PouÅžije sa na vÅĄetky prihlÃĄsenÊ Ãēčty." + }, "enableBadgeCounter": { "message": "ZobraziÅĨ počítadlo na ikone" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identita" }, + "typeSshKey": { + "message": "KÄžÃēč SSH" + }, + "newItemHeader": { + "message": "NovÊ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "UpraviÅĨ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "ZobraziÅĨ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "HistÃŗria hesla" }, + "generatorHistory": { + "message": "HistÃŗria generÃĄtora" + }, + "clearGeneratorHistoryTitle": { + "message": "VymazaÅĨ histÃŗriu generÃĄtora" + }, + "cleargGeneratorHistoryDescription": { + "message": "Ak budete pokračovaÅĨ, vÅĄetky poloÅžky z histÃŗrie generÃĄtora budu natrvalo vymazanÊ. Naozaj chcete pokračovaÅĨ?" + }, "back": { "message": "SpäÅĨ" }, "collections": { "message": "Zbierky" }, + "nCollections": { + "message": "$COUNT$ zbierok", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "ObÄžÃēbenÊ" }, @@ -1282,6 +1874,10 @@ "message": "ZÃĄkladnÃĄ domÊna", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "ZÃĄkladnÃĄ domÊna (odporÃēčanÊ)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "NÃĄzov domÊny", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Spôsob mapovania", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "PredvolenÊ mapovanie", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "VoÄžby prepínača" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Neboli nÃĄjdenÊ Åžiadne heslÃĄ." }, + "clearHistory": { + "message": "VymazaÅĨ histÃŗriu" + }, + "nothingToShow": { + "message": "Nie je čo zobraziÅĨ" + }, + "nothingGeneratedRecently": { + "message": "V poslednej dobe ste nič negenerovali" + }, "remove": { "message": "OdstrÃĄniÅĨ" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "OdomknÃēÅĨ s PIN" }, + "setYourPinTitle": { + "message": "NastaviÅĨ PIN" + }, + "setYourPinButton": { + "message": "NastaviÅĨ PIN" + }, "setYourPinCode": { "message": "NastaviÅĨ kÃŗd PIN na odomykanie Bitwardenu. Nastavenie PIN sa vynuluje, ak sa Ãēplne odhlÃĄsite z aplikÃĄcie." }, + "setYourPinCode1": { + "message": "Na odomknutie Bitwardenu sa namiesto hlavnÊho hesla pouÅžije vÃĄÅĄ PIN. VÃĄÅĄ PIN sa resetuje, ak sa niekedy Ãēplne odhlÃĄsite zo Bitwardenu." + }, "pinRequired": { "message": "KÃŗd PIN je povinnÃŊ." }, "invalidPin": { "message": "NeplatnÃŊ PIN kÃŗd." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "PríliÅĄ veÄža neplatnÃŊch pokusov o zadanie PIN kÃŗdu. Odhlasuje sa." + }, "unlockWithBiometrics": { "message": "OdomknÃēÅĨ pomocou biometrie" }, + "unlockWithMasterPassword": { + "message": "OdomknÃēÅĨ pomocou hlavnÊho hesla" + }, "awaitDesktop": { "message": "ČakÃĄ sa na potvrdenie z desktopu" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Pri reÅĄtarte prehliadača zamknÃēÅĨ s hlavnÃŊm heslom" }, + "lockWithMasterPassOnRestart1": { + "message": "Pri reÅĄtarte prehliadača vyÅžadovaÅĨ hlavnÊ heslo" + }, "selectOneCollection": { "message": "Musíte vybraÅĨ aspoň jednu zbierku." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Jedno alebo viac nastavení organizÃĄcie ovplyvňujÃē vaÅĄe nastavenia generÃĄtora." }, + "passwordGenerator": { + "message": "GenerÃĄtor hesla" + }, + "usernameGenerator": { + "message": "GenerÃĄtor pouŞívateÄžskÊho mena" + }, + "useThisPassword": { + "message": "PouÅžiÅĨ toto heslo" + }, + "useThisUsername": { + "message": "PouÅžiÅĨ toto pouŞívateÄžskÊ meno" + }, + "securePasswordGenerated": { + "message": "BezpečnÊ heslo vygenerovanÊ! Nezabudnite tieÅž aktualizovaÅĨ heslo na strÃĄnke." + }, + "useGeneratorHelpTextPartOne": { + "message": "PouÅžite generÃĄtor", + "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": "na vytvorenie silnÊho, unikÃĄtneho hesla.", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { - "message": "Akcia pri vyprÅĄaní času pre trezor" + "message": "Akcia pri vyprÅĄaní časovÊho limitu pre trezor" + }, + "vaultTimeoutAction1": { + "message": "Akcia pri vyprÅĄaní časovÊho limitu" }, "lock": { "message": "UzamknÃēÅĨ", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "KÃ´ÅĄ", @@ -1452,15 +2101,21 @@ "restoredItem": { "message": "ObnovenÃĄ poloÅžka" }, + "alreadyHaveAccount": { + "message": "UÅž mÃĄte Ãēčet?" + }, "vaultTimeoutLogOutConfirmation": { "message": "OdhlÃĄsenie bude vyÅžadovaÅĨ online prihlÃĄsenie po vyprÅĄaní časovÊho limitu. Naozaj chcete pouÅžiÅĨ toto nastavenie?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Potvrdenie akcie pre vyprÅĄanÃŊ časovÃŊ limit" + "message": "Potvrdenie akcie pri vyprÅĄaní časovÊho limitu" }, "autoFillAndSave": { "message": "Auto-vyplniÅĨ a UloÅžiÅĨ" }, + "fillAndSave": { + "message": "VyplniÅĨ a uloÅžiÅĨ" + }, "autoFillSuccessAndSavedUri": { "message": "AutomatickÊ vypÄēnenie a uloÅženie ÃēspeÅĄnÊ" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "VaÅĄe novÊ heslo nespÄēňa pravidlÃĄ." }, + "receiveMarketingEmailsV2": { + "message": "DostÃĄvajte do schrÃĄnky rady, oznÃĄmenia a príleÅžitosti na vÃŊskum od spoločnosti Bitwarden." + }, + "unsubscribe": { + "message": "OdhlÃĄsiÅĨ sa z odberu" + }, + "atAnyTime": { + "message": "môŞete kedykoÄžvek." + }, + "byContinuingYouAgreeToThe": { + "message": "Pokračovaním sÃēhlasíte s" + }, + "and": { + "message": "a" + }, "acceptPolicies": { "message": "Označením tohto políčka sÃēhlasíte s nasledovnÃŊm:" }, @@ -1552,11 +2222,17 @@ "message": "ZÃĄsady ochrany osobnÃŊch Ãēdajov" }, "hintEqualsPassword": { - "message": "NÃĄpoveda pre heslo nemôŞe byÅĨ rovnakÃĄ ako heslo." + "message": "NÃĄpoveď k heslu nemôŞe byÅĨ rovnakÃĄ ako heslo." }, "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Chyba obnovenia prístupovÊho tokenu" + }, + "errorRefreshingAccessTokenDesc": { + "message": "NenaÅĄiel sa Åžiadny token obnovenia ani kÄžÃēče API. SkÃēste sa odhlÃĄsiÅĨ a znova prihlÃĄsiÅĨ." + }, "desktopSyncVerificationTitle": { "message": "Overenie synchronizÃĄcie desktopu" }, @@ -1576,7 +2252,7 @@ "message": "AplikÃĄcia Bitwarden Desktop musí byÅĨ pred pouÅžitím odomknutia pomocou biometrickÃŊch Ãēdajov spustenÃĄ." }, "errorEnableBiometricTitle": { - "message": "Nie je môŞnÊ povoliÅĨ biometriu" + "message": "Nie je môŞnÊ povoliÅĨ biometrickÊ Ãēdaje" }, "errorEnableBiometricDesc": { "message": "Akcia bola zruÅĄenÃĄ desktopovou aplikÃĄciou" @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Nezhoda Ãēčtu" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "KÄžÃēč biometrickÃŊch Ãēdajov sa nezhoduje" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Odomknutie biometrickÃŊmi Ãēdajmi zlyhalo. TajnÃŊ kÄžÃēč biometrickÃŊch Ãēdajov nedokÃĄzal odomknÃēÅĨ trezor. SkÃēste biometrickÊ Ãēdaje nastaviÅĨ znova." + }, "biometricsNotEnabledTitle": { "message": "Biometria nie je povolenÃĄ" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Biometria v prehliadači nie je podporovanÃĄ na tomto zariadení." }, + "biometricsNotUnlockedTitle": { + "message": "PouŞívateÄž je zamknutÃŊ alebo odhlÃĄsenÃŊ" + }, + "biometricsNotUnlockedDesc": { + "message": "Prosím, odomknite tohto pouŞívateÄža v počítačovej aplikÃĄcii a skÃēste to znova." + }, + "biometricsNotAvailableTitle": { + "message": "Odomykanie biometrickÃŊmi Ãēdajmi je nedostupnÊ" + }, + "biometricsNotAvailableDesc": { + "message": "Odomykanie biometrickÃŊmi Ãēdajmi je momentÃĄlne nedostupnÊ. SkÃēste to znova neskôr." + }, "biometricsFailedTitle": { "message": "Biometria zlyhala" }, @@ -1629,23 +2323,66 @@ "personalOwnershipPolicyInEffect": { "message": "Politika organizÃĄcie ovplyvňuje vaÅĄe moÅžnosti vlastníctva." }, + "personalOwnershipPolicyInEffectImports": { + "message": "ZÃĄsady organizÃĄcie zablokovali importovanie poloÅžiek do vÃĄÅĄho osobnÊho trezoru." + }, + "domainsTitle": { + "message": "DomÊny", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "VylÃēčenÊ domÊny" }, "excludedDomainsDesc": { "message": "Bitwarden nebude poÅžadovaÅĨ ukladanie prihlasovacích Ãēdajov pre tieto domÊny. Aby sa zmeny prejavili, musíte strÃĄnku obnoviÅĨ." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden nebude poÅžadovaÅĨ ukladanie prihlasovacích Ãēdajov pre tieto domÊny pre vÅĄetky prihlÃĄsenÊ Ãēčty. Aby sa zmeny prejavili, musíte strÃĄnku obnoviÅĨ." + }, + "websiteItemLabel": { + "message": "WebstrÃĄnka $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ nie je platnÃĄ domÊna", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "UloÅženÊ zmeny vylÃēčenej domÊny" + }, + "limitSendViews": { + "message": "ObmedziÅĨ zobrazenia" + }, + "limitSendViewsHint": { + "message": "Po dosiahnutí limitu si tento Send nemôŞe nikto zobraziÅĨ.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "ZostÃĄvajÃēci počet zobrazení: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, "send": { - "message": "OdoslaÅĨ", + "message": "Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDetails": { + "message": "Podrobnosti o Sende", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text, ktorÃŊ chcete zdieÄžaÅĨ" + }, "sendTypeFile": { "message": "SÃēbor" }, @@ -1666,6 +2406,9 @@ "message": "VÅĄetky Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "V predvolenom nastavení skryÅĨ text" + }, "maxAccessCountReached": { "message": "Bol dosiahnutÃŊ maximÃĄlny počet prístupov", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "ChrÃĄnenÊ heslom" }, + "copyLink": { + "message": "KopírovaÅĨ odkaz" + }, "copySendLink": { "message": "KopírovaÅĨ odkaz na Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Ste si istÃŊ, Åže chcete odstrÃĄniÅĨ Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Naozaj chcete natrvalo odstrÃĄniÅĨ tento Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "UpraviÅĨ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Send bude natrvalo odstrÃĄnenÃŊ v zadanÃŊ dÃĄtum a čas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send bude natrvalo odstrÃĄnenÃŊ v tento deň.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "DÃĄtum exspirÃĄcie" }, @@ -1769,6 +2523,10 @@ "message": "VoliteÄžne môŞete vyÅžadovaÅĨ heslo pre pouŞívateÄžov na prístup k tomuto Sendu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Pridajte voliteÄžnÊ heslo pre príjemcov na prístup k tomuto Sendu.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "ZabezpečenÃĄ poznÃĄmka o tomto Sende.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send vytvorenÃŊ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send bol ÃēspeÅĄne vytvorenÃŊ!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send bude k dispozícii kaÅždÊmu s odkazom nasledujÃēcu hodinu.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "Send bude k dispozícii kaÅždÊmu s odkazom po dobu $HOURS$ hod.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send bude k dispozícii kaÅždÊmu s odkazom nasledujÃēci deň.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "Send bude k dispozícii kaÅždÊmu s odkazom po dobu $DAYS$ dní.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "SkopírovanÃŊ odkaz na Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send upravenÃŊ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "ZobraziÅĨ rozÅĄÃ­renie v novom okne?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Na vytvorenie Sendu so sÃēborom musíte zobraziÅĨ rozÅĄÃ­renie v novom okne.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Ak chcete zvoliÅĨ sÃēbor, otvorte rozÅĄÃ­renie v bočnom paneli (ak je to moÅžnÊ) alebo kliknite do tohto okna kliknutím na tento banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Ak chcete zvoliÅĨ sÃēbor pomocou Safari, kliknite na tento banner a otvorte novÊ okno." }, + "popOut": { + "message": "ZobraziÅĨ v novom okne" + }, "sendFileCalloutHeader": { "message": "Skôr neÅž začnete" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "SkryÅĨ moju emailovÃē adresu pred príjemcami." }, + "hideYourEmail": { + "message": "SkryÅĨ moju e-mailovÃē adresu pri zobrazení." + }, "sendOptionsPolicyInEffect": { "message": "Jedno alebo viac pravidiel organizÃĄcie ovplyvňujÃē vaÅĄe moÅžnosti funkcie Send." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "VyÅžaduje sa overenie e-mailu" }, + "emailVerifiedV2": { + "message": "OverenÃŊ e-mail" + }, "emailVerificationRequiredDesc": { "message": "Na pouÅžitie tejto funkcie musíte overiÅĨ svoj e-mail. Svoj e-mail môŞete overiÅĨ vo webovom trezore." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "VaÅĄe hlavnÊ heslo nespÄēňa jednu alebo viacero podmienok vaÅĄej organizÃĄcie. Ak chcete získaÅĨ prístup k trezoru, musíte teraz aktualizovaÅĨ svoje hlavnÊ heslo. Pokračovaním sa odhlÃĄsite z aktuÃĄlnej relÃĄcie a budete sa musieÅĨ znova prihlÃĄsiÅĨ. Aktívne relÃĄcie na inÃŊch zariadeniach môŞu zostaÅĨ aktívne aÅž jednu hodinu." }, + "tdeDisabledMasterPasswordRequired": { + "message": "VaÅĄa organizÃĄcia zakÃĄzala ÅĄifrovanie dôveryhodnÊho zariadenia. Na prístup k trezoru nastavte hlavnÊ heslo." + }, "resetPasswordPolicyAutoEnroll": { "message": "AutomatickÃĄ registrÃĄcia" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "VybraÅĨ priečinok..." }, - "ssoCompleteRegistration": { - "message": "Aby ste dokončili nastavenie prihlasovacieho portÃĄlu (SSO), prosím nastavte hlavnÊ heslo na prístup a ochranu vÃĄÅĄho trezora." + "noFoldersFound": { + "message": "NenaÅĄli sa Åžiadne priečinky", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Povolenia vaÅĄej organizÃĄcie boli aktualizovanÊ, čo si vyÅžaduje nastavenie hlavnÊho hesla.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "VaÅĄa organizÃĄcia vyÅžaduje, aby ste nastavili hlavnÊ heslo.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "z $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "VyÅžaduje sa overenie", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hodiny" @@ -1904,6 +2740,9 @@ "minutes": { "message": "MinÃēty" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Na moÅžnosti pri vyprÅĄaní časovÊho limitu boli uplatnenÊ poÅžiadavky pravidiel spoločnosti" + }, "vaultTimeoutPolicyInEffect": { "message": "ZÃĄsady vaÅĄej organizÃĄcie ovplyvňujÃē časovÃŊ limit trezoru. MaximÃĄlny povolenÃŊ časovÃŊ limit trezoru je $HOURS$ h a $MINUTES$ m", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "MaximÃĄlne $HOURS$ hod. a $MINUTES$ min.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "ČasovÃŊ limit prekračuje obmedzenie nastavenÊ vaÅĄou organizÃĄciou: maximÃĄlne $HOURS$ hod. a $MINUTES$ min.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "ZÃĄsady vaÅĄej organizÃĄcie ovplyvňujÃē časovÃŊ limit trezoru. MaximÃĄlny povolenÃŊ časovÃŊ limit trezoru je $HOURS$ h a $MINUTES$ min. Nastavenie akcie pri vyprÅĄaní časovÊho limitu je $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exportovanie trezora organizÃĄcie" + }, + "exportingOrganizationVaultDesc": { + "message": "ExportovanÊ budÃē iba poloÅžky trezora organizÃĄcie spojenÊ s $ORGANIZATION$. PoloÅžky osobnÊho trezora a poloÅžky z inÃŊch organizÃĄcií nebudÃē zahrnutÊ.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Chyba" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "VygenerovaÅĨ pouŞívateÄžskÊ meno" }, + "generateEmail": { + "message": "GenerovaÅĨ e-mail" + }, + "generatorBoundariesHint": { + "message": "Hodnota musí byÅĨ medzi $MIN$ a $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Typ pouŞívateÄžskÊho mena" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "VytvoriÅĨ e-mailovÃŊ alias pomocou externej sluÅžby preposielania." }, + "forwarderDomainName": { + "message": "E-mailovÃĄ domÊna", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Vyberte domÊnu, ktorÃĄ je podporovanÃĄ vybranou sluÅžbou", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ chyba: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "VygenerovanÊ Bitwardenom.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "WebstrÃĄnka: $WEBSITE$. VygenerovanÊ Bitwardenom.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "NeplatnÃŊ token API $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "NeplatnÃŊ token API $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Nepodarilo sa získaÅĨ ID maskovanÊho e-mailovÊho Ãēčtu $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "NeplatnÃĄ domÊna $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "NeplatnÃĄ url adresa $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Vyskytla sa neznÃĄma chyba $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "NepodporovanÃĄ sluÅžba: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "NÃĄzov hostiteÄža", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Ako pouŞívaÅĨ automatickÊ vypÄēňanie" }, "autofillSelectInfoWithCommand": { - "message": "Vyberte poloÅžku z tejto strÃĄnky, alebo pouÅžite skratku: $COMMAND$", + "message": "Vyberte poloÅžku z ponuky, pouÅžite klÃĄvesovÃē skratku $COMMAND$, alebo preskÃēmajte ďalÅĄie moÅžnosti nastavenia.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Vyberte poloÅžku z tejto strÃĄnky, alebo nastavte skratku v nastaveniach." + "message": "Vyberte poloÅžku z ponuky alebo preskÃēmajte ďalÅĄie moÅžnosti nastavenia." }, "gotIt": { "message": "ChÃĄpem" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Nastavenia automatickÊho vypÄēňania" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Skratka automatickÊho vypÄēňania" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "ZmeniÅĨ skratku" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "SpravovaÅĨ skratky" + }, "autofillShortcut": { "message": "KlÃĄvesovÃĄ skratka automatickÊho vypÄēňania" }, - "autofillShortcutNotSet": { - "message": "Skratka automatickÊho vypÄēňania nie je nastavenÃĄ. Zmeníte ju v nastaveniach prehliadača." + "autofillLoginShortcutNotSet": { + "message": "Skratka automatickÊho vypÄēňania prihlasovacích Ãēdajov nie je nastavenÃĄ. Zmeníte ju v nastaveniach prehliadača." }, - "autofillShortcutText": { - "message": "Skratka automatickÊho vypÄēňania je: $COMMAND$. Zmeníte ju v nastaveniach prehliadača.", + "autofillLoginShortcutText": { + "message": "Skratka automatickÊho vypÄēňania prihlasovacích Ãēdajov je: $COMMAND$. Zmeníte ju v nastaveniach prehliadača.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "PrihlÃĄsenie na" - }, "opensInANewWindow": { "message": "OtvÃĄraÅĨ v novom okne" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Pole identifikÃĄtora SSO je povinnÊ." }, + "creatingAccountOn": { + "message": "VytvÃĄranie Ãēčtu na" + }, + "checkYourEmail": { + "message": "Skontrolujte si svoj e-mail" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Postupujte podÄža odkazu v e-maile zaslanom na adresu" + }, + "andContinueCreatingYourAccount": { + "message": "a pokračujte vo vytvÃĄraní Ãēčtu." + }, + "noEmail": { + "message": "ÅŊiadny email?" + }, + "goBack": { + "message": "PrejsÅĨ späÅĨ" + }, + "toEditYourEmailAddress": { + "message": "na Ãēpravu e-mailovej adresy." + }, "eu": { "message": "EÚ", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Prístup zamietnutÃŊ. NemÃĄte oprÃĄvnenie na zobrazenie tejto strÃĄnky." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "DôveryhodnÊ zariadenie" }, + "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." + }, + "sendsNoItemsMessage": { + "message": "PouÅžite Send na bezpečnÊ zdieÄžanie zaÅĄifrovanÃŊch informÃĄcii s kÃŊmkoÄžvek.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Vstup je povinnÃŊ." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "Jedno pole vyÅžaduje vaÅĄu pozornosÅĨ." + }, + "multipleFieldsNeedAttention": { + "message": "NiektorÊ polia ($COUNT$) vyÅžadujÃē vaÅĄu pozornosÅĨ.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Vyberte --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "PrepnÃēÅĨ zbalenie", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "ImportovaÅĨ Ãēdaje do Bitwardenu?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "OchrÃĄniÅĨ Ãēdaje z LastPassu a importovaÅĨ ich do Bitwardenu?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "UloÅžiÅĨ ako nezaÅĄifrovanÃŊ sÃēbor", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "ImportovaÅĨ do Bitwardenu", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importovanie...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Import Ãēdajov prebehol ÃēspeÅĄne!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Chyba pri importovaní. Podrobnosti nÃĄjdete v konzole.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Počas importu sa vyskytla chyba siete.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domÊna" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "PoloÅžky, ktorÊ vyÅžadujÃē opätovnÊ zadanie hlavnÊho hesla sa nedajÃē automaticky vyplniÅĨ pri načítaní strÃĄnky. AutomatickÊ vypÄēňanie pri načítaní strÃĄnky je vypnutÊ.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "AutomatickÊ vypÄēňanie pri načítaní strÃĄnky nastavenÊ na pôvodnÃē predvoÄžbu.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Vypnite vÃŊzvu na opätovnÊ zadanie hlavnÊho hesla na Ãēpravu tohto poÄža", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "PrepnÃēÅĨ bočnÃē navigÃĄciu" + }, + "skipToContent": { + "message": "PreskočiÅĨ na obsah" + }, + "bitwardenOverlayButton": { + "message": "Tlačidlo ponuky automatickÊho vypÄēňania Bitwardenu", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "PrepnÃēÅĨ ponuku automatickÊho vypÄēňania Bitwardenu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Ponuka automatickÊho vypÄēňania Bitwardenu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Odomknite svoj Ãēčet na zobrazenie zodpovedajÃēcich prihlasovacích Ãēdajov", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Odomknite svoj Ãēčet na zobrazenie nÃĄvrhov automatickÊho vypÄēňania", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "OdomknÃēÅĨ Ãēčet", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "OdomknÃēÅĨ konto v novom okne", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Vyplňte prihlasovacie Ãēdaje pre", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "ČiastočnÊ pouŞívateÄžskÊ meno", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "ÅŊiadne poloÅžky na zobrazenie", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "NovÃĄ poloÅžka", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "PridaÅĨ novÃē poloÅžku trezoru", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "NovÊ prihlasovacie Ãēdaje", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "PridaÅĨ do trezora novÊ prihlÃĄsenie. Otvorí sa v novom okne", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "NovÃĄ karta", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "PridaÅĨ do trezora novÃē kartu. Otvorí sa v novom okne", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "NovÃĄ identita", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "PridaÅĨ do trezora novÃē identitu. Otvorí sa v novom okne", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "K dispozícii je ponuka automatickÊho vyplňovania Bitwardenu. Stlačte tlačidlo so ÅĄÃ­pkou nadol a vyberte.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ZapnÃēÅĨ" + }, + "ignore": { + "message": "IgnorovaÅĨ" + }, + "importData": { + "message": "Import Ãēdajov", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Chyba importu" + }, + "importErrorDesc": { + "message": "Vyskytol sa problÊm s Ãēdajmi, ktorÊ ste sa pokÃēsili importovaÅĨ. VyrieÅĄte chyby uvedenÊ niÅžÅĄie v zdrojovom sÃēbore a skÃēste to znova." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "VyrieÅĄte problÊmy niÅžÅĄie a skÃēste to znova." + }, + "description": { + "message": "Popis" + }, + "importSuccess": { + "message": "Importovanie prebehlo ÃēspeÅĄne" + }, + "importSuccessNumberOfItems": { + "message": "Dokopy bolo importovanÃŊch $AMOUNT$ poloÅžiek.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "SkÃēsiÅĨ znova" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Pre tÃēto akciu sa vyÅžaduje overenie. Ak chcete pokračovaÅĨ, nastavte PIN kÃŗd." + }, + "setPin": { + "message": "NastaviÅĨ PIN kÃŗd" + }, + "verifyWithBiometrics": { + "message": "OveriÅĨ pomocou biometrie" + }, + "awaitingConfirmation": { + "message": "ČakajÃēce potvrdenie" + }, + "couldNotCompleteBiometrics": { + "message": "Overenie pomocou biometrie zlyhalo." + }, + "needADifferentMethod": { + "message": "Potrebujete inÃē metÃŗdu?" + }, + "useMasterPassword": { + "message": "PouÅžiÅĨ hlavnÊ heslo" + }, + "usePin": { + "message": "PouÅžiÅĨ PIN kÃŗd" + }, + "useBiometrics": { + "message": "PouÅžiÅĨ biometrickÊ Ãēdaje" + }, + "enterVerificationCodeSentToEmail": { + "message": "Zadajte overovací kÃŗd, ktorÃŊ vÃĄm bol zaslanÃŊ na e-mail." + }, + "resendCode": { + "message": "Znova odoslaÅĨ kÃŗd" + }, + "total": { + "message": "Celkom" + }, + "importWarning": { + "message": "Importujete Ãēdaje do $ORGANIZATION$. VaÅĄe Ãēdaje môŞu byÅĨ zdieÄžanÊ s členmi tejto organizÃĄcie. Chcete pokračovaÅĨ?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Chyba pri pripÃĄjaní k sluÅžbe Duo. PouÅžite inÃē metÃŗdu dvojstupňovÊho prihlÃĄsenia alebo kontaktujte Duo a poÅžiadajte o pomoc." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Spustite DUO a postupujte podÄža pokynov na dokončenie prihlÃĄsenia." + }, + "duoRequiredForAccount": { + "message": "Pre vÃĄÅĄ Ãēčet je potrebnÊ dvojstupňovÊ prihlÃĄsenie Duo." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Ak chcete dokončiÅĨ prihlÃĄsenie, otvorte rozÅĄÃ­renie." + }, + "popoutExtension": { + "message": "ZobraziÅĨ rozÅĄÃ­renie v novom okne" + }, + "launchDuo": { + "message": "SpustiÅĨ DUO" + }, + "importFormatError": { + "message": "DÃĄta nie sÃē sprÃĄvne formÃĄtovanÊ. Prosím, overte importovanÃŊ sÃēbor a skÃēste to znova." + }, + "importNothingError": { + "message": "Nič sa neimportovalo." + }, + "importEncKeyError": { + "message": "Chyba pri deÅĄifrovaní exportovanÊho sÃēboru. VÃĄÅĄ ÅĄifrovací kÄžÃēč sa nezhoduje so ÅĄifrovacím kÄžÃēčom pouÅžitÃŊm pri exporte Ãēdajov." + }, + "invalidFilePassword": { + "message": "NeplatnÊ heslo sÃēboru, pouÅžite heslo, ktorÊ ste zadali pri vytvÃĄraní exportnÊho sÃēboru." + }, + "destination": { + "message": "CieÄž" + }, + "learnAboutImportOptions": { + "message": "ZistiÅĨ viac o moÅžnostiach importu" + }, + "selectImportFolder": { + "message": "Vyberte priečinok" + }, + "selectImportCollection": { + "message": "Vyberte zbierku" + }, + "importTargetHint": { + "message": "ZvoÄžte tÃēto moÅžnosÅĨ, ak chcete obsah importovanÊho sÃēboru presunÃēÅĨ do $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "SÃēbor obsahuje nepriradenÊ poloÅžky." + }, + "selectFormat": { + "message": "Vyberte formÃĄt sÃēboru importu" + }, + "selectImportFile": { + "message": "VybraÅĨ sÃēbor na import" + }, + "chooseFile": { + "message": "VybraÅĨ sÃēbor" + }, + "noFileChosen": { + "message": "Nebol vybratÃŊ Åžiadny sÃēbor" + }, + "orCopyPasteFileContents": { + "message": "alebo kopírujte/vloÅžte obsah sÃēboru" + }, + "instructionsFor": { + "message": "$NAME$ pokyny", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "PotvrdiÅĨ import trezoru" + }, + "confirmVaultImportDesc": { + "message": "Tento sÃēbor je chrÃĄnenÃŊ heslom. Ak chcete importovaÅĨ Ãēdaje, zadajte heslo sÃēboru." + }, + "confirmFilePassword": { + "message": "PotvrdiÅĨ heslo sÃēboru" + }, + "exportSuccess": { + "message": "Údaje z trezora boli exportovanÊ" + }, + "typePasskey": { + "message": "PrístupovÃŊ kÄžÃēč" + }, + "accessing": { + "message": "Pristupovanie" + }, + "passkeyNotCopied": { + "message": "PrístupovÃŊ kÃŗd sa neskopíruje" + }, + "passkeyNotCopiedAlert": { + "message": "PrístupovÃŊ kÄžÃēč sa do klonovanej poloÅžky neskopíruje. Chcete pokračovaÅĨ v klonovaní tejto poloÅžky?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Overenie poÅžadovanÊ iniciujÃēcim webom. TÃĄto funkcia zatiaÄž nie je implementovanÃĄ pre Ãēčty bez hlavnÊho hesla." + }, + "logInWithPasskeyQuestion": { + "message": "PrihlÃĄsiÅĨ sa s prístupovÃŊm kÄžÃēčom?" + }, + "passkeyAlreadyExists": { + "message": "Pre tÃēto aplikÃĄciu uÅž existuje prístupovÃŊ kÄžÃēč." + }, + "noPasskeysFoundForThisApplication": { + "message": "Pre tÃēto aplikÃĄciu neboli nÃĄjdenÊ Åžiadne prístupovÊ kÄžÃēče." + }, + "noMatchingPasskeyLogin": { + "message": "Pre tÃēto strÃĄnku nemÃĄte zodpovedajÃēce prihlasovacie Ãēdaje." + }, + "noMatchingLoginsForSite": { + "message": "Pre tÃēto strÃĄnku sa nenaÅĄli prihlasovacie Ãēdaje" + }, + "searchSavePasskeyNewLogin": { + "message": "VyhÄžadaÅĨ alebo uloÅžiÅĨ prístupovÃŊ kÄžÃēč ako novÊ prihlasovacie Ãēdaje" + }, + "confirm": { + "message": "PotvrdiÅĨ" + }, + "savePasskey": { + "message": "UloÅžiÅĨ prístupovÃŊ kÄžÃēč" + }, + "savePasskeyNewLogin": { + "message": "UloÅžiÅĨ prístupovÃŊ kÄžÃēč ako novÊ prihlasovacie Ãēdaje" + }, + "chooseCipherForPasskeySave": { + "message": "Vyberte prihlasovacie Ãēdaje, do ktorÃŊch chcete uloÅžiÅĨ prístupovÃŊ kÄžÃēč" + }, + "chooseCipherForPasskeyAuth": { + "message": "Vyberte prístupovÃŊ kÄžÃēč, pomocou ktorÊho sa chcete prihlÃĄsiÅĨ" + }, + "passkeyItem": { + "message": "PoloÅžka prístupovÊho kÄžÃēča" + }, + "overwritePasskey": { + "message": "PrepísaÅĨ prístupovÃŊ kÄžÃēč?" + }, + "overwritePasskeyAlert": { + "message": "TÃĄto poloÅžka uÅž obsahuje prístupovÃŊ kÄžÃēč. Naozaj chcete prepísaÅĨ aktuÃĄlny prístupovÃŊ kÄžÃēč?" + }, + "featureNotSupported": { + "message": "Funkcia eÅĄte nie je podporovanÃĄ" + }, + "yourPasskeyIsLocked": { + "message": "Na pouÅžitie prístupovÊho kÄžÃēča sa vyÅžaduje overenie. Ak chcete pokračovaÅĨ, overte svoju totoÅžnosÅĨ." + }, + "multifactorAuthenticationCancelled": { + "message": "ViacfaktorovÊ overenie zruÅĄenÊ" + }, + "noLastPassDataFound": { + "message": "NenaÅĄli sa Åžiadne Ãēdaje z LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "NesprÃĄvne pouŞívateÄžskÊ meno alebo heslo" + }, + "incorrectPassword": { + "message": "NesprÃĄvne heslo" + }, + "incorrectCode": { + "message": "NesprÃĄvny kÃŗd" + }, + "incorrectPin": { + "message": "NesprÃĄvny PIN kÃŗd" + }, + "multifactorAuthenticationFailed": { + "message": "ViacfaktorovÊ overenie zlyhalo" + }, + "includeSharedFolders": { + "message": "ZahrnÃēÅĨ zdieÄžanÊ priečinky" + }, + "lastPassEmail": { + "message": "E-mail LastPass" + }, + "importingYourAccount": { + "message": "Importovanie vÃĄÅĄho Ãēčtu..." + }, + "lastPassMFARequired": { + "message": "VyÅžaduje sa viacfaktorovÊ overenie LastPass" + }, + "lastPassMFADesc": { + "message": "Zadajte jednorazovÃŊ prístupovÃŊ kÃŗd z aplikÃĄcie na overovanie" + }, + "lastPassOOBDesc": { + "message": "SchvÃĄÄžte ÅžiadosÅĨ o prihlÃĄsenie v aplikÃĄcii na overovanie alebo zadajte jednorazovÃŊ prístupovÃŊ kÃŗd." + }, + "passcode": { + "message": "PrístupovÃŊ kÃŗd" + }, + "lastPassMasterPassword": { + "message": "HlavnÊ heslo LastPass" + }, + "lastPassAuthRequired": { + "message": "VyÅžaduje sa overenie LastPass" + }, + "awaitingSSO": { + "message": "ČakÃĄ sa na overenie SSO" + }, + "awaitingSSODesc": { + "message": "Pokračujte v prihlasovaní pomocou prihlasovacích Ãēdajov svojej spoločnosti." + }, + "seeDetailedInstructions": { + "message": "PodrobnÊ pokyny nÃĄjdete na naÅĄej strÃĄnke pomoci na adrese", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "ImportovaÅĨ priamo z LastPass" + }, + "importFromCSV": { + "message": "ImportovaÅĨ z CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "SkÃēste to znova alebo vyhÄžadajte e-mail od spoločnosti LastPass, na overenie, či ste to vy." + }, + "collection": { + "message": "Zbierka" + }, + "lastPassYubikeyDesc": { + "message": "VloÅžte kÄžÃēč YubiKey priradenÃŊ k vÃĄÅĄmu Ãēčtu LastPass do USB portu počítača a potom sa dotknite jeho tlačidla." + }, + "switchAccount": { + "message": "PrepnÃēÅĨ Ãēčet" + }, + "switchAccounts": { + "message": "PrepnÃēÅĨ Ãēčty" + }, + "switchToAccount": { + "message": "PrepnÃēÅĨ na Ãēčet" + }, + "activeAccount": { + "message": "Aktívny Ãēčet" + }, + "availableAccounts": { + "message": "DostupnÊ Ãēčty" + }, + "accountLimitReached": { + "message": "DosiahnutÃŊ limit Ãēčtu. OdhlÃĄste sa z Ãēčtu, ak chcete pridaÅĨ ďalÅĄÃ­." + }, + "active": { + "message": "aktívne" + }, + "locked": { + "message": "zamknutÊ" + }, + "unlocked": { + "message": "odomknutÊ" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hotovanÊ na" + }, + "useDeviceOrHardwareKey": { + "message": "PouÅžiÅĨ vaÅĄe zariadenie alebo hardvÊrovÃŊ kÄžÃēč" + }, + "justOnce": { + "message": "Iba raz" + }, + "alwaysForThisSite": { + "message": "VÅždy pre tÃēto strÃĄnku" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ pridanÃĄ do vylÃēčenÃŊch domÊn.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "BeÅžnÊ formÃĄty", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "PokračovaÅĨ do nastavení prehliadača?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "PokračovaÅĨ v centre pomoci?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Zmeňte nastavenia automatickÊho vypÄēňania a sprÃĄvy hesiel vo svojom prehliadači.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "Skratky rozÅĄÃ­renia môŞete zobraziÅĨ a nastaviÅĨ v nastaveniach prehliadača.", + "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": "Zmeňte nastavenia automatickÊho vypÄēňania a sprÃĄvy hesiel vo svojom prehliadači.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "Skratky rozÅĄÃ­renia môŞete zobraziÅĨ a nastaviÅĨ v nastaveniach prehliadača.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "NastaviÅĨ Bitwarden ako predvolenÊho sprÃĄvcu hesiel?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ak nenastavíte tÃēto moÅžnosÅĨ, môŞe to spôsobiÅĨ konflikty medzi ponukou automatickÊho vypÄēňania Bitwardenu a ponukou vÃĄÅĄho prehliadača.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "NastaviÅĨ Bitwarden ako predvolenÃŊ sprÃĄvca hesiel", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Nie je moÅžnÊ nastaviÅĨ Bitwarden ako predvolenÊho sprÃĄvcu hesiel", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Ak chcete nastaviÅĨ Bitwarden ako predvolenÊho sprÃĄvcu hesiel, musíte mu udeliÅĨ oprÃĄvnenia na ochranu sÃēkromia v prehliadači.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "NastaviÅĨ ako predvolenÃŊ", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Prihlasovacie Ãēdaje boli ÃēspeÅĄne uloÅženÊ!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Heslo bolo uloÅženÊ!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Prihlasovacie Ãēdaje boli ÃēspeÅĄne aktualizovanÊ!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Heslo bolo aktualizovanÊ!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Chyba pri ukladaní prihlasovacích Ãēdajov. Viac informÃĄcii nÃĄjdete v konzole.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Úspech" + }, + "removePasskey": { + "message": "OdstrÃĄniÅĨ prístupovÃŊ kÄžÃēč" + }, + "passkeyRemoved": { + "message": "PrístupovÃŊ kÄžÃēč bol odstrÃĄnenÃŊ" + }, + "autofillSuggestions": { + "message": "NÃĄvrhy automatickÊho vypÄēňania" + }, + "autofillSuggestionsTip": { + "message": "UloÅžte poloÅžku prihlÃĄsenia pre tento web na automatickÊ vyplnenie" + }, + "yourVaultIsEmpty": { + "message": "VÃĄÅĄ trezor je prÃĄzdny" + }, + "noItemsMatchSearch": { + "message": "VyhÄžadÃĄvaniu nezodpovedajÃē Åžiadne poloÅžky" + }, + "clearFiltersOrTryAnother": { + "message": "VymaÅžte filtre alebo zmeňte vyhÄžadÃĄvanÃŊ vÃŊraz" + }, + "copyInfoTitle": { + "message": "SkopírovaÅĨ info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "SkopírovaÅĨ poznÃĄmku - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "ĎalÅĄie moÅžnosti, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "ĎalÅĄie moÅžnosti - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Zobrazit poloÅžku - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "AutomatickÊ vyplnenie - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Nie je čo kopírovaÅĨ" + }, + "assignToCollections": { + "message": "PrideliÅĨ k zbierkam" + }, + "copyEmail": { + "message": "SkopírovaÅĨ e-mail" + }, + "copyPhone": { + "message": "SkopírovaÅĨ telefÃŗn" + }, + "copyAddress": { + "message": "SkopírovaÅĨ adresu" + }, + "adminConsole": { + "message": "SprÃĄvcovskÃĄ konzola" + }, + "accountSecurity": { + "message": "Zabezpečenie Ãēčtu" + }, + "notifications": { + "message": "Upozornenia" + }, + "appearance": { + "message": "VzhÄžad" + }, + "errorAssigningTargetCollection": { + "message": "Chyba pri priraďovaní cieÄžovej kolekcie." + }, + "errorAssigningTargetFolder": { + "message": "Chyba pri priraďovaní cieÄžovÊho priečinka." + }, + "viewItemsIn": { + "message": "ZobraziÅĨ poloÅžky v $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "SpäÅĨ do $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "NovÃĄ" + }, + "removeItem": { + "message": "OdstrÃĄniÅĨ $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "PoloÅžky bez priečinka" + }, + "itemDetails": { + "message": "Podrobnosti o poloÅžke" + }, + "itemName": { + "message": "NÃĄzov poloÅžky" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Zbierky, ktorÊ môŞete len zobraziÅĨ nemôŞete odstrÃĄniÅĨ: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "OrganizÃĄcia je vypnutÃĄ" + }, + "owner": { + "message": "Vlastník" + }, + "selfOwnershipLabel": { + "message": "Vy", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "K poloÅžkÃĄm vo vypnutej organizÃĄcii nie je moÅžnÊ pristupovaÅĨ. PoÅžiadajte o pomoc vlastníka organizÃĄcie." + }, + "additionalInformation": { + "message": "ĎalÅĄie informÃĄcie" + }, + "itemHistory": { + "message": "HistÃŗria poloÅžky" + }, + "lastEdited": { + "message": "PoslednÃĄ Ãēprava" + }, + "ownerYou": { + "message": "Vlastník: Vy" + }, + "linked": { + "message": "PrepojenÊ" + }, + "copySuccessful": { + "message": "ÚspeÅĄne skopírovanÊ" + }, + "upload": { + "message": "NahraÅĨ" + }, + "addAttachment": { + "message": "PriloÅžiÅĨ prílohu" + }, + "maxFileSizeSansPunctuation": { + "message": "MaximÃĄlna veÄžkosÅĨ sÃēboru je 500 MB" + }, + "deleteAttachmentName": { + "message": "OdstrÃĄniÅĨ prílohu $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "StiahnuÅĨ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Naozaj chcete natrvalo odstrÃĄniÅĨ tÃēto prílohu?" + }, + "premium": { + "message": "PrÊmium" + }, + "freeOrgsCannotUseAttachments": { + "message": "BezplatnÊ organizÃĄcie nemôŞu pouŞívaÅĨ prílohy" + }, + "filters": { + "message": "Filtre" + }, + "personalDetails": { + "message": "OsobnÊ Ãēdaje" + }, + "identification": { + "message": "IdentifikÃĄcia" + }, + "contactInfo": { + "message": "KontaktnÊ informÃĄcie" + }, + "downloadAttachment": { + "message": "StiahnuÅĨ – $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "karta končí číslom", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Prihlasovacie Ãēdaje" + }, + "authenticatorKey": { + "message": "KÄžÃēč overovacej aplikÃĄcie" + }, + "autofillOptions": { + "message": "MoÅžnosti automatickÊho vypÄēňania" + }, + "websiteUri": { + "message": "WebovÃĄ strÃĄnka (URI)" + }, + "websiteUriCount": { + "message": "WebovÃĄ strÃĄnka (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "WebovÃĄ strÃĄnka pridanÃĄ" + }, + "addWebsite": { + "message": "PridaÅĨ webovÃē strÃĄnku" + }, + "deleteWebsite": { + "message": "OdstrÃĄniÅĨ webovÃē strÃĄnku" + }, + "defaultLabel": { + "message": "PredvolenÊ ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "ZobraziÅĨ spôsob mapovania $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "SkryÅĨ spôsob mapovania $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Automaticky vyplniÅĨ pri načítaní strÃĄnky?" + }, + "cardExpiredTitle": { + "message": "ExspirovanÃĄ karta" + }, + "cardExpiredMessage": { + "message": "Ak ste kartu obnovili, aktualizujte jej Ãēdaje" + }, + "cardDetails": { + "message": "Podrobnosti o karte" + }, + "cardBrandDetails": { + "message": "Podrobnosti o $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "PovoliÅĨ animÃĄcie" + }, + "showAnimations": { + "message": "ZobraziÅĨ animÃĄcie" + }, + "addAccount": { + "message": "PridaÅĨ Ãēčet" + }, + "loading": { + "message": "Načíta sa" + }, + "data": { + "message": "Údaje" + }, + "passkeys": { + "message": "PrístupovÊ kÄžÃēče", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "HeslÃĄ", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "PrihlÃĄsiÅĨ sa s prístupovÃŊm kÄžÃēčom", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "PriradiÅĨ" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "PoloÅžku si budÃē môcÅĨ pozrieÅĨ len členovia organizÃĄcie s prístupom k tÃŊmto zbierkam." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "PoloÅžky si budÃē môcÅĨ pozrieÅĨ len členovia organizÃĄcie s prístupom k tÃŊmto zbierkam." + }, + "bulkCollectionAssignmentWarning": { + "message": "Vybrali ste $TOTAL_COUNT$ poloÅžky. NemôŞete aktualizovaÅĨ $READONLY_COUNT$ poloÅžky(-iek), pretoÅže nemÃĄte oprÃĄvnenie na Ãēpravu.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "PridaÅĨ pole" + }, + "add": { + "message": "PridaÅĨ" + }, + "fieldType": { + "message": "Typ poÄža" + }, + "fieldLabel": { + "message": "NÃĄzov poÄža" + }, + "textHelpText": { + "message": "TextovÊ polia pouŞívajte pre takÊ Ãēdaje, ako sÃē bezpečnostnÊ otÃĄzky" + }, + "hiddenHelpText": { + "message": "SkrytÊ polia poŞívajte pre citlivÊ Ãēdaje ako je heslo" + }, + "checkBoxHelpText": { + "message": "Ak chcete automaticky vyplniÅĨ začiarkÃĄvacie políčko formulÃĄra, napríklad zapamätaÅĨ e-mail, pouÅžite začiarkÃĄvacie políčka" + }, + "linkedHelpText": { + "message": "Ak mÃĄte problÊmy s automatickÃŊm vypÄēňaním pre konkrÊtnu webovÃē strÃĄnku, pouÅžite prepojenÊ pole." + }, + "linkedLabelHelpText": { + "message": "Zadajte html atribÃēt poÄža id, name, aria-label, alebo placeholder." + }, + "editField": { + "message": "UpraviÅĨ pole" + }, + "editFieldLabel": { + "message": "UpraviÅĨ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "OdstrÃĄniÅĨ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "PridanÊ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "ZmeniÅĨ poradie $LABEL$. Na presun poloÅžky hore alebo dole pouÅžite klÃĄvesy so ÅĄÃ­pkami.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ presunutÊ vyÅĄÅĄie, pozícia $INDEX$/$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Vyberte zbierky na priradenie" + }, + "personalItemTransferWarningSingular": { + "message": "PoloÅžka sa natrvalo presunie do vybranej organizÃĄcie. UÅž ju nebudete vlastniÅĨ." + }, + "personalItemsTransferWarningPlural": { + "message": "Do vybranej organizÃĄcie sa natrvalo presunÃē $PERSONAL_ITEMS_COUNT$. Tieto poloÅžky uÅž nebudete vlastniÅĨ.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "Do $ORG$ sa natrvalo presunie jedna poloÅžka. PoloÅžku uÅž nebudete vlastniÅĨ.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "Do $ORG$ sa natrvalo presunÃē $PERSONAL_ITEMS_COUNT$ poloÅžky. Tieto poloÅžky uÅž nebudete vlastniÅĨ.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Zbierky boli ÃēspeÅĄne priradenÊ" + }, + "nothingSelected": { + "message": "Nič ste nevybrali." + }, + "movedItemsToOrg": { + "message": "VybratÊ poloÅžky boli presunutÊ do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "PoloÅžky presunutÊ do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "PoloÅžka presunutÃĄ do $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ presunutÊ niÅžÅĄie, pozícia $INDEX$/$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Umiestnenie poloÅžky" + }, + "fileSend": { + "message": "Send so sÃēborom" + }, + "fileSends": { + "message": "Sendy so sÃēborom" + }, + "textSend": { + "message": "TextovÃŊ Send" + }, + "textSends": { + "message": "TextovÊ Sendy" + }, + "bitwardenNewLook": { + "message": "Bitwarden mÃĄ novÃŊ vzhÄžad!" + }, + "bitwardenNewLookDesc": { + "message": "AutomatickÊ vypÄēňanie a vyhÄžadÃĄvanie na karte Trezor je jednoduchÅĄie a intuitívnejÅĄie ako kedykoÄžvek predtÃŊm. Poobzerajte sa!" + }, + "accountActions": { + "message": "OperÃĄcie s Ãēčtom" + }, + "showNumberOfAutofillSuggestions": { + "message": "ZobraziÅĨ počet odporÃēčanÃŊch prihlasovacích Ãēdajov na ikone rozÅĄÃ­renia" + }, + "systemDefault": { + "message": "PredvolenÊ systÊmom" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Na toto nastavenie boli uplatnenÊ poÅžiadavky pravidiel spoločnosti" + }, + "sshPrivateKey": { + "message": "SÃēkromnÃŊ kÄžÃēč" + }, + "sshPublicKey": { + "message": "VerejnÃŊ kÄžÃēč" + }, + "sshFingerprint": { + "message": "Odtlačok" + }, + "sshKeyAlgorithm": { + "message": "Typ kÄžÃēča" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Znova" + }, + "vaultCustomTimeoutMinimum": { + "message": "MinimÃĄlny vlastnÃŊ časovÃŊ limit je 1 minÃēta." + }, + "additionalContentAvailable": { + "message": "K dispozícii je ďalÅĄÃ­ obsah" + }, + "fileSavedToDevice": { + "message": "SÃēbor sa uloÅžil do zariadenia. Spravujte stiahnutÊ sÃēbory zo zariadenia." + }, + "showCharacterCount": { + "message": "ZobraziÅĨ počítadlo znakov" + }, + "hideCharacterCount": { + "message": "SkryÅĨ počítadlo znakov" + }, + "itemsInTrash": { + "message": "PoloÅžky v koÅĄi" + }, + "noItemsInTrash": { + "message": "V koÅĄi nie sÃē Åžiadne poloÅžky" + }, + "noItemsInTrashDesc": { + "message": "PoloÅžky, ktorÊ odstrÃĄnite, sa zobrazia tu a po 30 dňoch sa odstrÃĄnia natrvalo" + }, + "trashWarning": { + "message": "PoloÅžky, ktorÊ boli v koÅĄi viac ako 30 dní budÃē automaticky odstrÃĄnenÊ" + }, + "restore": { + "message": "ObnoviÅĨ" + }, + "deleteForever": { + "message": "Natrvalo odstrÃĄniÅĨ" + }, + "noEditPermissions": { + "message": "Na Ãēpravu tejto poloÅžky nemÃĄte oprÃĄvnenie" + }, + "authenticating": { + "message": "Overuje sa" + }, + "fillGeneratedPassword": { + "message": "VloÅžiÅĨ vygenerovanÊ heslo", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "VygenerovanÊ novÊ heslo", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "UloÅžiÅĨ prihlasovacie Ãēdaje do Bitwardenu?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Medzera", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Vlnovka", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "ObrÃĄtenÃĄ čiarka", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "VÃŊkričník", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "ZavinÃĄÄ", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "MrieÅžka", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "DolÃĄr", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percento", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "StrieÅĄka", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Hviezdička", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "ÄŊavÃĄ zÃĄtvorka", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "PravÃĄ zÃĄtvorka", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Podčiarkovník", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Spojovník", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "RovnÃĄ sa", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "ÄŊavÃĄ zloÅženÃĄ zÃĄtvorka", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "PravÃĄ zloÅženÃĄ zÃĄtvorka", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "ÄŊavÃĄ hranatÃĄ zÃĄtvorka", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "PravÃĄ hranatÃĄ zÃĄtvorka", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "ZvislÃĄ čiara", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "SpätnÃĄ lomka", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Dvojbodka", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Bodkočiarka", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "DvojitÊ Ãēvodzovky", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "JednoduchÊ Ãēvodzovky", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "ÄŊavÃĄ lomenÃĄ zÃĄtvorka", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "PravÃĄ lomenÃĄ zÃĄtvorka", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Čiarka", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Bodka", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "OtÃĄznik", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Lomka", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "MalÊ písmenÃĄ" + }, + "uppercaseAriaLabel": { + "message": "VeÄžkÊ písmenÃĄ" + }, + "generatedPassword": { + "message": "VygenerovanÊ heslo" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index ee581226b0c..24ad943bcc4 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Brezplačni upravitelj gesel", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Varen in brezplačen upravitelj gesel za vse vaÅĄe naprave.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Prijavite se ali ustvarite nov račun za dostop do svojega varnega trezorja." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Ustvari račun" }, - "login": { - "message": "Prijavi se" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enkratna podjetniÅĄka prijava." @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Če pozabite glavno geslo, boste prejeli ta namig, da bi se gesla laÅže spomnili." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Ponovno vnesite glavno geslo" }, "masterPassHint": { "message": "Namig za glavno geslo (neobvezno)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Zavihek" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopiraj geslo" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Kopiraj opombo" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopiraj varnostno kodo" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Samodejno izpolnjevanje" }, + "autoFillLogin": { + "message": "Samodejno izpolni prijavo" + }, + "autoFillCard": { + "message": "Samodejno izpolni kartico" + }, + "autoFillIdentity": { + "message": "Samodejno izpolni identiteto" + }, "generatePasswordCopied": { "message": "Generiraj geslo (kopirano)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Ni ustreznih prijav." }, + "noCards": { + "message": "Ni kartic" + }, + "noIdentities": { + "message": "Ni identitet" + }, + "addLoginMenu": { + "message": "Dodaj prijavo" + }, + "addCardMenu": { + "message": "Dodaj kartico" + }, + "addIdentityMenu": { + "message": "Dodaj identiteto" + }, "unlockVaultMenu": { "message": "Odkleni svoj trezor" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Dodaj element" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Namig za geslo" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Za nadaljevanje potrdite svojo istovetnost." }, - "account": { - "message": "Račun" - }, "changeMasterPassword": { "message": "Spremeni glavno geslo" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Identifikacijsko geslo", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Odjava" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "O programu" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Različica" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Uredi mapo" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "IzbriÅĄi mapo" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Avtomatično generiraj močna, edinstvena gesla za vaÅĄe prijave." }, - "bitWebVault": { - "message": "Bitwarden spletni trezor" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Uvozi elemente" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generiraj geslo" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Ponovno ustvari geslo" }, @@ -244,17 +447,60 @@ "length": { "message": "DolÅžina" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Velike črke (A-Z)" + "message": "Velike črke (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Male črke (a-z)" + "message": "Male črke (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Å tevke (0-9)" + "message": "Å tevke (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Posebni znaki (!@#$%^&*)" + "message": "Posebni znaki (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Å tevilo besed" @@ -276,7 +522,16 @@ "message": "Minimalno posebnih znakov" }, "avoidAmbChar": { - "message": "Izogibaj se dvoumnim znakom" + "message": "Izogibaj se dvoumnim znakom", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "IÅĄÄi v trezorju" @@ -299,15 +554,30 @@ "password": { "message": "Geslo" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Večbesedno geslo" }, "favorite": { "message": "Priljubljeni" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Opombe" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Opomba" }, @@ -326,6 +596,18 @@ "launch": { "message": "ZaÅženi" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Spletna stran" }, @@ -338,8 +620,23 @@ "other": { "message": "Drugo" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Da spremenite časovne omejitve trezorja, nastavite metodo odklepanja." + }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" }, "rateExtension": { "message": "Ocenite to razÅĄiritev" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "VaÅĄ trezor je zaklenjen. Za nadaljevanje potrdite svojo identiteto." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Odkleni" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Zakleni trezor, ko preteče toliko časa:" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Zakleni zdaj" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Takoj" }, @@ -426,6 +738,18 @@ "security": { "message": "Varnost" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "PriÅĄlo je do napake" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "VaÅĄ račun je ustvarjen. Lahko se prijavite." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "Poslali smo vam e-poÅĄtno spročilo z namigom za vaÅĄe glavno geslo." }, "verificationCodeRequired": { "message": "Koda za preverjanje je obvezna." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Neveljavna koda za preverjanje" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Izbrane prijave na tej strani ni mogoče samodejno izpolniti. Namesto tega podatke kopirajte in prilepite." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "Odjavljen" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "VaÅĄa seja je potekla." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Ste prepričani, da se Åželite odjaviti?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Mapa dodana" }, - "changeMasterPass": { - "message": "Spremeni glavno geslo" - }, - "changeMasterPasswordConfirmation": { - "message": "Svoje glavno geslo lahko spremenite v Bitwardnovem spletnem trezorju. ÅŊelite zdaj obiskati Bitwardnovo spletno stran?" - }, "twoStepLoginConfirmation": { "message": "Avtentikacija v dveh korakih dodatno varuje vaÅĄ račun, saj zahteva, da vsakokratno prijavo potrdite z drugo napravo, kot je varnostni ključ, aplikacija za preverjanje pristnosti, SMS, telefonski klic ali e-poÅĄta. Avtentikacijo v dveh korakih lahko omogočite v spletnem trezorju bitwarden.com. Ali Åželite spletno stran obiskati sedaj?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Mapa shranjena" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Nov URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Element dodan" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Predlagaj dodajanje prijave" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Predlagaj dodajanje novega elementa, če v trezorju ni ustreznega." }, + "addLoginNotificationDescAlt": { + "message": "Če predmeta ni v trezorju, ga je potrebno dodati. Velja za vse prijavljene račune." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "PrikaÅži kartice na strani Zavihek" }, "showCardsCurrentTabDesc": { "message": "Na strani Zavihek prikaÅži kartice za laÅžje samodejno izpoljnjevanje." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "PrikaÅži identitete na strani Zavihek" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "VpraÅĄaj, ali naj Bitwarden posodobi geslo prijave, kadar zazna spremembo gesla na spletni strani" }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "ÅŊelite, da Bitwarden shrani spremembo tega gesla?" }, @@ -634,20 +1043,26 @@ "message": "Da, posodobi zdaj" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "PrikaÅži moÅžnosti kontekstnega menuja" }, "contextMenuItemDesc": { "message": "Z desnim klikom se vam prikaÅžejo moÅžnosti generiranja gesel in shranjenih prijav za spletno stran, na kateri ste." }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Privzet način preverjanja ujemanja URI-ja", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Izberite privzeti način preverjanja ujemanja URI-ja pri samodejnem izpolnjevanju in drugih dejanjih." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Spremeni temo aplikacije." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Temno", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Izvoz trezorja" }, "fileFormat": { "message": "Format datoteke" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "OPOZORILO", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "V skupni rabi" }, - "learnOrg": { - "message": "Preberite več o organizacijah" - }, - "learnOrgConfirmation": { - "message": "Bitwarden omogoča, da elemente v svojem trezorju delite z drugimi z uporabo organizacije. ÅŊelite obskati spletiÅĄÄe bitwarden.com za več informacij?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Premakni v organizacijo" @@ -762,6 +1204,9 @@ "file": { "message": "Datoteka" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Izberite datoteko." }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB ÅĄifriranega prostora za shrambo podatkov." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Premium članstvo lahko kupite na spletnem trezoju bitwarden.com. ÅŊelite obiskati spletno stran zdaj?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Ste premium član!" }, "premiumCurrentMemberThanks": { "message": "Hvala, ker podpirate Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "Vse za samo $PRICE$ /leto!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "OsveÅževanje zaključeno" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Aplikacija za avtentikacijo" }, - "authenticatorAppDesc": { - "message": "Uporabite aplikacijo za avtentikacijo (npr. Authy ali Google Authenticator), ki za vas ustvarja časovno spremenljive kode.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "Varnostni ključ YubiKey za enkratna gesla" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Za dostop do svojega računa uporabite YubiKey. Podprti so YubiKey 4, 4 Nano, 4C in naprave NEO." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-poÅĄta" }, - "emailDesc": { - "message": "Potrditvene kode vam bodo posredovane po e-poÅĄti." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Okolje po meri" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL naslov streÅžnika" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL naslov API streÅžnika" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Samodejno izpolni, ko se stran naloÅži" }, "enableAutoFillOnPageLoadDesc": { "message": "Če Bitwarden na strani zazna prijavni obrazec, ga samodejno izpolni takoj, ko se stran naloÅži." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Spletne strani, ki jim ne zaupate ali v katere so vdrli, lahko zlorabijo samodejno izpolnjevanje ob naloÅžitvi strani." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" + }, "learnMoreAboutAutofill": { "message": "Preberite več o samodejnem izpolnjevanju" }, @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Samodejno izpolni s prijavo, ki je bila na tej strani uporabljena zadnja" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Ustvari novo naključno geslo in ga kopiraj v odloÅžiÅĄÄe" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Zakleni trezor" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Polja po meri" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Logična vrednost" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Povezano polje", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identiteta" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Zgodovina gesel" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Nazaj" }, "collections": { "message": "Zbirke" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Priljubljeno" }, @@ -1282,6 +1874,10 @@ "message": "Bazna domena", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Ime domene", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Preverjanje ujemanja", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Privzeto preverjanje ujemanja", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "PrikaÅži/skrij moÅžnosti" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Ni takÅĄnih gesel." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Odstrani" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Odkleni s PIN-kodo" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Za odklep Bitwardna si nastavite PIN-kodo. PIN-koda bo ponastavljena, če se boste popolnoma odjavili iz aplikacije." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Potrebna je PIN-koda." }, "invalidPin": { "message": "Nepravilna PIN-koda." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Prijava z biometriko" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Čakam na potrditev z namizja" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Zakleni z glavnim geslom ob ponovnem zagonu brskalnika" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Izbrati morate vsaj eno zbirko." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Dejanje ob poteku roka" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Zaklepanje", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "KoÅĄ", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Element obnovljen" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Samodejno izpolni in shrani" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "Element je bil samodejno izpolnjen in shranjen" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "VaÅĄe novo glavno geslo ne ustreza zahtevam." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "Strinjam se z naslednjim:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "V redu" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Izključene domene" }, "excludedDomainsDesc": { "message": "Za te domene Bitwarden ne bo predlagal shranjevanja prijavnih podatkov. Sprememba nastavitev stopi v veljavo ÅĄele, ko osveÅžite stran." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ni veljavna domena", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "PoÅĄiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "IÅĄÄi poÅĄiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Besedilo" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Datoteka" }, @@ -1666,6 +2406,9 @@ "message": "Vse poÅĄiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Kopiraj povezavo poÅĄiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Ste prepričani, da Åželite izbrisati to poÅĄiljko?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Uredi poÅĄiljko", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "PoÅĄiljka bo trajno izbrisana ob izbranem času.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Datum poteka" }, @@ -1769,6 +2523,10 @@ "message": "Za dostop do te poÅĄiljke lahko nastavite geslo.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Zasebni zapiski o tej poÅĄiljki.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "PoÅĄiljka ustvarjena", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "PoÅĄiljka shranjena", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Preden pričnete" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Skrij moj e-naslov pred prejemniki." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Nekatere nastavitve organizacije vplivajo na moÅžnosti, ki jih imate v zvezi s poÅĄiljkami." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Potrebna je potrditev e-naslova" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "Za uporabo te funkcionalnosti morate potrditi svoj e-naslov. To lahko storite v spletnem trezorju." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Izberi mapo..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Ur" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minut" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Napaka" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Ustvari uporabniÅĄko ime" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Vrsta uporabniÅĄkega imena" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Kako uporabljati samodejno izpolnjevanje" }, "autofillSelectInfoWithCommand": { - "message": "Izberite element na tej strani ali pa uporabite bliÅžnjico $COMMAND$.", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Izberite element na tej strani ali pa nastavite bliÅžnjico v nastavitvah." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Razumem" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Nastavitve" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "BliÅžnjica za samodejno izpolnjevanje" }, - "autofillShortcutNotSet": { - "message": "BliÅžnjična tipka za samodejno izpolnjevanje ni nastavljena. Nastavite jo lahko v nastavitvah brskalnika." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "BliÅžnjična tipka za samodejno izpolnjevanje je $COMMAND$. Spremenite jo lahko v nastavitvah brskalnika.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Odpre se v novem oknu" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index a75cd39ebca..d39949ecd07 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - ĐąĐĩҁĐŋĐģĐ°Ņ‚ĐŊи ĐŧĐĩĐŊĐ°ŅŸĐĩŅ€ ĐģОСиĐŊĐēи", + "message": "Bitwarden МĐĩĐŊĐ°ŅŸĐĩŅ€ ЛозиĐŊĐēĐĩ", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊи и ĐąĐĩҁĐŋĐģĐ°Ņ‚ĐŊи ĐŧĐĩĐŊĐ°ŅŸĐĩŅ€ ĐģОСиĐŊĐēи Са ŅĐ˛Đĩ Đ˛Đ°ŅˆĐĩ ŅƒŅ€ĐĩŅ’Đ°Ņ˜Đĩ.", - "description": "Extension description" + "message": "БиĐģĐž ĐŗĐ´Đĩ, Bitwarden ĐģаĐēĐž ОйĐĩСйĐĩŅ’ŅƒŅ˜Đĩ ŅĐ˛Đĩ Đ˛Đ°ŅˆĐĩ ĐģОСиĐŊĐēĐĩ, ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊĐĩ ĐēŅ™ŅƒŅ‡ĐĩвĐĩ и ĐžŅĐĩŅ‚Ņ™Đ¸Đ˛Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ˜Đĩ", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ иĐģи ĐēŅ€ĐĩĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ ĐŊОви ĐŊаĐģĐžĐŗ Са ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋ ҁĐĩŅ„Ņƒ." }, + "inviteAccepted": { + "message": "Позив ĐŋŅ€Đ¸Ņ…Đ˛Đ°Ņ›ĐĩĐŊ" + }, "createAccount": { "message": "ĐšŅ€ĐĩĐ¸Ņ€Đ°Ņ˜ ĐŊаĐģĐžĐŗ" }, - "login": { - "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ" + "newToBitwarden": { + "message": "Нови ҁ҂Đĩ ҃ Bitwarden-҃?" + }, + "logInWithPasskey": { + "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ ŅĐ° ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊиĐŧ ĐēŅ™ŅƒŅ‡ĐĩĐŧ" + }, + "useSingleSignOn": { + "message": "ĐŖĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚Đ¸ ҘĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊ҃ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ" + }, + "welcomeBack": { + "message": "Đ”ĐžĐąŅ€ĐžĐ´ĐžŅˆĐģи ĐŊаСад" + }, + "setAStrongPassword": { + "message": "ĐŸĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ Ņ˜Đ°Đē҃ ĐģОСиĐŊĐē҃" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Đ—Đ°Đ˛Ņ€ŅˆĐ¸Ņ‚Đĩ ĐēŅ€ĐĩĐ¸Ņ€Đ°ŅšĐĩ ĐŊаĐģĐžĐŗĐ° ĐŋĐžŅŅ‚Đ°Đ˛Ņ™Đ°ŅšĐĩĐŧ ĐģОСиĐŊĐēĐĩ" }, "enterpriseSingleSignOn": { "message": "Enterprise ЈĐĩĐ´ĐŊа ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ°" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ХавĐĩŅ‚ ГĐģавĐŊĐĩ ЛозиĐŊĐēĐĩ ĐŧĐžĐļĐĩ да ВаĐŧ ĐŋĐžĐŧĐžĐŗĐŊĐĩ да ҁĐĩ ĐŋĐžŅ‚ŅĐĩŅ‚Đ¸Ņ‚Đĩ аĐēĐž ҘĐĩ ĐˇĐ°ĐąĐžŅ€Đ°Đ˛Đ¸Ņ‚Đĩ." }, + "masterPassHintText": { + "message": "АĐēĐž ĐˇĐ°ĐąĐžŅ€Đ°Đ˛Đ¸Ņ‚Đĩ ĐģОСиĐŊĐē҃, ĐŊĐ°ĐŗĐžĐ˛ĐĩŅˆŅ‚Đ°Ņ˜ Са ĐģОСиĐŊĐē҃ ҁĐĩ ĐŧĐžĐļĐĩ ĐŋĐžŅĐģĐ°Ņ‚Đ¸ ĐŊа Đ˛Đ°Ņˆ иĐŧĐĩҘĐģ. $CURRENT$/$MAXIMUM$ ĐēĐ°Ņ€Đ°ĐēŅ‚ĐĩŅ€Đ° ĐŧаĐēŅĐ¸Đŧ҃Đŧ.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "ПоĐŊĐžĐ˛Đ¸Ņ‚Đĩ ГĐģавĐŊ҃ ЛозиĐŊĐē҃" }, "masterPassHint": { "message": "ХавĐĩŅ‚ ГĐģавĐŊĐĩ ЛозиĐŊĐēĐĩ (ĐžĐŋŅ†Đ¸ĐžĐŊĐž)" }, + "joinOrganization": { + "message": "ĐŸŅ€Đ¸Đ´Ņ€ŅƒĐļи ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Ņƒ" + }, + "joinOrganizationName": { + "message": "ĐŸŅ€Đ¸Đ´Ņ€ŅƒĐļĐ¸Ņ‚Đ¸ ҁĐĩ $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Đ—Đ°Đ˛Ņ€ŅˆĐ¸Ņ‚Đĩ ĐŋŅ€Đ¸Đ´Ņ€ŅƒĐļĐ¸Đ˛Đ°ŅšĐĩ ĐžĐ˛ĐžŅ˜ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ¸ ĐŋĐžŅŅ‚Đ°Đ˛Ņ™Đ°ŅšĐĩĐŧ ĐŗĐģавĐŊĐĩ ĐģОСиĐŊĐēĐĩ." + }, "tab": { "message": "ЈĐĩĐˇĐ¸Ņ‡Đ°Đē" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ĐģОСиĐŊĐē҃" }, + "copyPassphrase": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊ҃ Ņ„Ņ€Đ°ĐˇŅƒ" + }, "copyNote": { "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ĐąĐĩĐģĐĩ҈Đē҃" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅĐŊи ĐēОд" }, + "copyName": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ иĐŧĐĩ" + }, + "copyCompany": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ Ņ„Đ¸Ņ€Đŧ҃" + }, + "copySSN": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ĐąŅ€ĐžŅ˜ ŅĐžŅ†Đ¸Ņ˜Đ°ĐģĐŊĐžĐŗ ĐžŅĐ¸ĐŗŅƒŅ€Đ°ŅšĐ°" + }, + "copyPassportNumber": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ĐąŅ€ĐžŅ˜ ĐŋĐ°ŅĐžŅˆĐ°" + }, + "copyLicenseNumber": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ĐąŅ€ĐžŅ˜ ĐģĐ¸Ņ†ĐĩĐŊ҆Đĩ" + }, + "copyPrivateKey": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊи ĐēŅ™ŅƒŅ‡" + }, + "copyPublicKey": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ Ņ˜Đ°Đ˛ĐŊи ĐēŅ™ŅƒŅ‡" + }, + "copyFingerprint": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ‚Đ¸ ĐžŅ‚Đ¸ŅĐ°Đē" + }, + "copyCustomField": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ‚Đ¸ $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ‚Đ¸ вĐĩĐąŅĐ°Ņ˜Ņ‚" + }, + "copyNotes": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ‚Đ¸ ĐąĐĩĐģĐĩ҈ĐēĐĩ" + }, + "fill": { + "message": "ПоĐŋ҃ĐŊи", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž Đ´ĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ" }, + "autoFillLogin": { + "message": "ĐŅƒŅ‚Đž-Đŋ҃ҚĐĩҚĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ" + }, + "autoFillCard": { + "message": "ĐŅƒŅ‚Đž-Đŋ҃ҚĐĩҚĐĩ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ" + }, + "autoFillIdentity": { + "message": "ĐŅƒŅ‚Đž-Đŋ҃ҚĐĩҚĐĩ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚Đ°" + }, "generatePasswordCopied": { "message": "ГĐĩĐŊĐĩŅ€Đ¸ŅˆĐ¸ ЛозиĐŊĐē҃ (ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊĐž)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "НĐĩĐŧа ĐžĐ´ĐŗĐžĐ˛Đ°Ņ€Đ°Ņ˜ŅƒŅ›Đ¸Ņ… ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐ°." }, + "noCards": { + "message": "НĐĩĐŧа ĐēĐ°Ņ€Ņ‚Đĩ" + }, + "noIdentities": { + "message": "НĐĩĐŧа идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚Đ°" + }, + "addLoginMenu": { + "message": "НĐĩĐŧа ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ" + }, + "addCardMenu": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Ņƒ" + }, + "addIdentityMenu": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚" + }, "unlockVaultMenu": { "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜ ŅĐ˛ĐžŅ˜ ҁĐĩŅ„" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Đ”ĐžĐ´Đ°Ņ˜ ŅŅ‚Đ°Đ˛Đē҃" }, + "accountEmail": { + "message": "ИĐŧĐĩҘĐģ ĐŊаĐģĐžĐŗĐ°" + }, + "requestHint": { + "message": "Đ—Đ°Ņ…Ņ‚ĐĩĐ˛Đ°Ņ˜ ŅĐ°Đ˛ĐĩŅ‚" + }, + "requestPasswordHint": { + "message": "Đ—Đ°Ņ‚Ņ€Đ°ĐļĐ¸Ņ‚Đ¸ ŅĐ°Đ˛ĐĩŅ‚ ĐģОСиĐŊĐēĐĩ" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ иĐŧĐĩҘĐģ ŅĐ˛ĐžĐŗ ĐŊаĐģĐžĐŗĐ° и ĐąĐ¸Ņ›Đĩ ваĐŧ ĐŋĐžŅĐģĐ°Ņ‚ ŅĐ°Đ˛ĐĩŅ‚ Са ĐģОСиĐŊĐē҃" + }, "passwordHint": { "message": "ХавĐĩŅ‚ ĐģОСиĐŊĐēĐĩ" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "ĐŸĐžŅ‚Đ˛Ņ€Đ´Đ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚ да йи ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Đģи." }, - "account": { - "message": "НаĐģĐžĐŗ" - }, "changeMasterPassword": { "message": "ĐŸŅ€ĐžĐŧĐĩĐŊи ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃" }, + "continueToWebApp": { + "message": "Đ˜Ņ›Đ¸ ĐŊа вĐĩĐą аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Ņƒ?" + }, + "continueToWebAppDesc": { + "message": "Đ˜ŅŅ‚Ņ€Đ°ĐļĐ¸Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ ŅĐ˛ĐžŅ˜ŅŅ‚Đ°Đ˛Đ° ĐŊа Bitwarden ĐŊаĐģĐžĐŗŅƒ ĐŊа вĐĩĐą аĐŋĐģиĐēĐ°Đ¸Ņ˜Đ¸." + }, + "continueToHelpCenter": { + "message": "ĐĐ°ŅŅ‚Đ°Đ˛Đ¸ ĐŊа ĐŋĐžĐŧĐžŅ›ĐŊи ҆ĐĩĐŊŅ‚Đ°Ņ€?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden ҃ ĐŋĐžĐŧĐžŅ›ĐŊи ҆ĐĩĐŊŅ‚Đ°Ņ€." + }, + "continueToBrowserExtensionStore": { + "message": "ЖĐĩĐģĐ¸Ņ‚Đĩ Đģи да ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ҃ ĐŋŅ€ĐžĐ´Đ°Đ˛ĐŊĐ¸Ņ†Ņƒ Đ´ĐžĐ´Đ°Ņ‚Đ°Đēа Са ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "ПоĐŧĐžĐˇĐ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸Đŧа да ŅĐ°ĐˇĐŊĐ°Ņ˜Ņƒ да Đģи ҘĐĩ Bitwarden ĐŋŅ€Đ°Đ˛Đ¸ Са ŅšĐ¸Ņ…. ĐŸĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžĐ´Đ°Đ˛ĐŊĐ¸Ņ†Ņƒ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ° и ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ĐžŅ†ĐĩĐŊ҃." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "МоĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đ¸ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃ ĐŊа Bitwarden вĐĩĐą аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ¸." + }, "fingerprintPhrase": { "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊĐžŅĐŊа Đ¤Ņ€Đ°ĐˇĐ° ĐĄĐĩŅ„Đ°", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "ĐžĐ´Ņ˜Đ°Đ˛Đ¸ ҁĐĩ" }, + "aboutBitwarden": { + "message": "О Bitwarden" + }, "about": { "message": "О аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ¸" }, + "moreFromBitwarden": { + "message": "Đ’Đ¸ŅˆĐĩ Од Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "ĐĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đ¸ ĐŊа bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator ĐžĐŧĐžĐŗŅƒŅ›Đ°Đ˛Đ° ваĐŧ да Ņ‡ŅƒĐ˛Đ°Ņ‚Đĩ ĐēŅ™ŅƒŅ‡ĐĩвĐĩ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ° и ĐŗĐĩĐŊĐĩŅ€Đ¸ŅˆĐĩŅ‚Đĩ ĐĸОĐĸП ĐēОдОвĐĩ Са Ņ‚ĐžĐēОвĐĩ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đĩ ҃ 2 ĐēĐžŅ€Đ°Đēа. ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ ĐŊа bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊĐž Ņ‡ŅƒĐ˛Đ°Ņ˜Ņ‚Đĩ, ҃ĐŋŅ€Đ°Đ˛Ņ™Đ°Ņ˜Ņ‚Đĩ и Đ´ĐĩĐģĐ¸Ņ‚Đĩ Ņ‚Đ°Ņ˜ĐŊĐĩ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐĩŅ€Đ° ŅĐ° Bitwarden Secrets Manager. ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ ĐŊа bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "ĐšŅ€ĐĩĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ ĐŗĐģĐ°Ņ‚ĐēĐž и ĐąĐĩСйĐĩĐ´ĐŊĐž Đ¸ŅĐēŅƒŅŅ‚Đ˛Đž ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐ° ĐąĐĩС Ņ‚Ņ€Đ°Đ´Đ¸Ņ†Đ¸ĐžĐŊаĐģĐŊĐ¸Ņ… ĐģОСиĐŊĐēи ŅĐ° Passwordless.dev. ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ ĐŊа bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "БĐĩҁĐŋĐģĐ°Ņ‚ĐŊĐž Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "ИĐŧĐ°Ņ‚Đĩ ĐŋŅ€Đ°Đ˛Đž ĐŊа БĐĩҁĐŋĐģĐ°Ņ‚ĐŊĐž Bitwarden Families. Đ˜ŅĐēĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐžĐ˛Ņƒ ĐŋĐžĐŊŅƒĐ´Ņƒ даĐŊĐ°Ņ ҃ вĐĩĐą аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ¸." + }, "version": { "message": "ВĐĩŅ€ĐˇĐ¸Ņ˜Đ°" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "ĐŖŅ€Đĩди Ņ„Đ°ŅŅ†Đ¸ĐēĐģ҃" }, + "newFolder": { + "message": "Нова Ņ„Đ°ŅŅ†Đ¸ĐēĐģа" + }, + "folderName": { + "message": "ИĐŧĐĩ Ņ„Đ°ŅŅ†Đ¸ĐēĐģĐĩ" + }, + "folderHintText": { + "message": "ĐŖĐŗĐŊĐĩĐˇĐ´Đ¸Ņ‚Đĩ Ņ„Đ°ŅŅ†Đ¸ĐēĐģ҃ Đ´ĐžĐ´Đ°Đ˛Đ°ŅšĐĩĐŧ иĐŧĐĩĐŊа ĐŊĐ°Đ´Ņ€ĐĩŅ’ĐĩĐŊĐĩ Ņ„Đ°ŅŅ†ĐēĐģĐĩ ĐŋŅ€Đ°Ņ›ĐĩĐŊĐžĐŗ СĐŊаĐēĐžĐŧ „/“. ĐŸŅ€Đ¸ĐŧĐĩŅ€: Đ”Ņ€ŅƒŅˆŅ‚Đ˛ĐĩĐŊи/Đ¤ĐžŅ€ŅƒĐŧи" + }, + "noFoldersAdded": { + "message": "ĐĐ¸ŅŅƒ Đ´ĐžĐ´Đ°Ņ‚Đĩ Ņ„Đ°ŅŅ†Đ¸ĐēĐģĐĩ" + }, + "createFoldersToOrganize": { + "message": "ĐšŅ€ĐĩĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ Ņ„Đ°ŅŅ†Đ¸ĐēĐģĐĩ да ĐąĐ¸ŅŅ‚Đĩ ĐžŅ€ĐŗĐ°ĐŊиСОваĐģи ŅĐ˛ĐžŅ˜Đĩ ŅŅ‚Đ°Đ˛ĐēĐĩ ҃ ҁĐĩŅ„Ņƒ" + }, + "deleteFolderPermanently": { + "message": "Да Đģи ҁ҂Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊи да ĐļĐĩĐģĐ¸Ņ‚Đĩ да Ņ‚Ņ€Đ°Ņ˜ĐŊĐž Đ¸ĐˇĐąŅ€Đ¸ŅˆĐĩŅ‚Đĩ ĐžĐ˛Ņƒ Ņ„Đ°ŅŅ†Đ¸ĐēĐģ҃?" + }, "deleteFolder": { "message": "Đ˜ĐˇĐąŅ€Đ¸ŅˆĐ¸ Ņ„Đ°ŅŅ†Đ¸ĐēĐģ҃" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи ĐŗĐĩĐŊĐĩŅ€Đ¸ŅˆĐ¸Ņ‚Đĩ Ņ˜Đ°ĐēĐĩ, ҘĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊĐĩ ĐģОСиĐŊĐēĐĩ Са Đ˛Đ°ŅˆĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ." }, - "bitWebVault": { - "message": "Bitwarden ИĐŊŅ‚ĐĩŅ€ĐŊĐĩŅ‚ ĐĄĐĩŅ„" + "bitWebVaultApp": { + "message": "Bitwarden вĐĩĐą аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ°" }, "importItems": { "message": "ĐŖĐ˛ĐžĐˇ ŅŅ‚Đ°Đ˛Đēи" @@ -235,6 +435,9 @@ "generatePassword": { "message": "ГĐĩĐŊĐĩŅ€Đ¸ŅĐ°ŅšĐĩ ĐģОСиĐŊĐēĐĩ" }, + "generatePassphrase": { + "message": "ГĐĩĐŊĐĩŅ€Đ¸ŅˆĐ¸Ņ‚Đĩ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊ҃ Ņ„Ņ€Đ°ĐˇŅƒ" + }, "regeneratePassword": { "message": "ПоĐŊОвО ĐŗĐĩĐŊĐĩŅ€Đ¸ŅˆĐ¸ ĐģОСиĐŊĐē҃" }, @@ -244,17 +447,60 @@ "length": { "message": "Đ”ŅƒĐļиĐŊа" }, + "passwordMinLength": { + "message": "МиĐŊиĐŧаĐģĐŊа Đ´ŅƒĐļиĐŊа ĐģОСиĐŊĐēĐĩ" + }, "uppercase": { - "message": "ВĐĩĐģиĐēа ҁĐģОва (A-Z)" + "message": "ВĐĩĐģиĐēа ҁĐģОва (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "МаĐģа ҁĐģОва (a-z)" + "message": "МаĐģа ҁĐģОва (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "ĐĻĐ¸Ņ„Ņ€Đĩ (0-9)" + "message": "ĐĻĐ¸Ņ„Ņ€Đĩ (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ĐĄĐŋĐĩŅ†Đ¸Ņ˜Đ°ĐģĐŊа ҁĐģОва (!@#$%^&*)" + "message": "ĐĄĐŋĐĩŅ†Đ¸Ņ˜Đ°ĐģĐŊа ҁĐģОва (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "ĐŖĐēŅ™ŅƒŅ‡Đ¸Ņ‚Đ¸", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "ĐŖĐēŅ™ŅƒŅ‡Đ¸Ņ‚Đ¸ вĐĩĐģиĐēа ҁĐģОва", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "А-Ш", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "ĐŖĐēŅ™ŅƒŅ‡Đ¸Ņ‚Đ¸ ĐŧаĐģа ҁĐģОва", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "а-҈", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "ĐŖĐēŅ™ŅƒŅ‡Đ¸Ņ‚ Đ¸ĐąŅ€ĐžŅ˜ĐĩвĐĩ", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "ĐŖĐēŅ™ŅƒŅ‡Đ¸Ņ‚Đ¸ ҁĐŋĐĩŅ†Đ¸Ņ˜Đ°ĐģĐŊа ҁĐģОва", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Đ‘Ņ€ĐžŅ˜ Ņ€ĐĩŅ‡Đ¸" @@ -276,7 +522,16 @@ "message": "МиĐŊиĐŧаĐģĐŊĐž ҁĐŋĐĩŅ†Đ¸Ņ˜Đ°ĐģĐŊĐ¸Ņ… СĐŊаĐēОва" }, "avoidAmbChar": { - "message": "ИСйĐĩĐŗĐ°Đ˛Đ°Ņ˜ Đ´Đ˛ĐžŅĐŧĐ¸ŅĐģĐĩĐŊĐĩ ĐēĐ°Ņ€Đ°ĐēŅ‚ĐĩŅ€Đĩ" + "message": "ИСйĐĩĐŗĐ°Đ˛Đ°Ņ˜ Đ´Đ˛ĐžŅĐŧĐ¸ŅĐģĐĩĐŊĐĩ ĐēĐ°Ņ€Đ°ĐēŅ‚ĐĩŅ€Đĩ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "ИСйĐĩĐŗĐ°Đ˛Đ°Ņ˜ Đ´Đ˛ĐžŅĐŧĐ¸ŅĐģĐĩĐŊĐĩ ĐēĐ°Ņ€Đ°ĐēŅ‚ĐĩŅ€Đĩ", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Đ—Đ°Ņ…Ņ‚Đĩви ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēĐĩ ĐŋŅ€ĐĩĐ´ŅƒĐˇĐĩŅ›Đ° ҁ҃ ĐŋŅ€Đ¸ĐŧĐĩҚĐĩĐŊи ĐŊа ĐžĐŋŅ†Đ¸Ņ˜Đĩ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ĐŸŅ€ĐĩŅ‚Ņ€Đ°Đļи ҁĐĩŅ„" @@ -299,15 +554,30 @@ "password": { "message": "ЛозиĐŊĐēа" }, + "totp": { + "message": "ĐĸĐ°Ņ˜ĐŊа Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ°" + }, "passphrase": { "message": "Đ¤Ņ€Đ°ĐˇĐ° ĐģОСиĐŊĐēĐĩ" }, "favorite": { "message": "ОĐŧĐ¸Ņ™ĐĩĐŊĐž" }, + "unfavorite": { + "message": "ĐĄĐēиĐŊи ĐžĐŧĐ¸Ņ™ĐĩĐŊĐž" + }, + "itemAddedToFavorites": { + "message": "ĐĄŅ‚Đ°Đ˛Đēа ҘĐĩ Đ´ĐžĐ´Đ°Ņ‚Đ° ҃ Ņ„Đ°Đ˛ĐžŅ€Đ¸Ņ‚Đĩ" + }, + "itemRemovedFromFavorites": { + "message": "ĐĄŅ‚Đ°Đ˛Đēа ҘĐĩ ҃ĐēĐģĐžŅšĐĩĐŊа иС Ņ„Đ°Đ˛ĐžŅ€Đ¸Ņ‚Đĩ" + }, "notes": { "message": "БĐĩĐģĐĩ҈ĐēĐĩ" }, + "privateNote": { + "message": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊа ĐąĐĩĐģĐĩ҈Đēа" + }, "note": { "message": "БĐĩĐģĐĩ҈Đēа" }, @@ -326,6 +596,18 @@ "launch": { "message": "ĐžŅ‚Đ˛ĐžŅ€Đ¸" }, + "launchWebsite": { + "message": "ПоĐēŅ€ĐĩĐŊĐ¸Ņ‚Đĩ вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Ņƒ" + }, + "launchWebsiteName": { + "message": "ПоĐēŅ€ĐĩĐŊŅƒŅ‚Đ¸ ŅĐ°Ņ˜Ņ‚ $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ВĐĩĐą ŅĐ°Ņ˜Ņ‚" }, @@ -338,9 +620,24 @@ "other": { "message": "ĐžŅŅ‚Đ°ĐģĐž" }, + "unlockMethods": { + "message": "ОĐŋŅ†Đ¸Ņ˜Đĩ Đ´ĐĩĐąĐģĐžĐēĐ¸Ņ€Đ°ŅšĐ°" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "ПодĐĩŅĐ¸Ņ‚Đĩ ĐŧĐĩŅ‚ĐžĐ´ ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Đ˛Đ°ŅšĐ° да ĐąĐ¸ŅŅ‚Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊиĐģи Ņ€Đ°Đ´ŅšŅƒ Đ˛Ņ€ĐĩĐŧĐĩĐŊҁĐēĐžĐŗ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩŅšĐ° ҁĐĩŅ„Đ°." }, + "unlockMethodNeeded": { + "message": "ПодĐĩŅĐ¸Ņ‚Đĩ ĐŧĐĩŅ‚ĐžĐ´ ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Đ˛Đ°ŅšĐ° ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа" + }, + "sessionTimeoutHeader": { + "message": "Đ˜ŅŅ‚ĐĩĐē ҁĐĩŅĐ¸Ņ˜Đĩ" + }, + "vaultTimeoutHeader": { + "message": "ĐĸĐ°Ņ˜ĐŧĐ°ŅƒŅ‚ ҁĐĩŅ„Đ°" + }, + "otherOptions": { + "message": "ĐžŅŅ‚Đ°ĐģĐĩ ĐžĐŋŅ†Đ¸Ņ˜Đĩ" + }, "rateExtension": { "message": "ĐžŅ†ĐĩĐŊи ĐžĐ˛Đ°Ņ˜ Đ´ĐžĐ´Đ°Ņ‚Đ°Đē" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "ĐĄĐĩŅ„ ҘĐĩ СаĐēŅ™ŅƒŅ‡Đ°ĐŊ. ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃ Са ĐŊĐ°ŅŅ‚Đ°Đ˛Đ°Đē." }, + "yourVaultIsLockedV2": { + "message": "Đ’Đ°Ņˆ ҁĐĩŅ„ ҘĐĩ ĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊ" + }, + "yourAccountIsLocked": { + "message": "Đ’Đ°Ņˆ ĐŊаĐģĐžĐŗ ҘĐĩ СаĐēŅ™ŅƒŅ‡Đ°ĐŊ" + }, + "or": { + "message": "иĐģи" + }, "unlock": { "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "ĐĸĐ°Ņ˜ĐŧĐ°ŅƒŅ‚ ҁĐĩŅ„Đ°" }, + "vaultTimeout1": { + "message": "ĐĸĐ°Ņ˜ĐŧĐ°ŅƒŅ‚" + }, "lockNow": { "message": "ЗаĐēŅ™ŅƒŅ‡Đ°Ņ˜ ОдĐŧĐ°Ņ…" }, + "lockAll": { + "message": "ЗаĐēŅ™ŅƒŅ‡Đ°Ņ˜ ŅĐ˛Đĩ" + }, "immediately": { "message": "ОдĐŧĐ°Ņ…" }, @@ -426,6 +738,18 @@ "security": { "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚" }, + "confirmMasterPassword": { + "message": "ĐŸĐžŅ‚Ņ€Đ´Đ¸Ņ‚Đ¸ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃" + }, + "masterPassword": { + "message": "ГĐģавĐŊа ЛозиĐŊĐēа" + }, + "masterPassImportant": { + "message": "Đ’Đ°ŅˆĐ° ĐŗĐģавĐŊа ĐģОСиĐŊĐēа ҁĐĩ ĐŊĐĩ ĐŧĐžĐļĐĩ ĐŋĐžĐ˛Ņ€Đ°Ņ‚Đ¸Ņ‚Đ¸ аĐēĐž ҘĐĩ ĐˇĐ°ĐąĐžŅ€Đ°Đ˛Đ¸Ņ‚Đĩ!" + }, + "masterPassHintLabel": { + "message": "ХавĐĩŅ‚ ĐŗĐģавĐŊĐĩ ĐģОСиĐŊĐēĐĩ" + }, "errorOccurred": { "message": "Đ”ĐžŅˆĐģĐž ҘĐĩ Đ´Đž ĐŗŅ€Đĩ҈ĐēĐĩ!" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Đ’Đ°Ņˆ ĐŊаĐģĐžĐŗ ҘĐĩ ĐēŅ€ĐĩĐ¸Ņ€Đ°ĐŊ! Хада ҁĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đ¸." }, + "newAccountCreated2": { + "message": "Đ’Đ°Ņˆ ĐŊОви ĐŊаĐģĐžĐŗ ҘĐĩ ĐŊаĐŋŅ€Đ°Đ˛Ņ™ĐĩĐŊ!" + }, + "youHaveBeenLoggedIn": { + "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊи ҁ҂Đĩ!" + }, + "youSuccessfullyLoggedIn": { + "message": "ĐŖŅĐŋĐĩ҈ĐŊĐž ҁ҂Đĩ ҁĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Đģи" + }, + "youMayCloseThisWindow": { + "message": "МоĐļĐĩŅ‚Đĩ ĐˇĐ°Ņ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐžĐ˛Đ°Ņ˜ ĐŋŅ€ĐžĐˇĐžŅ€" + }, "masterPassSent": { "message": "ĐŸĐžŅĐģаĐģи ҁĐŧĐž ВаĐŧ ĐŋĐžŅ€ŅƒĐē҃ ŅĐ° ŅĐ°Đ˛ĐĩŅ‚ĐžĐŧ ĐŗĐģавĐŊĐĩ ĐģОСиĐŊĐēĐĩ." }, "verificationCodeRequired": { "message": "ВĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊи ĐēОд ҘĐĩ ОйавĐĩСаĐŊ." }, + "webauthnCancelOrTimeout": { + "message": "ĐŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ° ҘĐĩ ĐžŅ‚ĐēаСаĐŊа иĐģи ҘĐĩ Ņ‚Ņ€Đ°Ņ˜Đ°Đģа ĐŋŅ€ĐĩĐ´ŅƒĐŗĐž. МоĐģиĐŧ Đ˛Đ°Ņ, ĐŋĐžĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО." + }, "invalidVerificationCode": { "message": "НĐĩĐ¸ŅĐŋŅ€Đ°Đ˛Đ°ĐŊ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊи ĐēОд" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "ĐĐ¸Ņ˜Đĩ ĐŧĐžĐŗŅƒŅ›Đĩ Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž Đ´ĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐžĐ´Đ°ĐąŅ€Đ°ĐŊĐĩ ŅŅ‚Đ°Đ˛ĐēĐĩ ĐŊа ĐžĐ˛ĐžŅ˜ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸. ĐŖĐŧĐĩŅŅ‚Đž Ņ‚ĐžĐŗĐ° ĐēĐžĐŋĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ и ĐŊаĐģĐĩĐŋĐ¸Ņ‚Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ˜Đĩ." }, + "totpCaptureError": { + "message": "ĐĐ¸Ņ˜Đĩ ĐŧĐžĐŗŅƒŅ›Đĩ ҁĐēĐĩĐŊĐ¸Ņ€Đ°Ņ‚Đ¸ QR ĐēÃ´Đ´ ŅĐ° ҂ҀĐĩĐŊŅƒŅ‚ĐŊĐĩ вĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ" + }, + "totpCaptureSuccess": { + "message": "ВĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊи ĐēÃ´Đ´ Đ´ĐžĐ´Đ°Ņ‚" + }, + "totpCapture": { + "message": "ĐĄĐēĐĩĐŊĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ QR ĐēÃ´Đ´ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ° ŅĐ° ҂ҀĐĩĐŊŅƒŅ‚ĐŊĐĩ вĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ" + }, + "totpHelperTitle": { + "message": "ĐŖŅ‡Đ¸ĐŊĐ¸Ņ‚Đĩ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Ņƒ ҃ 2 ĐēĐžŅ€Đ°Đēа ĐąĐĩҁĐŋŅ€ĐĩĐēĐžŅ€ĐŊĐžĐŧ" + }, + "totpHelper": { + "message": "Bitwarden ĐŧĐžĐļĐĩ да Ņ‡ŅƒĐ˛Đ° и ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ° вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊĐĩ ĐēОдОвĐĩ ҃ 2 ĐēĐžŅ€Đ°Đēа. КоĐŋĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ и ĐŊаĐģĐĩĐŋĐ¸Ņ‚Đĩ ĐēŅ™ŅƒŅ‡ ҃ ОвО ĐŋĐžŅ™Đĩ." + }, + "totpHelperWithCapture": { + "message": "Bitwarden ĐŧĐžĐļĐĩ да Ņ‡ŅƒĐ˛Đ° и ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ° вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊĐĩ ĐēОдОвĐĩ ҃ 2 ĐēĐžŅ€Đ°Đēа. ИСайĐĩŅ€Đ¸Ņ‚Đĩ иĐēĐžĐŊ҃ ĐēаĐŧĐĩŅ€Đĩ да ĐąĐ¸ŅŅ‚Đĩ ĐŊаĐŋŅ€Đ°Đ˛Đ¸Đģи ҁĐŊиĐŧаĐē ĐĩĐēŅ€Đ°ĐŊа QR ĐēОда Са Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Ņƒ ОвĐĩ вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Đĩ иĐģи ĐēĐžĐŋĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ и ĐŊаĐģĐĩĐŋĐ¸Ņ‚Đĩ ĐēŅ™ŅƒŅ‡ ҃ ОвО ĐŋĐžŅ™Đĩ." + }, + "learnMoreAboutAuthenticators": { + "message": "ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ Đž Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ¸Đŧа" + }, + "copyTOTP": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ‚Đ¸ ҘĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊи ĐēÃ´Đ´ (TOTP)" + }, "loggedOut": { "message": "ĐžĐ´Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐž" }, + "loggedOutDesc": { + "message": "ĐžĐ´Ņ˜Đ°Đ˛Ņ™ĐĩĐŊи ҁ҂Đĩ ŅĐ° ŅĐ˛ĐžĐŗ ĐŊаĐģĐžĐŗĐ°." + }, "loginExpired": { "message": "Đ’Đ°ŅˆĐ° ҁĐĩŅĐ¸Ņ˜Đ° ҘĐĩ Đ¸ŅŅ‚ĐĩĐēĐģа." }, + "logIn": { + "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸ ҁĐĩ" + }, + "logInToBitwarden": { + "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ ĐŊа Bitwarden" + }, + "restartRegistration": { + "message": "ПоĐŊОвО ĐŋĐžĐēŅ€ĐĩĐŊĐ¸Ņ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Ņƒ" + }, + "expiredLink": { + "message": "Đ˜ŅŅ‚ĐĩĐēĐģа вĐĩСа" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "ПоĐŊОвО ĐŋĐžĐēŅ€ĐĩĐŊĐ¸Ņ‚Đĩ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Ņƒ иĐģи ĐŋĐžĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ да ҁĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ." + }, + "youMayAlreadyHaveAnAccount": { + "message": "МоĐļда вĐĩŅ› иĐŧĐ°Ņ‚Đĩ ĐŊаĐģĐžĐŗ" + }, "logOutConfirmation": { "message": "Đ—Đ°Đ¸ŅŅ‚Đ° ĐļĐĩĐģĐ¸Ņ‚Đĩ да ҁĐĩ ĐžĐ´Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Đ¤Đ°ŅŅ†Đ¸ĐēĐģа Đ´ĐžĐ´Đ°Ņ‚Đ°" }, - "changeMasterPass": { - "message": "ĐŸŅ€ĐžĐŧĐĩĐŊи ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃" - }, - "changeMasterPasswordConfirmation": { - "message": "МоĐļĐĩŅ‚Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đ¸ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃ ҃ Đ’Đ°ŅˆĐĩĐŧ ҁĐĩŅ„Ņƒ ĐŊа bitwarden.com. Да Đģи ĐļĐĩĐģĐ¸Ņ‚Đĩ да ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ вĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ ŅĐ°Đ´Đ°?" - }, "twoStepLoginConfirmation": { "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ° ҃ два ĐēĐžŅ€Đ°Đēа Ņ‡Đ¸ĐŊи Đ˛Đ°Ņˆ ĐŊаĐģĐžĐŗ ŅĐ¸ĐŗŅƒŅ€ĐŊĐ¸Ņ˜Đ¸Đŧ ĐˇĐ°Ņ…Ņ‚ĐĩвОĐŧ да вĐĩŅ€Đ¸Ņ„Đ¸Đē҃ҘĐĩŅ‚Đĩ ŅĐ˛ĐžŅ˜Đĩ ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ ĐŋĐžĐŧĐžŅ›Ņƒ Đ´Ņ€ŅƒĐŗĐžĐŗ ŅƒŅ€ĐĩŅ’Đ°Ņ˜Đ°, ĐēаО ŅˆŅ‚Đž ҁ҃ ĐąĐĩСйĐĩĐ´ĐŊĐžŅĐŊи ĐēŅ™ŅƒŅ‡, аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ°, СМС-а, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊҁĐēи ĐŋОСив иĐģи иĐŧĐĩҘĐģ. ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ ҃ два ĐēĐžŅ€Đ°Đēа ĐŧĐžĐļĐĩ ҁĐĩ ĐžĐŧĐžĐŗŅƒŅ›Đ¸Ņ‚Đ¸ ĐŊа вĐĩĐą ҁĐĩŅ„Ņƒ. Да Đģи ĐļĐĩĐģĐ¸Ņ‚Đĩ да ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ вĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ ŅĐ°Đ´Đ°?" }, + "twoStepLoginConfirmationContent": { + "message": "ĐŖŅ‡Đ¸ĐŊĐ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜ ĐŊаĐģĐžĐŗ ŅĐ¸ĐŗŅƒŅ€ĐŊĐ¸Ņ˜Đ¸Đŧ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐĩĐŧ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ ҃ два ĐēĐžŅ€Đ°Đēа ҃ Bitwarden вĐĩĐą аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ¸." + }, + "twoStepLoginConfirmationTitle": { + "message": "Đ˜Ņ›Đ¸ ĐŊа вĐĩĐą аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Ņƒ?" + }, "editedFolder": { "message": "Đ¤Đ°ŅŅ†Đ¸ĐēĐģа иСĐŧĐĩҚĐĩĐŊа" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Нови ĐģиĐŊĐē" }, + "addDomain": { + "message": "Đ”ĐžĐ´Đ°Ņ˜ Đ´ĐžĐŧĐĩĐŊ", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "ĐĄŅ‚Đ°Đ˛Đēа Đ´ĐžĐ´Đ°Ņ‚Đ°" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "ĐŸĐ¸Ņ‚Đ°Ņ˜ ĐŋŅ€Đĩ Đ´ĐžĐ´Đ°Đ˛Đ°ŅšĐ°" }, + "vaultSaveOptionsTitle": { + "message": "ОĐŋŅ†Đ¸Ņ˜Đĩ Ņ‡ŅƒĐ˛Đ°ŅšĐ° ҃ ҁĐĩŅ„Ņƒ" + }, "addLoginNotificationDesc": { "message": "â€žĐĐžŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đĩ Đ”ĐžĐ´Đ°Ņ˜ ЛозиĐŊĐēŅƒâ€œ Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи Ņ‚Ņ€Đ°Đļи да ŅĐ°Ņ‡ŅƒĐ˛Đ°Ņ‚Đĩ ĐŊОвĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ ҃ ҁĐĩŅ„Ņƒ Đēад ĐŗĐžĐ´ ҁĐĩ ĐŋŅ€Đ˛Đ¸ ĐŋŅƒŅ‚ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ĐŊа ŅšĐ¸Ņ…." }, + "addLoginNotificationDescAlt": { + "message": "Đ—Đ°Ņ‚Ņ€Đ°ĐļĐ¸Ņ‚Đĩ да Đ´ĐžĐ´Đ°Ņ‚Đĩ ŅŅ‚Đ°Đ˛Đē҃ аĐēĐž ĐžĐŊа ĐŊĐ¸Ņ˜Đĩ ĐŋŅ€ĐžĐŊĐ°Ņ’ĐĩĐŊа ҃ Đ˛Đ°ŅˆĐĩĐŧ ҁĐĩŅ„Ņƒ. ОдĐŊĐžŅĐ¸ ҁĐĩ ĐŊа ŅĐ˛Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐĩ ĐŊаĐģĐžĐŗĐĩ." + }, + "showCardsInVaultView": { + "message": "ĐŸŅ€Đ¸ĐēаĐļĐ¸Ņ‚Đĩ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ ĐēаО ĐŋŅ€ĐĩĐ´ĐģĐžĐŗĐĩ Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ҃ ĐŋŅ€Đ¸ĐēĐ°ĐˇŅƒ ҁĐĩŅ„Đ°" + }, "showCardsCurrentTab": { "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐēŅ€ĐĩĐ´Đ¸Ņ‚ĐŊĐĩ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ" }, "showCardsCurrentTabDesc": { "message": "ĐŸŅ€Đ¸ĐēаĐļи ŅŅ‚Đ°Đ˛ĐēĐĩ ĐēŅ€ĐĩĐ´Đ¸Ņ‚ĐŊĐ¸Ņ… ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ Са ĐģаĐē҈Đĩ Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž Đ´ĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ." }, + "showIdentitiesInVaultView": { + "message": "ĐŸŅ€Đ¸ĐēаĐļĐ¸Ņ‚Đĩ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚Đĩ ĐēаО ĐŋŅ€ĐĩĐ´ĐģĐžĐŗĐĩ Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ҃ ĐŋŅ€Đ¸ĐēĐ°ĐˇŅƒ ҁĐĩŅ„Đ°" + }, "showIdentitiesCurrentTab": { "message": "ĐŸŅ€Đ¸ĐēаĐļи идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚Đĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐŋĐžŅ‚Đ˛Ņ€Đ´Ņƒ Са аĐļŅƒŅ€Đ¸Ņ€Đ°ŅšĐĩ ҂ҀĐĩĐŊŅƒŅ‚ĐŊĐĩ ĐģОСиĐŊĐēĐĩ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ Đēада ҁĐĩ ĐŋŅ€ĐžĐŧĐĩĐŊа ĐŋŅ€ĐĩĐŋОСĐŊа ĐŊа Web ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸." }, + "changedPasswordNotificationDescAlt": { + "message": "Đ—Đ°Ņ‚Ņ€Đ°ĐļĐ¸Ņ‚Đĩ аĐļŅƒŅ€Đ¸Ņ€Đ°ŅšĐĩ ĐģОСиĐŊĐēĐĩ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ Đēада ҁĐĩ ĐžŅ‚ĐēŅ€Đ¸Ņ˜Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊа ĐŊа вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Đ¸. ОдĐŊĐžŅĐ¸ ҁĐĩ ĐŊа ŅĐ˛Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐĩ ĐŊаĐģĐžĐŗĐĩ." + }, + "enableUsePasskeys": { + "message": "Đ—Đ°Ņ‚Ņ€Đ°ĐļĐ¸Ņ‚Đĩ Са ŅĐ°Ņ‡ŅƒĐ˛Đ°Đ˛Đ°ŅšĐĩ и ĐēĐžŅ€Đ¸ŅˆŅ›ĐĩҚĐĩ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊĐĩ ĐēŅ™ŅƒŅ‡ĐĩвĐĩ" + }, + "usePasskeysDesc": { + "message": "Đ—Đ°Ņ‚Ņ€Đ°ĐļĐ¸Ņ‚Đĩ да ŅĐ°Ņ‡ŅƒĐ˛Đ°Ņ‚Đĩ ĐŊОвĐĩ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊĐĩ ĐēŅ™ŅƒŅ‡ĐĩвĐĩ иĐģи ҁĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ŅĐ° ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊиĐŧ ĐēŅ™ŅƒŅ‡ĐĩвиĐŧа ҃ҁĐēĐģĐ°Đ´Đ¸ŅˆŅ‚ĐĩĐŊиĐŧ ҃ Đ˛Đ°ŅˆĐĩĐŧ ҁĐĩŅ„Ņƒ. ОдĐŊĐžŅĐ¸ ҁĐĩ ĐŊа ŅĐ˛Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐĩ ĐŊаĐģĐžĐŗĐĩ." + }, "notificationChangeDesc": { "message": "Да Đģи ĐļĐĩĐģĐ¸Ņ‚Đĩ да аĐļŅƒŅ€Đ¸Ņ€Đ°Ņ‚Đĩ ĐžĐ˛Ņƒ ĐģОСиĐŊĐē҃ Са Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜" }, + "additionalOptions": { + "message": "Đ”ĐžĐ´Đ°Ņ‚ĐŊĐĩ ĐžĐŋŅ†Đ¸Ņ˜Đĩ" + }, "enableContextMenuItem": { "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊи ĐŧĐĩĐŊи" }, "contextMenuItemDesc": { "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸ ĐēĐģиĐē Са ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐ°ŅšĐĩ ĐŗĐĩĐŊĐĩŅ€Đ¸ŅĐ°ŅšŅƒ ĐģОСиĐŊĐēи и ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ°Đŧа Са ҂ҀĐĩĐŊŅƒŅ‚ĐŊ҃ web ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ. " }, + "contextMenuItemDescAlt": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸ ĐēĐģиĐē Са ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐ°ŅšĐĩ ĐŗĐĩĐŊĐĩŅ€Đ¸ŅĐ°ŅšŅƒ ĐģОСиĐŊĐēи и ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ°Đŧа Са ҂ҀĐĩĐŊŅƒŅ‚ĐŊ҃ web ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ. ОдĐŊĐžŅĐ¸ ҁĐĩ ĐŊа ŅĐ˛Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐĩ ĐŊаĐģĐžĐŗĐĩ." + }, "defaultUriMatchDetection": { "message": "ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Đ´ĐŊĐž ĐŊаĐģаĐļĐĩҚĐĩ ĐŖĐ Đ›", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊи ĐŊĐ°Ņ‡Đ¸ĐŊ ĐŊа ĐēĐžŅ˜Đ¸ ҁĐĩ ĐŋĐžŅŅ‚ŅƒĐŋа ŅĐ° ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ŅšĐĩĐŧ ĐŖĐ Đ› Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ ĐŋŅ€Đ¸ĐģиĐēĐžĐŧ Đ¸ĐˇĐ˛ĐžŅ’ĐĩŅšĐ° Ņ€Đ°Đ´ŅšĐ¸ ĐēаО ŅˆŅ‚Đž ҘĐĩ Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ĐŸŅ€ĐžĐŧĐĩĐŊи ĐąĐžŅ˜Đĩ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đĩ" }, + "themeDescAlt": { + "message": "ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ Ņ‚ĐĩĐŧ҃ ĐąĐžŅ˜Đĩ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đĩ. ОдĐŊĐžŅĐ¸ ҁĐĩ ĐŊа ŅĐ˛Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐĩ ĐŊаĐģĐžĐŗĐĩ." + }, "dark": { "message": "ĐĸаĐŧĐŊа", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized ҆ҀĐŊĐž", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "ИСвОС Од" + }, "exportVault": { "message": "ИСвОС ҁĐĩŅ„Đ°" }, "fileFormat": { "message": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ" }, + "fileEncryptedExportWarningDesc": { + "message": "ĐžĐ˛Đ°Ņ˜ иСвОС Ņ›Đĩ ĐąĐ¸Ņ‚Đ¸ ĐˇĐ°ŅˆŅ‚Đ¸Ņ›ĐĩĐŊ ĐģОСиĐŊĐēĐžĐŧ и ĐˇĐ°Ņ…Ņ‚ĐĩĐ˛Đ°Ņ›Đĩ ĐģОСиĐŊĐē҃ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ Са Đ´ĐĩŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ŅšĐĩ." + }, + "filePassword": { + "message": "ЛозиĐŊĐēа Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ" + }, + "exportPasswordDescription": { + "message": "Ова ĐģОСиĐŊĐēа Ņ›Đĩ ҁĐĩ ĐēĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Са иСвОС и ŅƒĐ˛ĐžĐˇ ОвĐĩ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ" + }, + "accountRestrictedOptionDescription": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐēŅ™ŅƒŅ‡ Са ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ŅšĐĩ Đ˛Đ°ŅˆĐĩĐŗ ĐŊаĐģĐžĐŗĐ°, иСвĐĩĐ´ĐĩĐŊ иС ĐēĐžŅ€Đ¸ŅĐŊĐ¸Ņ‡ĐēĐžĐŗ иĐŧĐĩĐŊа и ĐŗĐģавĐŊĐĩ ĐģОСиĐŊĐēĐĩ, да ŅˆĐ¸Ņ„Ņ€ŅƒŅ˜ĐĩŅ‚Đĩ иСвОС и ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚Đĩ ŅƒĐ˛ĐžĐˇ ŅĐ°ĐŧĐž ĐŊа ҂ҀĐĩĐŊŅƒŅ‚ĐŊи Bitwarden ĐŊаĐģĐžĐŗ." + }, + "passwordProtectedOptionDescription": { + "message": "ПодĐĩŅĐ¸Ņ‚Đĩ ĐģОСиĐŊĐē҃ Са ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ŅšĐĩ иСвОСа и ŅƒĐ˛ĐžĐˇ ҃ йиĐģĐž ĐēĐžŅ˜Đ¸ Bitwarden ĐŊаĐģĐžĐŗ ĐēĐžŅ€Đ¸ŅŅ‚ĐĩŅ›Đ¸ ĐģОСиĐŊĐē҃ Са Đ´ĐĩŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ŅšĐĩ." + }, + "exportTypeHeading": { + "message": "ĐĸиĐŋ иСвОСа" + }, + "accountRestricted": { + "message": "НаĐģĐžĐŗ ҘĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊ" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "ĐŖĐŊĐĩŅ‚Đĩ ĐģОСиĐŊĐēĐĩ ҁĐĩ ĐŊĐĩ ĐŋĐžĐ´ŅƒĐ´Đ°Ņ€Đ°Ņ˜Ņƒ." + }, "warning": { "message": "ĐŖĐŸĐžĐ—ĐžĐ Đ•ĐŠĐ•", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ДĐĩŅ™ĐĩĐŊĐž" }, - "learnOrg": { - "message": "ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đž ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ°Đŧа" - }, - "learnOrgConfirmation": { - "message": "Bitwarden ваĐŧ ĐžĐŧĐžĐŗŅƒŅ›Đ°Đ˛Đ° да Đ´ĐĩĐģĐ¸Ņ‚Đĩ ŅŅ‚Đ°Đ˛ĐēĐĩ ҁĐĩŅ„Đ° ŅĐ° Đ´Ņ€ŅƒĐŗĐ¸Đŧа ĐēĐžŅ€Đ¸ŅŅ‚ĐĩŅ›Đ¸ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Ņƒ. Да Đģи ĐļĐĩĐģĐ¸Ņ‚Đĩ да ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Ņƒ bitwarden.com да ĐąĐ¸ŅŅ‚Đĩ ŅĐ°ĐˇĐŊаĐģи Đ˛Đ¸ŅˆĐĩ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business ваĐŧ ĐžĐŧĐžĐŗŅƒŅ›Đ°Đ˛Đ° да Đ´ĐĩĐģĐ¸Ņ‚Đĩ ŅŅ‚Đ°Đ˛ĐēĐĩ ҁĐĩŅ„Đ° ŅĐ° Đ´Ņ€ŅƒĐŗĐ¸Đŧа ĐēĐžŅ€Đ¸ŅŅ‚ĐĩŅ›Đ¸ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Ņƒ. ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ ĐŊа вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Ņƒ bitwarden.com." }, "moveToOrganization": { "message": "ĐŸŅ€ĐĩĐŧĐĩŅŅ‚Đ¸ ҃ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Ņƒ" @@ -762,6 +1204,9 @@ "file": { "message": "Đ”Đ°Ņ‚ĐžŅ‚ĐĩĐēа" }, + "fileToShare": { + "message": "Đ”Đ°Ņ‚ĐžŅ‚ĐĩĐēа Са Đ´ĐĩŅ™ĐĩҚĐĩ" + }, "selectFile": { "message": "ИСайĐĩŅ€Đ¸ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃." }, @@ -772,7 +1217,7 @@ "message": "Đ¤ŅƒĐŊĐēŅ†Đ¸Ņ˜Đ° ҘĐĩ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊа" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐŊа ҘĐĩ ĐŧĐ¸ĐŗŅ€Đ°Ņ†Đ¸Ņ˜Đ° ĐēŅ™ŅƒŅ‡Đ° Са ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ŅšĐĩ. ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ ĐŋŅ€ĐĩĐēĐž вĐĩĐą ҁĐĩŅ„Đ° да ĐąĐ¸ŅŅ‚Đĩ аĐļŅƒŅ€Đ¸Ņ€Đ°Đģи ĐēŅ™ŅƒŅ‡ Са ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ŅšĐĩ." }, "premiumMembership": { "message": "ĐŸŅ€ĐĩĐŧĐ¸Ņ˜ŅƒĐŧ ҇ĐģаĐŊŅŅ‚Đ˛Đž" @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1ГБ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐž ҁĐēĐģĐ°Đ´Đ¸ŅˆŅ‚Đĩ Са ĐŋŅ€Đ¸ĐģĐžĐŗĐĩ." }, + "premiumSignUpEmergency": { + "message": "ĐĨĐ¸Ņ‚Đ°ĐŊ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋ." + }, "premiumSignUpTwoStepOptions": { "message": "ĐŸŅ€Đ¸ĐžŅ€Đ¸Ņ‚Đ°Ņ€ĐŊĐĩ ĐžĐŋŅ†Đ¸Ņ˜Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ ҃ два ĐēĐžŅ€Đ°Đēа ĐēаО ŅˆŅ‚Đž ҁ҃ YubiKey и Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "МоĐļĐĩŅ‚Đĩ Đē҃ĐŋĐ¸Ņ‚Đ¸ ĐŋŅ€ĐĩĐŧĐ¸Ņ˜ŅƒĐŧ ĐŋŅ€ĐĩŅ‚ĐŋĐģĐ°Ņ‚Ņƒ ĐŊа bitwarden.com. Да Đģи ĐļĐĩĐģĐ¸Ņ‚Đĩ да ĐŋĐžŅĐĩŅ‚Đ¸Ņ‚Đĩ вĐĩĐą ŅĐ°Ņ˜Ņ‚ ŅĐ°Đ´Đ°?" }, + "premiumPurchaseAlertV2": { + "message": "МоĐļĐĩŅ‚Đĩ да Đē҃ĐŋĐ¸Ņ‚Đĩ ĐŸŅ€ĐĩĐŧĐ¸ŅƒĐŧ ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа ĐŊаĐģĐžĐŗĐ° ҃ вĐĩĐą аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ¸ Bitwarden." + }, "premiumCurrentMember": { "message": "Ви ҁ҂Đĩ ĐŋŅ€ĐĩĐŧĐ¸Ņ˜ŅƒĐŧ ҇ĐģаĐŊ!" }, "premiumCurrentMemberThanks": { "message": "ĐĨваĐģа ВаĐŧ Са ĐŋĐžĐ´Ņ€ŅˆĐē҃ Bitwarden-а." }, + "premiumFeatures": { + "message": "ĐĐ°Đ´ĐžĐŗŅ€Đ°Đ´Đ¸Ņ‚Đĩ ĐŊа ĐŋŅ€ĐĩĐŧĐ¸ŅƒĐŧ и Đ´ĐžĐąĐ¸Ņ˜Ņ‚Đĩ:" + }, "premiumPrice": { "message": "ХвĐĩ Са ŅĐ°ĐŧĐž $PRICE$ ĐŗĐžĐ´Đ¸ŅˆŅšĐĩ!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "ХвĐĩ Ņ‚Đž Са ŅĐ°ĐŧĐž $PRICE$ ĐŗĐžĐ´Đ¸ŅˆŅšĐĩ!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ĐžŅĐ˛ĐĩĐļĐ°Đ˛Đ°ŅšĐĩ ҘĐĩ ĐˇĐ°Đ˛Ņ€ŅˆĐĩĐŊĐž" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "АĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ° ĐŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€" }, - "authenticatorAppDesc": { - "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Ņƒ Са Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Ņƒ (ĐēаО ŅˆŅ‚Đž ҘĐĩ Authy иĐģи Google Authenticator) Са ĐŗĐĩĐŊĐĩŅ€Đ¸ŅĐ°ŅšĐĩ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊĐ¸Ņ… ĐēОдОва.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ ĐēÃ´Đ´ ĐēĐžŅ˜Đ¸ ĐŗĐĩĐŊĐĩŅ€Đ¸ŅˆĐĩ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ° Са Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Ņƒ ĐēаО ŅˆŅ‚Đž ҘĐĩ Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅĐŊи ĐēŅ™ŅƒŅ‡" + "yubiKeyTitleV2": { + "message": "Yubico OTP ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅĐŊи ĐēŅ™ŅƒŅ‡" }, "yubiKeyDesc": { "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ YubiKey Са ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋ ĐŊаĐģĐžĐŗŅƒ. Ради ŅĐ° YubiKey 4, 4 Nano, 4C, и NEO ŅƒŅ€ĐĩŅ’Đ°Ņ˜Đ¸Đŧа." }, - "duoDesc": { - "message": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸ ŅĐ° Duo Security ĐēĐžŅ€Đ¸ŅŅ‚ĐĩŅ›Đ¸ Duo Mobile аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Ņƒ, СМС, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊҁĐēи ĐŋОСив, иĐģи U2F ĐēŅ™ŅƒŅ‡.", + "duoDescV2": { + "message": "ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ ĐēÃ´Đ´ ĐēĐžŅ˜Đ¸ ҘĐĩ ĐŗĐĩĐŊĐĩŅ€Đ¸ŅĐ°Đž Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Е-ĐŋĐžŅˆŅ‚Đ°" }, - "emailDesc": { - "message": "ВĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊи ĐēОдОви Ņ›Đĩ ваĐŧ ĐąĐ¸Ņ‚Đ¸ ĐŋĐžŅĐģĐ°Ņ‚Đ¸ иĐŧĐĩҘĐģĐžĐŧ." + "emailDescV2": { + "message": "ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ ĐēÃ´Đ´ ĐŋĐžŅĐģĐ°Ņ‚ ĐŊа Đ˛Đ°Ņˆ иĐŧĐĩҘĐģ." }, "selfHostedEnvironment": { "message": "ХаĐŧĐžŅŅ‚Đ°ĐģĐŊĐž ĐžĐēŅ€ŅƒĐļĐĩҚĐĩ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "НавĐĩĐ´Đ¸Ņ‚Đĩ ĐžŅĐŊОвĐŊи ĐŖĐ Đ› Đ˛Đ°ŅˆĐĩ ĐģĐžĐēаĐģĐŊĐĩ Bitwarden иĐŊŅŅ‚Đ°ĐģĐ°Ņ†Đ¸Ņ˜Đĩ." }, + "selfHostedBaseUrlHint": { + "message": "НавĐĩĐ´Đ¸Ņ‚Đĩ ĐžŅĐŊОвĐŊ҃ ĐŖĐ Đ› Đ°Đ´Ņ€Đĩҁ҃ Đ˛Đ°ŅˆĐĩĐŗ ĐģĐžĐēаĐģĐŊĐžĐŗ Ņ…ĐžŅŅ‚ĐžĐ˛Đ°ŅšĐ° Bitwarden-а. ĐŸŅ€Đ¸ĐŧĐĩŅ€: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "За ĐŊаĐŋŅ€ĐĩĐ´ĐŊ҃ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ˜Ņƒ, ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊавĐĩŅŅ‚Đ¸ ĐžŅĐŊОвĐŊ҃ ĐŖĐ Đ› Đ°Đ´Ņ€Đĩҁ҃ ŅĐ˛Đ°ĐēĐĩ ҃ҁĐģŅƒĐŗĐĩ ĐŊĐĩĐˇĐ°Đ˛Đ¸ŅĐŊĐž." + }, + "selfHostedEnvFormInvalid": { + "message": "ĐœĐžŅ€Đ°Ņ‚Đĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ иĐģи ĐžŅĐŊОвĐŊи ĐŖĐ Đ› ҁĐĩŅ€Đ˛ĐĩŅ€Đ° иĐģи ĐąĐ°Ņ€ ҘĐĩĐ´ĐŊĐž ĐŋŅ€Đ¸ĐģĐ°ĐŗĐžŅ’ĐĩĐŊĐž ĐžĐēŅ€ŅƒĐļĐĩҚĐĩ." + }, "customEnvironment": { "message": "ĐŸŅ€Đ¸ĐģĐ°ĐŗĐžŅ’ĐĩĐŊĐž ĐžĐēŅ€ŅƒĐļĐĩҚĐĩ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "ĐŖĐ Đ› ĐĄĐĩŅ€Đ˛ĐĩŅ€Đ°" }, + "selfHostBaseUrl": { + "message": "ĐŖĐ Đ› ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐēĐžŅ˜Đ¸ ҁĐĩ ŅĐ°ĐŧĐžŅŅ‚Đ°ĐģĐŊĐž Ņ…ĐžŅŅ‚ŅƒŅ˜Đĩ", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "ĐŖĐ Đ› АПИ ĐĄĐĩŅ€Đ˛ĐĩŅ€Đ°" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "ĐŖĐ Đ› Đ°Đ´Ņ€ĐĩҁĐĩ ĐžĐēŅ€ŅƒĐļĐĩŅšĐ° ҁ҃ ŅĐ°Ņ‡ŅƒĐ˛Đ°ĐŊĐĩ." }, + "showAutoFillMenuOnFormFields": { + "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐŧĐĩĐŊи Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŊа ĐŋĐžŅ™Đ¸Đŧа ĐžĐąŅ€Đ°ŅŅ†Đ°", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "ĐŸŅ€ĐĩĐ´ĐģĐžĐŗ Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐ°" + }, + "showInlineMenuLabel": { + "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐŋŅ€ĐĩĐ´ĐģĐžĐŗĐĩ Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ҃ ĐŋĐžŅ™Đ¸Đŧа ĐžĐąŅ€Đ°ŅŅ†Đ°" + }, + "showInlineMenuIdentitiesLabel": { + "message": "ĐŸŅ€Đ¸ĐēĐ°ĐˇĐ°Ņ‚Đ¸ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚Đĩ ĐēаО ĐŋŅ€ĐĩĐ´ĐģĐžĐŗĐĩ" + }, + "showInlineMenuCardsLabel": { + "message": "ĐŸŅ€Đ¸ĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ ĐēаО ĐŋŅ€ĐĩĐ´ĐģĐžĐŗĐĩ" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "ĐŸŅ€Đ¸ĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŋŅ€ĐĩĐ´ĐģĐžĐŗĐĩ Đēада ҘĐĩ Đ¸ĐˇĐ°ĐąŅ€Đ°ĐŊа иĐēĐžĐŊа" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "ОдĐŊĐžŅĐ¸ ҁĐĩ ĐŊа ŅĐ˛Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐĩ ĐŊаĐģĐžĐŗĐĩ." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Đ˜ŅĐēŅ™ŅƒŅ‡Đ¸Ņ‚Đĩ ŅƒĐŗŅ€Đ°Ņ’ĐĩĐŊ ĐŧĐĩĐŊĐ°ŅŸĐĩŅ€ ĐģОСиĐŊĐēи Đ˛Đ°ŅˆĐĩĐŗ ĐŋŅ€ĐĩŅ‚Ņ€Đ°ĐļĐ¸Đ˛Đ°Ņ‡Đ° да ĐąĐ¸ŅŅ‚Đĩ иСйĐĩĐŗĐģи ҁ҃ĐēОйĐĩ." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "ИСĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ° ĐŋŅ€ĐĩŅ‚Ņ€Đ°ĐļĐ¸Đ˛Đ°Ņ‡Đ°." + }, + "autofillOverlayVisibilityOff": { + "message": "Đ˜ŅĐēŅ™ŅƒŅ‡ĐĩĐŊĐž", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Када ҘĐĩ ĐŋĐžŅ™Đĩ Đ¸ĐˇĐ°ĐąŅ€Đ°ĐŊĐž (҃ Ņ„ĐžĐē҃ҁ҃)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Када ҘĐĩ Đ¸ĐˇĐ°ĐąŅ€Đ°ĐŊа иĐēĐžĐŊа Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐ°", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "ĐŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋŅ€Đ¸ ŅƒŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšŅƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ" + }, "enableAutoFillOnPageLoad": { "message": "ОĐŧĐžĐŗŅƒŅ›Đ¸ Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŊаĐēĐžĐŊ ŅƒŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšĐ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ" }, "enableAutoFillOnPageLoadDesc": { "message": "АĐēĐž ҁĐĩ ĐžŅ‚ĐēŅ€Đ¸Ņ˜Đĩ ĐžĐąŅ€Đ°ĐˇĐ°Ņ† Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ, Đ¸ĐˇĐ˛Ņ€ŅˆĐ¸Ņ‚Đĩ Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ Đēада ҁĐĩ вĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° ŅƒŅ‡Đ¸Ņ‚Đ°." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$ПаĐļŅšĐ°:$CLOSETAG$ КоĐŧĐŋŅ€ĐžĐŧĐ¸Ņ‚ĐžĐ˛Đ°ĐŊĐĩ иĐģи ĐŊĐĩĐŋĐžŅƒĐˇĐ´Đ°ĐŊĐĩ вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Đĩ ĐŧĐžĐŗŅƒ да Đ¸ŅĐēĐžŅ€Đ¸ŅŅ‚Đĩ Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋŅ€Đ¸ ŅƒŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšŅƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "КоĐŧĐŋŅ€ĐžĐŧĐ¸Ņ‚ĐžĐ˛Đ°ĐŊĐĩ иĐģи ĐŊĐĩĐŋĐžŅƒĐˇĐ´Đ°ĐŊĐĩ вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Đĩ ĐŧĐžĐŗŅƒ да Đ¸ŅĐēĐžŅ€Đ¸ŅŅ‚Đĩ Đ°ŅƒŅ‚Đž-Đŋ҃ҚĐĩҚĐĩ ĐŋŅ€Đ¸ ŅƒŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšŅƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ Đž Ņ€Đ¸ĐˇĐ¸Ņ†Đ¸Đŧа" + }, "learnMoreAboutAutofill": { "message": "ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ Đž Đ°ŅƒŅ‚Đž-Đŋ҃ҚĐĩҚĐĩ" }, @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "ĐžŅ‚Đ˛ĐžŅ€Đ¸ ҁĐĩŅ„ ҃ ĐąĐžŅ‡ĐŊ҃ Ņ‚Ņ€Đ°Đē҃" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋĐžŅĐģĐĩĐ´ŅšŅƒ ĐēĐžŅ€Đ¸ŅˆŅ›ĐĩĐŊ҃ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ Са ҂ҀĐĩĐŊŅƒŅ‚ĐŊ҃ вĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ" }, + "commandAutofillCardDesc": { + "message": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋĐžŅĐģĐĩĐ´ŅšŅƒ ĐēĐžŅ€Đ¸ŅˆŅ›ĐĩĐŊ҃ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Ņƒ Са ҂ҀĐĩĐŊŅƒŅ‚ĐŊ҃ вĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ" + }, + "commandAutofillIdentityDesc": { + "message": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋĐžŅĐģĐĩĐ´ŅšĐ¸ ĐēĐžŅ€Đ¸ŅˆŅ›ĐĩĐŊ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚ Са ҂ҀĐĩĐŊŅƒŅ‚ĐŊ҃ вĐĩĐą ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ" + }, "commandGeneratePasswordDesc": { "message": "ГĐĩĐŊĐĩŅ€Đ¸ŅˆĐ¸Ņ‚Đĩ и ĐēĐžĐŋĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ ĐŊĐžĐ˛Ņƒ ҁĐģŅƒŅ‡Đ°Ņ˜ĐŊ҃ ĐģОСиĐŊĐē҃ ҃ ĐŋŅ€Đ¸Đ˛Ņ€ĐĩĐŧĐĩĐŊ҃ ĐŧĐĩĐŧĐžŅ€Đ¸Ņ˜Ņƒ" }, "commandLockVaultDesc": { "message": "ЗаĐēŅ™ŅƒŅ‡Đ°Ņ˜ ҁĐĩŅ„" }, - "privateModeWarning": { - "message": "ĐŸĐžĐ´Ņ€ŅˆĐēа Са ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊи Ņ€ĐĩĐļиĐŧ ҘĐĩ ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģĐŊа и ĐŊĐĩĐēĐĩ Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ˜Đĩ ҁ҃ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐĩ." - }, "customFields": { "message": "ĐŸŅ€Đ¸ĐģĐ°ĐŗĐžŅ’ĐĩĐŊа ĐŸĐžŅ™Đ°" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Đ‘ŅƒĐģОвĐĩ" }, + "cfTypeCheckbox": { + "message": "ĐŸĐžŅ™Đĩ Са ĐŋĐžŅ‚Đ˛Ņ€Đ´Ņƒ" + }, "cfTypeLinked": { "message": "ПовĐĩСаĐŊĐž", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐŋŅ€ĐĩĐŋОСĐŊĐ°Ņ‚Ņ™Đ¸Đ˛Ņƒ ҁĐģиĐē҃ ĐŋĐžŅ€ĐĩĐ´ ŅĐ˛Đ°ĐēĐĩ ŅŅ‚Đ°Đ˛ĐēĐĩ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ." }, + "faviconDescAlt": { + "message": "ĐŸŅ€Đ¸ĐēĐ°ĐˇŅƒŅ˜Đĩ ĐŋŅ€ĐĩĐŋОСĐŊĐ°Ņ‚Ņ™Đ¸Đ˛Ņƒ ҁĐģиĐē҃ ĐŋĐžŅ€ĐĩĐ´ ŅĐ˛Đ°ĐēĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ. ВаĐļи Са ŅĐ˛Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐĩ ĐŊаĐģĐžĐŗĐĩ." + }, "enableBadgeCounter": { "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐąĐĩĐ´Đļ ŅĐ° ĐąŅ€ĐžŅ˜Đ°Ņ‡ĐĩĐŧ" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "ИдĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚" }, + "typeSshKey": { + "message": "SSH ĐēŅ™ŅƒŅ‡" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "ĐŖŅ€Đĩди $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "ВидĐĩŅ‚Đ¸ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ˜Đ° ЛозиĐŊĐēĐĩ" }, + "generatorHistory": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ Đ¸ŅŅ‚ĐžŅ€Đ¸Ņ˜Đĩ" + }, + "clearGeneratorHistoryTitle": { + "message": "Đ˜ŅĐŋŅ€Đ°ĐˇĐŊĐ¸Ņ‚Đ¸ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ Đ¸ŅŅ‚ĐžŅ€Đ¸Ņ˜Đĩ" + }, + "cleargGeneratorHistoryDescription": { + "message": "АĐēĐž ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ, ŅĐ˛Đ¸ ҃ĐŊĐžŅĐ¸ Ņ›Đĩ ĐąĐ¸Ņ‚Đ¸ Ņ‚Ņ€Đ°Ņ˜ĐŊĐž Đ¸ĐˇĐąŅ€Đ¸ŅĐ°ĐŊи иС ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° Đ¸ŅŅ‚ĐžŅ€Đ¸Ņ˜Đĩ. Да Đģи ҁ҂Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊи да ĐļĐĩĐģĐ¸Ņ‚Đĩ да ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ?" + }, "back": { "message": "Назад" }, "collections": { "message": "КоĐģĐĩĐēŅ†Đ¸Ņ˜Đĩ" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "ОĐŧĐ¸Ņ™ĐĩĐŊи" }, @@ -1282,6 +1874,10 @@ "message": "ГĐģавĐŊи Đ´ĐžĐŧĐĩĐŊ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "ĐžŅĐŊОвĐŊи Đ´ĐžĐŧĐĩĐŊ (ĐŋŅ€ĐĩĐŋĐžŅ€ŅƒŅ‡ĐĩĐŊĐž)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ИĐŧĐĩ Đ´ĐžĐŧĐĩĐŊа", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "НаĐģаĐļĐĩҚĐĩ ĐŖĐ Đ›", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Đ´ĐŊĐž ĐŊаĐģаĐļĐĩҚĐĩ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ĐŸŅ€ĐĩĐąĐ°Ņ†Đ¸Ņ‚Đ¸ ĐžĐŋŅ†Đ¸Ņ˜Đĩ" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "НĐĩĐŧа ĐģОСиĐŊĐēи ҃ ĐģĐ¸ŅŅ‚Đ¸." }, + "clearHistory": { + "message": "ĐžĐąŅ€Đ¸ŅˆĐ¸ Đ¸ŅŅ‚ĐžŅ€Đ¸Ņ˜Ņƒ" + }, + "nothingToShow": { + "message": "НĐĩĐŧа ŅˆŅ‚Đ° да ҁĐĩ ĐŋŅ€Đ¸ĐēаĐļĐĩ" + }, + "nothingGeneratedRecently": { + "message": "НĐĩдавĐŊĐž ĐŊĐ¸ŅŅ‚Đĩ ĐŊĐ¸ŅˆŅ‚Đ° ĐŗĐĩĐŊĐĩŅ€Đ¸ŅĐ°Đģи" + }, "remove": { "message": "ĐŖĐēĐģĐžĐŊи" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜ ŅĐ° ПИН" }, + "setYourPinTitle": { + "message": "ĐŸĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ PIN" + }, + "setYourPinButton": { + "message": "ĐŸĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ PIN" + }, "setYourPinCode": { "message": "ĐŸĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜ ПИН ĐēОд Са ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Đ˛Đ°ŅšĐĩ Bitwarden-а. ĐŸĐžŅŅ‚Đ°Đ˛ĐēĐĩ ПИН-а Ņ›Đĩ ҁĐĩ Ņ€ĐĩҁĐĩŅ‚ĐžĐ˛Đ°Ņ‚Đ¸ аĐēĐž ҁĐĩ иĐēада ĐŋĐžŅ‚Đŋ҃ĐŊĐž ĐžĐ´Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ иС аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đĩ." }, + "setYourPinCode1": { + "message": "Đ’Đ°Ņˆ ПИН Ņ›Đĩ ҁĐĩ ĐēĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Са ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Đ˛Đ°ŅšĐĩ Bitwarden-а ҃ĐŧĐĩŅŅ‚Đž Đ˛Đ°ŅˆĐĩ ĐŗĐģавĐŊĐĩ ĐģОСиĐŊĐēĐĩ. Đ’Đ°Ņˆ ПИН Ņ›Đĩ ҁĐĩ Ņ€ĐĩҁĐĩŅ‚ĐžĐ˛Đ°Ņ‚Đ¸ аĐēĐž ҁĐĩ иĐēада ĐŋĐžŅ‚Đŋ҃ĐŊĐž ĐžĐ´Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ŅĐ° Bitwarden-а." + }, "pinRequired": { "message": "ПИН ҘĐĩ ОйавĐĩСаĐŊ." }, "invalidPin": { "message": "ĐŸĐžĐŗŅ€ĐĩŅˆĐ°ĐŊ ПИН ĐēОд." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "ĐŸŅ€ĐĩĐ˛Đ¸ŅˆĐĩ ĐŋĐžĐēŅƒŅˆĐ°Ņ˜Đ° ҃ĐŊĐžŅĐ° ĐŊĐĩваĐļĐĩŅ›ĐĩĐŗ ПИН-а. ĐžĐ´Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐ°." + }, "unlockWithBiometrics": { "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Đ˛Đ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŧĐžŅ›Ņƒ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ˜Đĩ" }, + "unlockWithMasterPassword": { + "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜ ŅĐ° ĐŗĐģавĐŊĐžĐŧ ĐģОСиĐŊĐēĐžĐŧ" + }, "awaitDesktop": { "message": "ЧĐĩĐēĐ°ŅšĐĩ ĐŋĐžŅ‚Đ˛Ņ€Đ´Đĩ ŅĐ° Đ´ĐĩҁĐēŅ‚ĐžĐŋа" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "ЗаĐēŅ™ŅƒŅ‡Đ°Ņ˜Ņ‚Đĩ ŅĐ° ĐŗĐģавĐŊĐžĐŧ ĐģОСиĐŊĐēĐžĐŧ ĐŋŅ€Đ¸ ĐŋĐžĐŊОвĐŊĐžĐŧ ĐŋĐžĐēŅ€ĐĩŅ‚Đ°ŅšŅƒ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Đ°" }, + "lockWithMasterPassOnRestart1": { + "message": "ĐŸĐžŅ‚Ņ€Đ°ĐļĐ¸Ņ‚Đ¸ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃ ĐŋŅ€Đ¸ ĐŋĐžĐŊОвĐŊĐžĐŧ ĐŋĐžĐēŅ€ĐĩŅ‚Đ°ŅšŅƒ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Đ°" + }, "selectOneCollection": { "message": "ĐœĐžŅ€Đ°Ņ‚Đĩ ĐžĐ´Đ°ĐąŅ€Đ°Ņ‚Đ¸ ĐŧаĐēĐ°Ņ€ ҘĐĩĐ´ĐŊ҃ ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ˜Ņƒ." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "ЈĐĩĐ´ĐŊа иĐģи Đ˛Đ¸ŅˆĐĩ ҁĐŧĐĩŅ€ĐŊĐ¸Ņ†Đ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ŅƒŅ‚Đ¸Ņ‡Ņƒ ĐŊа ĐŋĐžŅŅ‚Đ°Đ˛ĐēĐĩ Đ˛Đ°ŅˆĐĩĐŗ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°." }, + "passwordGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ ЛозиĐŊĐēĐĩ" + }, + "usernameGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ ĐēĐžŅ€Đ¸ŅĐŊĐ¸Ņ‡ĐēĐžĐŗ иĐŧĐĩĐŊа" + }, + "useThisPassword": { + "message": "ĐŖĐŋĐžŅ‚Ņ€Đĩйи ĐžĐ˛Ņƒ ĐģОСиĐŊĐē҃" + }, + "useThisUsername": { + "message": "ĐŖĐŋĐžŅ‚Ņ€Đĩйи ОвО ĐēĐžŅ€Đ¸ŅĐŊĐ¸Ņ‡ĐēĐž иĐŧĐĩ" + }, + "securePasswordGenerated": { + "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊа ĐģОСиĐŊĐēа ҘĐĩ ĐŗĐĩĐŊĐĩŅ€Đ¸ŅĐ°ĐŊа! НĐĩ ĐˇĐ°ĐąĐžŅ€Đ°Đ˛Đ¸Ņ‚Đĩ да аĐļŅƒŅ€Đ¸Ņ€Đ°Ņ‚Đĩ и ŅĐ˛ĐžŅ˜Ņƒ ĐģОСиĐŊĐē҃ ĐŊа вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Đ¸." + }, + "useGeneratorHelpTextPartOne": { + "message": "ĐŖĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚Đ¸ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "да ĐēŅ€ĐĩĐ¸Ņ€Đ°Ņ‚Đĩ Ņ˜Đ°Đē҃ ҘĐĩдиĐŊŅŅ‚Đ˛ĐĩĐŊ҃ ĐģОСиĐŊĐē҃", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "АĐēŅ†Đ¸Ņ˜Đ° ĐŊа Ņ‚Đ°Ņ˜ĐŧĐ°ŅƒŅ‚ ҁĐĩŅ„Đ°" }, + "vaultTimeoutAction1": { + "message": "АĐēŅ†Đ¸Ņ˜Đ° Ņ‚Đ°Ņ˜ĐŧĐ°ŅƒŅ‚Đ°" + }, "lock": { "message": "ЗаĐēŅ™ŅƒŅ‡Đ°Ņ˜", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ĐžŅ‚Đŋад", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ĐĄŅ‚Đ°Đ˛Đēа Đ˛Ņ€Đ°Ņ›ĐĩĐŊа" }, + "alreadyHaveAccount": { + "message": "ВĐĩŅ› иĐŧĐ°Ņ‚Đĩ ĐŊаĐģĐžĐŗ?" + }, "vaultTimeoutLogOutConfirmation": { "message": "ĐžĐ´Ņ˜Đ°Đ˛Đ° Ņ›Đĩ ҃ĐēĐģĐžĐŊĐ¸Ņ‚Đ¸ ŅĐ˛Đ°Đēи ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋ Đ˛Đ°ŅˆĐĩĐŧ ҁĐĩŅ„Ņƒ и ĐˇĐ°Ņ…Ņ‚Đĩва ĐŧŅ€ĐĩĐļĐŊ҃ ĐŋĐžŅ‚Đ˛Ņ€Đ´Ņƒ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚Đ° ĐŊаĐēĐžĐŊ Đ¸ŅŅ‚ĐĩĐēа Ņ‚Đ°Ņ˜ĐŧĐ°ŅƒŅ‚Đ°. Да Đģи ҁ҂Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊи да ĐļĐĩĐģĐ¸Ņ‚Đĩ да ĐēĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐžĐ˛Ņƒ ĐŋĐžŅŅ‚Đ°Đ˛Đē҃?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ и Ņ‡ŅƒĐ˛Đ°ŅšĐĩ" }, + "fillAndSave": { + "message": "ПоĐŋ҃ĐŊи и ŅĐ°Ņ‡ŅƒĐ˛Đ°Ņ˜" + }, "autoFillSuccessAndSavedUri": { "message": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи ĐŋĐžĐŋ҃ҚĐĩĐŊа ŅŅ‚Đ°Đ˛Đēа и ŅĐ°Ņ‡ŅƒĐ˛Đ°ĐŊ ĐŖĐ Đ›" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Đ’Đ°ŅˆĐ° ĐŊОва ĐŗĐģавĐŊа ĐģОСиĐŊĐēа ĐŊĐĩ Đ¸ŅĐŋŅƒŅšĐ°Đ˛Đ° ĐˇĐ°Ņ…Ņ‚ĐĩвĐĩ ҁĐŧĐĩŅ€ĐŊĐ¸Ņ†Đ°." }, + "receiveMarketingEmailsV2": { + "message": "Đ”ĐžĐąĐ¸Ņ˜Đ°Ņ˜Ņ‚Đĩ ŅĐ°Đ˛ĐĩŅ‚Đĩ, ĐŊĐ°Ņ˜Đ°Đ˛Đĩ и ĐŧĐžĐŗŅƒŅ›ĐŊĐžŅŅ‚Đ¸ Đ¸ŅŅ‚Ņ€Đ°ĐļĐ¸Đ˛Đ°ŅšĐ° Од Bitwarden-а ҃ ĐŋŅ€Đ¸Ņ˜ĐĩĐŧĐŊĐžĐŧ ŅĐ°ĐŊĐ´ŅƒŅ‡ĐĩŅ‚Ņƒ." + }, + "unsubscribe": { + "message": "ĐžĐ´Ņ˜Đ°Đ˛Đ¸ ҁĐĩ" + }, + "atAnyTime": { + "message": "йиĐģĐž Đēада." + }, + "byContinuingYouAgreeToThe": { + "message": "АĐēĐž ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ, ҁĐģаĐļĐĩŅ‚Đĩ ҁĐĩ ŅĐ°" + }, + "and": { + "message": "и" + }, "acceptPolicies": { "message": "ОзĐŊĐ°Ņ‡Đ°Đ˛Đ°ŅšĐĩĐŧ ĐžĐ˛ĐžĐŗ ĐŋĐžŅ™Đ° ĐŋŅ€Đ¸ŅŅ‚Đ°Ņ˜ĐĩŅ‚Đĩ ĐŊа ҁĐģĐĩĐ´ĐĩŅ›Đĩ:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "ĐŖ Ņ€ĐĩĐ´Ņƒ" }, + "errorRefreshingAccessToken": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ĐžŅĐ˛ĐĩĐļĐ°Đ˛Đ°ŅšŅƒ Ņ‚ĐžĐēĐĩĐŊа ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋа" + }, + "errorRefreshingAccessTokenDesc": { + "message": "ĐĐ¸Ņ˜Đĩ ĐŋŅ€ĐžĐŊĐ°Ņ’ĐĩĐŊ Ņ‚ĐžĐēĐĩĐŊ Са ĐžŅĐ˛ĐĩĐļĐ°Đ˛Đ°ŅšĐĩ иĐģи АПИ ĐēŅ™ŅƒŅ‡Đĩви. ПоĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ да ҁĐĩ ĐžĐ´Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ и ĐŋĐžĐŊОвО ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ." + }, "desktopSyncVerificationTitle": { "message": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ° ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ Desktop-а" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "НĐĩĐŋĐžĐ´ŅƒĐ´Đ°Ņ€Đ°ŅšĐĩ ĐŊаĐģĐžĐŗĐ°" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "НĐĩĐŋĐžĐ´ŅƒĐ´Đ°Ņ€Đ°ŅšĐĩ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ˜ŅĐēĐžĐŗ ĐēŅ™ŅƒŅ‡Đ°" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ˜ŅĐēĐž ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Đ˛Đ°ŅšĐĩ ĐŊĐ¸Ņ˜Đĩ ҃ҁĐŋĐĩĐģĐž. БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ˜ŅĐēи Ņ‚Đ°Ņ˜ĐŊи ĐēŅ™ŅƒŅ‡ ĐŊĐ¸Ņ˜Đĩ ҃ҁĐŋĐĩĐž да ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ° ҁĐĩŅ„. ПоĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО да ĐŋОдĐĩŅĐ¸Ņ‚Đĩ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ˜Ņƒ." + }, "biometricsNotEnabledTitle": { "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ˜Đ° ĐŊĐ¸Ņ˜Đĩ ĐžĐŧĐžĐŗŅƒŅ›ĐĩĐŊа" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ˜Đ° ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Đ° ĐŊĐ¸Ņ˜Đĩ ĐŋĐžĐ´Ņ€ĐļаĐŊа ĐŊа ОвОĐŧ ŅƒŅ€ĐĩŅ’Đ°Ņ˜Ņƒ." }, + "biometricsNotUnlockedTitle": { + "message": "ĐšĐžŅ€Đ¸ŅĐŊиĐē ҘĐĩ СаĐēŅ™ŅƒŅ‡Đ°ĐŊ иĐģи ĐžĐ´Ņ˜Đ°Đ˛Ņ™ĐĩĐŊ" + }, + "biometricsNotUnlockedDesc": { + "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜Ņ‚Đĩ ĐžĐ˛ĐžĐŗ ĐēĐžŅ€Đ¸ŅĐŊиĐēа ҃ Đ´ĐĩҁĐēŅ‚ĐžĐŋ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ¸ и ĐŋĐžĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО." + }, + "biometricsNotAvailableTitle": { + "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ˜ŅĐēĐž ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Đ˛Đ°ŅšĐĩ ĐŊĐ¸Ņ˜Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž" + }, + "biometricsNotAvailableDesc": { + "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ˜ŅĐēĐž ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Đ˛Đ°ŅšĐĩ ҂ҀĐĩĐŊŅƒŅ‚ĐŊĐž ĐŊĐ¸Ņ˜Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž. ПоĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО ĐēĐ°ŅĐŊĐ¸Ņ˜Đĩ." + }, "biometricsFailedTitle": { "message": "БиоĐŧĐĩŅ‚Ņ€Đ¸Ņ˜Đ° ĐŊĐ¸Ņ˜Đĩ ҃ҁĐŋĐĩĐģа" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ҁĐŧĐĩŅ€ĐŊĐ¸Ņ†Đĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ŅƒŅ‚Đ¸Ņ‡Ņƒ ĐŊа Đ˛Đ°ŅˆĐĩ ĐŧĐžĐŗŅƒŅ›ĐŊĐžŅŅ‚Đ¸ вĐģĐ°ŅĐŊĐ¸ŅˆŅ‚Đ˛Đ°." }, + "personalOwnershipPolicyInEffectImports": { + "message": "ПоĐģĐ¸Ņ‚Đ¸Đēа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ҘĐĩ ĐąĐģĐžĐēĐ¸Ņ€Đ°Đģа ŅƒĐ˛ĐžĐˇ ŅŅ‚Đ°Đ˛Đēи ҃ Đ˛Đ°Ņˆ ĐŋĐžŅ˜ĐĩдиĐŊĐ°Ņ‡ĐŊи ҁĐĩŅ„." + }, + "domainsTitle": { + "message": "ДоĐŧĐĩĐŊи", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Đ˜ĐˇŅƒĐˇĐĩŅ‚Đ¸ Đ´ĐžĐŧĐĩĐŊи" }, "excludedDomainsDesc": { "message": "Bitwarden ĐŊĐĩŅ›Đĩ Ņ‚Ņ€Đ°ĐļĐ¸Ņ‚Đ¸ да ŅĐ°Ņ‡ŅƒĐ˛Đ° ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ Са ОвĐĩ Đ´ĐžĐŧĐĩĐŊĐĩ. ĐœĐžŅ€Đ°Ņ‚Đĩ ĐžŅĐ˛ĐĩĐļĐ¸Ņ‚Đ¸ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ да йи ĐŋŅ€ĐžĐŧĐĩĐŊĐĩ ŅŅ‚ŅƒĐŋиĐģĐĩ ĐŊа ҁĐŊĐ°ĐŗŅƒ." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden ĐŊĐĩŅ›Đĩ Ņ‚Ņ€Đ°ĐļĐ¸Ņ‚Đ¸ да ŅĐ°Ņ‡ŅƒĐ˛Đ° ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ Са ОвĐĩ Đ´ĐžĐŧĐĩĐŊĐĩ Са ŅĐ˛Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐĩ ĐŊаĐģĐžĐŗĐĩ. ĐœĐžŅ€Đ°Ņ‚Đĩ ĐžŅĐ˛ĐĩĐļĐ¸Ņ‚Đ¸ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ да йи ĐŋŅ€ĐžĐŧĐĩĐŊĐĩ ŅŅ‚ŅƒĐŋиĐģĐĩ ĐŊа ҁĐŊĐ°ĐŗŅƒ." + }, + "websiteItemLabel": { + "message": "ĐĄĐ°Ņ˜Ņ‚ $number$ (ĐŖĐ Đ›)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ĐŊĐ¸Ņ˜Đĩ ваĐļĐĩŅ›Đ¸ Đ´ĐžĐŧĐĩĐŊ", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Đ˜ĐˇŅƒĐˇĐĩŅ‚Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐĩ Đ´ĐžĐŧĐĩĐŊа ҁ҃ ŅĐ°Ņ‡ŅƒĐ˛Đ°ĐŊĐĩ" + }, + "limitSendViews": { + "message": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ¸Ņ‚Đ¸ ĐŋŅ€Đ¸ĐēаСĐĩ" + }, + "limitSendViewsHint": { + "message": "НиĐēĐž ĐŊĐĩ ĐŧĐžĐļĐĩ да види ОвО Send ĐŊаĐēĐžĐŊ ŅˆŅ‚Đž ҁĐĩ Đ´ĐžŅŅ‚Đ¸ĐŗĐŊĐĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩҚĐĩ.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "ĐžŅŅ‚Đ°ĐģĐ¸Ņ… ĐŋŅ€ĐĩĐŗĐģĐĩда: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "ДĐĩŅ‚Đ°Ņ™Đ¸ Send-а", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ĐĸŅ€Đ°Đļи „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ĐĸĐĩĐēҁ҂" }, + "sendTypeTextToShare": { + "message": "ĐĸĐĩĐēҁ҂ Са Đ´ĐĩŅ™ĐĩҚĐĩ" + }, "sendTypeFile": { "message": "Đ”Đ°Ņ‚ĐžŅ‚ĐĩĐēа" }, @@ -1666,6 +2406,9 @@ "message": "ХвĐĩ „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "ХаĐēŅ€Đ¸Ņ˜ Ņ‚ĐĩĐēҁ҂ ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊĐž" + }, "maxAccessCountReached": { "message": "Đ”ĐžŅŅ‚Đ¸ĐŗĐŊŅƒŅ‚ ĐŧаĐēŅĐ¸ĐŧаĐģаĐŊ ĐąŅ€ĐžŅ˜ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋа", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Đ—Đ°ŅˆŅ‚Đ¸Ņ›ĐĩĐŊĐž ĐģОСиĐŊĐēĐžĐŧ" }, + "copyLink": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ вĐĩĐˇŅƒ" + }, "copySendLink": { "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ ĐŖĐ Đ› „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "ĐĄĐ¸ĐŗŅƒŅ€ĐŊĐž Đ¸ĐˇĐąŅ€Đ¸ŅĐ°Ņ‚Đ¸ ĐžĐ˛Đ°Ņ˜ „Send“?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Да Đģи ҁ҂Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊи да ĐļĐĩĐģĐ¸Ņ‚Đĩ да Ņ‚Ņ€Đ°Ņ˜ĐŊĐž Đ¸ĐˇĐąŅ€Đ¸ŅˆĐĩŅ‚Đĩ ĐžĐ˛Đ°Ņ˜ Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "ĐŖŅ€Đĩди „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "„Send“ Ņ›Đĩ ĐąĐ¸Ņ‚Đ¸ Ņ‚Ņ€Đ°Ņ˜ĐŊĐž Đ¸ĐˇĐąŅ€Đ¸ŅĐ°ĐŊ ĐŊавĐĩĐ´ĐĩĐŊĐžĐŗ Đ´Đ°Ņ‚ŅƒĐŧа и Đ˛Ņ€ĐĩĐŧĐĩĐŊа.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send Ņ›Đĩ ĐąĐ¸Ņ‚Đ¸ Ņ‚Ņ€Đ°Ņ˜ĐŊĐž ĐžĐąŅ€Đ¸ŅĐ°ĐŊĐž ҃ ĐŊавĐĩĐ´ĐĩĐŊи Đ´Đ°Ņ‚ŅƒĐŧ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Đ ĐžĐē ҃ĐŋĐžŅ‚Ņ€ĐĩĐąĐĩ" }, @@ -1769,6 +2523,10 @@ "message": "ОĐŋŅ†Đ¸ĐžĐŊаĐģĐŊĐž ĐˇĐ°Ņ…Ņ‚ĐĩĐ˛Đ°Ņ˜Ņ‚Đĩ ĐģОСиĐŊĐē҃ Са ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋ ĐēĐžŅ€Đ¸ŅĐŊĐ¸Ņ†Đ¸Đŧа „Send“-҃.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Đ”ĐžĐ´Đ°Ņ˜Ņ‚Đĩ ĐžĐŋŅ†Đ¸ĐžĐŊаĐģĐŊ҃ ĐģОСиĐŊĐē҃ Са ĐŋŅ€Đ¸ĐŧĐ°ĐžŅ†Đĩ да ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐĩ ОвОĐŧ Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐĩ ĐąĐĩĐģĐĩ҈ĐēĐĩ Đž ОвОĐŧ „Send“.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "ĐšŅ€ĐĩĐ¸Ņ€Đ°ĐŊĐž ҁĐģĐ°ŅšĐĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send ҘĐĩ ҃ҁĐŋĐĩ҈ĐŊĐž ĐŊаĐŋŅ€Đ°Đ˛Ņ™ĐĩĐŊ!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "Send Ņ›Đĩ ĐąĐ¸Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž ŅĐ˛Đ¸Đŧа ĐēĐžŅ˜Đ¸ иĐŧĐ°Ņ˜Ņƒ вĐĩĐˇŅƒ ĐŊĐ°Ņ€ĐĩĐ´ĐŊĐ¸Ņ… 1 ŅĐ°Ņ‚.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "Send Ņ›Đĩ ĐąĐ¸Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž ŅĐ˛Đ¸Đŧа ĐēĐžŅ˜Đ¸ иĐŧĐ°Ņ˜Ņƒ вĐĩĐˇŅƒ ĐŊĐ°Ņ€ĐĩĐ´ĐŊĐ¸Ņ… 1 даĐŊ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send ĐģиĐŊĐē ҘĐĩ ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "ИСĐŧĐĩҚĐĩĐŊĐž ҁĐģĐ°ŅšĐĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Đ˜ŅĐēĐ°Ņ‡ŅƒŅ›Đ¸ Đ´ĐžĐ´Đ°Ņ‚Đ°Đē?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Да ĐąĐ¸ŅŅ‚Đĩ ĐēŅ€ĐĩĐ¸Ņ€Đ°Đģи Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃ Send, ĐŋĐžŅ‚Ņ€ĐĩĐąĐŊĐž ҘĐĩ да Đ¸ŅĐēĐžŅ‡Đ¸Ņ‚Đĩ ĐĩĐēҁ҂ĐĩĐŊĐˇĐ¸Ņ˜Ņƒ ҃ ĐŊОви ĐŋŅ€ĐžĐˇĐžŅ€.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Да ĐąĐ¸ŅŅ‚Đĩ Đ¸ĐˇĐ°ĐąŅ€Đ°Đģи Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃, ĐžŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ ĐĩĐēҁ҂ĐĩĐŊĐˇĐ¸Ņ˜Ņƒ ĐŊа ĐąĐžŅ‡ĐŊĐžŅ˜ Ņ‚Ņ€Đ°Ņ†Đ¸ (аĐēĐž ҘĐĩ ĐŧĐžĐŗŅƒŅ›Đĩ) иĐģи ĐžŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ ҃ ĐŊОви ĐŋŅ€ĐžĐˇĐžŅ€ ĐēĐģиĐēĐžĐŧ ĐŊа ĐžĐ˛Đ°Ņ˜ йаĐŊĐĩŅ€." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Да ĐąĐ¸ŅŅ‚Đĩ Đ¸ĐˇĐ°ĐąŅ€Đ°Đģи Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃ ŅĐ° Safari-ĐžĐŧ, ĐžŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ ҃ ĐŊОви ĐŋŅ€ĐžĐˇĐžŅ€ ĐēĐģиĐēĐžĐŧ ĐŊа ĐžĐ˛Đ°Ņ˜ йаĐŊĐĩŅ€." }, + "popOut": { + "message": "Đ˜ŅĐēĐžŅ‡Đ¸Ņ‚Đ¸" + }, "sendFileCalloutHeader": { "message": "ĐŸŅ€Đĩ ĐŊĐĩĐŗĐž ŅˆŅ‚Đž ĐŋĐžŅ‡ĐŊĐĩ҈" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "ХаĐēŅ€Đ¸Ņ˜ ĐŧĐžŅ˜Ņƒ Đĩ-Đ°Đ´Ņ€Đĩҁ҃ Од ĐŋŅ€Đ¸ĐŧĐ°ĐžŅ†Đ°." }, + "hideYourEmail": { + "message": "ХаĐēŅ€Đ¸Ņ˜Ņ‚Đĩ ŅĐ˛ĐžŅ˜ иĐŧĐĩҘĐģ Од ĐŗĐģĐĩдаĐģĐ°Ņ†Đ°." + }, "sendOptionsPolicyInEffect": { "message": "ЈĐĩĐ´ĐŊа иĐģи Đ˛Đ¸ŅˆĐĩ ҁĐŧĐĩŅ€ĐŊĐ¸Ņ†Đ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ŅƒŅ‚Đ¸Ņ‡Ņƒ ĐŊа ĐžĐŋŅ†Đ¸Ņ˜Đĩ „Send“-а." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐŊа ҘĐĩ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ° Đĩ-ĐŋĐžŅˆŅ‚Đĩ" }, + "emailVerifiedV2": { + "message": "ИĐŧĐĩҘĐģ вĐĩŅ€Đ¸Ņ„Đ¸ĐēОваĐŊ" + }, "emailVerificationRequiredDesc": { "message": "ĐœĐžŅ€Đ°Ņ‚Đĩ да ĐŋĐžŅ‚Đ˛Ņ€Đ´Đ¸Ņ‚Đĩ Đĩ-ĐŋĐžŅˆŅ‚Ņƒ да ĐąĐ¸ŅŅ‚Đĩ ĐēĐžŅ€Đ¸ŅŅ‚Đ¸Đģи ĐžĐ˛Ņƒ Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ˜Ņƒ. МоĐļĐĩŅ‚Đĩ да ĐŋĐžŅ‚Đ˛Ņ€Đ´Đ¸Ņ‚Đĩ Đĩ-ĐŋĐžŅˆŅ‚Ņƒ ҃ вĐĩĐą ҁĐĩŅ„Ņƒ." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Đ’Đ°ŅˆĐ° ĐŗĐģавĐŊа ĐģОСиĐŊĐēа ĐŊĐĩ Đ¸ŅĐŋŅƒŅšĐ°Đ˛Đ° ҘĐĩĐ´ĐŊ҃ иĐģи Đ˛Đ¸ŅˆĐĩ ҁĐŧĐĩŅ€ĐŊĐ¸Ņ†Đ° Đ˛Đ°ŅˆĐĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ. Да ĐąĐ¸ŅŅ‚Đĩ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋиĐģи ҁĐĩŅ„Ņƒ, ĐŧĐžŅ€Đ°Ņ‚Đĩ ОдĐŧĐ°Ņ… да аĐļŅƒŅ€Đ¸Ņ€Đ°Ņ‚Đĩ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃. АĐēĐž ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ, ĐžĐ´Ņ˜Đ°Đ˛Đ¸Ņ›ĐĩŅ‚Đĩ ҁĐĩ ŅĐ° Đ˛Đ°ŅˆĐĩ ҂ҀĐĩĐŊŅƒŅ‚ĐŊĐĩ ҁĐĩŅĐ¸Ņ˜Đĩ, ŅˆŅ‚Đž ĐˇĐ°Ņ…Ņ‚Đĩва да ҁĐĩ ĐŋĐžĐŊОвО ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ. АĐēŅ‚Đ¸Đ˛ĐŊĐĩ ҁĐĩŅĐ¸Ņ˜Đĩ ĐŊа Đ´Ņ€ŅƒĐŗĐ¸Đŧ ŅƒŅ€ĐĩŅ’Đ°Ņ˜Đ¸Đŧа ĐŧĐžĐŗŅƒ да ĐžŅŅ‚Đ°ĐŊ҃ аĐēŅ‚Đ¸Đ˛ĐŊĐĩ Đ´Đž ҘĐĩдаĐŊ ŅĐ°Ņ‚." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Đ’Đ°ŅˆĐ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ° ҘĐĩ ĐžĐŊĐĩĐŧĐžĐŗŅƒŅ›Đ¸Đģа ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ŅšĐĩ ĐŋĐžŅƒĐˇĐ´Đ°ĐŊĐžĐŗ ŅƒŅ€ĐĩŅ’Đ°Ņ˜Đ°. ĐŸĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃ Са ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋ Đ˛Đ°ŅˆĐĩĐŧ ҂ҀĐĩĐˇĐžŅ€Ņƒ." + }, "resetPasswordPolicyAutoEnroll": { "message": "ĐŅƒŅ‚Đž ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ Ņ„Đ°ŅŅ†Đ¸ĐēĐģ҃..." }, - "ssoCompleteRegistration": { - "message": "Да ĐąĐ¸ŅŅ‚Đĩ Đ´ĐžĐ˛Ņ€ŅˆĐ¸Đģи ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ ĐŋĐžĐŧĐžŅ›Ņƒ SSO, ĐŧĐžĐģиĐŧĐž да ĐŋĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃ Са ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋ и ĐˇĐ°ŅˆŅ‚Đ¸Ņ‚Ņƒ Đ˛Đ°ŅˆĐĩĐŗ ҁĐĩŅ„Đ°." + "noFoldersFound": { + "message": "ĐĐ¸ŅŅƒ ĐŋŅ€ĐžĐŊĐ°Ņ’ĐĩĐŊĐĩ Ņ„Đ°ŅŅ†Đ¸ĐēĐģĐĩ", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "ДозвоĐģĐĩ Са Đ˛Đ°ŅˆŅƒ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Ņƒ ҁ҃ аĐļŅƒŅ€Đ¸Ņ€Đ°ĐŊĐĩ, ŅˆŅ‚Đž ĐˇĐ°Ņ…Ņ‚Đĩва да ĐŋĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Đ’Đ°ŅˆĐ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ° ĐˇĐ°Ņ…Ņ‚Đĩва да ĐŋĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "Од $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "ĐŸĐžŅ‚Ņ€ĐĩйдĐŊа вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ°", + "description": "Default title for the user verification dialog." }, "hours": { "message": "ĐĄĐ°Ņ‚Đ°" @@ -1904,6 +2740,9 @@ "minutes": { "message": "МиĐŊŅƒŅ‚Đ°" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Đ—Đ°Ņ…Ņ‚Đĩви ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēĐĩ ĐŋŅ€ĐĩĐ´ŅƒĐˇĐĩŅ›Đ° ҁ҃ ĐŋŅ€Đ¸ĐŧĐĩҚĐĩĐŊи ĐŊа ĐžĐŋŅ†Đ¸Ņ˜Đĩ Ņ‚Đ°Ņ˜ĐŧĐ°ŅƒŅ‚Đ°" + }, "vaultTimeoutPolicyInEffect": { "message": "ПоĐģĐ¸ŅĐ° Đ˛Đ°ŅˆĐĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ŅƒŅ‚Đ¸Ņ‡Đĩ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩ Đ¸ŅŅ‚ĐĩĐēа ҁĐĩŅ„Đ°. МаĐēŅĐ¸ĐŧаĐģĐŊĐž Đ´ĐžĐˇĐ˛ĐžŅ™ĐĩĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩ Đ¸ŅŅ‚ĐĩĐēа ҘĐĩ $HOURS$ ŅĐ°Ņ‚(и) и $MINUTES$ minut(а)", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "МаĐēиĐŧ҃Đŧ $HOURS$ ŅĐ°Ņ‚(а) и $MINUTES$ ĐŧиĐŊŅƒŅ‚(а).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "ĐĸĐ°Ņ˜ĐŧĐ°ŅƒŅ‚ ҘĐĩ вĐĩŅ›Đ¸ ĐŊĐĩĐŗĐž ŅˆŅ‚Đž ҘĐĩ Ņ€ĐĩŅˆĐ¸Đģа ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ°: ĐŧаĐēиĐŧ҃Đŧ $HOURS$ ŅĐ°Ņ‚(а) и $MINUTES$ ĐŧиĐŊŅƒŅ‚(а)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "ĐĄĐŧĐĩŅ€ĐŊĐ¸Ņ†Đĩ Đ˛Đ°ŅˆĐĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ŅƒŅ‚Đ¸Ņ‡Ņƒ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩĐŊҁĐēĐž ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩҚĐĩ ҁĐĩŅ„Đ°. МаĐēŅĐ¸ĐŧаĐģĐŊĐž Đ´ĐžĐˇĐ˛ĐžŅ™ĐĩĐŊĐž ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩҚĐĩ ҁĐĩŅ„Đ° ҘĐĩ $HOURS$ ŅĐ°Ņ‚(и) и $MINUTES$ ĐŧиĐŊŅƒŅ‚(а). Đ’Đ°ŅˆĐ° Ņ€Đ°Đ´ŅšĐ° Đ˛Ņ€ĐĩĐŧĐĩĐŊҁĐēĐžĐŗ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩŅšĐ° ҁĐĩŅ„Đ° ҘĐĩ ĐŋОдĐĩ҈ĐĩĐŊа ĐŊа $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "ИСвОС ҁĐĩŅ„Đ° ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ" + }, + "exportingOrganizationVaultDesc": { + "message": "Đ‘Đ¸Ņ›Đĩ иСвĐĩСĐĩĐŊ ŅĐ°ĐŧĐž ҁĐĩŅ„ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ĐŋОвĐĩСаĐŊ ŅĐ° $ORGANIZATION$. ĐĄŅ‚Đ°Đ˛ĐēĐĩ ҃ ĐŋĐžŅ˜ĐĩдиĐŊĐ°Ņ‡ĐŊиĐŧ ҁĐĩŅ„ĐžĐ˛Đ¸Đŧа иĐģи Đ´Ņ€ŅƒĐŗĐ¸Đŧ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ°Đŧа ĐŊĐĩŅ›Đĩ ĐąĐ¸Ņ‚Đ¸ ҃ĐēŅ™ŅƒŅ‡ĐĩĐŊĐĩ.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Đ“Ņ€Đĩ҈Đēа" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ГĐĩĐŊĐĩŅ€Đ¸ŅˆĐ¸ иĐŧĐĩ" }, + "generateEmail": { + "message": "ГĐĩĐŊĐĩŅ€Đ¸ŅˆĐ¸Ņ‚Đĩ иĐŧĐĩҘĐģ" + }, + "generatorBoundariesHint": { + "message": "Đ’Ņ€ĐĩĐ´ĐŊĐžŅŅ‚ ĐŧĐžŅ€Đ° ĐąĐ¸Ņ‚Đ¸ иСĐŧĐĩŅ’Ņƒ $MIN$ и $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "ĐĸиĐŋ иĐŧĐĩĐŊа" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "ГĐĩĐŊĐĩŅ€Đ¸ŅˆĐ¸Ņ‚Đĩ ĐŋҁĐĩŅƒĐ´ĐžĐŊиĐŧ Đĩ-ĐŋĐžŅˆŅ‚Đĩ ĐŋĐžĐŧĐžŅ›Ņƒ ĐĩĐēҁ҂ĐĩŅ€ĐŊĐĩ ҃ҁĐģŅƒĐŗĐĩ ĐŋŅ€ĐžŅĐģĐĩŅ’Đ¸Đ˛Đ°ŅšĐ°." }, + "forwarderDomainName": { + "message": "ДоĐŧĐĩĐŊ иĐŧĐĩҘĐģа", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ Đ´ĐžĐŧĐĩĐŊ ĐēĐžŅ˜Đ¸ ĐŋĐžĐ´Ņ€Đļава Đ¸ĐˇĐ°ĐąŅ€Đ°ĐŊа ҃ҁĐģŅƒĐŗĐ°", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ ĐŗŅ€Đĩ҈Đēа: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "ГĐĩĐŊĐĩŅ€Đ¸ŅĐ°Đž Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "ВĐĩĐąŅĐ°Ņ˜Ņ‚: $WEBSITE$. ГĐĩĐŊĐĩŅ€Đ¸ŅĐ°Đž Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "ĐŸĐžĐŗŅ€ĐĩŅˆĐ°ĐŊ АПИ Ņ‚ĐžĐēĐĩĐŊ $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "ĐŸĐžĐŗŅ€ĐĩŅˆĐ°ĐŊ АПИ Ņ‚ĐžĐēĐĩĐŊ $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "ĐĐ¸Ņ˜Đĩ ĐŧĐžĐŗŅƒŅ›Đĩ Đ´ĐžĐąĐ¸Ņ‚Đ¸ ИД ĐŊаĐģĐžĐŗĐ° ĐŧĐ°ŅĐēĐ¸Ņ€Đ°ĐŊĐžĐŗ иĐŧĐĩҘĐģа $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "ĐŸĐžĐŗŅ€ĐĩŅˆĐ°ĐŊ Đ´ĐžĐŧĐĩĐŊ $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "ĐŸĐžĐŗŅ€ĐĩŅˆĐ°ĐŊ ĐŖĐ Đ› $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "НĐĩĐŋОСĐŊĐ°Ņ‚Đ° ĐŗŅ€Đĩ҈Đēа $SERVICENAME$-а.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "НĐĩĐŋОСĐŊĐ°Ņ‚Đ¸ ҈ĐŋĐĩĐ´Đ¸Ņ‚ĐĩŅ€: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ИĐŧĐĩ Đ´ĐžĐŧĐ°Ņ›Đ¸ĐŊа", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "КаĐēĐž Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°Ņ‚Đ¸" }, "autofillSelectInfoWithCommand": { - "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ŅŅ‚Đ°Đ˛Đē҃ ŅĐ° ОвĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ иĐģи ĐēĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩŅ‡Đ¸Ņ†Ņƒ: $COMMAND$", + "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ŅŅ‚Đ°Đ˛Đē҃ ŅĐ° ĐžĐ˛ĐžĐŗ ĐĩĐēŅ€Đ°ĐŊа, ĐēĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩŅ‡Đ¸Ņ†Ņƒ $COMMAND$, иĐģи Đ¸ŅŅ‚Ņ€Đ°ĐļĐ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐĩ ĐžĐŋŅ†Đ¸Ņ˜Đĩ ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ŅŅ‚Đ°Đ˛Đē҃ ŅĐ° ОвĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ иĐģи ĐŋĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩŅ‡Đ¸Ņ†Ņƒ ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа." + "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ŅŅ‚Đ°Đ˛Đē҃ ŅĐ° ĐžĐ˛ĐžĐŗ ĐĩĐēŅ€Đ°ĐŊа, иĐģи Đ¸ŅŅ‚Ņ€Đ°ĐļĐ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐĩ ĐžĐŋŅ†Đ¸Ņ˜Đĩ ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа." }, "gotIt": { "message": "Đ Đ°ĐˇŅƒĐŧĐĩĐŧ" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "ПодĐĩŅˆĐ°Đ˛Đ°ŅšĐ° ĐŅƒŅ‚Đž-Đŋ҃ҚĐĩŅšĐ°" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "ĐŸŅ€ĐĩŅ‡Đ¸Ņ†Đ° Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "ĐŸŅ€ĐžĐŧĐĩĐŊи ĐŋŅ€ĐĩŅ‡Đ¸Ņ†Ņƒ" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "ĐŖĐŋŅ€Đ°Đ˛Ņ™Đ°ŅšĐĩ ĐŋŅ€ĐĩŅ‡Đ¸Ņ†Đ°Đŧа" + }, "autofillShortcut": { "message": "ĐŸŅ€ĐĩŅ‡Đ¸Ņ†Đĩ ĐŅƒŅ‚Đž-Đŋ҃ҚĐĩŅšĐ°" }, - "autofillShortcutNotSet": { + "autofillLoginShortcutNotSet": { "message": "ĐŸŅ€ĐĩŅ‡Đ¸Ņ†Đ° Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŊĐ¸Ņ˜Đĩ ĐŋОдĐĩ҈ĐĩĐŊа. ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ОвО ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа ĐŋŅ€ĐĩŅ‚Ņ€Đ°ĐļĐ¸Đ˛Đ°Ņ‡Đ°." }, - "autofillShortcutText": { - "message": "ĐŸŅ€ĐĩŅ‡Đ¸Ņ†Đ° Đ°ŅƒŅ‚Đž-Đŋ҃ҚĐĩŅšĐ° ҘĐĩ: $COMMAND$. ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ОвО ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа ĐŋŅ€ĐĩŅ‚Ņ€Đ°ĐļĐ¸Đ˛Đ°Ņ‡Đ°.", + "autofillLoginShortcutText": { + "message": "ĐŸŅ€ĐĩŅ‡Đ¸Ņ†Đ° Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ Са Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ҘĐĩ $COMMAND$. ĐŖĐŋŅ€Đ°Đ˛Ņ™Đ°Ņ˜Ņ‚Đĩ ŅĐ˛Đ¸Đŧ ĐŋŅ€ĐĩŅ‡Đ¸Ņ†Đ°Đŧа ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа ĐŋŅ€ĐĩŅ‚Ņ€Đ°ĐļĐ¸Đ˛Đ°Ņ‡Đ°.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ĐĩĐŊĐž ĐŊа" - }, "opensInANewWindow": { "message": "ĐžŅ‚Đ˛Đ°Ņ€Đ° ҁĐĩ ҃ ĐŊОвОĐŧ ĐŋŅ€ĐžĐˇĐžŅ€Ņƒ" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "ĐŸĐžŅ‚Ņ€ĐĩйаĐŊ ҘĐĩ SSO идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ." }, + "creatingAccountOn": { + "message": "ĐšŅ€ĐĩĐ¸Ņ€Đ°Ņ˜ ĐŊаĐģĐžĐŗ ĐŊа" + }, + "checkYourEmail": { + "message": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜ иĐŧĐĩҘĐģ" + }, + "followTheLinkInTheEmailSentTo": { + "message": "ĐŸŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ вĐĩĐˇŅƒ ĐŋĐžŅĐģĐ°Ņ‚ĐžŅ˜ ĐŊа" + }, + "andContinueCreatingYourAccount": { + "message": "и ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ŅĐ° ĐēŅ€ĐĩĐ¸Ņ€Đ°ŅšĐĩĐŧ ĐŊаĐģĐžĐŗĐ°." + }, + "noEmail": { + "message": "НĐĩĐŧĐ°Ņ‚Đĩ иĐŧĐĩҘĐģ?" + }, + "goBack": { + "message": "Đ˜Ņ›Đ¸ ĐŊаСад" + }, + "toEditYourEmailAddress": { + "message": "да иСĐŧĐĩĐŊĐ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜ иĐŧĐĩҘĐģ." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "ĐžĐ´ĐąĐ¸Ņ˜ĐĩĐŊ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋ. НĐĩĐŧĐ°Ņ‚Đĩ дОСвОĐģ҃ да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ ĐžĐ˛Ņƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "ĐŖŅ€ĐĩŅ’Đ°Ņ˜ ĐŋĐžŅƒĐˇĐ´Đ°ĐŊ" }, + "sendsNoItemsTitle": { + "message": "НĐĩĐŧа аĐēŅ‚Đ¸Đ˛ĐŊĐ¸Ņ… Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "ĐŖĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚Đĩ Send да ĐąĐĩСйĐĩĐ´ĐŊĐž Đ´ĐĩĐģĐ¸Ņ‚Đĩ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ˜Đĩ ŅĐ° йиĐģĐž ĐēиĐŧ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "ĐŖĐŊĐžŅ ҘĐĩ ĐŋĐžŅ‚Ņ€ĐĩйаĐŊ." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 ĐŋĐžŅ™Đĩ ĐˇĐ°Ņ…Ņ‚Đĩва Đ˛Đ°ŅˆŅƒ ĐŋаĐļҚ҃." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ ĐŋĐžŅ™Đ° ĐˇĐ°Ņ…Ņ‚ĐĩĐ˛Đ°Ņ˜Ņƒ Đ˛Đ°ŅˆŅƒ ĐŋаĐļҚ҃.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- ĐžĐ´Đ°ĐąŅ€Đ°Ņ‚Đ¸ --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "ĐŸŅ€ĐžĐŧĐĩĐŊи ĐŋŅ€ĐžŅˆĐ¸Ņ€ĐĩҚĐĩ", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "ĐŖĐ˛ĐĩĐˇĐ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜Đĩ ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ ҃ Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Đ—Đ°ŅˆŅ‚Đ¸Ņ‚Đ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜Đĩ LastPass ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ и ŅƒĐ˛ĐĩĐˇĐ¸Ņ‚Đĩ ҃ Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "ĐĄĐ°Ņ‡ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēаО ĐŊĐĩŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊ҃ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "ĐŖĐ˛ĐžĐˇ ҃ Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ĐŖĐ˛ĐžĐˇ...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "ĐŸĐžĐ´Đ°Ņ†Đ¸ ҁ҃ ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ˛ĐĩСĐĩĐŊи!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ŅƒĐ˛ĐžĐˇŅƒ. ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚Đĩ ĐēĐžĐŊСОĐģ҃ Са Đ´ĐĩŅ‚Đ°Ņ™Đĩ.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Đ”ĐžŅˆĐģĐž ҘĐĩ Đ´Đž ĐŗŅ€Đĩ҈ĐēĐĩ ĐŊа ĐŧŅ€ĐĩĐļи Ņ‚ĐžĐēĐžĐŧ ŅƒĐ˛ĐžĐˇĐ°.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "ДоĐŧĐĩĐŊ аĐģĐ¸Ņ˜Đ°ŅĐ°" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "ĐĄŅ‚Đ°Đ˛ĐēĐĩ ŅĐ° ҃ĐŋĐ¸Ņ‚ĐžĐŧ Са ĐŋĐžĐŊОвĐŊĐž ĐŋĐžŅŅ‚Đ°Đ˛Ņ™Đ°ŅšĐĩ ĐŗĐģавĐŊĐĩ ĐģОСиĐŊĐēĐĩ ĐŊĐĩ ĐŧĐžĐŗŅƒ ҁĐĩ Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋ҃ĐŊĐ¸Ņ‚Đ¸ ĐŋŅ€Đ¸ ŅƒŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšŅƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ. ĐŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋŅ€Đ¸ ŅƒŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšŅƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ ҘĐĩ Đ¸ŅĐēŅ™ŅƒŅ‡ĐĩĐŊĐž.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "ĐŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋŅ€Đ¸ ŅƒŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšŅƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ ҘĐĩ ĐŋОдĐĩ҈ĐĩĐŊĐž да ĐēĐžŅ€Đ¸ŅŅ‚Đ¸ ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊĐž ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐĩ.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Đ˜ŅĐēŅ™ŅƒŅ‡Đ¸Ņ‚Đĩ ĐŋĐžĐŊОвĐŊи ҃ĐŋĐ¸Ņ‚ ĐŗĐģавĐŊĐĩ ĐģОСиĐŊĐēĐĩ да ĐąĐ¸ŅŅ‚Đĩ ŅƒŅ€ĐĩдиĐģи ОвО ĐŋĐžŅ™Đĩ", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "ĐŖĐēŅ™ŅƒŅ‡Đ¸Ņ‚Đĩ ĐąĐžŅ‡ĐŊ҃ ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ˜Ņƒ" + }, + "skipToContent": { + "message": "ĐŸŅ€ĐĩҁĐēĐžŅ‡Đ¸ ĐŊа ŅĐ°Đ´Ņ€ĐļĐ°Ņ˜" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden ĐŧĐĩĐŊи Đ´ŅƒĐŗĐŧĐĩŅ‚Đ° Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐ°", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "ĐŸŅ€ĐĩĐąĐ°Ņ†Đ¸ ĐŧĐĩĐŊи Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐ° Bitwarden-а", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden ĐŧĐĩĐŊи Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐ°", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜Ņ‚Đĩ ĐŊаĐģĐžĐŗ да ĐąĐ¸ŅŅ‚Đĩ видĐĩĐģи ĐŋĐžĐ´ŅƒĐ´Đ°Ņ€ĐŊĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜Ņ‚Đĩ ŅĐ˛ĐžŅ˜ ĐŊаĐģĐžĐŗ да ĐąĐ¸ŅŅ‚Đĩ видĐĩĐģи ĐŋŅ€ĐĩĐ´ĐģĐžĐŗĐĩ Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜ ĐŊаĐģĐžĐŗ", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "ĐžŅ‚ĐēŅ™ŅƒŅ‡Đ°Ņ˜Ņ‚Đĩ ŅĐ˛ĐžŅ˜ ĐŊаĐģĐžĐŗ, ĐžŅ‚Đ˛Đ°Ņ€Đ° ҁĐĩ ҃ ĐŊОвОĐŧ ĐŋŅ€ĐžĐˇĐžŅ€Ņƒ", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "ПоĐŋ҃ĐŊĐ¸Ņ‚Đ¸ аĐēŅ€ĐĩĐ´Đ¸Ņ‚Đ¸Đ˛Đĩ Са", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "ДĐĩĐģиĐŧĐ¸Ņ‡ĐŊĐž ĐēĐžŅ€Đ¸ŅĐŊĐ¸Ņ‡ĐēĐž иĐŧĐĩ", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "НĐĩĐŧа ŅŅ‚Đ°Đ˛Đēи Са ĐŋŅ€Đ¸ĐēĐ°ĐˇĐ¸Đ˛Đ°ŅšĐĩ", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Нова ŅŅ‚Đ°Đ˛ĐēĐĩ", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Đ”ĐžĐ´Đ°Ņ˜Ņ‚Đĩ ĐŊĐžĐ˛Ņƒ ŅŅ‚Đ°Đ˛Đē҃ ҁĐĩŅ„Ņƒ", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Ново ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "Đ”ĐžĐ´Đ°Ņ˜ ĐŊĐžĐ˛Ņƒ ŅŅ‚Đ°Đ˛Đē҃ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ ҃ ҁĐĩŅ„, ĐžŅ‚Đ˛Đ°Ņ€Đ° ҁĐĩ ҃ ĐŊОвОĐŧ ĐŋŅ€ĐžĐˇĐžŅ€Ņƒ", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Нова ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đ°", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "Đ”ĐžĐ´Đ°Ņ˜ ĐŊĐžĐ˛Ņƒ ŅŅ‚Đ°Đ˛Đē҃ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ ҁĐĩŅ„Đ°, ĐžŅ‚Đ˛Đ°Ņ€Đ° ҁĐĩ ҃ ĐŊОвОĐŧ ĐŋŅ€ĐžĐˇĐžŅ€Ņƒ", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Нови идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "Đ”ĐžĐ´Đ°Ņ˜ ĐŊОв идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚ ҃ ҁĐĩŅ„, ĐžŅ‚Đ˛Đ°Ņ€Đ° ҁĐĩ ҃ ĐŊОвОĐŧ ĐŋŅ€ĐžĐˇĐžŅ€Ņƒ", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "МĐĩĐŊи Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐ° Bitwarden-а ҘĐĩ Đ´ĐžŅŅ‚ŅƒĐŋаĐŊ. ĐŸŅ€Đ¸Ņ‚Đ¸ŅĐŊĐ¸Ņ‚Đĩ Ņ‚Đ°ŅŅ‚ĐĩŅ€ ŅĐ° ҁ҂ҀĐĩĐģĐ¸Ņ†ĐžĐŧ ĐŊадОĐģĐĩ да ĐąĐ¸ŅŅ‚Đĩ Đ¸ĐˇĐ°ĐąŅ€Đ°Đģи.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ĐŖĐēŅ™ŅƒŅ‡Đ¸" + }, + "ignore": { + "message": "Đ˜ĐŗĐŊĐžŅ€Đ¸ŅˆĐ¸" + }, + "importData": { + "message": "ĐŖĐ˛ĐĩСи ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ŅƒĐ˛ĐžĐˇŅƒ" + }, + "importErrorDesc": { + "message": "ĐŸĐžŅ˜Đ°Đ˛Đ¸Đž ҁĐĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧ ŅĐ° ĐŋĐžĐ´Đ°Ņ†Đ¸Đŧа ĐēĐžŅ˜Đĩ ҁ҂Đĩ ĐŋĐžĐēŅƒŅˆĐ°Đģи да ŅƒĐ˛ĐĩСĐĩŅ‚Đĩ. Đ ĐĩŅˆĐ¸Ņ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧĐĩ ҃ Đ¸ĐˇĐ˛ĐžŅ€ĐŊĐžŅ˜ Đ´Đ°Ņ‚ĐžŅ‚ĐĩŅ†Đ¸ ĐŊавĐĩĐ´ĐĩĐŊĐĩ Đ¸ŅĐŋОд и ĐŋĐžĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "ПоĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đĩ ĐŗŅ€Đĩ҈ĐēĐĩ Đ¸ŅĐŋОд и ĐŋĐžĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО." + }, + "description": { + "message": "ОĐŋĐ¸Ņ" + }, + "importSuccess": { + "message": "ĐŸĐžĐ´Đ°Ņ†Đ¸ ҁ҃ ŅƒĐ˛ĐĩСĐĩĐŊи" + }, + "importSuccessNumberOfItems": { + "message": "$AMOUNT$ ŅŅ‚Đ°Đ˛ĐēĐĩ/и ҁ҃ ŅƒĐ˛ĐĩСĐĩĐŊĐĩ.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "ПоĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "За ĐžĐ˛Ņƒ Ņ€Đ°Đ´ŅšŅƒ ҘĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐŊа вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ°. ПодĐĩŅĐ¸Ņ‚Đĩ ПИН да ĐąĐ¸ŅŅ‚Đĩ ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Đģи." + }, + "setPin": { + "message": "ĐŸĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ PIN" + }, + "verifyWithBiometrics": { + "message": "ВĐĩŅ€Đ¸Ņ„Đ¸ĐēŅƒŅ˜Ņ‚Đĩ ĐŋĐžĐŧĐžŅ›Ņƒ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ˜Đĩ" + }, + "awaitingConfirmation": { + "message": "ЧĐĩĐēа ҁĐĩ ĐŋĐžŅ‚Đ˛Ņ€Đ´Đ°" + }, + "couldNotCompleteBiometrics": { + "message": "ĐĐ¸Ņ˜Đĩ ĐŧĐžĐŗŅƒŅ›Đĩ ĐˇĐ°Đ˛Ņ€ŅˆĐ¸Ņ‚Đ¸ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ˜Ņƒ." + }, + "needADifferentMethod": { + "message": "ĐŸĐžŅ‚Ņ€ĐĩйаĐŊ ваĐŧ ҘĐĩ Đ´Ņ€ŅƒĐŗĐ¸ ĐŊĐ°Ņ‡Đ¸ĐŊ?" + }, + "useMasterPassword": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐŗĐģавĐŊ҃ ĐģОСиĐŊĐē҃" + }, + "usePin": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ПИН" + }, + "useBiometrics": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ˜Ņƒ" + }, + "enterVerificationCodeSentToEmail": { + "message": "ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ вĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸ĐžĐŊи ĐēÃ´Đ´ ĐēĐžŅ˜Đ¸ ҘĐĩ ĐŋĐžŅĐģĐ°Ņ‚ ĐŊа Đ’Đ°ŅˆŅƒ Đĩ-Đ°Đ´Ņ€Đĩҁ҃." + }, + "resendCode": { + "message": "ПоĐŊОвО ĐŋĐžŅˆĐ°Ņ™Đ¸Ņ‚Đĩ ĐēÃ´Đ´" + }, + "total": { + "message": "Đ—ĐąĐ¸Ņ€" + }, + "importWarning": { + "message": "ĐŖĐ˛ĐžĐˇĐ¸Ņ‚Đĩ ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ ҃ $ORGANIZATION$. Đ’Đ°ŅˆĐ¸ ĐŋĐžĐ´Đ°Ņ†Đ¸ ĐŧĐžĐŗŅƒ ĐąĐ¸Ņ‚Đ¸ ĐŋОдĐĩŅ™ĐĩĐŊи ŅĐ° ҇ĐģаĐŊОвиĐŧа ОвĐĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ. Да Đģи ĐļĐĩĐģĐ¸Ņ‚Đĩ да ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ ĐŋОвĐĩĐˇĐ¸Đ˛Đ°ŅšŅƒ ŅĐ° ҃ҁĐģŅƒĐŗĐžĐŧ Duo. ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ¸ ĐŧĐĩŅ‚ĐžĐ´ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ ҃ два ĐēĐžŅ€Đ°Đēа иĐģи ĐēĐžĐŊŅ‚Đ°ĐēŅ‚Đ¸Ņ€Đ°Ņ˜Ņ‚Đĩ Duo Са ĐŋĐžĐŧĐžŅ›." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "ПоĐēŅ€ĐĩĐŊŅƒŅ‚Đ¸ DUO и ĐŋŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ ĐēĐžŅ€Đ°ĐēĐĩ да ĐąĐ¸ŅŅ‚Đĩ ĐˇĐ°Đ˛Ņ€ŅˆĐ¸Đģи ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ." + }, + "duoRequiredForAccount": { + "message": "Duo ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ° ҃ два ĐēĐžŅ€Đ°Đēа ҘĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐŊа Са Đ˛Đ°Ņˆ ĐŊаĐģĐžĐŗ." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Đ˜ŅĐēĐ°Ņ‡ŅƒŅ›Đ¸ Đ´ĐžĐ´Đ°Ņ‚Đ°Đē да ĐąĐ¸ŅŅ‚Đĩ Đ´ĐžĐ˛Ņ€ŅˆĐ¸Đģи ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ." + }, + "popoutExtension": { + "message": "Đ˜ŅĐēĐ°Ņ‡ŅƒŅ›Đ¸ Đ´ĐžĐ´Đ°Ņ‚Đ°Đē" + }, + "launchDuo": { + "message": "ПоĐēŅ€ĐĩĐŊŅƒŅ‚Đ¸ DUO" + }, + "importFormatError": { + "message": "ĐŸĐžĐ´Đ°Ņ†Đ¸ ĐŊĐ¸ŅŅƒ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐŊĐž Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€Đ°ĐŊи. ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚Đĩ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃ Са ŅƒĐ˛ĐžĐˇ и ĐŋĐžĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО." + }, + "importNothingError": { + "message": "ĐĐ¸ŅˆŅ‚Đ° ĐŊĐ¸Ņ˜Đĩ ŅƒĐ˛ĐĩĐļĐĩĐŊĐž." + }, + "importEncKeyError": { + "message": "Đ“Ņ€Đĩ҈Đēа ҃ Đ´ĐĩŅˆĐ¸Ņ„Ņ€Đ¸Ņ€Đ°ŅšŅƒ иСвОСĐŊĐĩ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ. Đ’Đ°Ņˆ ĐēŅ™ŅƒŅ‡ Са ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ŅšĐĩ ĐŊĐĩ ĐžĐ´ĐŗĐžĐ˛Đ°Ņ€Đ° ĐēŅ™ŅƒŅ‡Ņƒ ĐēĐžŅ˜Đ¸ ҁĐĩ ĐēĐžŅ€Đ¸ŅŅ‚Đ¸Đž Са иСвОС ĐŋĐžĐ´Đ°Ņ‚Đ°Đēа." + }, + "invalidFilePassword": { + "message": "НĐĩваĐļĐĩŅ›Đ° ĐģОСиĐŊĐēа Са Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃, ĐēĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐģОСиĐŊĐē҃ ĐēĐžŅ˜Ņƒ ҁ҂Đĩ ҃ĐŊĐĩĐģи Đēада ҁ҂Đĩ ĐēŅ€ĐĩĐ¸Ņ€Đ°Đģи Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃ Са иСвОС." + }, + "destination": { + "message": "ĐžĐ´Ņ€ĐĩĐ´Đ¸ŅˆŅ‚Đĩ" + }, + "learnAboutImportOptions": { + "message": "ХаСĐŊĐ°Ņ˜Ņ‚Đĩ Đ˛Đ¸ŅˆĐĩ Đž ĐžĐŋŅ†Đ¸Ņ˜Đ°Đŧа ŅƒĐ˛ĐžĐˇĐ°" + }, + "selectImportFolder": { + "message": "ИСайĐĩŅ€Đ¸ Ņ„Đ°ŅŅ†Đ¸ĐēĐģ҃" + }, + "selectImportCollection": { + "message": "ИСайĐĩŅ€Đ¸ ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ˜Ņƒ" + }, + "importTargetHint": { + "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ĐžĐ˛Ņƒ ĐžĐŋŅ†Đ¸Ņ˜Ņƒ аĐēĐž ĐļĐĩĐģĐ¸Ņ‚Đĩ да ҁĐĩ ŅĐ°Đ´Ņ€ĐļĐ°Ņ˜ ŅƒĐ˛ĐĩСĐĩĐŊĐĩ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ ĐŋŅ€ĐĩĐŧĐĩŅŅ‚Đ¸ ҃ $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Đ”Đ°Ņ‚ĐžŅ‚ĐĩĐēа ŅĐ°Đ´Ņ€Đļи ĐŊĐĩдОдĐĩŅ™ĐĩĐŊĐĩ ŅŅ‚Đ°Đ˛ĐēĐĩ." + }, + "selectFormat": { + "message": "ĐžĐ´Đ°ĐąŅ€Đ°Ņ‚Đ¸ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ Са ŅƒĐ˛ĐžĐˇ" + }, + "selectImportFile": { + "message": "ĐžĐ´Đ°ĐąŅ€Đ°Ņ‚Đ¸ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃ Са ŅƒĐ˛ĐžĐˇ" + }, + "chooseFile": { + "message": "ИСайĐĩŅ€Đ¸ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐē҃" + }, + "noFileChosen": { + "message": "ĐĐ¸Ņ˜Đĩ Đ¸ĐˇĐ°ĐąŅ€Đ°ĐŊа ĐŊĐ¸Ņ˜ĐĩĐ´ĐŊа Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēа" + }, + "orCopyPasteFileContents": { + "message": "иĐģи ĐēĐžĐŋĐ¸Ņ€Đ°Ņ˜Ņ‚Đĩ/ĐŊаĐģĐĩĐŋĐ¸Ņ‚Đĩ ŅĐ°Đ´Ņ€ĐļĐ°Ņ˜ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ Са ŅƒĐ˛ĐžĐˇ" + }, + "instructionsFor": { + "message": "ИĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Ņ˜Đĩ Са $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "ĐŸĐžŅ‚Đ˛Ņ€Đ´Đ¸Ņ‚Đĩ ŅƒĐ˛ĐžĐˇ ҁĐĩŅ„Đ°" + }, + "confirmVaultImportDesc": { + "message": "Ова Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēа ҘĐĩ ĐˇĐ°ŅˆŅ‚Đ¸Ņ›ĐĩĐŊа ĐģОСиĐŊĐēĐžĐŧ. ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ ĐģОСиĐŊĐē҃ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ да ĐąĐ¸ŅŅ‚Đĩ ŅƒĐ˛ĐĩСĐģи ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ." + }, + "confirmFilePassword": { + "message": "ĐŸĐžŅ‚Đ˛Ņ€Đ´Đ¸Ņ‚Đ¸ ĐģОСиĐŊĐē҃ Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ" + }, + "exportSuccess": { + "message": "ĐŸĐžĐ´Đ°Ņ†Đ¸ иС ҁĐĩŅ„Đ° ҁ҃ иСвĐĩСĐĩĐŊи" + }, + "typePasskey": { + "message": "ĐŸŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡" + }, + "accessing": { + "message": "ĐŸŅ€Đ¸ŅŅ‚ŅƒĐŋ" + }, + "passkeyNotCopied": { + "message": "ĐŸŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡ ĐŊĐĩŅ›Đĩ ĐąĐ¸Ņ‚Đ¸ ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊ" + }, + "passkeyNotCopiedAlert": { + "message": "ĐŸŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡ ĐŊĐĩŅ›Đĩ ĐąĐ¸Ņ‚Đ¸ ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊ ĐŊа ĐēĐģĐžĐŊĐ¸Ņ€Đ°ĐŊ҃ ŅŅ‚Đ°Đ˛Đē҃. Да Đģи ĐļĐĩĐģĐ¸Ņ‚Đĩ да ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ŅĐ° ĐēĐģĐžĐŊĐ¸Ņ€Đ°ŅšĐĩĐŧ ŅŅ‚Đ°Đ˛ĐēĐĩ?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "ВĐĩŅ€Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Ņƒ ĐˇĐ°Ņ…Ņ‚Đĩва ŅĐ°Ņ˜Ņ‚ ĐēĐžŅ˜Đ¸ ĐŋĐžĐēŅ€ĐĩŅ›Đĩ. Ова Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ˜Đ° Ņ˜ĐžŅˆ ŅƒĐ˛ĐĩĐē ĐŊĐ¸Ņ˜Đĩ иĐŧĐŋĐģĐĩĐŧĐĩĐŊŅ‚Đ¸Ņ€Đ°ĐŊа Са ĐŊаĐģĐžĐŗĐĩ ĐąĐĩС ĐŗĐģавĐŊĐĩ ĐģОСиĐŊĐēĐĩ." + }, + "logInWithPasskeyQuestion": { + "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ ŅĐ° ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊиĐŧ ĐēŅ™ŅƒŅ‡ĐĩĐŧ?" + }, + "passkeyAlreadyExists": { + "message": "За ĐžĐ˛Ņƒ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Ņƒ вĐĩŅ› ĐŋĐžŅŅ‚ĐžŅ˜Đ¸ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡." + }, + "noPasskeysFoundForThisApplication": { + "message": "ĐĐ¸ŅŅƒ ĐŋŅ€ĐžĐŊĐ°Ņ’ĐĩĐŊи ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡Đĩви Са ĐžĐ˛Ņƒ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Ņƒ." + }, + "noMatchingPasskeyLogin": { + "message": "НĐĩĐŧĐ°Ņ‚Đĩ ĐžĐ´ĐŗĐžĐ˛Đ°Ņ€Đ°Ņ˜ŅƒŅ›Ņƒ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ Са ĐžĐ˛Đ°Ņ˜ ŅĐ°Ņ˜Ņ‚." + }, + "noMatchingLoginsForSite": { + "message": "НĐĩĐŧа ĐžĐ´ĐŗĐžĐ˛Đ°Ņ€Đ°Ņ˜ŅƒŅ›Đ¸Ņ… ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ° Са ĐžĐ˛Đ°Ņ˜ ŅĐ°Ņ˜Ņ‚" + }, + "searchSavePasskeyNewLogin": { + "message": "ĐŸŅ€ĐĩŅ‚Ņ€Đ°ĐļĐ¸Ņ‚Đ¸ иĐģи ŅĐ°Ņ‡ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡ ĐēаО ĐŊĐžĐ˛Ņƒ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ" + }, + "confirm": { + "message": "ĐŸĐžŅ‚Đ˛Ņ€Đ´Đ¸" + }, + "savePasskey": { + "message": "ĐĄĐ°Ņ‡ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡" + }, + "savePasskeyNewLogin": { + "message": "ĐĄĐ°Ņ‡ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡ ĐēаО ĐŊĐžĐ˛Ņƒ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ" + }, + "chooseCipherForPasskeySave": { + "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ да ĐąĐ¸ŅŅ‚Đĩ ŅĐ°Ņ‡ŅƒĐ˛Đ°Đģи ĐžĐ˛Đ°Ņ˜ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡" + }, + "chooseCipherForPasskeyAuth": { + "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ" + }, + "passkeyItem": { + "message": "ĐĄŅ‚Đ°Đ˛Đēа ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊĐžĐŗ ĐēŅ™ŅƒŅ‡Đ°" + }, + "overwritePasskey": { + "message": "ЗаĐŧĐĩĐŊĐ¸Ņ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡?" + }, + "overwritePasskeyAlert": { + "message": "Ова ŅŅ‚Đ°Đ˛Đēа вĐĩŅ› ŅĐ°Đ´Ņ€Đļи ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡. Да Đģи ҁ҂Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊи да ĐļĐĩĐģĐ¸Ņ‚Đĩ да СаĐŧĐĩĐŊĐ¸Ņ‚Đĩ ҂ҀĐĩĐŊŅƒŅ‚ĐŊи ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡?" + }, + "featureNotSupported": { + "message": "Đ¤ŅƒĐŊĐēŅ†Đ¸Ņ˜Đ° Ņ˜ĐžŅˆ ĐŊĐ¸Ņ˜Đĩ ĐŋĐžĐ´Ņ€ĐļаĐŊа" + }, + "yourPasskeyIsLocked": { + "message": "За ĐēĐžŅ€Đ¸ŅˆŅ›ĐĩҚĐĩ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊĐžĐŗ ĐēŅ™ŅƒŅ‡Đ° ҘĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐŊа Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ°. ĐŸĐžŅ‚Đ˛Ņ€Đ´Đ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚ да ĐąĐ¸ŅŅ‚Đĩ ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Đģи." + }, + "multifactorAuthenticationCancelled": { + "message": "Đ’Đ¸ŅˆĐĩŅ„Đ°ĐēŅ‚ĐžŅ€ŅĐēа Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ° ҘĐĩ ĐžŅ‚ĐēаСаĐŊа" + }, + "noLastPassDataFound": { + "message": "НĐĩĐŧа LastPass ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ" + }, + "incorrectUsernameOrPassword": { + "message": "НĐĩваĐļĐĩŅ›Đĩ ĐēĐžŅ€Đ¸ŅĐŊĐ¸Ņ‡ĐēĐž иĐŧĐĩ иĐģи ĐģОСиĐŊĐēа" + }, + "incorrectPassword": { + "message": "ĐŸĐžĐŗŅ€Đĩ҈ĐŊа ĐģОСиĐŊĐēа" + }, + "incorrectCode": { + "message": "ĐŸĐžĐŗŅ€ĐĩŅˆĐ°ĐŊ ĐēÃ´Đ´" + }, + "incorrectPin": { + "message": "НĐĩŅ‚Đ°Ņ‡Đ°ĐŊ PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Đ’Đ¸ŅˆĐĩŅ„Đ°ĐēŅ‚ĐžŅ€ŅĐēа Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ° ҘĐĩ ĐŊĐĩ҃ҁĐŋĐĩ҈ĐŊа" + }, + "includeSharedFolders": { + "message": "ĐŖĐēŅ™ŅƒŅ‡Đ¸ Đ´ĐĩŅ™ĐĩĐŊĐĩ Ņ„Đ°ŅŅ†Đ¸ĐēĐģĐĩ" + }, + "lastPassEmail": { + "message": "LastPass иĐŧĐĩҘĐģ" + }, + "importingYourAccount": { + "message": "ĐŖĐ˛ĐžĐˇ ĐŊаĐģĐžĐŗĐ°..." + }, + "lastPassMFARequired": { + "message": "LastPass Đ˛Đ¸ŅˆĐĩŅ„Đ°ĐēŅ‚ĐžŅ€ŅĐēа Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ° ҘĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐŊа" + }, + "lastPassMFADesc": { + "message": "ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜Ņƒ ҘĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊ҃ ĐģОСиĐŊĐē҃ иС аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đĩ Са Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Ņƒ" + }, + "lastPassOOBDesc": { + "message": "ĐžĐ´ĐžĐąŅ€Đ¸Ņ‚Đĩ ĐˇĐ°Ņ…Ņ‚Đĩв Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ ҃ аĐŋĐģиĐēĐ°Ņ†Đ¸Ņ˜Đ¸ Са Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Ņƒ иĐģи ҃ĐŊĐĩŅĐ¸Ņ‚Đĩ ҘĐĩĐ´ĐŊĐžĐēŅ€Đ°Ņ‚ĐŊ҃ ĐģОСиĐŊĐē҃." + }, + "passcode": { + "message": "ЛозиĐŊĐēа" + }, + "lastPassMasterPassword": { + "message": "LastPass ĐŗĐģавĐŊа ĐģОСиĐŊĐēа" + }, + "lastPassAuthRequired": { + "message": "LastPass Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ° ҘĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐŊа" + }, + "awaitingSSO": { + "message": "ЧĐĩĐēĐ°ŅšĐĩ SSO Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đĩ" + }, + "awaitingSSODesc": { + "message": "ĐĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ да ҁĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™ŅƒŅ˜ĐĩŅ‚Đĩ ĐēĐžŅ€Đ¸ŅŅ‚ĐĩŅ›Đ¸ аĐēŅ€ĐĩĐ´Đ¸Ņ‚Đ¸Đ˛Đĩ ŅĐ˛ĐžŅ˜Đĩ ĐēĐžĐŧĐŋаĐŊĐ¸Ņ˜Đĩ." + }, + "seeDetailedInstructions": { + "message": "ĐŸĐžĐŗĐģĐĩĐ´Đ°Ņ˜Ņ‚Đĩ Đ´ĐĩŅ‚Đ°Ņ™ĐŊа ҃ĐŋŅƒŅ‚ŅŅ‚Đ˛Đ° ĐŊа ĐŊĐ°ŅˆĐžŅ˜ вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Đ¸ Са ĐŋĐžĐŧĐžŅ› ĐŊа", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Đ”Đ¸Ņ€ĐĩĐēŅ‚Đ°ĐŊ ŅƒĐ˛ĐžĐˇ иС LastPass-а" + }, + "importFromCSV": { + "message": "ĐŖĐ˛ĐžĐˇ иС CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "ПоĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ĐŋĐžĐŊОвО иĐģи ĐŋĐžŅ‚Ņ€Đ°ĐļĐ¸Ņ‚Đĩ иĐŧĐĩҘĐģ Од LastPass Са ĐŋĐžŅ‚Đ˛Ņ€Đ´Ņƒ идĐĩĐŊŅ‚Đ¸Ņ‚ĐĩŅ‚Đ°." + }, + "collection": { + "message": "КоĐģĐĩĐēŅ†Đ¸Ņ˜Đ°" + }, + "lastPassYubikeyDesc": { + "message": "ĐŖĐŊĐĩŅ‚Đ¸ YubiKey ĐēĐžŅ˜Đ¸ ҘĐĩ Đ°ŅĐžŅ†Đ¸Ņ€Đ°ĐŊ ŅĐ° LastPass ĐŊаĐģĐžĐŗĐžĐŧ ҃ ĐŖĐĄĐ‘ ĐŋĐžŅ€Ņ‚ Đ˛Đ°ŅˆĐĩĐŗ Ņ€Đ°Ņ‡ŅƒĐŊĐ°Ņ€Đ°, и ĐˇĐ°Ņ‚Đ¸Đŧ Đ´ĐžĐ´Đ¸Ņ€ĐŊĐ¸Ņ‚Đĩ ҚĐĩĐŗĐžĐ˛Đž Đ´ŅƒĐŗĐŧĐĩ." + }, + "switchAccount": { + "message": "ĐŸŅ€ĐžĐŧĐĩĐŊи ĐŊаĐģĐžĐŗ" + }, + "switchAccounts": { + "message": "ĐŸŅ€ĐžĐŧĐĩĐŊи ĐŊаĐģĐžĐŗ" + }, + "switchToAccount": { + "message": "ĐŸŅ€ĐĩĐąĐ°Ņ†Đ¸Ņ‚Đĩ ҁĐĩ ĐŊа ĐŊаĐģĐžĐŗ" + }, + "activeAccount": { + "message": "АĐēŅ‚Đ¸Đ˛Đ°ĐŊ ĐŊаĐģĐžĐŗ" + }, + "availableAccounts": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊи ĐŊаĐģОСи" + }, + "accountLimitReached": { + "message": "Đ“Ņ€Đ°ĐŊĐ¸Ņ†Đ° ĐŊаĐģĐžĐŗĐ° Đ´ĐžŅŅ‚Đ¸ĐŗĐŊŅƒŅ‚Đ°. ĐžĐ´Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ Од ҘĐĩĐ´ĐŊĐžĐŗ ĐŊаĐģĐžĐŗĐ° да йи дОдаĐģи Đ´Ņ€ŅƒĐŗĐ¸." + }, + "active": { + "message": "аĐēŅ‚Đ¸Đ˛Đ°ĐŊ" + }, + "locked": { + "message": "СаĐēŅ™ŅƒŅ‡Đ°ĐŊ" + }, + "unlocked": { + "message": "Đ´ĐĩĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊ" + }, + "server": { + "message": "ҁĐĩŅ€Đ˛ĐĩŅ€" + }, + "hostedAt": { + "message": "Ņ…ĐžŅŅ‚Đ¸Ņ€Đ°ĐŊ ĐŊа" + }, + "useDeviceOrHardwareKey": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ŅĐ˛ĐžŅ˜ ŅƒŅ€ĐĩŅ’Đ°Ņ˜ иĐģи Ņ…Đ°Ņ€Đ´Đ˛ĐĩҀҁĐēи ĐēŅ™ŅƒŅ‡" + }, + "justOnce": { + "message": "ХаĐŧĐž ҘĐĩĐ´ĐŊĐžĐŧ" + }, + "alwaysForThisSite": { + "message": "ĐŖĐ˛ĐĩĐē Са ĐžĐ˛Đ°Ņ˜ ŅĐ°Ņ˜Ņ‚" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ Đ´ĐžĐ´Đ°Ņ‚Đž ĐŊа Đ¸ŅĐēŅ™ŅƒŅ‡ĐĩĐŊĐĩ Đ´ĐžĐŧĐĩĐŊĐĩ.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "ĐŖĐžĐąĐ¸Ņ‡Đ°Ņ˜ĐĩĐŊи Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "ЖĐĩĐģĐ¸Ņ‚Đĩ Đģи да ĐŊĐ°ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đĩ ĐŊа ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ° ĐŋŅ€ĐĩŅ‚Ņ€Đ°ĐļĐ¸Đ˛Đ°Ņ‡Đ°?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "ĐĐ°ŅŅ‚Đ°Đ˛Đ¸ ĐŊа ĐŋĐžĐŧĐžŅ›ĐŊи ҆ĐĩĐŊŅ‚Đ°Ņ€?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ° Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐ° и ҃ĐŋŅ€Đ°Đ˛Ņ™Đ°ŅšĐ° ĐģОСиĐŊĐēаĐŧа ҃ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Ņƒ.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "МоĐļĐĩŅ‚Đĩ да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ и ĐŋОдĐĩŅĐ¸Ņ‚Đĩ ĐŋŅ€ĐĩŅ‡Đ¸Ņ†Đĩ Са ĐĩĐēҁ҂ĐĩĐŊĐˇĐ¸Ņ˜Đĩ ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Đ°.", + "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": "ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ° Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐ° и ҃ĐŋŅ€Đ°Đ˛Ņ™Đ°ŅšĐ° ĐģОСиĐŊĐēаĐŧа ҃ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Ņƒ.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "МоĐļĐĩŅ‚Đĩ да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ и ĐŋОдĐĩŅĐ¸Ņ‚Đĩ ĐŋŅ€ĐĩŅ‡Đ¸Ņ†Đĩ Са ĐĩĐēҁ҂ĐĩĐŊĐˇĐ¸Ņ˜Đĩ ҃ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Đ°.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "ĐŖŅ€Đ°Đ´Đ¸Ņ‚Đĩ да Bitwarden ĐąŅƒĐ´Đĩ Đ˛Đ°Ņˆ ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊи ĐŧĐĩĐŊĐ°ŅŸĐĩŅ€ ĐģОСиĐŊĐēи?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Đ˜ĐŗĐŊĐžŅ€Đ¸ŅĐ°ŅšĐĩ ОвĐĩ ĐžĐŋŅ†Đ¸Ņ˜Đĩ ĐŧĐžĐļĐĩ дОвĐĩŅŅ‚Đ¸ Đ´Đž ҁ҃ĐēОйа иСĐŧĐĩŅ’Ņƒ Ņ™ŅƒŅ‚ĐžĐŋ҃ҚĐĩŅšĐ° Bitwarden-а и Đ˛Đ°ŅˆĐĩĐŗ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Đ°.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "ĐŖŅ€Đ°Đ´Đ¸Ņ‚Đĩ да Bitwarden ĐąŅƒĐ´Đĩ Đ˛Đ°Ņˆ ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊи ĐŧĐĩĐŊĐ°ŅŸĐĩŅ€ ĐģОСиĐŊĐēи", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋĐžŅŅ‚Đ°Đ˛Đ¸ Bitwarden ĐēаО ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊи ĐŧĐĩĐŊĐ°ŅŸĐĩŅ€ ĐģОСиĐŊĐēи", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "ĐœĐžŅ€Đ°Ņ‚Đĩ Đ´Đ°Ņ‚Đ¸ дОСвОĐģĐĩ Са ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐžŅŅ‚ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´Đ°Ņ‡Đ° Bitwarden-҃ да йи ҁĐĩ ĐŋĐžŅŅ‚Đ°Đ˛Đ¸Đž ĐēаО ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊи ĐŧĐĩĐŊĐ°ŅŸĐĩŅ€.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "ĐŸĐžŅŅ‚Đ°Đ˛Đ¸ ĐēаО ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊĐž", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "АĐēŅ€ĐĩĐ´Đ¸Ņ‚Đ¸Đ˛Đ¸ ҁ҃ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐ°Ņ‡ŅƒĐ˛Đ°ĐŊи!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "ЛозиĐŊĐēа ҘĐĩ ŅĐ°Ņ‡ŅƒĐ˛Đ°ĐŊа!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "АĐēŅ€ĐĩĐ´Đ¸Ņ‚Đ¸Đ˛Đ¸ ҁ҃ ҃ҁĐŋĐĩ҈ĐŊĐž аĐļŅƒŅ€Đ¸Ņ€Đ°ĐŊи!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "ЛозиĐŊĐēа ҘĐĩ аĐļŅƒŅ€Đ¸Ņ€Đ°ĐŊа!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ Ņ‡ŅƒĐ˛Đ°ŅšŅƒ аĐēŅ€ĐĩĐ´Đ¸Ņ‚Đ¸Đ˛Đ°. ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚Đĩ ĐēĐžĐŊСОĐģ҃ Са Đ´ĐĩŅ‚Đ°Ņ™Đĩ.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "ĐŖŅĐŋĐĩŅ…" + }, + "removePasskey": { + "message": "ĐŖĐēĐģĐžĐŊĐ¸Ņ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡" + }, + "passkeyRemoved": { + "message": "ĐŸŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡ ҘĐĩ ҃ĐēĐģĐžŅšĐĩĐŊ" + }, + "autofillSuggestions": { + "message": "ĐŸŅ€ĐĩĐ´ĐģОСи Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ" + }, + "autofillSuggestionsTip": { + "message": "ĐĄĐ°Ņ‡ŅƒĐ˛Đ°Ņ˜Ņ‚Đĩ ŅŅ‚Đ°Đ˛Đē҃ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ Са ĐžĐ˛Ņƒ ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Ņƒ Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ" + }, + "yourVaultIsEmpty": { + "message": "Đ’Đ°Ņˆ ҁĐĩŅ„ ҘĐĩ ĐŋŅ€Đ°ĐˇĐ°ĐŊ" + }, + "noItemsMatchSearch": { + "message": "НĐĩĐŧа Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ° ĐŋĐž Đ˛Đ°ŅˆĐĩĐŧ ҃ĐŋĐ¸Ņ‚Ņƒ" + }, + "clearFiltersOrTryAnother": { + "message": "ĐžĐąŅ€Đ¸ŅˆĐ¸Ņ‚Đĩ Ņ„Đ¸ĐģŅ‚ĐĩŅ€Đĩ иĐģи ĐŋĐžĐēŅƒŅˆĐ°Ņ˜Ņ‚Đĩ ŅĐ° Đ´Ņ€ŅƒĐŗĐ¸Đŧ Ņ‚ĐĩŅ€ĐŧиĐŊĐžĐŧ" + }, + "copyInfoTitle": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ˜Đĩ - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ БĐĩĐģĐĩ҈Đē҃ - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Đ’Đ¸ŅˆĐĩ ĐžĐŋŅ†Đ¸Ņ˜Đ°, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Đ’Đ¸ŅˆĐĩ ĐžĐŋŅ†Đ¸Ņ˜Đ° - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ŅŅ‚Đ°Đ˛ĐēĐĩ - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "ĐŅƒŅ‚Đž-Đŋ҃ҚĐĩҚĐĩ - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "НĐĩĐŧа Đ˛Ņ€ĐĩĐ´ĐŊĐžŅŅ‚Đ¸ Са ĐēĐžĐŋĐ¸Ņ€Đ°ŅšĐĩ" + }, + "assignToCollections": { + "message": "ДодĐĩĐģи ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ˜Đ°Đŧа" + }, + "copyEmail": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ иĐŧĐĩҘĐģ" + }, + "copyPhone": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊ" + }, + "copyAddress": { + "message": "КоĐŋĐ¸Ņ€Đ°Ņ˜ Đ°Đ´Ņ€Đĩҁ҃" + }, + "adminConsole": { + "message": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ŅĐēа ĐēĐžĐŊСОĐģа" + }, + "accountSecurity": { + "message": "БĐĩСйĐĩĐ´ĐŊĐžŅŅ‚ ĐŊаĐģĐžĐŗĐ°" + }, + "notifications": { + "message": "ОбавĐĩŅˆŅ‚ĐĩŅšĐ°" + }, + "appearance": { + "message": "Đ˜ĐˇĐŗĐģĐĩĐ´" + }, + "errorAssigningTargetCollection": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ дОдĐĩŅ™Đ¸Đ˛Đ°ŅšŅƒ Ņ†Đ¸Ņ™ĐŊĐĩ ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ˜Đĩ." + }, + "errorAssigningTargetFolder": { + "message": "Đ“Ņ€Đĩ҈Đēа ĐŋŅ€Đ¸ дОдĐĩŅ™Đ¸Đ˛Đ°ŅšŅƒ Ņ†Đ¸Ņ™ĐŊĐĩ Ņ„Đ°ŅŅ†Đ¸ĐēĐģĐĩ." + }, + "viewItemsIn": { + "message": "ВидĐĩŅ‚Đ¸ ŅŅ‚Đ°Đ˛ĐēĐĩ ҃ $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Назад ĐŊа $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Ново" + }, + "removeItem": { + "message": "ĐŖĐēĐģĐžĐŊĐ¸Ņ‚Đ¸ $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "ĐĄŅ‚Đ°Đ˛ĐēĐĩ ĐąĐĩС Ņ„Đ°ŅŅ†Đ¸ĐēĐģĐĩ" + }, + "itemDetails": { + "message": "ДĐĩŅ‚Đ°Ņ™Đ¸ ŅŅ‚Đ°Đ˛ĐēĐĩ" + }, + "itemName": { + "message": "ИĐŧĐĩ ŅŅ‚Đ°Đ˛ĐēĐĩ" + }, + "cannotRemoveViewOnlyCollections": { + "message": "НĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ҃ĐēĐģĐžĐŊĐ¸Ņ‚Đ¸ ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ˜Đĩ ŅĐ° дОСвОĐģаĐŧа ŅĐ°ĐŧĐž Са ĐŋŅ€Đ¸ĐēаС: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ° ҘĐĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊа" + }, + "owner": { + "message": "ВĐģĐ°ŅĐŊиĐē" + }, + "selfOwnershipLabel": { + "message": "Đĸи", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "ĐĐ¸Ņ˜Đĩ ĐŧĐžĐŗŅƒŅ›Đĩ ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐ¸Ņ‚Đ¸ ŅŅ‚Đ°Đ˛ĐēаĐŧа ҃ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊиĐŧ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ°Đŧа. ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ ҁĐĩ вĐģĐ°ŅĐŊиĐē҃ Đ˛Đ°ŅˆĐĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ Са ĐŋĐžĐŧĐžŅ›." + }, + "additionalInformation": { + "message": "Đ”ĐžĐ´Đ°Ņ‚ĐŊĐĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ˜Đĩ" + }, + "itemHistory": { + "message": "Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ˜Đ° ĐŋŅ€ĐĩĐ´ĐŧĐĩŅ‚Đ°" + }, + "lastEdited": { + "message": "ĐŸĐžŅĐģĐĩĐ´ŅšĐ° иСĐŧĐĩĐŊа" + }, + "ownerYou": { + "message": "ВĐģĐ°ŅĐŊиĐē: Ви" + }, + "linked": { + "message": "ПовĐĩСаĐŊĐž" + }, + "copySuccessful": { + "message": "КоĐŋĐ¸Ņ˜Đ° ҃ҁĐŋĐĩ҈ĐŊа" + }, + "upload": { + "message": "ĐžŅ‚ĐŋŅ€ĐĩĐŧи" + }, + "addAttachment": { + "message": "Đ”ĐžĐ´Đ°Ņ˜ ĐŋŅ€Đ¸ĐģĐžĐŗ" + }, + "maxFileSizeSansPunctuation": { + "message": "МаĐēŅĐ¸ĐŧаĐģĐŊа вĐĩĐģĐ¸Ņ‡Đ¸ĐŊа ҘĐĩ 500МБ" + }, + "deleteAttachmentName": { + "message": "ĐžĐąŅ€Đ¸ŅˆĐ¸ ĐŋŅ€Đ¸ĐģĐžĐŗ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "ĐŸŅ€ĐĩŅƒĐˇĐŧи $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Да Đģи ҁ҂Đĩ ŅĐ¸ĐŗŅƒŅ€ĐŊи да ĐļĐĩĐģĐ¸Ņ‚Đĩ да Ņ‚Ņ€Đ°Ņ˜ĐŊĐž Đ¸ĐˇĐąŅ€Đ¸ŅˆĐĩŅ‚Đĩ ĐžĐ˛Đ°Ņ˜ ĐŋŅ€Đ¸ĐģĐžĐŗ?" + }, + "premium": { + "message": "ĐŸŅ€ĐĩĐŧĐ¸Ņ˜ŅƒĐŧ" + }, + "freeOrgsCannotUseAttachments": { + "message": "БĐĩҁĐŋĐģĐ°Ņ‚ĐŊĐĩ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ĐŊĐĩ ĐŧĐžĐŗŅƒ да ĐēĐžŅ€Đ¸ŅŅ‚Đĩ ĐŋŅ€Đ¸ĐģĐžĐŗĐĩ" + }, + "filters": { + "message": "ФиĐģŅ‚ĐĩŅ€Đ¸" + }, + "personalDetails": { + "message": "Đ›Đ¸Ņ‡ĐŊĐĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ˜Đĩ" + }, + "identification": { + "message": "ИдĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ°" + }, + "contactInfo": { + "message": "КоĐŊŅ‚Đ°ĐēŅ‚ иĐŊŅ„Đž" + }, + "downloadAttachment": { + "message": "ĐŸŅ€ĐĩŅƒĐˇĐŧи - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "ĐąŅ€ĐžŅ˜ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ ҁĐĩ ĐˇĐ°Đ˛Ņ€ŅˆĐ°Đ˛Đ° ŅĐ°", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "АĐēŅ€ĐĩĐ´Đ¸Ņ‚Đ¸Đ˛Đĩ Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņ™Đ¸Đ˛Đ°ŅšĐĩ" + }, + "authenticatorKey": { + "message": "ĐšŅ™ŅƒŅ‡ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ°" + }, + "autofillOptions": { + "message": "ОĐŋŅ†Đ¸Ņ˜Đĩ ĐŅƒŅ‚Đž-Đŋ҃ҚĐĩŅšĐ°" + }, + "websiteUri": { + "message": "ВĐĩĐąŅĐ°Ņ˜Ņ‚ (URI)" + }, + "websiteUriCount": { + "message": "ĐĄĐ°Ņ˜Ņ‚ (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "ВĐĩĐąŅĐ°Ņ˜Ņ‚ Đ´ĐžĐ´Đ°Ņ‚" + }, + "addWebsite": { + "message": "Đ”ĐžĐ´Đ°Ņ˜ вĐĩĐąŅĐ°Ņ˜Ņ‚" + }, + "deleteWebsite": { + "message": "ĐžĐąŅ€Đ¸ŅˆĐ¸ вĐĩĐąŅĐ°Ņ˜Ņ‚" + }, + "defaultLabel": { + "message": "ĐŸĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊĐž ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ŅšĐĩ ĐŋĐžĐ´ŅƒĐ´Đ°Ņ€Đ°ŅšĐ° $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "ХаĐēŅ€Đ¸Ņ˜ ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ŅšĐĩ ĐŋĐžĐ´ŅƒĐ´Đ°Ņ€Đ°ŅšĐ° $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "ĐŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋŅ€Đ¸ ŅƒŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšŅƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đĩ?" + }, + "cardExpiredTitle": { + "message": "ĐšĐ°Ņ€Ņ‚Đ¸Ņ†Đ° ҘĐĩ Đ¸ŅŅ‚ĐĩĐēĐģа" + }, + "cardExpiredMessage": { + "message": "АĐēĐž ҁ҂Đĩ ҘĐĩ ОйĐŊОвиĐģи, аĐļŅƒŅ€Đ¸Ņ€Đ°Ņ˜Ņ‚Đĩ ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ Đž ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đ¸" + }, + "cardDetails": { + "message": "ДĐĩŅ‚Đ°Ņ™Đ¸ ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ" + }, + "cardBrandDetails": { + "message": "$BRAND$ Đ´ĐĩŅ‚Đ°Ņ™Đ¸", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "ОĐŧĐžĐŗŅƒŅ›Đ¸ аĐŊиĐŧĐ°Ņ†Đ¸Ņ˜Đĩ" + }, + "showAnimations": { + "message": "ĐŸŅ€Đ¸ĐēаĐļи аĐŊиĐŧĐ°Ņ†Đ¸Ņ˜Đĩ" + }, + "addAccount": { + "message": "Đ”ĐžĐ´Đ°Ņ˜ ĐŊаĐģĐžĐŗ" + }, + "loading": { + "message": "ĐŖŅ‡Đ¸Ņ‚Đ°Đ˛Đ°ŅšĐĩ" + }, + "data": { + "message": "ĐŸĐžĐ´Đ°Ņ†Đ¸" + }, + "passkeys": { + "message": "ĐŸŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊи ĐēŅ™ŅƒŅ‡Đĩви", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "ЛозиĐŊĐēĐĩ", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ ŅĐ° ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐŊиĐŧ ĐēŅ™ŅƒŅ‡ĐĩĐŧ", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "ДодĐĩĐģи" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "ХаĐŧĐž ҇ĐģаĐŊОви ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ŅĐ° ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐžĐŧ ОвиĐŧ ĐˇĐąĐ¸Ņ€ĐēаĐŧа Ņ›Đĩ ĐŧĐžŅ›Đ¸ да видĐĩ ŅŅ‚Đ°Đ˛Đē҃." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "ХаĐŧĐž ҇ĐģаĐŊОви ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ ŅĐ° ĐŋŅ€Đ¸ŅŅ‚ŅƒĐŋĐžĐŧ ОвиĐŧ ĐˇĐąĐ¸Ņ€ĐēаĐŧа Ņ›Đĩ ĐŧĐžŅ›Đ¸ да видĐĩ ŅŅ‚Đ°Đ˛ĐēĐĩ." + }, + "bulkCollectionAssignmentWarning": { + "message": "ĐžĐ´Đ°ĐąŅ€Đ°Đģи ҁ҂Đĩ $TOTAL_COUNT$ ŅŅ‚Đ°Đ˛Đēи. НĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ да аĐļŅƒŅ€Đ¸Ņ€Đ°Ņ‚Đĩ $READONLY_COUNT$ Од ŅŅ‚Đ°Đ˛Đēи ҘĐĩŅ€ ĐŊĐĩĐŧĐ°Ņ‚Đĩ дОСвОĐģĐĩ Са ŅƒŅ€ĐĩŅ’Đ¸Đ˛Đ°ŅšĐĩ.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Đ”ĐžĐ´Đ°Ņ˜ ĐŋĐžŅ™Đĩ" + }, + "add": { + "message": "Đ”ĐžĐ´Đ°Ņ˜" + }, + "fieldType": { + "message": "Đ’Ņ€ŅŅ‚Đ° ĐŋĐžŅ™Đ°" + }, + "fieldLabel": { + "message": "ОзĐŊаĐēа ĐŋĐžŅ™Đ°" + }, + "textHelpText": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ Ņ‚ĐĩĐēŅŅ‚ŅƒĐ°ĐģĐŊа ĐŋĐžŅ™Đ° Са ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ ĐēаО ŅˆŅ‚Đž ҁ҃ ĐąĐĩСйĐĩĐ´ĐŊĐžŅĐŊа ĐŋĐ¸Ņ‚Đ°ŅšĐ°" + }, + "hiddenHelpText": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ҁĐēŅ€Đ¸Đ˛ĐĩĐŊа ĐŋĐžŅ™Đ° Са ĐžŅĐĩŅ‚Ņ™Đ¸Đ˛Đĩ ĐŋĐžĐ´Đ°Ņ‚ĐēĐĩ ĐēаО ŅˆŅ‚Đž ҘĐĩ ĐģОСиĐŊĐēа" + }, + "checkBoxHelpText": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐŋĐžŅ™Đ° Са ĐŋĐžŅ‚Đ˛Ņ€Đ´Ņƒ аĐēĐž ĐļĐĩĐģĐ¸Ņ‚Đĩ да Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи ĐŋĐžĐŋ҃ĐŊĐ¸Ņ‚Đĩ ĐŋĐžŅ™Đĩ Са ĐŋĐžŅ‚Đ˛Ņ€Đ´Ņƒ ĐžĐąŅ€Đ°ŅŅ†Đ°, ĐŊа ĐŋŅ€Đ¸ĐŧĐĩŅ€ иĐŧĐĩҘĐģ Са ĐŋаĐŧŅ›ĐĩҚĐĩ" + }, + "linkedHelpText": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ ĐŋОвĐĩСаĐŊĐž ĐŋĐžŅ™Đĩ Đēада иĐŧĐ°Ņ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧа ŅĐ° Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēиĐŧ ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩĐŧ Са ĐžĐ´Ņ€ĐĩŅ’ĐĩĐŊ҃ вĐĩĐą ĐģĐžĐēĐ°Ņ†Đ¸Ņ˜Ņƒ." + }, + "linkedLabelHelpText": { + "message": "ĐŖĐŊĐĩŅĐ¸Ņ‚Đĩ html Ид ĐŋĐžŅ™Đ°, иĐŧĐĩ, aria-label, иĐģи placeholder." + }, + "editField": { + "message": "ĐŖŅ€Đĩди ĐŋĐžŅ™Đĩ" + }, + "editFieldLabel": { + "message": "ĐŖŅ€Đĩди $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "ĐžĐąŅ€Đ¸ŅˆĐ¸ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ ҘĐĩ Đ´ĐžĐ´Đ°Ņ‚Đž", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "ĐŸŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Ņ‚Đ¸ $LABEL$. ĐšĐžŅ€Đ¸ŅŅ‚Đ¸Ņ‚Đĩ Ņ‚Đ°ŅŅ‚ĐĩŅ€ ŅĐ° ҁ҂ҀĐĩĐģĐ¸Ņ†ĐžĐŧ да ĐąĐ¸ŅŅ‚Đĩ ĐŋĐžĐŧĐĩŅ€Đ¸Đģи ŅŅ‚Đ°Đ˛Đē҃.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ ĐŋŅ€ĐĩĐŧĐĩŅˆŅ‚ĐĩĐŊĐž ĐŊа ĐŗĐžŅ€Đĩ, ĐŋĐžĐˇĐ¸Ņ†Đ¸Ņ˜Đ° $INDEX$ Од $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "ИСайĐĩŅ€Đ¸Ņ‚Đĩ ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ˜Đĩ Са дОдĐĩĐģ҃" + }, + "personalItemTransferWarningSingular": { + "message": "1 ŅŅ‚Đ°Đ˛Đēа ĐąĐ¸Ņ›Đĩ Ņ‚Ņ€Đ°Ņ˜ĐŊĐž ĐŋŅ€ĐĩĐąĐ°Ņ‡ĐĩĐŊа ҃ Đ¸ĐˇĐ°ĐąŅ€Đ°ĐŊ҃ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Ņƒ. Đ’Đ¸ŅˆĐĩ ĐŊĐĩŅ›ĐĩŅ‚Đĩ иĐŧĐ°Ņ‚Đ¸ ĐžĐ˛Ņƒ ŅŅ‚Đ°Đ˛Đē҃." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ŅŅ‚Đ°Đ˛ĐēĐĩ ĐąĐ¸Ņ›Đĩ Ņ‚Ņ€Đ°Ņ˜ĐŊĐž ĐŋŅ€ĐĩĐąĐ°Ņ‡ĐĩĐŊи ҃ Đ¸ĐˇĐ°ĐąŅ€Đ°ĐŊ҃ ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ°Ņ†Đ¸Ņ˜Ņƒ. Đ’Đ¸ŅˆĐĩ ĐŊĐĩŅ›ĐĩŅ‚Đĩ иĐŧĐ°Ņ‚Đ¸ ОвĐĩ ŅŅ‚Đ°Đ˛ĐēĐĩ.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 ŅŅ‚Đ°Đ˛Đēа ĐąĐ¸Ņ›Đĩ Ņ‚Ņ€Đ°Ņ˜ĐŊĐž ĐŋŅ€ĐĩĐąĐ°Ņ‡ĐĩĐŊа ҃ $ORG$. Đ’Đ¸ŅˆĐĩ ĐŊĐĩŅ›ĐĩŅ‚Đĩ иĐŧĐ°Ņ‚Đ¸ ĐžĐ˛Ņƒ ŅŅ‚Đ°Đ˛Đē҃.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ŅŅ‚Đ°Đ˛ĐēĐĩ ĐąĐ¸Ņ›Đĩ Ņ‚Ņ€Đ°Ņ˜ĐŊĐž ĐŋŅ€ĐĩĐąĐ°Ņ‡ĐĩĐŊи ҃ $ORG$. Đ’Đ¸ŅˆĐĩ ĐŊĐĩŅ›ĐĩŅ‚Đĩ иĐŧĐ°Ņ‚Đ¸ ОвĐĩ ŅŅ‚Đ°Đ˛ĐēĐĩ.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "ĐŖŅĐŋĐĩ҈ĐŊĐž дОдĐĩŅ™ĐĩĐŊĐĩ ĐēĐžĐģĐĩĐēŅ†Đ¸Ņ˜Đĩ" + }, + "nothingSelected": { + "message": "ĐĐ¸ŅŅ‚Đĩ ĐŊĐ¸ŅˆŅ‚Đ° Đ¸ĐˇĐ°ĐąŅ€Đ°Đģи." + }, + "movedItemsToOrg": { + "message": "ĐžĐ´Đ°ĐąŅ€Đ°ĐŊĐĩ ŅŅ‚Đ°Đ˛ĐēĐĩ ĐŋŅ€ĐĩĐŧĐĩŅˆŅ‚ĐĩĐŊĐĩ ҃ $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "ĐĄŅ‚Đ°Đ˛ĐēĐĩ ĐŋŅ€ĐĩĐŧĐĩŅˆŅ‚ĐĩĐŊĐĩ ҃ $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "ĐĄŅ‚Đ°Đ˛Đēа ĐŋŅ€ĐĩĐŧĐĩŅˆŅ‚ĐĩĐŊа ҃ $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ ĐŋŅ€ĐĩĐŧĐĩŅˆŅ‚ĐĩĐŊĐž ĐŊа Đ´ĐžĐģĐĩ, ĐŋĐžĐˇĐ¸Ņ†Đ¸Ņ˜Đ° $INDEX$ Од $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "ĐĄĐŧĐĩŅˆŅ‚Đ°Ņ˜ ŅŅ‚Đ°Đ˛ĐēĐĩ" + }, + "fileSend": { + "message": "Đ”Đ°Ņ‚ĐžŅ‚ĐĩĐēа „Send“" + }, + "fileSends": { + "message": "Đ”Đ°Ņ‚ĐžŅ‚ĐĩĐēа „Send“" + }, + "textSend": { + "message": "ĐĸĐĩĐēҁ҂ „Send“" + }, + "textSends": { + "message": "ĐĸĐĩĐēҁ҂ „Send“" + }, + "bitwardenNewLook": { + "message": "Bitwarden иĐŧа ĐŊОви Đ¸ĐˇĐŗĐģĐĩĐ´!" + }, + "bitwardenNewLookDesc": { + "message": "ЛаĐē҈Đĩ ҘĐĩ и иĐŊŅ‚ŅƒĐ¸Ņ‚Đ¸Đ˛ĐŊĐ¸Ņ˜Đĩ ĐŊĐĩĐŗĐž иĐēада да ҁĐĩ Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ° и Ņ‚Ņ€Đ°Đļи ŅĐ° ĐēĐ°Ņ€Ņ‚Đ¸Ņ†Đĩ ĐĄĐĩŅ„Đ°. ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚Đĩ!" + }, + "accountActions": { + "message": "АĐēŅ†Đ¸Ņ˜Đĩ вĐĩСаĐŊĐĩ Са ĐŊаĐģĐžĐŗ" + }, + "showNumberOfAutofillSuggestions": { + "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐąŅ€ĐžŅ˜ ĐŋŅ€ĐĩĐ´ĐģĐžĐŗĐ° Са Đ°ŅƒŅ‚Đž-ĐŋĐžĐŋŅƒŅšĐ°Đ˛Đ°ŅšĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ ĐŊа иĐēĐžĐŊи Đ´ĐžĐ´Đ°Ņ‚Đēа" + }, + "systemDefault": { + "message": "ĐĄĐ¸ŅŅ‚ĐĩĐŧҁĐēи ĐŋĐžĐ´Ņ€Đ°ĐˇŅƒĐŧĐĩваĐŊĐž" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Đ—Đ°Ņ…Ņ‚Đĩви ĐŋĐžĐģĐ¸Ņ‚Đ¸ĐēĐĩ ĐŋŅ€ĐĩĐ´ŅƒĐˇĐĩŅ›Đ° ҁ҃ ĐŋŅ€Đ¸ĐŧĐĩҚĐĩĐŊи ĐŊа ОвО ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐĩ" + }, + "sshPrivateKey": { + "message": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊи ĐēŅ™ŅƒŅ‡" + }, + "sshPublicKey": { + "message": "ЈавĐŊи ĐēŅ™ŅƒŅ‡" + }, + "sshFingerprint": { + "message": "ĐžŅ‚Đ¸ŅĐ°Đē ĐŋŅ€ŅŅ‚Đ°" + }, + "sshKeyAlgorithm": { + "message": "Đ’Ņ€ŅŅ‚Đ° ĐēŅ™ŅƒŅ‡Đ°" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-ĐąĐ¸Ņ‚Đ°" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-ĐąĐ¸Ņ‚Đ°" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-ĐąĐ¸Ņ‚Đ°" + }, + "retry": { + "message": "ĐŸŅ€ĐžĐąĐ°Ņ˜ ĐŋĐžĐŊОвО" + }, + "vaultCustomTimeoutMinimum": { + "message": "МиĐŊиĐŧаĐģĐŊĐž ĐŋŅ€Đ¸ĐģĐ°ĐŗĐžŅ’ĐĩĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊҁĐēĐž ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩҚĐĩ ҘĐĩ 1 ĐŧиĐŊŅƒŅ‚." + }, + "additionalContentAvailable": { + "message": "Đ”ĐžĐ´Đ°Ņ‚ĐŊи ŅĐ°Đ´Ņ€ĐļĐ°Ņ˜ ҘĐĩ Đ´ĐžŅŅ‚ŅƒĐŋаĐŊ" + }, + "fileSavedToDevice": { + "message": "Đ”Đ°Ņ‚ĐžŅ‚ĐĩĐēа ҘĐĩ ŅĐ°Ņ‡ŅƒĐ˛Đ°ĐŊа ĐŊа ŅƒŅ€ĐĩŅ’Đ°Ņ˜Ņƒ. ĐŖĐŋŅ€Đ°Đ˛Ņ™Đ°Ņ˜Ņ‚Đĩ ĐŋŅ€ĐĩŅƒĐˇĐ¸ĐŧĐ°ŅšĐ¸Đŧа ŅĐ° ŅĐ˛ĐžĐŗ ŅƒŅ€ĐĩŅ’Đ°Ņ˜Đ°." + }, + "showCharacterCount": { + "message": "ĐŸŅ€Đ¸ĐēаĐļи ĐąŅ€ĐžŅ˜Đ°ŅšĐĩ ҁĐģОва" + }, + "hideCharacterCount": { + "message": "ХаĐēŅ€Đ¸Ņ˜ ĐąŅ€ĐžŅ˜Đ°ŅšĐĩ ҁĐģОва" + }, + "itemsInTrash": { + "message": "ĐĄŅ‚Đ°Đ˛ĐēĐĩ ҃ ҁĐŧĐĩŅ›Ņƒ" + }, + "noItemsInTrash": { + "message": "НĐĩĐŧа ŅŅ‚Đ°Đ˛Đēи ҃ ҁĐŧĐĩŅ›Ņƒ" + }, + "noItemsInTrashDesc": { + "message": "ĐĄŅ‚Đ°Đ˛ĐēĐĩ ĐēĐžŅ˜Đĩ Đ¸ĐˇĐąŅ€Đ¸ŅˆĐĩŅ‚Đĩ Ņ›Đĩ ҁĐĩ ĐŋĐžŅ˜Đ°Đ˛Đ¸Ņ‚Đ¸ ОвдĐĩ и ĐąĐ¸Ņ›Đĩ Ņ‚Ņ€Đ°Ņ˜ĐŊĐž Đ¸ĐˇĐąŅ€Đ¸ŅĐ°ĐŊĐĩ ĐŊаĐēĐžĐŊ 30 даĐŊа" + }, + "trashWarning": { + "message": "ĐĄŅ‚Đ°Đ˛ĐēĐĩ ĐēĐžŅ˜Đĩ ҁ҃ йиĐģĐĩ ҃ ҁĐŧĐĩŅ›Ņƒ Đ˛Đ¸ŅˆĐĩ Од 30 даĐŊа ĐąĐ¸Ņ›Đĩ Đ°ŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи Đ¸ĐˇĐąŅ€Đ¸ŅĐ°ĐŊĐĩ" + }, + "restore": { + "message": "ĐŸĐžĐ˛Ņ€Đ°Ņ‚Đ¸" + }, + "deleteForever": { + "message": "ĐŖĐēĐģĐžĐŊĐ¸Ņ‚Đ¸ ĐˇĐ°ŅƒĐ˛ĐĩĐē" + }, + "noEditPermissions": { + "message": "НĐĩĐŧĐ°Ņ‚Đĩ дОСвОĐģ҃ да ŅƒŅ€ĐĩŅ’ŅƒŅ˜ĐĩŅ‚Đĩ ĐžĐ˛Ņƒ ŅŅ‚Đ°Đ˛Đē҃" + }, + "authenticating": { + "message": "ĐŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ˜Đ°" + }, + "fillGeneratedPassword": { + "message": "ПоĐŋ҃ĐŊĐ¸Ņ‚Đĩ ĐŗĐĩĐŊĐĩŅ€Đ¸ŅĐ°ĐŊ҃ ĐģОСиĐŊĐē҃", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "ЛозиĐŊĐēа ĐŋĐžĐŊОвО ĐŗĐĩĐŊĐĩŅ€Đ¸ŅĐ°ĐŊа", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "ĐĄĐ°Ņ‡ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ ĐŊа Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "ĐŸŅ€ĐžŅŅ‚ĐžŅ€", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "ĐĸиĐģда", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "ĐŖĐˇĐ˛Đ¸Ņ‡ĐŊиĐē", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "ЗĐŊаĐē „ĐĩŅ‚â€œ", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "ЗĐŊаĐē â€žŅ…ĐĩŅˆâ€œ", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "ЗĐŊаĐē Đ´ĐžĐģĐ°Ņ€", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "ЗĐŊаĐē ĐŋĐžŅŅ‚ĐžŅ‚Đ°Đē", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 7a4816dfa96..e64855b383e 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Gratis lÃļsenordshanterare", + "message": "Bitwarden LÃļsenordshanterare", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden är en säker och gratis lÃļsenordshanterare fÃļr alla dina enheter.", - "description": "Extension description" + "message": "Hemma, pÃĨ jobbet eller pÃĨ sprÃĨng säkrar Bitwarden enkelt alla dina lÃļsenord, lÃļsenord och känslig information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Logga in eller skapa ett nytt konto fÃļr att komma ÃĨt ditt säkra valv." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Skapa konto" }, - "login": { - "message": "Logga in" + "newToBitwarden": { + "message": "Ny pÃĨ Bitwarden?" + }, + "logInWithPasskey": { + "message": "Logga in med nyckel" + }, + "useSingleSignOn": { + "message": "Använd Single Sign-On" + }, + "welcomeBack": { + "message": "Välkommen tillbaka" + }, + "setAStrongPassword": { + "message": "Ställ in ett starkt lÃļsenord" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Single Sign-On fÃļr fÃļretag" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "En huvudlÃļsenordsledtrÃĨd kan hjälpa dig att komma ihÃĨg ditt lÃļsenord om du glÃļmmer bort det." }, + "masterPassHintText": { + "message": "Om du glÃļmmer ditt lÃļsenord kan lÃļsenordsledtrÃĨden skickas till din e-postadress. $CURRENT$/$MAXIMUM$ tecken max.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Ange huvudlÃļsenordet igen" }, "masterPassHint": { "message": "HuvudlÃļsenordsledtrÃĨd (valfri)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Flik" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Kopiera lÃļsenord" }, + "copyPassphrase": { + "message": "Kopiera lÃļsenfras" + }, "copyNote": { "message": "Kopiera anteckning" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "Kopiera säkerhetskod" }, + "copyName": { + "message": "Kopiera namn" + }, + "copyCompany": { + "message": "Kopiera fÃļretag" + }, + "copySSN": { + "message": "Kopiera personnummer" + }, + "copyPassportNumber": { + "message": "Kopiera passnummer" + }, + "copyLicenseNumber": { + "message": "Kopiera licensnummer" + }, + "copyPrivateKey": { + "message": "Kopiera privat nyckel" + }, + "copyPublicKey": { + "message": "Kopiera offentlig nyckel" + }, + "copyFingerprint": { + "message": "Kopiera fingeravtryck" + }, + "copyCustomField": { + "message": "Kopiera $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiera webbplats" + }, + "copyNotes": { + "message": "Kopiera anteckningar" + }, + "fill": { + "message": "Fyll", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Fyll i automatiskt" }, + "autoFillLogin": { + "message": "Autofyll inloggning" + }, + "autoFillCard": { + "message": "Autofyll kort" + }, + "autoFillIdentity": { + "message": "Autofyll identitet" + }, "generatePasswordCopied": { "message": "Skapa lÃļsenord (kopierad)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Inga matchande inloggningar" }, + "noCards": { + "message": "Inga kort" + }, + "noIdentities": { + "message": "Inga identiteter" + }, + "addLoginMenu": { + "message": "Lägg till inloggning" + }, + "addCardMenu": { + "message": "Lägg till kort" + }, + "addIdentityMenu": { + "message": "Lägg till identitet" + }, "unlockVaultMenu": { "message": "LÃĨs upp ditt valv" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Lägg till objekt" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Begär ledtrÃĨd" + }, + "requestPasswordHint": { + "message": "Begär lÃļsenordsledtrÃĨd" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "LÃļsenordsledtrÃĨd" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Bekräfta din identitet fÃļr att fortsätta." }, - "account": { - "message": "Konto" - }, "changeMasterPassword": { "message": "Ändra huvudlÃļsenord" }, + "continueToWebApp": { + "message": "Fortsätt till webbapp?" + }, + "continueToWebAppDesc": { + "message": "Utforska fler funktioner i ditt Bitwarden-konto i webbappen." + }, + "continueToHelpCenter": { + "message": "Fortsätt till Hjälpcenter?" + }, + "continueToHelpCenterDesc": { + "message": "Lär dig mer om hur man använder Bitwarden i hjälpcentret." + }, + "continueToBrowserExtensionStore": { + "message": "Fortsätt till webbläsartilläggsbutiken?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Hjälp andra att ta reda pÃĨ om Bitwarden är rätt fÃļr dem. BesÃļk din webbläsares tilläggsbutik och lämna en recension nu." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Du kan ändra ditt huvudlÃļsenord i Bitwarden-webbappen." + }, "fingerprintPhrase": { "message": "Fingeravtrycksfras", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Logga ut" }, + "aboutBitwarden": { + "message": "Om Bitwarden" + }, "about": { "message": "Om" }, + "moreFromBitwarden": { + "message": "Mer frÃĨn Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Fortsätt till bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden fÃļr FÃļretag" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator lÃĨter dig lagra autentiseringsnycklar och generera TOTP-koder fÃļr tvÃĨstegsverifieringsflÃļden. Lär dig mer pÃĨ bitwarden.com hemsidan" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Hemlighetshanterare" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Skapa smidiga och säkra inloggningsupplevelser fria frÃĨn traditionella lÃļsenord med Passwordless.dev. Läs mer pÃĨ bitwarden.com hemsidan." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Redigera mapp" }, + "newFolder": { + "message": "Ny mapp" + }, + "folderName": { + "message": "Mappnamn" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "Inga mappar tillagda" + }, + "createFoldersToOrganize": { + "message": "Skapa mappar fÃļr att organisera dina valvobjekt" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Radera mapp" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Skapa starka och unika lÃļsenord automatiskt fÃļr dina inloggningar." }, - "bitWebVault": { - "message": "Bitwardens webbvalv" + "bitWebVaultApp": { + "message": "Bitwarden webbapp" }, "importItems": { "message": "Importera objekt" @@ -233,7 +433,10 @@ "message": "Välj" }, "generatePassword": { - "message": "Skapa lÃļsenord" + "message": "Generera lÃļsenord" + }, + "generatePassphrase": { + "message": "Generera lÃļsenfras" }, "regeneratePassword": { "message": "Återskapa lÃļsenord" @@ -244,17 +447,60 @@ "length": { "message": "Längd" }, + "passwordMinLength": { + "message": "Minsta tillÃĨtna lÃļsenordslängd" + }, "uppercase": { - "message": "Versaler (A-Ö)" + "message": "Versaler (A-Ö)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Gemener (a-Ãļ)" + "message": "Gemener (a-Ãļ)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Siffror (0-9)" + "message": "Siffror (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Specialtecken (!@#$%^&*)" + "message": "Specialtecken (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Inkludera", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Inkludera versaler", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Inkludera gemener", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Inkludera siffror", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Inkludera specialtecken", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Antal ord" @@ -276,7 +522,16 @@ "message": "Minsta antal speciella tecken" }, "avoidAmbChar": { - "message": "Undvik tvetydiga tecken" + "message": "Undvik tvetydiga tecken", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Undvik tvetydiga tecken", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "SÃļk i valvet" @@ -299,15 +554,30 @@ "password": { "message": "LÃļsenord" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { - "message": "LÃļsenordsfras" + "message": "LÃļsenfras" }, "favorite": { "message": "Favorit" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Anteckningar" }, + "privateNote": { + "message": "Privat anteckning" + }, "note": { "message": "Anteckning" }, @@ -326,6 +596,18 @@ "launch": { "message": "Öppna" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Webbplats" }, @@ -338,9 +620,24 @@ "other": { "message": "Annat" }, + "unlockMethods": { + "message": "UpplÃĨsningsalternativ" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Ställ in en upplÃĨsningsmetod i Inställningar" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Andra alternativ" + }, "rateExtension": { "message": "Betygsätt tillägget" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Ditt valv är lÃĨst. Verifiera din identitet fÃļr att fortsätta." }, + "yourVaultIsLockedV2": { + "message": "Ditt valv är lÃĨst" + }, + "yourAccountIsLocked": { + "message": "Ditt konto är lÃĨst" + }, + "or": { + "message": "eller" + }, "unlock": { "message": "LÃĨs upp" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Valvets tidsgräns" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "LÃĨs nu" }, + "lockAll": { + "message": "LÃĨs alla" + }, "immediately": { "message": "Omedelbart" }, @@ -426,6 +738,18 @@ "security": { "message": "Säkerhet" }, + "confirmMasterPassword": { + "message": "Bekräfta huvudlÃļsenord" + }, + "masterPassword": { + "message": "HuvudlÃļsenord" + }, + "masterPassImportant": { + "message": "Ditt huvudlÃļsenord kan inte ÃĨterställas om du glÃļmmer det!" + }, + "masterPassHintLabel": { + "message": "HuvudlÃļsenordsledtrÃĨd" + }, "errorOccurred": { "message": "Ett fel har uppstÃĨtt" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Ditt nya konto har skapats! Du kan logga in nu." }, + "newAccountCreated2": { + "message": "Ditt nya konto har skapats!" + }, + "youHaveBeenLoggedIn": { + "message": "Du har blivit inloggad!" + }, + "youSuccessfullyLoggedIn": { + "message": "Du är nu inloggad" + }, + "youMayCloseThisWindow": { + "message": "Du kan stänga detta fÃļnster" + }, "masterPassSent": { "message": "Vi har skickat ett e-postmeddelande till dig med din huvudlÃļsenordsledtrÃĨd." }, "verificationCodeRequired": { "message": "Verifieringskod krävs." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Ogiltig verifieringskod" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Kunde inte automatiskt fylla i det valda objektet pÃĨ den här webbsidan. Klipp/klistra informationen istället." + "message": "Det gick inte att fylla i det valda objektet automatiskt pÃĨ den här webbsidan. Kopiera och klistra in informationen istället." + }, + "totpCaptureError": { + "message": "Det gÃĨr inte att skanna QR-koden frÃĨn den aktuella webbsidan" + }, + "totpCaptureSuccess": { + "message": "Autentiseringsnyckel tillagd" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Läs mer om autentiserare" + }, + "copyTOTP": { + "message": "Kopiera autentiseringsnyckel (TOTP)" }, "loggedOut": { "message": "Utloggad" }, + "loggedOutDesc": { + "message": "Du har blivit utloggad frÃĨn ditt konto." + }, "loginExpired": { "message": "Din inloggningssession har upphÃļrt." }, + "logIn": { + "message": "Logga in" + }, + "logInToBitwarden": { + "message": "Logga in pÃĨ Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Är du säker pÃĨ att du vill logga ut?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Lade till mapp" }, - "changeMasterPass": { - "message": "Ändra huvudlÃļsenord" - }, - "changeMasterPasswordConfirmation": { - "message": "Du kan ändra ditt huvudlÃļsenord pÃĨ bitwardens webbvalv. Vill du besÃļka webbplatsen nu?" - }, "twoStepLoginConfirmation": { "message": "TvÃĨstegsverifiering gÃļr ditt konto säkrare genom att kräva att du verifierar din inloggning med en annan enhet, t.ex. en säkerhetsnyckel, autentiseringsapp, SMS, telefonsamtal eller e-post. TvÃĨstegsverifiering kan aktiveras i Bitwardens webbvalv. Vill du besÃļka webbplatsen nu?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Mapp sparad" }, @@ -537,7 +921,7 @@ "message": "LÃļsenord kopierat" }, "uri": { - "message": "URI (länk)" + "message": "URI" }, "uriPosition": { "message": "URI $POSITION$", @@ -552,6 +936,10 @@ "newUri": { "message": "Ny URI" }, + "addDomain": { + "message": "Lägg till domän", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Nytt objekt skapat" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Be om att lägga till inloggning" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Be om att lägga till ett objekt om det inte finns i ditt valv." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Visa kort pÃĨ fliksida" }, "showCardsCurrentTabDesc": { "message": "Lista kortobjekt pÃĨ fliksidan fÃļr enkel automatisk fyllning." }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "Visa identiteter pÃĨ fliksidan" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Be om att uppdatera ett lÃļsenord när en ändring upptäcks pÃĨ en webbplats." }, + "changedPasswordNotificationDescAlt": { + "message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts." + }, + "enableUsePasskeys": { + "message": "Be om att spara och använda lÃļsennycklar" + }, + "usePasskeysDesc": { + "message": "Be om att spara nya lÃļsennycklar eller logga in med nycklar som lagras i ditt valv. Gäller fÃļr alla inloggade konton." + }, "notificationChangeDesc": { "message": "Vill du uppdatera det här lÃļsenordet i Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "LÃĨs upp" }, + "additionalOptions": { + "message": "Ytterligare alternativ" + }, "enableContextMenuItem": { "message": "Visa alternativ fÃļr snabbmenyn" }, "contextMenuItemDesc": { "message": "Använd ett andra klick fÃļr att komma ÃĨt lÃļsenordsgenerering och matchande inloggningar fÃļr webbplatsen. " }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "Standardmatchning fÃļr URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Välj standardalternativet fÃļr hur matchning av URI är hanterat fÃļr inloggningar när du utfÃļr operationer sÃĨsom automatisk ifyllnad." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Ändra programmets färgtema." }, + "themeDescAlt": { + "message": "Ändra programmets färgtema. Gäller fÃļr alla inloggade konton." + }, "dark": { "message": "MÃļrkt", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized mÃļrk", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Exportera frÃĨn" + }, "exportVault": { "message": "Exportera valv" }, "fileFormat": { "message": "Filformat" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "FillÃļsenord" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Exporttyp" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "VARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Delad" }, - "learnOrg": { - "message": "Lär dig om organisationer" - }, - "learnOrgConfirmation": { - "message": "Bitwarden gÃļr det mÃļjligt fÃļr dig att dela objekt i valvet med andra genom att använda en organisation. Vill du besÃļka bitwarden.com fÃļr att lära dig mer?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Flytta till organisation" @@ -762,6 +1204,9 @@ "file": { "message": "Fil" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Välj en fil" }, @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "1 GB lagring av krypterade filer." }, + "premiumSignUpEmergency": { + "message": "NÃļdÃĨtkomst." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "Premium-alternativ fÃļr tvÃĨstegsverifiering, sÃĨsom YubiKey och Duo." }, "ppremiumSignUpReports": { "message": "LÃļsenordshygien, kontohälsa och dataintrÃĨngsrapporter fÃļr att hÃĨlla ditt valv säkert." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Du kan kÃļpa premium-medlemskap i Bitwardens webbvalv. Vill du besÃļka webbplatsen nu?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Du är en premium-medlem!" }, "premiumCurrentMemberThanks": { "message": "Tack fÃļr att du stÃļdjer Bitwarden." }, + "premiumFeatures": { + "message": "Uppgradera till Premium och fÃĨ:" + }, "premiumPrice": { "message": "Allt fÃļr endast $PRICE$/ÃĨr!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "Allt fÃļr endast $PRICE$ per ÃĨr!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Uppdatering färdig" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Autentiseringsapp" }, - "authenticatorAppDesc": { - "message": "Använd en autentiseringsapp (till exempel Authy eller Google Authenticator) fÃļr att skapa tidsbaserade verifieringskoder.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP säkerhetsnyckel" + "yubiKeyTitleV2": { + "message": "Yubico OTP-säkerhetsnyckel" }, "yubiKeyDesc": { "message": "Använd en YubiKey fÃļr att fÃĨ ÃĨtkomst till ditt konto. Fungerar med YubiKey 4, 4 Nano, 4C och NEO enheter." }, - "duoDesc": { - "message": "Verifiera med Duo Security genom att använda Duo Mobile-appen, SMS, telefonsamtal eller en U2F säkerhetsnyckel.", + "duoDescV2": { + "message": "Ange en kod som genererats av Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-post" }, - "emailDesc": { - "message": "Verifieringskoder kommer att skickas till dig via e-post." + "emailDescV2": { + "message": "Ange en kod som skickar per e-post." }, "selfHostedEnvironment": { "message": "Egen-hostad miljÃļ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Ange bas-URL:en fÃļr din \"on-premise\"-hostade Bitwarden-installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Anpassad miljÃļ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server-URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API-server-URL" }, @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "MiljÃļ-URL:erna har sparats" }, + "showAutoFillMenuOnFormFields": { + "message": "Visa menyn fÃļr automatisk ifyllnad pÃĨ formulärfält", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Visa identiteter som fÃļrslag" + }, + "showInlineMenuCardsLabel": { + "message": "Visa kort som fÃļrslag" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Redigera webbläsarinställningar." + }, + "autofillOverlayVisibilityOff": { + "message": "Av", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "När ikonen fÃļr automatisk ifyllnad är vald", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Aktivera automatisk ifyllnad vid sidhämtning" }, "enableAutoFillOnPageLoadDesc": { "message": "UtfÃļr automatisk ifyllnad om ett inloggningsformulär upptäcks när webbsidan laddas." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Komprometterade eller ej betrodda webbplatser kan utnyttja automatisk ifyllnad vid sidladdning." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Läs mer om risker" + }, "learnMoreAboutAutofill": { - "message": "Läs mer om automatisk ifyllnad" + "message": "Läs mer om autofyll" }, "defaultAutoFillOnPageLoad": { "message": "Standardinställning fÃļr autofyll fÃļr inloggningsobjekt" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Öppna valvet i sidofältet" }, - "commandAutofillDesc": { - "message": "Fyll automatiskt i den senast använda inloggningen fÃļr den aktuella webbsidan" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Skapa och kopiera ett nytt slumpmässigt lÃļsenord till urklipp." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "LÃĨs valvet" }, - "privateModeWarning": { - "message": "StÃļd fÃļr privat läge är experimentellt och vissa funktioner är begränsade." - }, "customFields": { "message": "Anpassade fält" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Kryssruta" + }, "cfTypeLinked": { "message": "Länkat", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Visa en identifierbar bild bredvid varje inloggning." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Visa aktivitetsräknaren" }, @@ -1134,7 +1678,7 @@ "message": "Säkerhetskod" }, "ex": { - "message": "t.ex." + "message": "t. ex." }, "title": { "message": "Titel" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identitet" }, + "typeSshKey": { + "message": "SSH-nyckel" + }, + "newItemHeader": { + "message": "Ny $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Redigera $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Visa $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "LÃļsenordshistorik" }, + "generatorHistory": { + "message": "Generatorhistorik" + }, + "clearGeneratorHistoryTitle": { + "message": "Rensa generatorhistorik" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Tillbaka" }, "collections": { "message": "Samlingar" }, + "nCollections": { + "message": "$COUNT$ samlingar", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoriter" }, @@ -1282,6 +1874,10 @@ "message": "Basdomän", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Basdomän (rekommenderas)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domännamn", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Matchning", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Standardmatchning", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Växla alternativ" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Det finns inga lÃļsenord att lista." }, + "clearHistory": { + "message": "Rensa historik" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Ta bort" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "LÃĨs upp med PIN-kod" }, + "setYourPinTitle": { + "message": "Ställ in PIN-kod" + }, + "setYourPinButton": { + "message": "Ställ in PIN-kod" + }, "setYourPinCode": { "message": "Ange en PIN-kod fÃļr att lÃĨsa upp Bitwarden. Dina PIN-inställningar ÃĨterställs om du nÃĨgonsin loggar ut helt frÃĨn programmet." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN-kod krävs." }, "invalidPin": { "message": "Ogiltig PIN-kod." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "FÃļr mÃĨnga ogiltiga PIN-inmatningsfÃļrsÃļk. Loggar ut." + }, "unlockWithBiometrics": { "message": "LÃĨs upp med biometri" }, + "unlockWithMasterPassword": { + "message": "LÃĨs upp med huvudlÃļsenord" + }, "awaitDesktop": { "message": "Väntar pÃĨ bekräftelse frÃĨn skrivbordsprogrammet" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "LÃĨs med huvudlÃļsenordet vid omstart av webbläsaren" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Du mÃĨste markera minst en samling." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "En eller flera organisationspolicyer pÃĨverkar dina generatorinställningar." }, + "passwordGenerator": { + "message": "LÃļsenordsgenerator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Åtgärd när valvets tidsgräns Ãļverskrids" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "LÃĨs", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papperskorg", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Återställde objekt" }, + "alreadyHaveAccount": { + "message": "Har du redan ett konto?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Genom att logga ut upphÃļr all ÃĨtkomst till valvet och onlineautentisering krävs efter att tidsgränsen Ãļverskridits. Är du säker pÃĨ att du vill använda denna inställning?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Fyll i automatiskt och spara" }, + "fillAndSave": { + "message": "Fyll och spara" + }, "autoFillSuccessAndSavedUri": { "message": "Fyllde i objektet automatiskt och sparade URI:n" }, @@ -1474,7 +2129,7 @@ "message": "Vill du fortfarande fylla i denna inloggning?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "Formuläret kommer frÃĨn en annan domän än den URI fÃļr din sparade inloggning. Välj OK att automatiskt fylla i ändÃĨ, eller Avbryt fÃļr att stoppa." }, "autofillIframeWarningTip": { "message": "FÃļr att fÃļrhindra denna varning i framtiden, spara denna URI, $HOSTNAME$, till ditt Bitwarden inloggningsobjekt fÃļr denna webbplats.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Ditt nya huvudlÃļsenord uppfyller inte kraven i policyn." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "när som helst." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "och" + }, "acceptPolicies": { "message": "Genom att markera denna ruta godkänner du fÃļljande:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "OK" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Verifiering av synkronisering med skrivbordsprogrammet" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Kontoavvikelse" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometri är inte aktiverat" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "Biometri i webbläsaren stÃļds inte pÃĨ den här enheten." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "LÃĨs upp den här användaren i skrivbordsprogrammet och fÃļrsÃļk igen." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "Biometri misslyckades" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "Biometri kan inte slutfÃļras, Ãļverväg att använda ett huvudlÃļsenord eller logga ut. Om detta kvarstÃĨr, kontakta Bitwardens support." }, "nativeMessaginPermissionErrorTitle": { "message": "BehÃļrighet ej beviljad" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "En organisationspolicy pÃĨverkar dina ägarskapsalternativ." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domäner", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Exkluderade domäner" }, "excludedDomainsDesc": { "message": "Bitwarden kommer inte att frÃĨga om att fÃĨ spara inloggningsuppgifter fÃļr dessa domäner. Du mÃĨste uppdatera sidan fÃļr att ändringarna ska träda i kraft." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Webbplats $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ är inte en giltig domän", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "SÃļk bland Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fil" }, @@ -1666,6 +2406,9 @@ "message": "Alla Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Det maximala antalet ÃĨtkomster har uppnÃĨtts", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "LÃļsenordsskyddad" }, + "copyLink": { + "message": "Kopiera länk" + }, "copySendLink": { "message": "Kopiera Send-länk", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Är du säker pÃĨ att du vill radera denna Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Redigera Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Denna Send kommer att raderas permanent pÃĨ angivet datum och klockslag.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "UtgÃĨngsdatum" }, @@ -1769,6 +2523,10 @@ "message": "Kräv valfritt ett lÃļsenord fÃļr att användare ska komma ÃĨt denna Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Privata anteckningar om denna Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Ny Send har skapats", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send har sparats", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "FÃļr att välja en fil, Ãļppna tillägget i sidofältet (om mÃļjligt) eller skapa ett nytt fÃļnster genom att klicka pÃĨ denna banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "FÃļr att välja en fil med Safari, Ãļppna ett nytt fÃļnster genom att klicka pÃĨ denna banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Innan du bÃļrjar" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "DÃļlj min e-postadress fÃļr mottagare." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "En eller flera organisationsriktlinjer pÃĨverkar dina Send-inställningar." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "E-postverifiering krävs" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "Du mÃĨste verifiera din e-postadress fÃļr att använda den här funktionen. Du kan verifiera din e-postadress i webbvalvet." }, @@ -1884,7 +2695,10 @@ "message": "Ditt huvudlÃļsenord ändrades nyligen av en administratÃļr i din organisation. FÃļr att fÃĨ tillgÃĨng till valvet mÃĨste du uppdatera det nu. Om du fortsätter kommer du att loggas ut frÃĨn din nuvarande session, vilket kräver att du loggar in igen. Aktiva sessioner pÃĨ andra enheter kan komma att vara aktiva i upp till en timme." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Ditt huvudlÃļsenord fÃļljer inte ett eller flera av din organisations regler. FÃļr att komma ÃĨt ditt valv sÃĨ mÃĨste du ändra ditt huvudlÃļsenord nu. Om du gÃļr det kommer du att loggas du ut ur din nuvarande session sÃĨ du mÃĨste logga in pÃĨ nytt. Aktiva sessioner pÃĨ andra enheter kommer fortsatt vara aktiva i upp till en timme." + }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." }, "resetPasswordPolicyAutoEnroll": { "message": "Automatiskt deltagande" @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Välj mappâ€Ļ" }, - "ssoCompleteRegistration": { - "message": "FÃļr att slutfÃļra inloggning med SSO, ange ett huvudlÃļsenord fÃļr att komma ÃĨt och skydda ditt valv." + "noFoldersFound": { + "message": "Inga mappar hittades", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Din organisations behÃļrigheter uppdaterades, vilket kräver att du anger ett huvudlÃļsenord.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Din organisation kräver att du anger ett huvudlÃļsenord.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "av $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verifiering krävs", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Timmar" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minuter" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Dina organisationsprinciper pÃĨverkar ditt valvs tid fÃļr timeout. Maximal tillÃĨten tid innan timeout är $HOURS$ timmar och $MINUTES$ minuter", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Fel" }, @@ -2007,7 +2884,24 @@ "message": "Återskapa användarnamn" }, "generateUsername": { - "message": "Skapa användarnamn" + "message": "Generera användarnamn" + }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } }, "usernameType": { "message": "Typ av användarnamn" @@ -2035,10 +2929,10 @@ "message": "Webbplatsnamn" }, "whatWouldYouLikeToGenerate": { - "message": "Vad vill du skapa?" + "message": "Vad skulle du vilja generera?" }, "passwordType": { - "message": "Typ av lÃļsenord" + "message": "LÃļsenordstyp" }, "service": { "message": "Tjänst" @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Skapa ett e-postalias med en extern vidarebefordranstjänst." }, + "forwarderDomainName": { + "message": "E-postdomän", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$-fel: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Genererad av Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Webbplats: $WEBSITE$. Genererad av Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Ogiltig $SERVICENAME$ API-token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Ogiltig $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Ogiltig $SERVICENAME$-domän.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Ogiltig $SERVICENAME$-URL.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Värdnamn", "description": "Part of a URL." @@ -2093,7 +3097,7 @@ "message": "Serverversion" }, "selfHostedServer": { - "message": "self-hosted" + "message": "självhostad" }, "thirdParty": { "message": "Tredje part" @@ -2192,7 +3196,7 @@ "message": "Hur du fyller i automatiskt" }, "autofillSelectInfoWithCommand": { - "message": "Välj ett objekt frÃĨn denna sida eller använd genvägen: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Välj ett objekt frÃĨn den här sidan eller ange en genväg i inställningarna." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "FÃļrstÃĨtt" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Inställningar fÃļr automatisk ifyllnad" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Ändra genväg" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Hantera genvägar" + }, "autofillShortcut": { "message": "Tangentbordsgenväg fÃļr automatisk ifyllnad" }, - "autofillShortcutNotSet": { - "message": "Genvägen fÃļr automatisk ifyllnad är inte satt. Ändra detta i webbläsarens inställningar." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "Genvägen fÃļr automatisk ifyllnad är: $COMMAND$. Ändra detta i webbläsarens inställningar.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logga in pÃĨ" - }, "opensInANewWindow": { "message": "Öppnas i ett nytt fÃļnster" }, @@ -2249,44 +3259,59 @@ "message": "Uncheck if using a public device" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "Godkänn frÃĨn din andra enhet" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "Be om godkännande frÃĨn administratÃļr" }, "approveWithMasterPassword": { "message": "Godkänn med huvudlÃļsenord" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "Organisationens SSO-identifierare krävs." + }, + "creatingAccountOn": { + "message": "Skapa konto pÃĨ" + }, + "checkYourEmail": { + "message": "Kolla din e-post" + }, + "followTheLinkInTheEmailSentTo": { + "message": "FÃļlj länken i e-postmeddelandet som skickats till" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "Ingen e-post?" + }, + "goBack": { + "message": "GÃĨ tillbaka" + }, + "toEditYourEmailAddress": { + "message": "fÃļr att redigera din e-postadress." }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { - "message": "Access denied. You do not have permission to view this page." + "message": "Åtkomst nekad. Du har inte behÃļrighet att visa denna sida." }, "general": { - "message": "General" + "message": "Allmänt" }, "display": { "message": "Display" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "Ditt konto har skapats!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "Godkännande frÃĨn administratÃļr har begärts" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "Din begäran har skickats till din administratÃļr." }, "youWillBeNotifiedOnceApproved": { "message": "Du kommer att meddelas vid godkännande." @@ -2295,16 +3320,24 @@ "message": "Problem med att logga in?" }, "loginApproved": { - "message": "Login approved" + "message": "Inloggning godkänd" }, "userEmailMissing": { - "message": "User email missing" + "message": "Användarens e-postadress saknas" }, "deviceTrusted": { - "message": "Device trusted" + "message": "Enhet betrodd" + }, + "sendsNoItemsTitle": { + "message": "Inga aktiva Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "Inmatning är obligatoriskt." }, "required": { "message": "obligatoriskt" @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Välj --" }, @@ -2404,7 +3449,1379 @@ "message": "Undermeny" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Växla synlig/dold", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Importera din data till Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Skydda din LastPass-data och importera till Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Spara som okrypterad fil", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Importera till Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importerar...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data har importerats till ditt valv!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Fel vid importeringen. Kolla konsolen fÃļr detaljer.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Nätverksfel uppstod vid import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Aliasdomän" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Objekt med \"Återupprepa huvudlÃļsenord\" kan inte fyllas i automatiskt vid sidladdning. Automatisk ifyllning vid sidladdning avstängd.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Aktivera automatisk ifyllnad vid sidhämtning sattes till att använda standardinställningen.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Stäng av \"ÃĨterupprepa huvudlÃļsenord\" fÃļr att redigera detta fält", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Hoppa till innehÃĨll" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden automatisk ifyllnadsmenyknapp", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Växla Bitwarden automatisk ifyllnadsmeny", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden automatisk ifyllnadsmeny", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "LÃĨs upp ditt konto fÃļr att visa matchande inloggningar", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "LÃĨs upp konto", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fyll i uppgifter fÃļr", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Inga objekt att visa", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Nytt objekt", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Lägg till nytt valvobjekt", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Ny inloggning", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Nytt kort", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Ny identitet", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden automatisk ifyllnadsmeny är tillgänglig. Tryck pÃĨ nedÃĨtpilen fÃļr att välja.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Aktivera" + }, + "ignore": { + "message": "Ignorera" + }, + "importData": { + "message": "Importera data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Fel vid import" + }, + "importErrorDesc": { + "message": "Det uppstod ett problem med den data du fÃļrsÃļkte importera. Åtgärda de fel som anges nedan i din källfil och fÃļrsÃļk igen." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Åtgärda felen nedan och fÃļrsÃļk igen." + }, + "description": { + "message": "Beskrivning" + }, + "importSuccess": { + "message": "Data har importerats till ditt valv" + }, + "importSuccessNumberOfItems": { + "message": "Sammanlagt $AMOUNT$ objekt importerades.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "FÃļrsÃļk igen" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verifiering krävs fÃļr denna ÃĨtgärd. Ange en PIN-kod fÃļr att fortsätta." + }, + "setPin": { + "message": "Ställ in PIN-kod" + }, + "verifyWithBiometrics": { + "message": "Verifiera med biometri" + }, + "awaitingConfirmation": { + "message": "Väntar pÃĨ bekräftelse" + }, + "couldNotCompleteBiometrics": { + "message": "Det gick inte att slutfÃļra biometri." + }, + "needADifferentMethod": { + "message": "BehÃļver du en annan metod?" + }, + "useMasterPassword": { + "message": "Använd huvudlÃļsenord" + }, + "usePin": { + "message": "Använd PIN-kod" + }, + "useBiometrics": { + "message": "Använd biometri" + }, + "enterVerificationCodeSentToEmail": { + "message": "Ange verifieringskoden som skickades till din e-postadress." + }, + "resendCode": { + "message": "Skicka kod igen" + }, + "total": { + "message": "Totalt" + }, + "importWarning": { + "message": "Du importerar data till $ORGANIZATION$. Din data kan komma att delas med medlemmar i den här organisationen. Vill du fortsätta?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Starta Duo och fÃļlj stegen fÃļr att slutfÃļra inloggningen." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Starta Duo" + }, + "importFormatError": { + "message": "Datan är inte korrekt formaterad. Vänligen kontrollera din importerade fil och fÃļrsÃļk igen." + }, + "importNothingError": { + "message": "Ingenting har importerats." + }, + "importEncKeyError": { + "message": "Ett fel uppstod vid dekryptering av den exporterade filen. Din krypteringsnyckel matchar inte krypteringsnyckeln som användes fÃļr att exportera datan." + }, + "invalidFilePassword": { + "message": "Ogiltigt fillÃļsenord, använd lÃļsenordet du angav när du skapade exportfilen." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Läs mer om dina importalternativ" + }, + "selectImportFolder": { + "message": "Välj en mapp" + }, + "selectImportCollection": { + "message": "Välj en samling" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Filen innehÃĨller otilldelade objekt." + }, + "selectFormat": { + "message": "Välj importfilens format" + }, + "selectImportFile": { + "message": "Välj importfilen" + }, + "chooseFile": { + "message": "Välj fil" + }, + "noFileChosen": { + "message": "Ingen fil vald" + }, + "orCopyPasteFileContents": { + "message": "eller kopiera och klistra in innehÃĨllet frÃĨn filen" + }, + "instructionsFor": { + "message": "Instruktioner fÃļr $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Bekräfta importering av valv" + }, + "confirmVaultImportDesc": { + "message": "Den här filen är lÃļsenordsskyddad. Ange lÃļsenordet fÃļr att importera data." + }, + "confirmFilePassword": { + "message": "Bekräfta fillÃļsenord" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Nyckel" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "LÃļsennyckeln kommer inte kopieras" + }, + "passkeyNotCopiedAlert": { + "message": "LÃļsennyckeln kommer inte att kopieras till det klonade objektet. Vill du fortsätta klona det här objektet?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verifiering krävs av den initierande webbplatsen. Denna funktion är ännu inte implementerad fÃļr konton utan huvudlÃļsenord." + }, + "logInWithPasskeyQuestion": { + "message": "Logga in med nyckel?" + }, + "passkeyAlreadyExists": { + "message": "En lÃļsennyckel finns redan fÃļr detta program." + }, + "noPasskeysFoundForThisApplication": { + "message": "Inga lÃļsennycklar hittades fÃļr detta program." + }, + "noMatchingPasskeyLogin": { + "message": "Det finns ingen matchande inloggning fÃļr denna webbplats." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "SÃļk eller spara nyckel som ny inloggning" + }, + "confirm": { + "message": "Bekräfta" + }, + "savePasskey": { + "message": "Spara nyckel" + }, + "savePasskeyNewLogin": { + "message": "Spara nyckel som ny inloggning" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "LÃļsennyckelobjekt" + }, + "overwritePasskey": { + "message": "Skriv Ãļver lÃļsennyckel?" + }, + "overwritePasskeyAlert": { + "message": "Detta objekt innehÃĨller redan en lÃļsennyckel. Är du säker pÃĨ att du vill skriva Ãļver nuvarande lÃļsennyckeln?" + }, + "featureNotSupported": { + "message": "Funktionen stÃļds ännu inte" + }, + "yourPasskeyIsLocked": { + "message": "Autentisering krävs fÃļr att använda lÃļsennyckel. Verifiera din identitet fÃļr att fortsätta." + }, + "multifactorAuthenticationCancelled": { + "message": "Flerfaktorsautentisering avbruten" + }, + "noLastPassDataFound": { + "message": "Ingen LastPass-data hittades" + }, + "incorrectUsernameOrPassword": { + "message": "Felaktigt användarnamn eller lÃļsenord" + }, + "incorrectPassword": { + "message": "Felaktigt lÃļsenord" + }, + "incorrectCode": { + "message": "Felaktig kod" + }, + "incorrectPin": { + "message": "Felaktig PIN-kod" + }, + "multifactorAuthenticationFailed": { + "message": "Flerfaktorsautentisering misslyckades" + }, + "includeSharedFolders": { + "message": "Inkludera delade mappar" + }, + "lastPassEmail": { + "message": "LastPass E-post" + }, + "importingYourAccount": { + "message": "Importerar ditt konto..." + }, + "lastPassMFARequired": { + "message": "LastPass flerfaktorsautentisering krävs" + }, + "lastPassMFADesc": { + "message": "Ange din engÃĨngskod frÃĨn din autentiseringsapp" + }, + "lastPassOOBDesc": { + "message": "Godkänn inloggningsbegäran i din autentiseringsapp eller ange en engÃĨngskod." + }, + "passcode": { + "message": "LÃļsenkod" + }, + "lastPassMasterPassword": { + "message": "LastPass HuvudlÃļsenord" + }, + "lastPassAuthRequired": { + "message": "LastPass autentisering krävs" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "Se detaljerade instruktioner pÃĨ vÃĨr hjälpsida pÃĨ", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Importera direkt frÃĨn LastPass" + }, + "importFromCSV": { + "message": "Importera frÃĨn CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Samling" + }, + "lastPassYubikeyDesc": { + "message": "Sätt in YubiKey som associeras med ditt LastPass-konto i din dators USB-port, tryck sedan pÃĨ knappen." + }, + "switchAccount": { + "message": "Byt konto" + }, + "switchAccounts": { + "message": "Byt konto" + }, + "switchToAccount": { + "message": "Byt till konto" + }, + "activeAccount": { + "message": "Aktivt konto" + }, + "availableAccounts": { + "message": "Tillgängliga konton" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "aktiv" + }, + "locked": { + "message": "lÃĨst" + }, + "unlocked": { + "message": "upplÃĨst" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Använd din enhet eller hÃĨrdvarunyckel" + }, + "justOnce": { + "message": "Bara en gÃĨng" + }, + "alwaysForThisSite": { + "message": "Alltid fÃļr denna webbplats" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Vanliga format", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Fortsätt till Hjälpcenter?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "LÃĨt Bitwarden hantera lÃļsenord som standard?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "LÃĨt Bitwarden hantera lÃļsenord som standard", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "GÃļr till standard", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Ta bort passkey" + }, + "passkeyRemoved": { + "message": "Passkey borttagen" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Ditt valv är tomt" + }, + "noItemsMatchSearch": { + "message": "Inga objekt matchar din sÃļkning" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Kopiera anteckning - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Visa objekt - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Kopiera e-postadress" + }, + "copyPhone": { + "message": "Kopiera telefon" + }, + "copyAddress": { + "message": "Kopiera adress" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Kontosäkerhet" + }, + "notifications": { + "message": "Aviseringar" + }, + "appearance": { + "message": "Utseende" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "Visa objekt i $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Tillbaka till $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Ny/Nytt" + }, + "removeItem": { + "message": "Ta bort $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Objekt utan mapp" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Objektnamn" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Ägare" + }, + "selfOwnershipLabel": { + "message": "Du", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Ytterligare information" + }, + "itemHistory": { + "message": "Objekthistorik" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Ägare: Du" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Ladda upp" + }, + "addAttachment": { + "message": "Lägg till bilaga" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximal filstorlek är 500 MB" + }, + "deleteAttachmentName": { + "message": "Radera bilaga $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Ladda ner $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identifikation" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Autentiseringsnyckel" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Webbplats (URI)" + }, + "websiteUriCount": { + "message": "Webbplats (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Lägg till webbplats" + }, + "deleteWebsite": { + "message": "Radera webbplats" + }, + "defaultLabel": { + "message": "Standard ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Aktivera animationer" + }, + "showAnimations": { + "message": "Visa animationer" + }, + "addAccount": { + "message": "Lägg till konto" + }, + "loading": { + "message": "Laddar" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Nycklar", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "LÃļsenord", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Logga in med nyckel", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Tilldela" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Lägg till fält" + }, + "add": { + "message": "Lägg till" + }, + "fieldType": { + "message": "Fälttyp" + }, + "fieldLabel": { + "message": "Fältetikett" + }, + "textHelpText": { + "message": "Använd textfält fÃļr data som t. ex. säkerhetsfrÃĨgor" + }, + "hiddenHelpText": { + "message": "Använd dolda fält fÃļr känslig data, som t. ex. ett lÃļsenord" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Redigera fält" + }, + "editFieldLabel": { + "message": "Redigera $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Radera $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden har fÃĨtt ett nytt utseende!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "KontoÃĨtgärder" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "Systemstandard" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Privat nyckel" + }, + "sshPublicKey": { + "message": "Offentlig nyckel" + }, + "sshFingerprint": { + "message": "Fingeravtryck" + }, + "sshKeyAlgorithm": { + "message": "Nyckeltyp" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "FÃļrsÃļk igen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Visa antal tecken" + }, + "hideCharacterCount": { + "message": "DÃļlj antal tecken" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Återställ" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Spara inloggning pÃĨ Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Utropstecken", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "FrÃĨgetecken", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Gemen" + }, + "uppercaseAriaLabel": { + "message": "Versal" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index bf1eedd8261..a4668a65add 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "Create account" }, - "login": { - "message": "Log in" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "A master password hint can help you remember your password if you forget it." }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type master password" }, "masterPassHint": { "message": "Master password hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Copy password" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy note" }, @@ -88,8 +137,60 @@ "copySecurityCode": { "message": "Copy security code" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { - "message": "Auto-fill" + "message": "Autofill" + }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" }, "generatePasswordCopied": { "message": "Generate password (copied)" @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "No matching logins" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "Unlock your vault" }, @@ -107,7 +223,7 @@ "message": "Log in to your vault" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "There are no logins available to autofill for the current browser tab." }, "addLogin": { "message": "Add a login" @@ -115,6 +231,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Confirm your identity to continue." }, - "account": { - "message": "Account" - }, "changeMasterPassword": { "message": "Change master password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Log out" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "About" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "Version" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Edit folder" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "Delete folder" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Generator", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Automatically generate strong, unique passwords for your logins." }, - "bitWebVault": { - "message": "Bitwarden web vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate password" }, @@ -244,17 +447,60 @@ "length": { "message": "Length" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -276,7 +522,16 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Search vault" @@ -299,15 +554,30 @@ "password": { "message": "Password" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "Passphrase" }, "favorite": { "message": "Favorite" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -326,6 +596,18 @@ "launch": { "message": "Launch" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Website" }, @@ -338,9 +620,24 @@ "other": { "message": "Other" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "Unlock" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "Immediately" }, @@ -426,6 +738,18 @@ "security": { "message": "Security" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "An error has occurred" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "We've sent you an email with your master password hint." }, "verificationCodeRequired": { "message": "Verification code is required." }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "Invalid verification code" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "Unable to autofill the selected item on this page. Copy and paste the information instead." + }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" }, "loggedOut": { "message": "Logged out" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "Your login session has expired." }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "Are you sure you want to log out?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "Folder added" }, - "changeMasterPass": { - "message": "Change master password" - }, - "changeMasterPasswordConfirmation": { - "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -552,6 +936,10 @@ "newUri": { "message": "New URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "Item added" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Ask to add login" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "Ask to add an item if one isn't found in your vault." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "Show cards on Tab page" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "List card items on the Tab page for easy autofill." + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "List identity items on the Tab page for easy autofill." }, "clearClipboard": { "message": "Clear clipboard", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "Do you want to update this password in Bitwarden?" }, @@ -634,23 +1043,29 @@ "message": "Update" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "Show context menu options" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Use a secondary click to access password generation and matching logins for the website." + }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." }, "defaultUriMatchDetection": { "message": "Default URI match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as autofill." }, "theme": { "message": "Theme" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "Dark", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export vault" }, "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "Shared" }, - "learnOrg": { - "message": "Learn about organizations" - }, - "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "Move to organization" @@ -762,6 +1204,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator app" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Server URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "Lock the vault" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Identity" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Password history" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Back" }, "collections": { "message": "Collections" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favorites" }, @@ -1282,6 +1874,10 @@ "message": "Base domain", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Domain name", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Default match detection", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "There are no passwords to list." }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "Remove" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, "invalidPin": { "message": "Invalid PIN code." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "Unlock with biometrics" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "One or more organization policies are affecting your generator settings." }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "Item restored" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, @@ -1459,13 +2111,16 @@ "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "Autofill and save" + }, + "fillAndSave": { + "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "Item autofilled and URI saved" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "Item autofilled " }, "insecurePageWarning": { "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Your new master password does not meet the policy requirements." }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -1666,6 +2406,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 20e234e4f8f..ecac21c82b8 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -3,21 +3,39 @@ "message": "bitwarden" }, "extName": { - "message": "bitwarden - Free Password Manager", + "message": "Bitwarden Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "bitwarden is a secure and free password manager for all of your devices.", - "description": "Extension description" + "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™ ā¸Ģ⏪⏎⏭ ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸šā¸ąā¸ā¸Šā¸ĩāšƒā¸Ģā¸Ąāšˆ āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸•ā¸šāš‰ā¸™ā¸´ā¸Ŗā¸ ā¸ąā¸ĸ⏂⏭⏇⏄⏏⏓" }, + "inviteAccepted": { + "message": "Invitation accepted" + }, "createAccount": { "message": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸šā¸ąā¸ā¸Šā¸ĩ" }, - "login": { - "message": "āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸š" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Set a strong password" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Finish creating your account by setting a password" }, "enterpriseSingleSignOn": { "message": "Enterprise Single Sign-On" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ā¸„ā¸ŗāšƒā¸šāš‰āš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸šā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸Ģā¸Ĩā¸ąā¸ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Šāšˆā¸§ā¸ĸāšƒā¸Ģāš‰ā¸„ā¸¸ā¸“ā¸™ā¸ļ⏁⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸Ģā¸Ĩā¸ąā¸ā¸­ā¸­ā¸āš„ā¸”āš‰ā¸Ģ⏞⏁ā¸Ĩā¸ˇā¸Ą" }, + "masterPassHintText": { + "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Re-type Master Password" }, "masterPassHint": { "message": "Master Password Hint (optional)" }, + "joinOrganization": { + "message": "Join organization" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Finish joining this organization by setting a master password." + }, "tab": { "message": "āšā¸—āš‡ā¸š" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "ā¸„ā¸ąā¸”ā¸Ĩ⏭⏁⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Copy Note" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "ā¸„ā¸ąā¸”ā¸Ĩ⏭⏁⏪ā¸Ģā¸ąā¸Ēā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸„ā¸§ā¸˛ā¸Ąā¸›ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ" }, + "copyName": { + "message": "Copy name" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ā¸ā¸Ŗā¸­ā¸ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" }, + "autoFillLogin": { + "message": "Autofill login" + }, + "autoFillCard": { + "message": "Autofill card" + }, + "autoFillIdentity": { + "message": "Autofill identity" + }, "generatePasswordCopied": { "message": "Generate Password (copied)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "āš„ā¸Ąāšˆā¸žā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™ā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸‡ā¸ā¸ąā¸™" }, + "noCards": { + "message": "No cards" + }, + "noIdentities": { + "message": "No identities" + }, + "addLoginMenu": { + "message": "Add login" + }, + "addCardMenu": { + "message": "Add card" + }, + "addIdentityMenu": { + "message": "Add identity" + }, "unlockVaultMenu": { "message": "⏛ā¸Ĩ⏔ā¸Ĩāš‡ā¸­ā¸ā¸ā¸•ā¸šāš‰ā¸™ā¸´ā¸Ŗā¸ ā¸ąā¸ĸ⏂⏭⏇⏄⏏⏓" }, @@ -115,6 +231,18 @@ "addItem": { "message": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸˛ā¸ĸ⏁⏞⏪" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ā¸„ā¸ŗāšƒā¸šāš‰ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸•ā¸™ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš€ā¸žā¸ˇāšˆā¸­ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸­" }, - "account": { - "message": "ā¸šā¸ąā¸ā¸Šā¸ĩ" - }, "changeMasterPassword": { "message": "Change Master Password" }, + "continueToWebApp": { + "message": "Continue to web app?" + }, + "continueToWebAppDesc": { + "message": "Explore more features of your Bitwarden account on the web app." + }, + "continueToHelpCenter": { + "message": "Continue to Help Center?" + }, + "continueToHelpCenterDesc": { + "message": "Learn more about how to use Bitwarden on the Help Center." + }, + "continueToBrowserExtensionStore": { + "message": "Continue to browser extension store?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "You can change your master password on the Bitwarden web app." + }, "fingerprintPhrase": { "message": "Fingerprint Phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "⏭⏭⏁⏈⏞⏁⏪⏰⏚⏚" }, + "aboutBitwarden": { + "message": "About Bitwarden" + }, "about": { "message": "āš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸š" }, + "moreFromBitwarden": { + "message": "More from Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Continue to bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden for Business" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "āšā¸āš‰āš„ā¸‚āš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒ" }, + "newFolder": { + "message": "New folder" + }, + "folderName": { + "message": "Folder name" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "ā¸Ĩā¸šāš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒ" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ā¸Ēā¸¸āšˆā¸Ąā¸Ŗā¸Ģā¸ąā¸Ē", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸—ā¸ĩāšˆā¸Ŗā¸ąā¸”ā¸ā¸¸ā¸Ąāšā¸Ĩā¸°āš„ā¸Ąāšˆā¸‹āš‰ā¸ŗāšƒā¸„ā¸Ŗāš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“" }, - "bitWebVault": { - "message": "bitwarden Web Vault" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "Import Items" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Generate Password" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Regenerate Password" }, @@ -244,17 +447,60 @@ "length": { "message": "ā¸„ā¸§ā¸˛ā¸Ąā¸ĸ⏞⏧" }, + "passwordMinLength": { + "message": "Minimum password length" + }, "uppercase": { - "message": "ā¸•ā¸ąā¸§ā¸žā¸´ā¸Ąā¸žāšŒāšƒā¸Ģā¸āšˆ (A-Z)" + "message": "ā¸•ā¸ąā¸§ā¸žā¸´ā¸Ąā¸žāšŒāšƒā¸Ģā¸āšˆ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "ā¸•ā¸ąā¸§ā¸žā¸´ā¸Ąā¸žāšŒāš€ā¸Ĩāš‡ā¸ (a-z)" + "message": "ā¸•ā¸ąā¸§ā¸žā¸´ā¸Ąā¸žāšŒāš€ā¸Ĩāš‡ā¸ (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "ā¸•ā¸ąā¸§āš€ā¸Ĩ⏂ (0-9)" + "message": "ā¸•ā¸ąā¸§āš€ā¸Ĩ⏂ (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ā¸­ā¸ąā¸ā¸‚ā¸Ŗā¸°ā¸žā¸´āš€ā¸¨ā¸Š (!@#$%^&*)" + "message": "ā¸­ā¸ąā¸ā¸‚ā¸Ŗā¸°ā¸žā¸´āš€ā¸¨ā¸Š (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of Words" @@ -276,7 +522,16 @@ "message": "Minimum Special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid Ambiguous Characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ā¸„āš‰ā¸™ā¸Ģā¸˛āšƒā¸™ā¸•ā¸šāš‰ā¸™ā¸´ā¸Ŗā¸ ā¸ąā¸ĸ" @@ -299,15 +554,30 @@ "password": { "message": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" }, + "totp": { + "message": "Authenticator secret" + }, "passphrase": { "message": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" }, "favorite": { "message": "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "āš‚ā¸™āš‰ā¸•" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "āš‚ā¸™āš‰ā¸•" }, @@ -326,6 +596,18 @@ "launch": { "message": "āš€ā¸Ŗā¸´āšˆā¸Ą" }, + "launchWebsite": { + "message": "Launch website" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "āš€ā¸§āš‡ā¸šāš„ā¸‹ā¸•āšŒ" }, @@ -338,9 +620,24 @@ "other": { "message": "ā¸­ā¸ˇāšˆā¸™ āš†" }, + "unlockMethods": { + "message": "Unlock options" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." }, + "unlockMethodNeeded": { + "message": "Set up an unlock method in Settings" + }, + "sessionTimeoutHeader": { + "message": "Session timeout" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "Other options" + }, "rateExtension": { "message": "Rate the Extension" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "ā¸•ā¸šāš‰āš€ā¸‹ā¸Ÿā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸–ā¸šā¸ā¸Ĩāš‡ā¸­ā¸ ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸•ā¸™ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš€ā¸žā¸ˇāšˆā¸­ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸­" }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" + }, "unlock": { "message": "⏛ā¸Ĩ⏔ā¸Ĩāš‡ā¸­ā¸„" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "⏪⏰ā¸ĸā¸°āš€ā¸§ā¸Ĩ⏞ā¸Ĩāš‡ā¸­ā¸ā¸•ā¸šāš‰āš€ā¸‹ā¸Ÿ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock Now" }, + "lockAll": { + "message": "Lock all" + }, "immediately": { "message": "ā¸—ā¸ąā¸™ā¸—ā¸ĩ" }, @@ -426,6 +738,18 @@ "security": { "message": "ā¸„ā¸§ā¸˛ā¸Ąā¸›ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ" }, + "confirmMasterPassword": { + "message": "Confirm master password" + }, + "masterPassword": { + "message": "Master password" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "Master password hint" + }, "errorOccurred": { "message": "ā¸žā¸šā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "ā¸šā¸ąā¸ā¸Šā¸ĩāšƒā¸Ģā¸Ąāšˆā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸–ā¸šā¸ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸‚ā¸ļāš‰ā¸™āšā¸Ĩāš‰ā¸§! ⏕⏭⏙⏙ā¸ĩāš‰ā¸„ā¸¸ā¸“ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸š" }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "You successfully logged in" + }, + "youMayCloseThisWindow": { + "message": "You may close this window" + }, "masterPassSent": { "message": "āš€ā¸Ŗā¸˛āš„ā¸”āš‰ā¸Ēāšˆā¸‡ā¸­ā¸ĩāš€ā¸Ąā¸Ĩā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸„ā¸ŗāšƒā¸šāš‰ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸Ģā¸Ĩā¸ąā¸ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸­ā¸­ā¸āš„ā¸›āšā¸Ĩāš‰ā¸§" }, "verificationCodeRequired": { "message": "ā¸•āš‰ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸¸āš‚ā¸„āš‰ā¸”ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™" }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "āš‚ā¸„āš‰ā¸”ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Unable to auto-fill the selected login on this page. Copy/paste your username and/or password instead." }, + "totpCaptureError": { + "message": "Unable to scan QR code from the current webpage" + }, + "totpCaptureSuccess": { + "message": "Authenticator key added" + }, + "totpCapture": { + "message": "Scan authenticator QR code from current webpage" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Copy Authenticator key (TOTP)" + }, "loggedOut": { "message": "⏭⏭⏁⏈⏞⏁⏪⏰⏚⏚" }, + "loggedOutDesc": { + "message": "You have been logged out of your account." + }, "loginExpired": { "message": "āš€ā¸‹ā¸Ēā¸Šā¸ąā¸™ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸Ģā¸Ąā¸”ā¸­ā¸˛ā¸ĸā¸¸āšā¸Ĩāš‰ā¸§" }, + "logIn": { + "message": "Log in" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩāš‡ā¸­ā¸āš€ā¸­ā¸˛ā¸•āšŒāšƒā¸Šāšˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "āš€ā¸žā¸´āšˆā¸Ąāš‚ā¸Ÿā¸Ĩāš€ā¸”ā¸­ā¸ŖāšŒāšā¸Ĩāš‰ā¸§" }, - "changeMasterPass": { - "message": "Change Master Password" - }, - "changeMasterPasswordConfirmation": { - "message": "⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸Ģā¸Ĩā¸ąā¸āš„ā¸”āš‰ā¸—ā¸ĩāšˆāš€ā¸§āš‡ā¸šā¸•ā¸šāš‰āš€ā¸‹ā¸Ÿ bitwarden.com ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸´ā¸”āš€ā¸§āš‡ā¸šāš„ā¸‹ā¸•āšŒāš€ā¸Ĩā¸ĸā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?" - }, "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to enter a security code from an authenticator app whenever you log in. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Edited Folder" }, @@ -552,6 +936,10 @@ "newUri": { "message": "āš€ā¸žā¸´āšˆā¸Ą URI āšƒā¸Ģā¸Ąāšˆ" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāšā¸Ĩāš‰ā¸§" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "ā¸–ā¸˛ā¸Ąāš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰āš€ā¸žā¸´āšˆā¸Ąā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸š" }, + "vaultSaveOptionsTitle": { + "message": "Save to vault options" + }, "addLoginNotificationDesc": { "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time." }, + "addLoginNotificationDescAlt": { + "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "āšā¸Ēā¸”ā¸‡ā¸ā¸˛ā¸ŖāšŒā¸”ā¸šā¸™ā¸Ģā¸™āš‰ā¸˛āšā¸—āš‡ā¸š" }, "showCardsCurrentTabDesc": { "message": "ā¸šā¸ąā¸•ā¸Ŗā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāšƒā¸™ā¸Ģā¸™āš‰ā¸˛āšā¸—āš‡ā¸šāš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰ā¸›āš‰ā¸­ā¸™ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āš„ā¸”āš‰ā¸‡āšˆā¸˛ā¸ĸ" }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" + }, "showIdentitiesCurrentTab": { "message": "āšā¸Ēā¸”ā¸‡ā¸•ā¸ąā¸§ā¸•ā¸™ā¸šā¸™ā¸Ģā¸™āš‰ā¸˛āšā¸—āš‡ā¸š" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Ask to update a login's password when a change is detected on a website." }, + "changedPasswordNotificationDescAlt": { + "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" + }, + "usePasskeysDesc": { + "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." + }, "notificationChangeDesc": { "message": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸™ā¸ĩāš‰āšƒā¸™ Bitwarden ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?" }, @@ -634,20 +1043,26 @@ "message": "Yes, Update Now" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "Unlock your Bitwarden vault to complete the autofill request." }, "notificationUnlock": { "message": "Unlock" }, + "additionalOptions": { + "message": "Additional options" + }, "enableContextMenuItem": { "message": "āšā¸Ēā¸”ā¸‡ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸āš€ā¸Ąā¸™ā¸šā¸šā¸Ŗā¸´ā¸šā¸—" }, "contextMenuItemDesc": { "message": "āšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸„ā¸Ĩ⏴⏁ā¸Ēā¸ŗā¸Ŗā¸­ā¸‡āš€ā¸žā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇⏁⏞⏪ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āšā¸Ĩā¸°ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸‡ā¸ā¸ąā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāš€ā¸§āš‡ā¸šāš„ā¸‹ā¸•āšŒ " }, + "contextMenuItemDescAlt": { + "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + }, "defaultUriMatchDetection": { "message": "ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸šā¸„ā¸šāšˆ URI āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "āš€ā¸Ĩ⏎⏭⏁⏧⏴⏘ā¸ĩāš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™āšƒā¸™ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ģā¸˛ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸šā¸„ā¸šāšˆ URI ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šāš€ā¸Ąā¸ˇāšˆā¸­ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸˛ā¸‡āš† āš€ā¸Šāšˆā¸™ ā¸ā¸˛ā¸Ŗā¸›āš‰ā¸­ā¸™ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Change the application's color theme." }, + "themeDescAlt": { + "message": "Change the application's color theme. Applies to all logged in accounts." + }, "dark": { "message": "ā¸Ąā¸ˇā¸”", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "Export Vault" }, "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "File password" + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "Export type" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "āšā¸Šā¸ŖāšŒāšā¸Ĩāš‰ā¸§" }, - "learnOrg": { - "message": "āš€ā¸Ŗā¸ĩā¸ĸā¸™ā¸Ŗā¸šāš‰āš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸šā¸­ā¸‡ā¸„āšŒā¸ā¸Ŗ" - }, - "learnOrgConfirmation": { - "message": "Bitwarden ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āšƒā¸Ģāš‰ā¸„ā¸¸ā¸“āšā¸Šā¸ŖāšŒā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗā¸•ā¸šāš‰ā¸™ā¸´ā¸Ŗā¸ ā¸ąā¸ĸā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸ā¸ąā¸šā¸œā¸šāš‰ā¸­ā¸ˇāšˆā¸™āš‚ā¸”ā¸ĸāšƒā¸Šāš‰ā¸­ā¸‡ā¸„āšŒā¸ā¸Ŗ ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗāš€ā¸ĸā¸ĩāšˆā¸ĸā¸Ąā¸Šā¸Ąāš€ā¸§āš‡ā¸šāš„ā¸‹ā¸•āšŒ bitwarden.com āš€ā¸žā¸ˇāšˆā¸­āš€ā¸Ŗā¸ĩā¸ĸā¸™ā¸Ŗā¸šāš‰āš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ąā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "ā¸ĸāš‰ā¸˛ā¸ĸāš„ā¸›ā¸ĸā¸ąā¸‡āšā¸šā¸šā¸­ā¸‡ā¸„āšŒā¸ā¸Ŗ" @@ -762,6 +1204,9 @@ "file": { "message": "āš„ā¸Ÿā¸ĨāšŒ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB of encrypted file storage." }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { "message": "Proprietary two-step login options such as YubiKey and Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "All for just $PRICE$ /year!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Refresh complete" }, @@ -838,7 +1301,7 @@ "message": "Copy TOTP automatically" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you autofill the login." }, "enableAutoBiometricsPrompt": { "message": "Ask for biometrics on launch" @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Authenticator App" }, - "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." }, - "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "⏭ā¸ĩāš€ā¸Ąā¸Ĩ" }, - "emailDesc": { - "message": "Verification codes will be emailed to you." + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "Self-hosted Environment" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premise hosted bitwarden installation." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Custom Environment" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL ā¸‚ā¸­ā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API Server URL" }, @@ -978,35 +1454,94 @@ "environmentSaved": { "message": "Environment URLs saved" }, + "showAutoFillMenuOnFormFields": { + "message": "Show autofill menu on form fields", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Turn off your browser's built in password manager settings to avoid conflicts." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Edit browser settings." + }, + "autofillOverlayVisibilityOff": { + "message": "Off", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "When field is selected (on focus)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "When autofill icon is selected", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "Enable Auto-fill On Page Load." }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "If a login form is detected, autofill when the web page loads." + }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Compromised or untrusted websites can exploit autofill on page load." + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Learn more about autofill" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "You can turn off autofill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if set up in Options)" + "message": "Autofill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Autofill on page load" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Do not autofill on page load" }, "commandOpenPopup": { "message": "Open vault popup" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "Open vault in sidebar" }, - "commandAutofillDesc": { - "message": "Auto-fill the last used login for the current website." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "Generate and copy a new random password to the clipboard." @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "ā¸Ĩāš‡ā¸­ā¸ā¸•ā¸šāš‰āš€ā¸‹ā¸Ÿ" }, - "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." - }, "customFields": { "message": "Custom Fields" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "Show a recognizable image next to each login." }, + "faviconDescAlt": { + "message": "Show a recognizable image next to each login. Applies to all logged in accounts." + }, "enableBadgeCounter": { "message": "Show badge counter" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸Ŗā¸°ā¸šā¸¸ā¸•ā¸ąā¸§ā¸•ā¸™" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "View $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "ā¸›ā¸Ŗā¸°ā¸§ā¸ąā¸•ā¸´ā¸‚ā¸­ā¸‡ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸š" }, "collections": { "message": "⏄⏭ā¸Ĩāš€ā¸Ĩā¸ā¸Šā¸ąā¸™" }, + "nCollections": { + "message": "$COUNT$ collections", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”" }, @@ -1282,6 +1874,10 @@ "message": "āš‚ā¸”āš€ā¸Ąā¸™ā¸žā¸ˇāš‰ā¸™ā¸ā¸˛ā¸™", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ā¸Šā¸ˇāšˆā¸­āš‚ā¸”āš€ā¸Ąā¸™", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Match Detection", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸šā¸„ā¸šāšˆāš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Toggle Options" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "āš„ā¸Ąāšˆā¸Ąā¸ĩ⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸°āšā¸Ē⏔⏇" }, + "clearHistory": { + "message": "Clear history" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "ā¸Ĩ⏚" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "⏛ā¸Ĩ⏔ā¸Ĩāš‡ā¸­ā¸ā¸”āš‰ā¸§ā¸ĸ PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "ā¸•ā¸ąāš‰ā¸‡ PIN āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ā¸›ā¸Ĩ⏔ā¸Ĩāš‡ā¸­ā¸ Bitwarden ā¸—ā¸ąāš‰ā¸‡ā¸™ā¸ĩāš‰ ā¸Ģ⏞⏁⏄⏏⏓ā¸Ĩāš‡ā¸­ā¸āš€ā¸­ā¸˛ā¸•āšŒā¸­ā¸­ā¸ā¸ˆā¸˛ā¸āšā¸­ā¸›āš‚ā¸”ā¸ĸā¸Ēā¸Ąā¸šā¸šā¸Ŗā¸“āšŒā¸ˆā¸°āš€ā¸›āš‡ā¸™ā¸ā¸˛ā¸Ŗā¸Ĩā¸šā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ PIN ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸”āš‰ā¸§ā¸ĸ" }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "ā¸•āš‰ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸¸ PIN" }, "invalidPin": { "message": "PIN āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡" }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Too many invalid PIN entry attempts. Logging out." + }, "unlockWithBiometrics": { "message": "⏛ā¸Ĩ⏔ā¸Ĩāš‡ā¸­ā¸ā¸”āš‰ā¸§ā¸ĸāš„ā¸šāš‚ā¸­āš€ā¸Ąā¸•ā¸Ŗā¸´ā¸" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "ā¸Ĩāš‡ā¸­ā¸„ā¸”āš‰ā¸§ā¸ĸ⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸Ģā¸Ĩā¸ąā¸āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ŗā¸ĩā¸Ēā¸•ā¸˛ā¸ŖāšŒā¸—āš€ā¸šā¸Ŗā¸˛ā¸§āšŒāš€ā¸‹ā¸­ā¸ŖāšŒ" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡āš€ā¸Ĩ⏎⏭⏁⏭ā¸ĸāšˆā¸˛ā¸‡ā¸™āš‰ā¸­ā¸ĸā¸Ģ⏙ā¸ļāšˆā¸‡ā¸„ā¸­ā¸Ĩāš€ā¸Ĩā¸ā¸Šā¸ąā¸™" }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸā¸­ā¸‡ā¸„āšŒā¸ā¸Ŗā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸™āš‰ā¸­ā¸ĸā¸Ģ⏙ā¸ļāšˆā¸‡ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸā¸Ēāšˆā¸‡ā¸œā¸Ĩā¸•āšˆā¸­ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸•ā¸ąā¸§ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“" }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸Ģā¸Ĩā¸ąā¸‡ā¸Ģā¸Ąā¸”āš€ā¸§ā¸Ĩ⏞ā¸Ĩāš‡ā¸­ā¸„ā¸•ā¸šāš‰āš€ā¸‹ā¸Ÿ" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "ā¸Ĩāš‡ā¸­ā¸", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ā¸–ā¸ąā¸‡ā¸‚ā¸ĸ⏰", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "ā¸„ā¸ˇā¸™ā¸„āšˆā¸˛ā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāšā¸Ĩāš‰ā¸§" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "⏁⏞⏪⏭⏭⏁⏈⏞⏁⏪⏰⏚⏚⏈⏰ā¸Ĩā¸šā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡ā¸•ā¸šāš‰ā¸™ā¸´ā¸Ŗā¸ ā¸ąā¸ĸā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸” āšā¸Ĩā¸°ā¸•āš‰ā¸­ā¸‡ā¸Ąā¸ĩā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸­ā¸­ā¸™āš„ā¸Ĩā¸™āšŒā¸Ģā¸Ĩā¸ąā¸‡ā¸ˆā¸˛ā¸ā¸Ģā¸Ąā¸”āš€ā¸§ā¸Ĩ⏞ ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "ā¸ā¸Ŗā¸­ā¸ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āšā¸Ĩā¸°ā¸šā¸ąā¸™ā¸—ā¸ļ⏁" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { "message": "āš€ā¸•ā¸´ā¸Ąā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āšā¸Ĩā¸°ā¸šā¸ąā¸™ā¸—ā¸ļ⏁ URI āšā¸Ĩāš‰ā¸§" }, @@ -1474,7 +2129,7 @@ "message": "Do you still wish to fill this login?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to autofill anyway, or Cancel to stop." }, "autofillIframeWarningTip": { "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸Ģā¸Ĩā¸ąā¸āšƒā¸Ģā¸Ąāšˆā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸Ąāšˆāš€ā¸›āš‡ā¸™āš„ā¸›ā¸•ā¸˛ā¸Ąā¸‚āš‰ā¸­ā¸ā¸ŗā¸Ģā¸™ā¸”ā¸‚ā¸­ā¸‡ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸ" }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { "message": "By checking this box you agree to the following:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "⏕⏁ā¸Ĩ⏇" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." }, + "personalOwnershipPolicyInEffectImports": { + "message": "An organization policy has blocked importing items into your individual vault." + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Excluded domains" }, "excludedDomainsDesc": { "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ is not a valid domain", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ā¸„āš‰ā¸™ā¸Ģā¸˛āšƒā¸™ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "āš„ā¸Ÿā¸ĨāšŒ" }, @@ -1666,6 +2406,9 @@ "message": "Send ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Password protected" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩ⏚ Send ⏙ā¸ĩāš‰āšƒā¸Šāšˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "āšā¸āš‰āš„ā¸‚ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -1769,6 +2523,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send created", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "Before you start" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "Email verification required" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Automatic enrollment" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "Select folder..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "No folders found", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Your organization permissions were updated, requiring you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Your organization requires you to set a master password.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Verification required", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Hours" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Error" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "Generate username" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "Username type" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Hostname", "description": "Part of a URL." @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "Your organization policies have turned on autofill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "How to autofill" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Select an item from this screen, or explore other options in settings." }, "gotIt": { "message": "Got it" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Autofill settings" + }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Autofill keyboard shortcut" }, - "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Default autofill shortcut: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { "message": "Opens in a new window" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." + }, "eu": { "message": "EU", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Device trusted" }, + "sendsNoItemsTitle": { + "message": "No active Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "Input is required." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- Select --" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Toggle collapse", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Import your data to Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Protect your LastPass data and import to Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Save as unencrypted file", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Import to Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Importing...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Data successfully imported!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "Error importing. Check console for details.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "Network error encountered during import.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias domain" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Items with master password re-prompt cannot be autofilled on page load. Autofill on page load turned off.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Autofill on page load set to use default setting.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Turn off master password re-prompt to edit this field", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "Skip to content" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden autofill menu button", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Toggle Bitwarden autofill menu", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden autofill menu", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Unlock your account to view matching logins", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Unlock account", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Fill credentials for", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Partial username", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "No items to show", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "New item", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Add new vault item", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "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.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Turn on" + }, + "ignore": { + "message": "Ignore" + }, + "importData": { + "message": "Import data", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Import error" + }, + "importErrorDesc": { + "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Resolve the errors below and try again." + }, + "description": { + "message": "Description" + }, + "importSuccess": { + "message": "Data successfully imported" + }, + "importSuccessNumberOfItems": { + "message": "A total of $AMOUNT$ items were imported.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Try again" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Verification required for this action. Set a PIN to continue." + }, + "setPin": { + "message": "Set PIN" + }, + "verifyWithBiometrics": { + "message": "Verify with biometrics" + }, + "awaitingConfirmation": { + "message": "Awaiting confirmation" + }, + "couldNotCompleteBiometrics": { + "message": "Could not complete biometrics." + }, + "needADifferentMethod": { + "message": "Need a different method?" + }, + "useMasterPassword": { + "message": "Use master password" + }, + "usePin": { + "message": "Use PIN" + }, + "useBiometrics": { + "message": "Use biometrics" + }, + "enterVerificationCodeSentToEmail": { + "message": "Enter the verification code that was sent to your email." + }, + "resendCode": { + "message": "Resend code" + }, + "total": { + "message": "Total" + }, + "importWarning": { + "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Launch Duo and follow the steps to finish logging in." + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "Launch Duo" + }, + "importFormatError": { + "message": "Data is not formatted correctly. Please check your import file and try again." + }, + "importNothingError": { + "message": "Nothing was imported." + }, + "importEncKeyError": { + "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." + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, + "selectFormat": { + "message": "Select the format of the import file" + }, + "selectImportFile": { + "message": "Select the import file" + }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, + "orCopyPasteFileContents": { + "message": "or copy/paste the import file contents" + }, + "instructionsFor": { + "message": "$NAME$ Instructions", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "Confirm vault import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, + "confirmFilePassword": { + "message": "Confirm file password" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "Passkey" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Passkey will not be copied" + }, + "passkeyNotCopiedAlert": { + "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "A passkey already exists for this application." + }, + "noPasskeysFoundForThisApplication": { + "message": "No passkeys found for this application." + }, + "noMatchingPasskeyLogin": { + "message": "You do not have a matching login for this site." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Confirm" + }, + "savePasskey": { + "message": "Save passkey" + }, + "savePasskeyNewLogin": { + "message": "Save passkey as new login" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "Passkey Item" + }, + "overwritePasskey": { + "message": "Overwrite passkey?" + }, + "overwritePasskeyAlert": { + "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" + }, + "featureNotSupported": { + "message": "Feature not yet supported" + }, + "yourPasskeyIsLocked": { + "message": "Authentication required to use passkey. Verify your identity to continue." + }, + "multifactorAuthenticationCancelled": { + "message": "Multifactor authentication cancelled" + }, + "noLastPassDataFound": { + "message": "No LastPass data found" + }, + "incorrectUsernameOrPassword": { + "message": "Incorrect username or password" + }, + "incorrectPassword": { + "message": "Incorrect password" + }, + "incorrectCode": { + "message": "Incorrect code" + }, + "incorrectPin": { + "message": "Incorrect PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Multifactor authentication failed" + }, + "includeSharedFolders": { + "message": "Include shared folders" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "Importing your account..." + }, + "lastPassMFARequired": { + "message": "LastPass multifactor authentication required" + }, + "lastPassMFADesc": { + "message": "Enter your one-time passcode from your authentication app" + }, + "lastPassOOBDesc": { + "message": "Approve the login request in your authentication app or enter a one-time passcode." + }, + "passcode": { + "message": "Passcode" + }, + "lastPassMasterPassword": { + "message": "LastPass master password" + }, + "lastPassAuthRequired": { + "message": "LastPass authentication required" + }, + "awaitingSSO": { + "message": "Awaiting SSO authentication" + }, + "awaitingSSODesc": { + "message": "Please continue to log in using your company credentials." + }, + "seeDetailedInstructions": { + "message": "See detailed instructions on our help site at", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Import directly from LastPass" + }, + "importFromCSV": { + "message": "Import from CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Try again or look for an email from LastPass to verify it's you." + }, + "collection": { + "message": "Collection" + }, + "lastPassYubikeyDesc": { + "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button." + }, + "switchAccount": { + "message": "Switch account" + }, + "switchAccounts": { + "message": "Switch accounts" + }, + "switchToAccount": { + "message": "Switch to account" + }, + "activeAccount": { + "message": "Active account" + }, + "availableAccounts": { + "message": "Available accounts" + }, + "accountLimitReached": { + "message": "Account limit reached. Log out of an account to add another." + }, + "active": { + "message": "active" + }, + "locked": { + "message": "locked" + }, + "unlocked": { + "message": "unlocked" + }, + "server": { + "message": "server" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "Just once" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Make default", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "Copy info - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "More options, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "More options - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "Assign to collections" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "Account security" + }, + "notifications": { + "message": "Notifications" + }, + "appearance": { + "message": "Appearance" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "Remove $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "Add account" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index f40c94f1222..7c67428539d 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Ücretsiz Parola YÃļneticisi", + "message": "Bitwarden Parola YÃļneticisi", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "TÃŧm cihazlarÄąnÄąz için gÃŧvenli ve Ãŧcretsiz bir parola yÃļneticisi.", - "description": "Extension description" + "message": "Bitwarden tÃŧm parolalarÄąnÄązÄą, geçiş anahtarlarÄąnÄązÄą ve hassas bilgilerinizi gÃŧvenle saklar", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "GÃŧvenli kasanÄąza ulaşmak için giriş yapÄąn veya yeni bir hesap oluşturun." }, + "inviteAccepted": { + "message": "Davet kabul edildi" + }, "createAccount": { "message": "Hesap oluştur" }, - "login": { - "message": "Giriş yap" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "GÃŧçlÃŧ bir parola belirleyin" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "ParolanÄązÄą belirleyerek hesabÄąnÄązÄą oluşturmayÄą tamamlayÄąn" }, "enterpriseSingleSignOn": { "message": "Kurumsal tek oturum açma (SSO)" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Ana parolanÄązÄą unutursanÄąz bu ipucuna bakÄąnca size ana parolanÄązÄą hatÄąrlatacak bir şey yazabilirsiniz." }, + "masterPassHintText": { + "message": "ParolanÄązÄą unutursanÄąz parola ipucunuzu e-posta adresinize gÃļnderebiliriz. Maksimum $CURRENT$/$MAXIMUM$ karakter.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Ana parolayÄą tekrar yazÄąn" }, "masterPassHint": { "message": "Ana parola ipucu (isteğe bağlÄą)" }, + "joinOrganization": { + "message": "Kuruluşa katÄąl" + }, + "joinOrganizationName": { + "message": "$ORGANIZATIONNAME$ kuruluşuna katÄąl", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Kuruluşa katÄąlmayÄą tamamlamak için ana parolanÄązÄą belirleyin." + }, "tab": { "message": "Sekme" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "ParolayÄą kopyala" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Notu kopyala" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "GÃŧvenlik kodunu kopyala" }, + "copyName": { + "message": "AdÄą kopyala" + }, + "copyCompany": { + "message": "Şirketi kopyala" + }, + "copySSN": { + "message": "Sosyal gÃŧvenlik numarasÄąnÄą kopyala" + }, + "copyPassportNumber": { + "message": "Pasaport numarasÄąnÄą kopyala" + }, + "copyLicenseNumber": { + "message": "Ruhsat numarasÄąnÄą kopyala" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "$FIELD$ alanÄąnÄą kopyala", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Web sitesini kopyala" + }, + "copyNotes": { + "message": "NotlarÄą kopyala" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Otomatik doldur" }, + "autoFillLogin": { + "message": "HesabÄą otomatik doldur" + }, + "autoFillCard": { + "message": "KartÄą otomatik doldur" + }, + "autoFillIdentity": { + "message": "Kimliği otomatik doldur" + }, "generatePasswordCopied": { "message": "Parola oluştur (ve kopyala)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "Eşleşen hesap yok" }, + "noCards": { + "message": "Kart yok" + }, + "noIdentities": { + "message": "Kimlik yok" + }, + "addLoginMenu": { + "message": "Hesap ekle" + }, + "addCardMenu": { + "message": "Kart ekle" + }, + "addIdentityMenu": { + "message": "Kimlik ekle" + }, "unlockVaultMenu": { "message": "KasanÄązÄąn kilidini aÃ§Äąn" }, @@ -107,7 +223,7 @@ "message": "KasanÄąza giriş yapÄąn" }, "autoFillInfo": { - "message": "Mevcut sekme için otomatik doldurulacak giriş bilgisi bulunmuyor." + "message": "Mevcut sekme için otomatik doldurulabilecek hesap yok." }, "addLogin": { "message": "Hesap ekle" @@ -115,6 +231,18 @@ "addItem": { "message": "KayÄąt ekle" }, + "accountEmail": { + "message": "Hesap e-posta adresi" + }, + "requestHint": { + "message": "İpucunu iste" + }, + "requestPasswordHint": { + "message": "Parola ipucunu iste" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "HesabÄąnÄązÄąn e-posta adresini girdiğinizde parola ipucunuz size gÃļnderilecektir" + }, "passwordHint": { "message": "Parola ipucu" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "Devam etmek için kimliğinizi doğrulayÄąn." }, - "account": { - "message": "Hesap" - }, "changeMasterPassword": { "message": "Ana parolayÄą değiştir" }, + "continueToWebApp": { + "message": "Web uygulamasÄąna devam edilsin mi?" + }, + "continueToWebAppDesc": { + "message": "Web uygulamasÄąnda Bitwarden hesabÄąnÄązÄąn diğer Ãļzelliklerini keşfedin." + }, + "continueToHelpCenter": { + "message": "YardÄąm merkezine gitmek ister misiniz?" + }, + "continueToHelpCenterDesc": { + "message": "YardÄąm merkezinde Bitwarden kullanÄąmÄą hakkÄąnda daha fazla bilgi alabilirsiniz." + }, + "continueToBrowserExtensionStore": { + "message": "TarayÄącÄąnÄązÄąn uzantÄą sitesine gitmek ister misiniz?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "Bitwarden'Äą başkalarÄąna da tanÄąmak ister misiniz? TarayÄącÄąnÄązÄąn uzantÄą mağazasÄąnÄą ziyaret edip Bitwarden'Äą değerlendirin." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Ana parolanÄązÄą Bitwarden web uygulamasÄąnda değiştirebilirsiniz." + }, "fingerprintPhrase": { "message": "Parmak izi ifadesi", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Ã‡ÄąkÄąÅŸ yap" }, + "aboutBitwarden": { + "message": "Bitwarden hakkÄąnda" + }, "about": { "message": "HakkÄąnda" }, + "moreFromBitwarden": { + "message": "Diğer Bitwarden ÃŧrÃŧnleri" + }, + "continueToBitwardenDotCom": { + "message": "bitwarden.com'a gitmek ister misiniz?" + }, + "bitwardenForBusiness": { + "message": "İşletmeler için Bitwarden" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Ücretsiz Bitwarden Aile" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "SÃŧrÃŧm" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "KlasÃļrÃŧ dÃŧzenle" }, + "newFolder": { + "message": "Yeni klasÃļr" + }, + "folderName": { + "message": "KlasÃļr adÄą" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "Hiç klasÃļr eklenmedi" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Bu klasÃļrÃŧ kalÄącÄą olarak silmek istediğinizden emin misiniz?" + }, "deleteFolder": { "message": "KlasÃļrÃŧ sil" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "Oluşturucu", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "HesaplarÄąnÄąz için otomatik olarak gÃŧçlÃŧ, ÃļzgÃŧn parolalar oluşturun." }, - "bitWebVault": { - "message": "Bitwarden web kasasÄą" + "bitWebVaultApp": { + "message": "Bitwarden web uygulamasÄą" }, "importItems": { "message": "HesaplarÄą içe aktar" @@ -235,6 +435,9 @@ "generatePassword": { "message": "Parola oluştur" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "Yeni parola oluştur" }, @@ -244,17 +447,60 @@ "length": { "message": "Uzunluk" }, + "passwordMinLength": { + "message": "Minimum parola uzunluğu" + }, "uppercase": { - "message": "BÃŧyÃŧk harf (A-Z)" + "message": "BÃŧyÃŧk harf (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "KÃŧçÃŧk harf (a-z)" + "message": "KÃŧçÃŧk harf (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Rakamlar (0-9)" + "message": "Rakamlar (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Özel karakterler (!@#$%^&*)" + "message": "Özel karakterler (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Dahil et", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "BÃŧyÃŧk harfleri dahil et", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "KÃŧçÃŧk harfleri dahil et", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "RakamlarÄą dahil et", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Özel karakterleri dahil et", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Kelime sayÄąsÄą" @@ -276,7 +522,16 @@ "message": "En az Ãļzel karakter" }, "avoidAmbChar": { - "message": "Okurken karÄąÅŸabilecek karakterleri kullanma" + "message": "Okurken karÄąÅŸabilecek karakterleri kullanma", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Okurken karÄąÅŸabilecek karakterleri kullanma", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Üreteç seçeneklerinize kurumsal ilke gereksinimleri uygulandÄą.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Kasada ara" @@ -299,15 +554,30 @@ "password": { "message": "Parola" }, + "totp": { + "message": "Kimlik doğrulama sÄąrrÄą" + }, "passphrase": { "message": "Uzun sÃļz" }, "favorite": { "message": "Favori" }, + "unfavorite": { + "message": "Favorilerden kaldÄąr" + }, + "itemAddedToFavorites": { + "message": "KayÄąt favorilere eklendi" + }, + "itemRemovedFromFavorites": { + "message": "KayÄąt favorilerden silindi" + }, "notes": { "message": "Notlar" }, + "privateNote": { + "message": "Özel not" + }, "note": { "message": "Not" }, @@ -326,6 +596,18 @@ "launch": { "message": "Aç" }, + "launchWebsite": { + "message": "Web sitesini aç" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Web sitesi" }, @@ -338,8 +620,23 @@ "other": { "message": "Diğer" }, + "unlockMethods": { + "message": "Kilit açma seçenekleri" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Kasa zaman aÅŸÄąmÄą eyleminizi değiştirmek için kilit açma yÃļnteminizi ayarlayÄąn." + }, + "unlockMethodNeeded": { + "message": "Ayarlar'da bir kilit açma yÃļntemi ayarlayÄąn" + }, + "sessionTimeoutHeader": { + "message": "Oturum zaman aÅŸÄąmÄą" + }, + "vaultTimeoutHeader": { + "message": "Kasa zaman aÅŸÄąmÄą" + }, + "otherOptions": { + "message": "Diğer seçenekler" }, "rateExtension": { "message": "UzantÄąyÄą değerlendirin" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "KasanÄąz kilitli. Devam etmek için kimliğinizi doğrulayÄąn." }, + "yourVaultIsLockedV2": { + "message": "KasanÄąz kilitli" + }, + "yourAccountIsLocked": { + "message": "HesabÄąnÄąz kilitlendi" + }, + "or": { + "message": "veya" + }, "unlock": { "message": "Kilidi aç" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Kasa zaman aÅŸÄąmÄą" }, + "vaultTimeout1": { + "message": "Zaman aÅŸÄąmÄą" + }, "lockNow": { "message": "Şimdi kilitle" }, + "lockAll": { + "message": "TÃŧmÃŧnÃŧ kilitle" + }, "immediately": { "message": "Hemen" }, @@ -426,6 +738,18 @@ "security": { "message": "GÃŧvenlik" }, + "confirmMasterPassword": { + "message": "Ana parolayÄą onaylayÄąn" + }, + "masterPassword": { + "message": "Ana parola" + }, + "masterPassImportant": { + "message": "Ana parolanÄązÄą unutursanÄąz kurtaramazsÄąnÄąz!" + }, + "masterPassHintLabel": { + "message": "Ana parola ipucu" + }, "errorOccurred": { "message": "Bir hata oluştu" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Yeni hesabÄąnÄąz oluşturuldu! Şimdi giriş yapabilirsiniz." }, + "newAccountCreated2": { + "message": "Yeni hesabÄąnÄąz oluşturuldu." + }, + "youHaveBeenLoggedIn": { + "message": "Oturum açtÄąnÄąz." + }, + "youSuccessfullyLoggedIn": { + "message": "BaşarÄąyla giriş yaptÄąnÄąz" + }, + "youMayCloseThisWindow": { + "message": "Bu pencereyi kapatabilirsiniz" + }, "masterPassSent": { "message": "Size ana parolanÄązÄąn ipucunu içeren bir e-posta gÃļnderdik." }, "verificationCodeRequired": { "message": "Doğrulama kodu gereklidir." }, + "webauthnCancelOrTimeout": { + "message": "Kimlik doğrulama iptal edildi ve çok uzun sÃŧrdÃŧ. LÃŧtfen yeniden deneyin." + }, "invalidVerificationCode": { "message": "Geçersiz doğrulama kodu" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "Seçilen hesap bu sayfada otomatik olarak doldurulamadÄą. LÃŧtfen bilgileri elle kopyalayÄąp yapÄąÅŸtÄąrÄąn." + "message": "Seçilen kayÄąt bu sayfada otomatik olarak doldurulamadÄą. LÃŧtfen bilgileri elle kopyalayÄąp yapÄąÅŸtÄąrÄąn." + }, + "totpCaptureError": { + "message": "Mevcut web sayfasÄąndaki QR kodu taranamÄąyor" + }, + "totpCaptureSuccess": { + "message": "Kimlik doğrulama anahtarÄą eklendi" + }, + "totpCapture": { + "message": "Mevcut web sayfasÄąndaki kimlik doğrulayÄącÄą QR kodunu tarayÄąn" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Kimlik doğrulama anahtarÄąnÄą kopyala (TOTP)" }, "loggedOut": { "message": "Ã‡ÄąkÄąÅŸ yapÄąldÄą" }, + "loggedOutDesc": { + "message": "HesabÄąnÄązdan Ã§ÄąkÄąÅŸ yapÄąldÄą." + }, "loginExpired": { "message": "Oturumunuz zaman aÅŸÄąmÄąna uğradÄą." }, + "logIn": { + "message": "Giriş yap" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "KaydÄą yeniden başlat" + }, + "expiredLink": { + "message": "BağlantÄąnÄąn sÃŧresi dolmuş" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "LÃŧtfen kaydÄą yeniden başlatÄąn veya giriş yapmayÄą deneyin." + }, + "youMayAlreadyHaveAnAccount": { + "message": "Zaten hesabÄąnÄąz olabilir" + }, "logOutConfirmation": { "message": "Ã‡ÄąkÄąÅŸ yapmak istediğinize emin misiniz?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "KlasÃļr eklendi" }, - "changeMasterPass": { - "message": "Ana parolayÄą değiştir" - }, - "changeMasterPasswordConfirmation": { - "message": "Ana parolanÄązÄą bitwarden.com web kasasÄą Ãŧzerinden değiştirebilirsiniz. Siteye gitmek ister misiniz?" - }, "twoStepLoginConfirmation": { "message": "İki aşamalÄą giriş, hesabÄąnÄąza girererken işlemi bir gÃŧvenlik anahtarÄą, şifrematik uygulamasÄą, SMS, telefon aramasÄą veya e-posta gibi ek bir yÃļntemle doğrulamanÄązÄą isteyerek hesabÄąnÄązÄąn gÃŧvenliğini artÄąrÄąr. İki aşamalÄą giriş Ãļzelliğini bitwarden.com web kasasÄą Ãŧzerinden etkinleştirebilirsiniz. Şimdi siteye gitmek ister misiniz?" }, + "twoStepLoginConfirmationContent": { + "message": "Bitwarden web uygulamasÄąnda iki aşamalÄą girişi ayarlayarak hesabÄąnÄązÄąn gÃŧvenliğini artÄąrabilirsiniz." + }, + "twoStepLoginConfirmationTitle": { + "message": "Web uygulamasÄąna devam edilsin mi?" + }, "editedFolder": { "message": "KlasÃļr kaydedildi" }, @@ -552,6 +936,10 @@ "newUri": { "message": "Yeni URI" }, + "addDomain": { + "message": "Alan adÄą ekle", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "KayÄąt eklendi" }, @@ -592,20 +980,32 @@ "enableAddLoginNotification": { "message": "Hesap eklemeyi Ãļner" }, + "vaultSaveOptionsTitle": { + "message": "Kasa seçeneklerine kaydet" + }, "addLoginNotificationDesc": { "message": "\"Hesap ekle\" bildirimi, ilk kez kullandığınÄąz hesap bilgilerini kasanÄąza kaydetmek isteyip istemediğinizi otomatik olarak sorar." }, + "addLoginNotificationDescAlt": { + "message": "KasanÄązda bulunmayan kayÄątlarÄąn eklenmesini isteyip istemediğinizi sorar. Oturum açmÄąÅŸ tÃŧm hesaplar için geçerlidir." + }, + "showCardsInVaultView": { + "message": "Kasa gÃļrÃŧnÃŧmÃŧnde kartlarÄą otomatik doldurma Ãļnerisi olarak gÃļster" + }, "showCardsCurrentTab": { "message": "Sekme sayfasÄąnda kartlarÄą gÃļster" }, "showCardsCurrentTabDesc": { - "message": "Kolay otomatik doldurma için sekme sayfasÄąnda kart Ãļğelerini listele" + "message": "Kolay otomatik doldurma için sekme sayfasÄąnda kartlarÄą listele." + }, + "showIdentitiesInVaultView": { + "message": "Kasa gÃļrÃŧnÃŧmÃŧnde kimlikleri otomatik doldurma Ãļnerisi olarak gÃļster" }, "showIdentitiesCurrentTab": { "message": "Sekme sayfasÄąnda kimlikleri gÃļster" }, "showIdentitiesCurrentTabDesc": { - "message": "Kolay otomatik doldurma için sekme sayfasÄąnda kimlik Ãļğelerini listele" + "message": "Kolay otomatik doldurma için sekme sayfasÄąnda kimlikleri listele." }, "clearClipboard": { "message": "Panoyu temizle", @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "Sitede bir değişiklik tespit edildiğinde hesap parolasÄąnÄą gÃŧncellemeyi Ãļner." }, + "changedPasswordNotificationDescAlt": { + "message": "Bir sitede değişiklik tespit edildiğinde hesap parolasÄąnÄą gÃŧncellemek isteyip istemediğiniz sorar. Oturum açmÄąÅŸ tÃŧm hesaplar için geçerlidir." + }, + "enableUsePasskeys": { + "message": "Geçiş anahtarlarÄąnÄą kaydet ve kullan" + }, + "usePasskeysDesc": { + "message": "Yeni geçiş anahtarlarÄąnÄą kaydetmek ve kasanÄązda saklanan geçiş anahtarlarÄąyla giriş yapmak için sor. Giriş yapmÄąÅŸ tÃŧm hesaplar için geçerlidir." + }, "notificationChangeDesc": { "message": "Bu parolayÄą Bitwarden'da gÃŧncellemek ister misiniz?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "Kilidi aç" }, + "additionalOptions": { + "message": "Ek seçenekler" + }, "enableContextMenuItem": { "message": "Bağlam menÃŧsÃŧ seçeneklerini gÃļster" }, "contextMenuItemDesc": { - "message": "Parola oluşturma ve eşlesen hesaplara ulaşmak için sağ tÄąklamayÄą kullan." + "message": "Parola oluşturmak ve eşleşen hesaplara ulaşmak için sağ tÄąklamayÄą kullan." + }, + "contextMenuItemDescAlt": { + "message": "Web sitesi için parola oluşturmak ve eşleşen hesap bilgilerine erişmek için sağ tÄąklamayÄą kullanabilirsiniz. Oturum açmÄąÅŸ tÃŧm hesaplar için geçerlidir." }, "defaultUriMatchDetection": { "message": "VarsayÄąlan URI eşleşme tespiti", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Otomatik doldurma gibi eylemler gerçekleştirilirken hesaplar için URI eşleşme tespitinin nasÄąl yapÄąlacağınÄą seçin." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "UygulamanÄąn renk temasÄąnÄą değiştir." }, + "themeDescAlt": { + "message": "UygulamanÄąn renk temasÄąnÄą değiştirir. Oturum açmÄąÅŸ tÃŧm hesaplar için geçerlidir." + }, "dark": { "message": "Koyu", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized koyu", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "DÄąÅŸa aktarÄąlacak konum" + }, "exportVault": { "message": "KasayÄą dÄąÅŸa aktar" }, "fileFormat": { "message": "Dosya biçimi" }, + "fileEncryptedExportWarningDesc": { + "message": "DÄąÅŸarÄą aktarÄąlan bu dosya parola korumalÄą olacak ve dosyanÄąn çÃļzÃŧlmesi için parolayÄą girmeniz gerekecek." + }, + "filePassword": { + "message": "Dosya parolasÄą" + }, + "exportPasswordDescription": { + "message": "Bu parola, bu dosyayÄą dÄąÅŸa ve içe aktarmak için kullanÄąlacaktÄąr" + }, + "accountRestrictedOptionDescription": { + "message": "DÄąÅŸa aktarmayÄą şifrelemek ve içe aktarmayÄą yalnÄązca mevcut Bitwarden hesabÄąyla kÄąsÄątlamak için, hesabÄąnÄązÄąn kullanÄącÄą adÄą ve ana parolasÄąndan tÃŧretilen hesap şifreleme anahtarÄąnÄązÄą kullanÄąn." + }, + "passwordProtectedOptionDescription": { + "message": "DÄąÅŸa aktardığınÄąz dosyayÄą şifrelemek ve bir Bitwarden hesabÄąna içe aktarmak için kullanacağınÄąz parolayÄą belirleyin." + }, + "exportTypeHeading": { + "message": "DÄąÅŸa aktarma tÃŧrÃŧ" + }, + "accountRestricted": { + "message": "Hesap kÄąsÄątlÄą" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Dosya parolasÄą\" ile \"Dosya parolasÄąnÄą onaylayÄąn\" eşleşmiyor." + }, "warning": { "message": "UYARI", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "PaylaÅŸÄąlan" }, - "learnOrg": { - "message": "Kuruluşlar hakkÄąnda bilgi al" - }, - "learnOrgConfirmation": { - "message": "Bitwarden'Äąn kuruluş Ãļzelliğini kullanarak kasanÄązdaki kayÄątlarÄą başkalarÄąyla paylaşabilirsiniz. Daha fazla bilgi için bitwarden.com sitesini ziyaret etmek ister misiniz?" + "bitwardenForBusinessPageDesc": { + "message": "İşletmeler için Bitwarden'Äą kullanarak kasanÄązdaki kayÄątlarÄą başkalarÄąyla paylaşabilirsiniz. Daha fazla bilgi için bitwarden.com sitesini ziyaret edin." }, "moveToOrganization": { "message": "Kuruluşa taÅŸÄą" @@ -762,6 +1204,9 @@ "file": { "message": "Dosya" }, + "fileToShare": { + "message": "PaylaÅŸÄąlacak dosya" + }, "selectFile": { "message": "Bir dosya seçin" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "Dosya ekleri için 1 GB şifrelenmiş depolama." }, + "premiumSignUpEmergency": { + "message": "Acil durum erişimi." + }, "premiumSignUpTwoStepOptions": { "message": "YubiKey ve Duo gibi marka bazlÄą iki aşamalÄą giriş seçenekleri." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Premium Ãŧyeliği bitwarden.com web kasasÄą Ãŧzerinden satÄąn alabilirsiniz. Şimdi siteye gitmek ister misiniz?" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "Premium Ãŧyesiniz!" }, "premiumCurrentMemberThanks": { "message": "Bitwarden'Äą desteklediğiniz için teşekkÃŧr ederiz." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "BunlarÄąn hepsi sadece yÄąlda $PRICE$!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "BunlarÄąn hepsi yÄąlda sadece $PRICE$!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Yenileme tamamlandÄą" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "Kimlik doğrulama uygulamasÄą" }, - "authenticatorAppDesc": { - "message": "Zamana dayalÄą doğrulama kodlarÄą oluşturmak için kimlik doğrulama uygulamasÄą (Ãļrn. Authy veya Google Authenticator) kullanÄąn.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Kimlik doğrulama uygulamanÄązÄąn (Ãļrn. Bitwarden Authenticator) Ãŧrettiği kodu girin.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { + "yubiKeyTitleV2": { "message": "YubiKey OTP gÃŧvenlik anahtarÄą" }, "yubiKeyDesc": { "message": "HesabÄąnÄąza erişmek için bir YubiKey kullanÄąn. YubiKey 4, 4 Nano, 4C ve NEO cihazlarÄąyla çalÄąÅŸÄąr." }, - "duoDesc": { - "message": "Duo Security ile doğrulama için Duo Mobile uygulamasÄą, SMS, telefon aramasÄą veya U2F gÃŧvenlik anahtarÄąnÄą kullanÄąn.", + "duoDescV2": { + "message": "Duo Security'nin Ãŧrettiği kodu girin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "E-posta" }, - "emailDesc": { - "message": "Doğrulama kodlarÄą e-posta adresinize gÃļnderilecek." + "emailDescV2": { + "message": "E-posta adresinize gÃļnderilen kodu girin." }, "selfHostedEnvironment": { "message": "Şirket içinde barÄąndÄąrÄąlan ortam" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Kurum içinde barÄąndÄąrÄąlan Bitwarden kurulumunuzun taban URL'sini belirtin." }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "Özel ortam" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "Sunucu URL'si" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API sunucu URL'si" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "Ortam URL'leri kaydedildi" }, + "showAutoFillMenuOnFormFields": { + "message": "Form alanlarÄąnda otomatik doldurma menÃŧsÃŧnÃŧ gÃļster", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Önerileri otomatik doldur" + }, + "showInlineMenuLabel": { + "message": "Form alanlarÄąnda otomatik doldurma Ãļnerilerini gÃļster" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Kimlikleri Ãļneri olarak gÃļster" + }, + "showInlineMenuCardsLabel": { + "message": "KartlarÄą Ãļneri olarak gÃļster" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Simge seçildiğinde Ãļnerileri gÃļster" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Oturum açmÄąÅŸ tÃŧm hesaplara uygulanÄąr." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "ÇakÄąÅŸmalarÄą Ãļnlemek için tarayÄącÄąnÄązÄąn yerleşik şifre yÃļneticisi ayarlarÄąnÄą kapatÄąn." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "TarayÄącÄą ayarlarÄąnÄą dÃŧzenleyin." + }, + "autofillOverlayVisibilityOff": { + "message": "KapalÄą", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Alan seçili olduğunda", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Otomatik doldurma simgesi seçildiğinde", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Sayfa yÃŧklendiğinde otomatik doldur" + }, "enableAutoFillOnPageLoad": { "message": "Sayfa yÃŧklendiğinde otomatik doldur" }, "enableAutoFillOnPageLoadDesc": { "message": "Sayfa yÃŧklendiğinde giriş formu tespit edilirse otomatik olarak formu doldur." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$UyarÄą:$CLOSETAG$ Ele geçirilmiş veya gÃŧvenilmeyen web siteleri sayfa yÃŧklenirken otomatik doldurmayÄą suistimal edebilir.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "Ele geçirilmiş veya gÃŧvenilmeyen web siteleri sayfa yÃŧklenirken otomatik doldurmayÄą suistimal edebilir." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Riskleri Ãļğrenin" + }, "learnMoreAboutAutofill": { "message": "Otomatik doldurma hakkÄąnda bilgi alÄąn" }, @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "KasayÄą kenar çubuğunda aç" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "Geçerli site için son kullanÄąlan hesabÄą otomatik doldur" }, + "commandAutofillCardDesc": { + "message": "Geçerli site için son kullanÄąlan kartÄą otomatik doldur" + }, + "commandAutofillIdentityDesc": { + "message": "Geçerli site için son kullanÄąlan kimliği otomatik doldur" + }, "commandGeneratePasswordDesc": { "message": "Rastgele yeni bir parola oluştur ve panoya kopyala" }, "commandLockVaultDesc": { "message": "KasayÄą kilitle" }, - "privateModeWarning": { - "message": "Gizli mod desteği deneyseldir ve bazÄą Ãļzellikler kÄąsÄątlÄądÄąr." - }, "customFields": { "message": "Özel alanlar" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Onay kutusu" + }, "cfTypeLinked": { "message": "BağlantÄąlÄą", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "HesaplarÄąn yanÄąnda tanÄądÄąk gÃļrseller gÃļster." }, + "faviconDescAlt": { + "message": "Her hesabÄąn yanÄąnda tanÄąnabilir bir resim gÃļster. Oturum açmÄąÅŸ tÃŧm hesaplar için geçerlidir." + }, "enableBadgeCounter": { "message": "Rozet sayacÄąnÄą gÃļster" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Kimlik" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "Yeni $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ dÃŧzenle", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "$TYPE$ bilgileri", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Parola geçmişi" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Geri" }, "collections": { "message": "Koleksiyonlar" }, + "nCollections": { + "message": "$COUNT$ koleksiyon", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "Favoriler" }, @@ -1282,6 +1874,10 @@ "message": "Ana alan adÄą", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Alan adÄą kÃļkÃŧ (Ãļnerilen)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "Alan adÄą", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Eşleşme tespiti", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "VarsayÄąlan eşleşme tespiti", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Seçenekleri aç/kapat" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Listelenecek parola yok." }, + "clearHistory": { + "message": "Geçmişi temizle" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "KaldÄąr" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "Kilidi PIN koduyla aç" }, + "setYourPinTitle": { + "message": "PIN belirle" + }, + "setYourPinButton": { + "message": "PIN belirle" + }, "setYourPinCode": { "message": "Bitwarden'Äą açarken kullanacağınÄąz PIN kodunu belirleyin. Uygulamadan tamamen Ã§ÄąkÄąÅŸ yaparsanÄąz PIN ayarlarÄąnÄąz sÄąfÄąrlanacaktÄąr." }, + "setYourPinCode1": { + "message": "Bitwarden'Äąn kilidini açmak için ana parolanÄąz yerine PIN'iniz kullanÄąlacaktÄąr. Bitwarden'dan tamamen Ã§ÄąkÄąÅŸ yaparsanÄąz PIN'iniz sÄąfÄąrlanÄąr." + }, "pinRequired": { "message": "PIN kodu gerekli." }, "invalidPin": { "message": "PIN kodu geçersiz." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Çok fazla geçersiz PIN girişi denemesi. Oturum kapatÄąlÄąyor." + }, "unlockWithBiometrics": { "message": "Kilidi biyometri ile aç" }, + "unlockWithMasterPassword": { + "message": "Kilidi ana parola ile aç" + }, "awaitDesktop": { "message": "MasaÃŧstÃŧnden onay bekleniyor" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "TarayÄącÄą yeniden başlatÄąldığında ana parola ile kilitle" }, + "lockWithMasterPassOnRestart1": { + "message": "TarayÄącÄą yeniden başlatÄąldığında ana parolayÄą sor" + }, "selectOneCollection": { "message": "En az bir koleksiyon seçmelisiniz." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "Bir ya da daha fazla kuruluş ilkesi, oluşturucu ayarlarÄąnÄązÄą etkiliyor." }, + "passwordGenerator": { + "message": "Parola Ãŧreteci" + }, + "usernameGenerator": { + "message": "KullanÄącÄą adÄą Ãŧreteci" + }, + "useThisPassword": { + "message": "Bu parolayÄą kullan" + }, + "useThisUsername": { + "message": "Bu kullanÄącÄą adÄąnÄą kullan" + }, + "securePasswordGenerated": { + "message": "GÃŧvenli parola Ãŧretildi. Web sitesindeki parolanÄązÄą da gÃŧncellemeyi unutmayÄąn." + }, + "useGeneratorHelpTextPartOne": { + "message": "GÃŧçlÃŧ ve benzersiz bir parola Ãŧretmek için", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "Ãŧreteci kullanabilirsiniz", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Kasa zaman aÅŸÄąmÄą eylemi" }, + "vaultTimeoutAction1": { + "message": "Zaman aÅŸÄąmÄą eylemi" + }, "lock": { "message": "Kilitle", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ÇÃļp kutusu", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "KayÄąt geri yÃŧklendi" }, + "alreadyHaveAccount": { + "message": "Zaten hesabÄąnÄąz var mÄą?" + }, "vaultTimeoutLogOutConfirmation": { "message": "Ã‡ÄąkÄąÅŸ yaptığınÄązda kasanÄąza erişiminiz tamamen sonlanacak ve zaman aÅŸÄąmÄąnÄąn ardÄąndan çevrimiçi kimlik doğrulamasÄą yapmanÄąz gerekecek. Bu ayarÄą kullanmak istediğinizden emin misiniz?" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Otomatik doldur ve kaydet" }, + "fillAndSave": { + "message": "Doldur ve kaydet" + }, "autoFillSuccessAndSavedUri": { "message": "KayÄąt otomatik dolduruldu ve URI kaydedildi" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Yeni ana parolanÄąz ilke gereksinimlerini karÅŸÄąlamÄąyor." }, + "receiveMarketingEmailsV2": { + "message": "Bitwarden'dan Ãļneriler, duyurular ve araştÄąrma fÄąrsatlarÄą e-posta adresinize gelsin." + }, + "unsubscribe": { + "message": "İstediğiniz zaman" + }, + "atAnyTime": { + "message": "aboneliğinizi iptal edebilirsiniz." + }, + "byContinuingYouAgreeToThe": { + "message": "Devam ederek şunlarÄą kabul etmiş olursunuz:" + }, + "and": { + "message": "ve" + }, "acceptPolicies": { "message": "Bu kutuyu işaretleyerek aşağıdakileri kabul etmiş olursunuz:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Tamam" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "MasaÃŧstÃŧ eşitleme doğrulamasÄą" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Hesap uyuşmazlığı" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biyometrik anahtar eşleşmedi" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biyometrik kilit açma başarÄąsÄąz oldu. Biyometrik gizli anahtarÄąnÄąz kasanÄąn kilidini açamadÄą. LÃŧtfen biyometriyi yeniden ayarlamayÄą deneyin." + }, "biometricsNotEnabledTitle": { "message": "Biyometri ayarlanmamÄąÅŸ" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "TarayÄącÄą biyometrisi bu cihazda desteklenmiyor." }, + "biometricsNotUnlockedTitle": { + "message": "KullanÄącÄą kilitlendi ve oturumu kapatÄąldÄą" + }, + "biometricsNotUnlockedDesc": { + "message": "LÃŧtfen masaÃŧstÃŧ uygulamasÄąndan bu kullanÄącÄąnÄąn kilidini aÃ§Äąp yeniden deneyin." + }, + "biometricsNotAvailableTitle": { + "message": "Biyometrik kilit açma kullanÄąlamÄąyor" + }, + "biometricsNotAvailableDesc": { + "message": "Biyometrik kilit açma şu anda kullanÄąlamÄąyor. LÃŧtfen daha sonra tekrar deneyin." + }, "biometricsFailedTitle": { "message": "Biyometri doğrulanamadÄą" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "Biyometri doğrulamasÄą tamamlanamadÄą. Ana parolanÄązÄą kullanabilir veya Ã§ÄąkÄąÅŸ yapabilirsiniz. Sorun devam ederse Bitwarden destek ekibiyle iletişime geçin." }, "nativeMessaginPermissionErrorTitle": { "message": "İzin verilmedi" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "Bir kuruluş ilkesi sahiplik seçeneklerinizi etkiliyor." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Bir kuruluş ilkesi, kayÄątlarÄą kişisel kasanÄąza içe aktarmayÄą engelledi." + }, + "domainsTitle": { + "message": "Alan adlarÄą", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "Hariç tutulan alan adlarÄą" }, "excludedDomainsDesc": { "message": "Bitwarden bu alan adlarÄąnda hesaplarÄąnÄązÄą kaydetmeyi sormayacaktÄąr. Değişikliklerin etkili olmasÄą için sayfayÄą yenilemelisiniz." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden, oturum açmÄąÅŸ tÃŧm hesaplar için bu alan adlarÄąnÄąn hesap bilgilerini kaydetmeyi sormayacaktÄąr. Değişikliklerin etkili olmasÄą için sayfayÄą yenilemeniz gerekir." + }, + "websiteItemLabel": { + "message": "Web sitesi $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ geçerli bir alan adÄą değil", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Alan adÄą istisnasÄą değişiklikleri kaydedildi" + }, + "limitSendViews": { + "message": "GÃļsterimi sÄąnÄąrla" + }, + "limitSendViewsHint": { + "message": "Bu sÄąnÄąra ulaÅŸÄąldÄąktan sonra bu Send'i kimse gÃļremez.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ gÃļsterim kaldÄą", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send ayrÄąntÄąlarÄą", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send'lerde ara", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "Metin" }, + "sendTypeTextToShare": { + "message": "PaylaÅŸÄąlacak metin" + }, "sendTypeFile": { "message": "Dosya" }, @@ -1666,6 +2406,9 @@ "message": "TÃŧm Send'ler", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Metni varsayÄąlan olarak gizle" + }, "maxAccessCountReached": { "message": "Maksimum erişim sayÄąsÄąna ulaÅŸÄąldÄą", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Parola korumalÄą" }, + "copyLink": { + "message": "BağlantÄąyÄą kopyala" + }, "copySendLink": { "message": "Send bağlantÄąsÄąnÄą kopyala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Bu Send'i silmek istediğinizden emin misiniz?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Bu Send'i kalÄącÄą olarak silmek istediğinizden emin misiniz?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Send'i dÃŧzenle", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Bu Send belirtilen tarih ve saatte kalÄącÄą olacak silinecek.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Bu Send belirtilen tarihte kalÄącÄą olacak silinecek.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Son kullanma tarihi" }, @@ -1769,6 +2523,10 @@ "message": "KullanÄącÄąlarÄąn bu Send'e erişmek için parola girmelerini isteyebilirsiniz.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Bu Send ile ilgili Ãļzel notlar.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send oluşturuldu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send başarÄąyla oluşturuldu.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "ÖnÃŧmÃŧzdeki 1 saat boyunca bu bağlantÄąya sahip olan herkes bu Send'e ulaşabilir.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "ÖnÃŧmÃŧzdeki $HOURS$ saat boyunca bu bağlantÄąya sahip olan herkes bu Send'e ulaşabilir.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "ÖnÃŧmÃŧzdeki 1 gÃŧn boyunca bu bağlantÄąya sahip olan herkes bu Send'e ulaşabilir.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "ÖnÃŧmÃŧzdeki $DAYS$ gÃŧn boyunca bu bağlantÄąya sahip olan herkes bu Send'e ulaşabilir.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send bağlantÄąsÄą kopyalandÄą", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send kaydedildi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "UzantÄą dÄąÅŸarÄą alÄąnsÄąn mÄą?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "Dosya Send'i oluşturmak için uzantÄąyÄą yeni bir pencere halinde dÄąÅŸarÄą almalÄąsÄąnÄąz.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "Dosya seçmek için eklentiyi kenar çubuğunda aÃ§Äąn (mÃŧmkÃŧnse) veya bu banner'a tÄąklayarak yeni bir pencerede aÃ§Äąn." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "Safari ile dosya seçmek için bu banner'a tÄąklayarak eklentiyi yeni bir pencerede aÃ§Äąn." }, + "popOut": { + "message": "DÄąÅŸarÄą al" + }, "sendFileCalloutHeader": { "message": "Başlamadan Ãļnce" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "E-posta adresimi alÄącÄąlardan gizle." }, + "hideYourEmail": { + "message": "E-posta adresimi Send'i gÃļrÃŧntÃŧleyenlerden gizle." + }, "sendOptionsPolicyInEffect": { "message": "Bir veya daha fazla kuruluş ilkesi Send seçeneklerinizi etkiliyor." }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "E-posta doğrulamasÄą gerekiyor" }, + "emailVerifiedV2": { + "message": "E-posta doğrulandÄą" + }, "emailVerificationRequiredDesc": { "message": "Bu Ãļzelliği kullanmak için e-postanÄązÄą doğrulamanÄąz gerekir. E-postanÄązÄą web kasasÄąnda doğrulayabilirsiniz." }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Ana parolanÄąz kuruluş ilkelerinizi karÅŸÄąlamÄąyor. KasanÄąza erişmek için ana parolanÄązÄą gÃŧncellemelisiniz. Devam ettiğinizde oturumunuz kapanacak ve yeniden oturum açmanÄąz gerekecektir. Diğer cihazlardaki aktif oturumlar bir saate kadar aktif kalabilir." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + }, "resetPasswordPolicyAutoEnroll": { "message": "Otomatik eklenme" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "KlasÃļr seç..." }, - "ssoCompleteRegistration": { - "message": "SSO ile girişinizi tamamlamak için lÃŧtfen kasanÄąza erişirken kullanacağınÄąz ana parolayÄą belirleyin." + "noFoldersFound": { + "message": "Hiçbir klasÃļr bulunamadÄą", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Kuruluş izinleriniz gÃŧncellendi ve bir ana parola belirlemeniz gerekiyor.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Kuruluşunuz bir ana parola belirlemenizi gerektiriyor.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "/ $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "Doğrulama gerekli", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Saat" @@ -1904,6 +2740,9 @@ "minutes": { "message": "Dakika" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Zaman aÅŸÄąmÄą ayarlarÄąnÄąza kurumsal ilke gereksinimleri uygulandÄą" + }, "vaultTimeoutPolicyInEffect": { "message": "Kuruluş ilkeleriniz izin verilen maksimum kasa zaman aÅŸÄąmÄąnÄą $HOURS$ saat $MINUTES$ dakika olarak belirlemiş.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "En fazla $HOURS$ saat $MINUTES$ dakika.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Zaman aÅŸÄąmÄąnÄąz kuruluşunuzun belirlediği maksimum sÃŧreyi aÅŸÄąyor: Maksimum $HOURS$ saat $MINUTES$ dakika", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Kuruluş ilkeleriniz kasa zaman aÅŸÄąmÄąnÄązÄą etkiliyor. İzin verilen maksimum kasa zaman aÅŸÄąmÄą $HOURS$ saat $MINUTES$ dakikadÄąr. Kasa zaman aÅŸÄąmÄą eyleminiz $ACTION$ olarak ayarlanmÄąÅŸ.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Kuruluş kasasÄąnÄą dÄąÅŸa aktarma" + }, + "exportingOrganizationVaultDesc": { + "message": "YalnÄązca $ORGANIZATION$ ile ilişkili kuruluş kasasÄą dÄąÅŸarÄą aktarÄąlacak. Kişisel kasalardaki ve diğer kuruluşlardaki kayÄątlar dahil edilmeyecek.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Hata" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "KullanÄącÄą adÄą oluştur" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "KullanÄącÄą adÄą tÃŧrÃŧ" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Harici bir yÃļnlendirme servisiyle e-posta maskesi oluştur." }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ hatasÄą: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Bitwarden tarafÄąndan Ãŧretildi.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Web sitesi: $WEBSITE$. Bitwarden tarafÄąndan Ãŧretildi.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Geçersiz $SERVICENAME$ alan adÄą.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Geçersiz $SERVICENAME$ URL'si.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Bilinmeyen $SERVICENAME$ hatasÄą oluştu.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Bilinmeyen yÃļnlendirici: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "Sunucu", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Otomatik doldurma nasÄąl yapÄąlÄąr?" }, "autofillSelectInfoWithCommand": { - "message": "Bu sayfadan bir kayÄąt seçin veya $COMMAND$ kÄąsayolunu kullanÄąn.", + "message": "Bu ekrandan bir Ãļğe seçin, $COMMAND$ kÄąsayolunu kullanÄąn veya ayarlardaki diğer seçenekleri keşfedin.", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Bu sayfadan bir kayÄąt seçin veya ayarlardan bir kÄąsayol ayarlayÄąn." + "message": "Bu ekrandan bir Ãļğe seçin veya ayarlardaki diğer seçenekleri keşfedin." }, "gotIt": { "message": "AnladÄąm" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "Otomatik doldurma ayarlarÄą" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Otomatik doldurma kÄąsayolu" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "KÄąsayolu değiştir" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "KÄąsayollarÄą yÃļnet" + }, "autofillShortcut": { "message": "Otomatik doldurma klavye kÄąsayolu" }, - "autofillShortcutNotSet": { - "message": "Otomatik doldurma kÄąsayolu ayarlanmamÄąÅŸ. Bunu tarayÄącÄąnÄąn ayarlarÄąndan değiştirebilirsiniz." + "autofillLoginShortcutNotSet": { + "message": "HesabÄą otomatik doldurma kÄąsayolu ayarlanmamÄąÅŸ. Bunu tarayÄącÄą ayarlarÄąndan değiştirebilirsiniz." }, - "autofillShortcutText": { - "message": "Otomatik doldurma kÄąsayolu: $COMMAND$. Bunu tarayÄącÄąnÄąn ayarlarÄąndan değiştirebilirsiniz.", + "autofillLoginShortcutText": { + "message": "HesabÄą otomatik doldurma kÄąsayolu: $COMMAND$. TÃŧm kÄąsayollarÄą tarayÄącÄą ayarlarÄąndan değiştirebilirsiniz.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "Giriş yapÄąlan konum" - }, "opensInANewWindow": { "message": "Yeni pencerede aÃ§ÄąlÄąr" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "Kuruluş SSO tanÄąmlayÄącÄąsÄą gereklidir." }, + "creatingAccountOn": { + "message": "Hesap oluşturuluyor:" + }, + "checkYourEmail": { + "message": "E-postanÄązÄą kontrol edin" + }, + "followTheLinkInTheEmailSentTo": { + "message": "HesabÄąnÄązÄą oluşturmaya devam etmek için" + }, + "andContinueCreatingYourAccount": { + "message": "adresine gÃļnderdiğimiz e-postadaki bağlantÄąya tÄąklayÄąn." + }, + "noEmail": { + "message": "E-posta gelmedi mi?" + }, + "goBack": { + "message": "Geri dÃļnÃŧp" + }, + "toEditYourEmailAddress": { + "message": "e-posta adresinizi dÃŧzenleyin." + }, "eu": { "message": "AB", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Erişim engellendi. Bu sayfayÄą gÃļrÃŧntÃŧleme iznine sahip değilsiniz." }, @@ -2277,7 +3302,7 @@ "message": "Genel" }, "display": { - "message": "Display" + "message": "GÃļrÃŧnÃŧm" }, "accountSuccessfullyCreated": { "message": "Hesap başarÄąyla oluşturuldu!" @@ -2303,17 +3328,25 @@ "deviceTrusted": { "message": "Cihaza gÃŧvenildi" }, + "sendsNoItemsTitle": { + "message": "Aktif Send yok", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "Şifrelenmiş bilgileri gÃŧvenle paylaşmak için Send'i kullanabilirsiniz.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { - "message": "Input is required." + "message": "Girdi gerekli." }, "required": { - "message": "required" + "message": "gerekli" }, "search": { "message": "Ara" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "Girdi en az $COUNT$ karakter uzunluğunda olmalÄądÄąr.", "placeholders": { "count": { "content": "$1", @@ -2322,7 +3355,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "Girdi $COUNT$ karakter uzunluğunu geçmemelidir.", "placeholders": { "count": { "content": "$1", @@ -2331,7 +3364,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "Şu karakterlere izin verilmez: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "Girdi değeri en fazla $MAX$ olmalÄą.", "placeholders": { "max": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "Bir veya daha fazla e-posta geçersiz" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "Girdi yalnÄązca boşluktan ibaret olamaz.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "Girdi bir e-posta adresi değil." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "YukarÄądaki $COUNT$ alanla ilgilenmeniz gerekiyor.", "placeholders": { "count": { "content": "$1", @@ -2376,14 +3409,26 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 alanla ilgilenmeniz gerekiyor." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ alanla ilgilenmeniz gerekiyor.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Seçin --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- Filtrelemek için yazÄąn --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "Seçenekler alÄąnÄąyor..." }, "multiSelectNotFound": { "message": "Hiç kayÄąt bulunamadÄą" @@ -2392,7 +3437,7 @@ "message": "TÃŧmÃŧnÃŧ temizle" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ tane daha", "placeholders": { "quantity": { "content": "$1", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "Alt menÃŧ" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "DaraltmayÄą aç/kapat", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Verileriniz Bitwarden'a aktarÄąlsÄąn mÄą?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "LastPass verileriniz korunsun ve Bitwarden'a aktarÄąlsÄąn mÄą?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Şifrelenmemiş dosya olarak kaydet", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Bitwarden'a aktar", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "İçe aktarÄąlÄąyor...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Veriler başarÄąyla içe aktarÄąldÄą!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "İçe aktarma hatasÄą. AyrÄąntÄąlar için konsolu kontrol edin.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "İçe aktarma sÄąrasÄąnda ağ hatasÄąyla karÅŸÄąlaÅŸÄąldÄą.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "Alias alan adÄą" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "Ana parolayÄą yeniden isteyen kayÄątlar sayfa yÃŧklendiğinde otomatik olarak doldurulamaz. Sayfa yÃŧklendiğinde otomatik doldurma kapatÄąldÄą.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Sayfa yÃŧklendiğinde otomatik doldurma, varsayÄąlan ayarÄą kullanacak şekilde ayarlandÄą.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Bu alanÄą dÃŧzenlemek için ana parolayÄą yeniden istemeyi kapatÄąn", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Kenar menÃŧsÃŧnÃŧ aç/kapat" + }, + "skipToContent": { + "message": "İçeriğe geç" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden otomatik doldurma menÃŧsÃŧ dÃŧğmesi", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Bitwarden otomatik doldurma menÃŧsÃŧnÃŧ aç/kapat", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden otomatik doldurma menÃŧsÃŧ", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "Eşleşen hesaplarÄąnÄązÄą gÃļrmek için hesabÄąnÄązÄąn kilidini aÃ§Äąn", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Otomatik doldurma Ãļnerilerini gÃļrmek için hesabÄąnÄązÄąn kilidini aÃ§Äąn", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "Hesap kilidini aç", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Bilgileri doldur", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "KÄąsmi kullanÄącÄą adÄą", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "GÃļsterilecek kayÄąt yok", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Yeni kayÄąt", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Kasaya yeni kayÄąt ekle", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Yeni hesap", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Yeni kart", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "Yeni kimlik", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden otomatik doldurma menÃŧsÃŧ mevcut. Seçmek için aşağı ok tuşuna basÄąn.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Aç" + }, + "ignore": { + "message": "Yok say" + }, + "importData": { + "message": "Verileri içe aktar", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "İçe aktarma hatasÄą" + }, + "importErrorDesc": { + "message": "İçe aktarmaya çalÄąÅŸtığınÄąz verilerle ilgili bir problem var. LÃŧtfen kaynak dosyanÄązdaki aşağıda belirtilen hatalarÄą çÃļzÃŧp tekrar deneyin." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "Aşağıdaki hatalarÄą dÃŧzeltip yeniden deneyin." + }, + "description": { + "message": "AÃ§Äąklama" + }, + "importSuccess": { + "message": "Veriler başarÄąyla içe aktarÄąldÄą" + }, + "importSuccessNumberOfItems": { + "message": "Toplam $AMOUNT$ kayÄąt içe aktarÄąldÄą.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Yeniden dene" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Bu işlem için doğrulama gerekiyor. Devam etmek için bir PIN belirleyin." + }, + "setPin": { + "message": "PIN belirle" + }, + "verifyWithBiometrics": { + "message": "Biyometri ile doğrula" + }, + "awaitingConfirmation": { + "message": "Onay bekleniyor" + }, + "couldNotCompleteBiometrics": { + "message": "Biyometri işlemi tamamlanamadÄą." + }, + "needADifferentMethod": { + "message": "FarklÄą bir yÃļnteme mi ihtiyacÄąnÄąz var?" + }, + "useMasterPassword": { + "message": "Ana parolayÄą kullan" + }, + "usePin": { + "message": "PIN kullan" + }, + "useBiometrics": { + "message": "Biyometri kullan" + }, + "enterVerificationCodeSentToEmail": { + "message": "E-posta adresinize gÃļnderilen doğrulama kodunu girin." + }, + "resendCode": { + "message": "Kodu yeniden gÃļnder" + }, + "total": { + "message": "Toplam" + }, + "importWarning": { + "message": "$ORGANIZATION$ kuruluşuna veri aktarÄąyorsunuz. Verileriniz bu kuruluşun Ãŧyeleriyle paylaÅŸÄąlabilir. Devam etmek istiyor musunuz?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "Duo'yu aÃ§Äąn ve girişi tamamlamak için adÄąmlarÄą izleyin." + }, + "duoRequiredForAccount": { + "message": "HesabÄąnÄąz için Duo iki adÄąmlÄą giriş gereklidir." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Giriş işlemini tamamlamak için uzantÄąyÄą dÄąÅŸarÄą alÄąn." + }, + "popoutExtension": { + "message": "UzantÄąyÄą dÄąÅŸarÄą al" + }, + "launchDuo": { + "message": "Duo'yu aç" + }, + "importFormatError": { + "message": "Veriler doğru biçimlendirilmemiş. LÃŧtfen içe aktarma dosyanÄązÄą kontrol edin ve tekrar deneyin." + }, + "importNothingError": { + "message": "Hiçbir şey içe aktarÄąlmadÄą." + }, + "importEncKeyError": { + "message": "DÄąÅŸa aktarÄąlmÄąÅŸ dosya çÃļzÃŧlemedi. Şifreleme anahtarÄąnÄąz, veriler dÄąÅŸa aktarÄąlÄąrken kullanÄąlanla uyuşmuyor." + }, + "invalidFilePassword": { + "message": "Geçersiz dosya parolasÄą. LÃŧtfen dÄąÅŸa aktardığınÄąz dosyayÄą oluştururken girdiğiniz parolayÄą kullanÄąn." + }, + "destination": { + "message": "Hedef" + }, + "learnAboutImportOptions": { + "message": "İçe aktarma seçeneklerinizi Ãļğrenin" + }, + "selectImportFolder": { + "message": "Bir klasÃļr seçin" + }, + "selectImportCollection": { + "message": "Bir koleksiyon seçin" + }, + "importTargetHint": { + "message": "İçe aktarÄąlan dosya içeriklerinin $DESTINATION$ konumuna taÅŸÄąnmasÄąnÄą istiyorsanÄąz bu seçeneği seçin", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Dosya atanmamÄąÅŸ Ãļğeler içeriyor." + }, + "selectFormat": { + "message": "İçe aktarma dosyasÄąnÄąn biçimini seçin" + }, + "selectImportFile": { + "message": "İçe aktarma dosyasÄąnÄą seçin" + }, + "chooseFile": { + "message": "Dosya seçin" + }, + "noFileChosen": { + "message": "Dosya seçilmedi" + }, + "orCopyPasteFileContents": { + "message": "veya içe aktarma dosyasÄąnÄąn içeriğini kopyalayÄąp yapÄąÅŸtÄąrÄąn" + }, + "instructionsFor": { + "message": "$NAME$ TalimatlarÄą", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "KasayÄą içe aktarmayÄą onaylayÄąn" + }, + "confirmVaultImportDesc": { + "message": "Bu dosya parola korumalÄądÄąr. Verileri içe aktarmak için lÃŧtfen dosya parolasÄąnÄą girin." + }, + "confirmFilePassword": { + "message": "Dosya parolasÄąnÄą onaylayÄąn" + }, + "exportSuccess": { + "message": "Kasa verileri dÄąÅŸa aktarÄąldÄą" + }, + "typePasskey": { + "message": "Geçiş anahtarÄą" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Geçiş anahtarÄą kopyalanmayacak" + }, + "passkeyNotCopiedAlert": { + "message": "Geçiş anahtarÄą klonlanan Ãļğeye kopyalanmayacaktÄąr. Bu Ãļğeyi klonlamaya devam etmek istiyor musunuz?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Site kimlik doğrulamasÄą gerektiriyor. Bu Ãļzellik henÃŧz ana parolasÄą olmayan hesaplarda kullanÄąlamaz." + }, + "logInWithPasskeyQuestion": { + "message": "Geçiş anahtarÄą ile giriş yapÄąlsÄąn mÄą?" + }, + "passkeyAlreadyExists": { + "message": "Bu uygulama için bir geçiş anahtarÄą zaten mevcut." + }, + "noPasskeysFoundForThisApplication": { + "message": "Bu uygulamaya ait hiç geçiş anahtarÄą bulunamadÄą." + }, + "noMatchingPasskeyLogin": { + "message": "Bu siteyle eşleşen hiç hesabÄąnÄąz yok." + }, + "noMatchingLoginsForSite": { + "message": "Bu siteyle eşleşen hesap bulunamadÄą" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "Onayla" + }, + "savePasskey": { + "message": "Geçiş anahtarÄąnÄą kaydet" + }, + "savePasskeyNewLogin": { + "message": "Geçiş anahtarÄąnÄą yeni hesap olarak kaydet" + }, + "chooseCipherForPasskeySave": { + "message": "Bu geçiş anahtarÄąnÄąn kaydedileceği hesabÄą seçin" + }, + "chooseCipherForPasskeyAuth": { + "message": "Giriş yapÄąlacak geçiş anahtarÄąnÄą seçin" + }, + "passkeyItem": { + "message": "Geçiş anahtarÄą kaydÄą" + }, + "overwritePasskey": { + "message": "Geçiş anahtarÄąnÄąn Ãŧzerine yazÄąlsÄąn mÄą?" + }, + "overwritePasskeyAlert": { + "message": "Bu kayÄąt zaten bir geçiş anahtarÄą içeriyor. Mevcut geçiş anahtarÄąnÄąn Ãŧzerine yazmak istediğinizden emin misiniz?" + }, + "featureNotSupported": { + "message": "Bu Ãļzellik henÃŧz desteklenmiyor" + }, + "yourPasskeyIsLocked": { + "message": "Geçiş anahtarÄąnÄą kullanmak için kimlik doğrulama gerekiyor. Devam etmek için kimliğinizi doğrulayÄąn." + }, + "multifactorAuthenticationCancelled": { + "message": "Çok faktÃļrlÃŧ kimlik doğrulama iptal edildi" + }, + "noLastPassDataFound": { + "message": "LastPass verisi bulunamadÄą" + }, + "incorrectUsernameOrPassword": { + "message": "KullanÄącÄą adÄą veya parola yanlÄąÅŸ" + }, + "incorrectPassword": { + "message": "YanlÄąÅŸ parola" + }, + "incorrectCode": { + "message": "YanlÄąÅŸ kod" + }, + "incorrectPin": { + "message": "YanlÄąÅŸ PIN" + }, + "multifactorAuthenticationFailed": { + "message": "Çok faktÃļrlÃŧ kimlik doğrulama başarÄąsÄąz oldu" + }, + "includeSharedFolders": { + "message": "PaylaÅŸÄąlan klasÃļrleri dahil et" + }, + "lastPassEmail": { + "message": "LastPass E-postasÄą" + }, + "importingYourAccount": { + "message": "HesabÄąnÄąz içe aktarÄąlÄąyor..." + }, + "lastPassMFARequired": { + "message": "LastPass çok faktÃļrlÃŧ kimlik doğrulamasÄą gerekli" + }, + "lastPassMFADesc": { + "message": "Kimlik doğrulama uygulamanÄązdaki tek kullanÄąmlÄąk kodu girin" + }, + "lastPassOOBDesc": { + "message": "Kimlik doğrulama uygulamanÄązda oturum açma isteğini onaylayÄąn veya tek kullanÄąmlÄąk kodu girin." + }, + "passcode": { + "message": "Kod" + }, + "lastPassMasterPassword": { + "message": "LastPass ana parolasÄą" + }, + "lastPassAuthRequired": { + "message": "LastPass kimlik doğrulamasÄą gerekli" + }, + "awaitingSSO": { + "message": "SSO kimlik doğrulamasÄą bekleniyor" + }, + "awaitingSSODesc": { + "message": "LÃŧtfen şirket hesabÄąnÄązla giriş yapmaya devam edin." + }, + "seeDetailedInstructions": { + "message": "AyrÄąntÄąlÄą talimatlarÄą yardÄąm sitemizde bulabilirsiniz:", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Doğrudan LastPass'ten içe aktar" + }, + "importFromCSV": { + "message": "CSV'den içe aktar" + }, + "lastPassTryAgainCheckEmail": { + "message": "Tekrar deneyin veya LastPass'ten gelecek kimlik doğrulama e-postasÄąnÄą kontrol edin." + }, + "collection": { + "message": "Koleksiyon" + }, + "lastPassYubikeyDesc": { + "message": "LastPass hesabÄąnÄązla ilişkili YubiKey'i bilgisayarÄąnÄązÄąn USB portuna takÄąp dÃŧğmesine dokunun." + }, + "switchAccount": { + "message": "HesabÄą değiştir" + }, + "switchAccounts": { + "message": "HesaplarÄą değiştir" + }, + "switchToAccount": { + "message": "Hesaba geç" + }, + "activeAccount": { + "message": "Aktif hesap" + }, + "availableAccounts": { + "message": "Mevcut hesaplar" + }, + "accountLimitReached": { + "message": "Hesap sÄąnÄąrÄąna ulaştÄąnÄąz. Yeni hesap eklemek için hesaplardan birinden Ã§ÄąkÄąÅŸ yapÄąn." + }, + "active": { + "message": "aktif" + }, + "locked": { + "message": "kilitli" + }, + "unlocked": { + "message": "kilitli değil" + }, + "server": { + "message": "sunucu" + }, + "hostedAt": { + "message": "konum" + }, + "useDeviceOrHardwareKey": { + "message": "CihazÄąmÄą veya anahtar donanÄąmÄąmÄą kullanacağım" + }, + "justOnce": { + "message": "YalnÄązca bir defa" + }, + "alwaysForThisSite": { + "message": "Bu site için her zaman" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ hariç tutulan alan adlarÄąna eklendi.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "SÄąk kullanÄąlan biçimler", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "TarayÄącÄą ayarlarÄąna gidilsin mi?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "YardÄąm merkezine gitmek ister misiniz?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Bitwarden varsayÄąlan parola yÃļneticiniz yapÄąlsÄąn mÄą?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Bu seçeneği gÃļz ardÄą ederseniz Bitwarden otomatik doldurma menÃŧsÃŧyle tarayÄącÄąnÄązÄąnki arasÄąnda çakÄąÅŸma yaşanabilir.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Bitwarden'Äą varsayÄąlan parola yÃļneticiniz yapÄąn", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Bitwarden varsayÄąlan parola yÃļneticisi olarak ayarlanamadÄą", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "Bitwarden'Äą varsayÄąlan parola yÃļneticisi olarak ayarlamak için tarayÄącÄą gizlilik izinlerini vermeniz gerekir.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "VarsayÄąlan yap", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Kimlik bilgileri başarÄąyla kaydedildi!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Parola kaydedildi!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Kimlik bilgileri başarÄąyla gÃŧncellendi!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Parola gÃŧncellendi!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Kimlik bilgileri kaydedilirken hata oluştu. AyrÄąntÄąlar için konsolu kontrol edin.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "BaşarÄąlÄą" + }, + "removePasskey": { + "message": "Geçiş anahtarÄąnÄą kaldÄąr" + }, + "passkeyRemoved": { + "message": "Geçiş anahtarÄą kaldÄąrÄąldÄą" + }, + "autofillSuggestions": { + "message": "Önerileri otomatik doldur" + }, + "autofillSuggestionsTip": { + "message": "Otomatik doldurma için bu siteye ait bir hesap kaydededin" + }, + "yourVaultIsEmpty": { + "message": "KasanÄąz boş" + }, + "noItemsMatchSearch": { + "message": "AramanÄązla eşleşen kayÄąt yok" + }, + "clearFiltersOrTryAnother": { + "message": "Filtreleri temizleyin veya başka bir arama yapmayÄą deneyin" + }, + "copyInfoTitle": { + "message": "Bilgileri kopyala - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Notu kopyala - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "Diğer seçenekler, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "Diğer seçenekler - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "KaydÄą gÃļrÃŧntÃŧle - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Otomatik doldur - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Kopyalanacak değer yok" + }, + "assignToCollections": { + "message": "Koleksiyonlara ata" + }, + "copyEmail": { + "message": "E-postayÄą kopyala" + }, + "copyPhone": { + "message": "Telefonu kopyala" + }, + "copyAddress": { + "message": "Adresi kopyala" + }, + "adminConsole": { + "message": "YÃļnetici Konsolu" + }, + "accountSecurity": { + "message": "Hesap gÃŧvenliği" + }, + "notifications": { + "message": "Bildirimler" + }, + "appearance": { + "message": "GÃļrÃŧnÃŧm" + }, + "errorAssigningTargetCollection": { + "message": "Hedef koleksiyon atama hatasÄą." + }, + "errorAssigningTargetFolder": { + "message": "Hedef klasÃļr atama hatasÄą." + }, + "viewItemsIn": { + "message": "$NAME$ içindeki kayÄątlarÄą gÃļrÃŧntÃŧle", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "$NAME$ klasÃļrÃŧne dÃļn", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Yeni" + }, + "removeItem": { + "message": "$NAME$ klasÃļrÃŧnÃŧ kaldÄąr", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "KlasÃļrÃŧ olmayan kayÄątlar" + }, + "itemDetails": { + "message": "KayÄąt ayrÄąntÄąlarÄą" + }, + "itemName": { + "message": "KayÄąt adÄą" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Kuruluş pasifleştirilmiş" + }, + "owner": { + "message": "Sahibi" + }, + "selfOwnershipLabel": { + "message": "Siz", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Pasif kuruluşlardaki kayÄątlara erişilemez. Destek almak için kuruluş sahibinizle iletişime geçin." + }, + "additionalInformation": { + "message": "Ek bilgiler" + }, + "itemHistory": { + "message": "Öğe geçmişi" + }, + "lastEdited": { + "message": "Son dÃŧzenlenme" + }, + "ownerYou": { + "message": "Sahibi: Siz" + }, + "linked": { + "message": "BağlandÄą" + }, + "copySuccessful": { + "message": "Kopyalama başarÄąlÄą" + }, + "upload": { + "message": "YÃŧkle" + }, + "addAttachment": { + "message": "Dosya ekle" + }, + "maxFileSizeSansPunctuation": { + "message": "Maksimum dosya boyutu 500 MB'dir" + }, + "deleteAttachmentName": { + "message": "$NAME$ dosyasÄąnÄą sil", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "$NAME$ dosyasÄąnÄą indir", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Bu dosyayÄą kalÄącÄą olarak silmek istediğinizden emin misiniz?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filtreler" + }, + "personalDetails": { + "message": "Kişisel bilgiler" + }, + "identification": { + "message": "Kimlik" + }, + "contactInfo": { + "message": "İletişim bilgileri" + }, + "downloadAttachment": { + "message": "İndir - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "kart numarasÄąnÄąn sonu", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Hesap bilgileri" + }, + "authenticatorKey": { + "message": "Kimlik doğrulama anahtarÄą" + }, + "autofillOptions": { + "message": "Otomatik doldurma ayarlarÄą" + }, + "websiteUri": { + "message": "Web sitesi (URI)" + }, + "websiteUriCount": { + "message": "Web sitesi (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Web sitesi eklendi" + }, + "addWebsite": { + "message": "Web sitesi ekle" + }, + "deleteWebsite": { + "message": "Web sitesini sil" + }, + "defaultLabel": { + "message": "VarsayÄąlan ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "$WEBSITE$ eşleşme tespitini gÃļster", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "$WEBSITE$ eşleşme tespitini gizle", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Sayfa yÃŧklendiğinde otomatik doldur" + }, + "cardExpiredTitle": { + "message": "KartÄąn sÃŧresi dolmuş" + }, + "cardExpiredMessage": { + "message": "KartÄą yenilediyseniz kart bilgilerini gÃŧncelleyin" + }, + "cardDetails": { + "message": "Kart bilgileri" + }, + "cardBrandDetails": { + "message": "$BRAND$ bilgileri", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "AnimasyonlarÄą etkinleştir" + }, + "showAnimations": { + "message": "AnimasyonlarÄą gÃļster" + }, + "addAccount": { + "message": "Hesap ekle" + }, + "loading": { + "message": "YÃŧkleniyor" + }, + "data": { + "message": "Veri" + }, + "passkeys": { + "message": "Geçiş AnahtarlarÄą", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Parolalar", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Geçiş anahtarÄąyla giriş yap", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Ata" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Alan ekle" + }, + "add": { + "message": "Ekle" + }, + "fieldType": { + "message": "Alan tÃŧrÃŧ" + }, + "fieldLabel": { + "message": "Alan etiketi" + }, + "textHelpText": { + "message": "GÃŧvenlik sorusu gibi veriler için metin alanlarÄąnÄą kullanÄąn" + }, + "hiddenHelpText": { + "message": "Parola gibi hassas verileri için gizli alanlarÄą kullanÄąn" + }, + "checkBoxHelpText": { + "message": "Formlardaki onay kutularÄąnÄą (Ãļrn. \"e-posta adresimi hatÄąrla\") otomatik doldurmak isterseniz onay kutularÄąnÄą kullanÄąn" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "AlanÄą dÃŧzenle" + }, + "editFieldLabel": { + "message": "$LABEL$ alanÄąnÄą dÃŧzenle", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "$LABEL$ etiketini sil", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ eklendi", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Select collections to assign" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Successfully assigned collections" + }, + "nothingSelected": { + "message": "Hiçbir şey seçmediniz." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "KayÄątlar $ORGNAME$ kuruluşuna taÅŸÄąndÄą", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "KayÄąt $ORGNAME$ kuruluşuna taÅŸÄąndÄą", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "KayÄąt konumu" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "Dosya Send'leri" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Metin Send'leri" + }, + "bitwardenNewLook": { + "message": "Bitwarden'Äąn tasarÄąmÄą gÃŧncellendi!" + }, + "bitwardenNewLookDesc": { + "message": "Otomatik doldurma ve kasanÄązda arama yapma artÄąk eskisinden daha kolay. Yeni tasarÄąma gÃļz atmayÄą unutmayÄąn!" + }, + "accountActions": { + "message": "Hesap işlemleri" + }, + "showNumberOfAutofillSuggestions": { + "message": "Otomatik Ãļneri sayÄąsÄąnÄą uzantÄą simgesinde gÃļster" + }, + "systemDefault": { + "message": "Sistem varsayÄąlanÄą" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Bu ayara kurumsal ilke gereksinimleri uygulandÄą" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Yeniden dene" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum Ãļzel zaman aÅŸÄąmÄą 1 dakikadÄąr." + }, + "additionalContentAvailable": { + "message": "Ek içerikler mevcut" + }, + "fileSavedToDevice": { + "message": "Dosya cihaza kaydedildi. CihazÄąnÄązÄąn indirilenler klasÃļrÃŧnden yÃļnetebilirsiniz." + }, + "showCharacterCount": { + "message": "Karakter sayacÄąnÄą gÃļster" + }, + "hideCharacterCount": { + "message": "Karakter sayacÄąnÄą gizle" + }, + "itemsInTrash": { + "message": "ÇÃļp kutusundaki kayÄątlar" + }, + "noItemsInTrash": { + "message": "ÇÃļp kutusunda hiç kayÄąt yok" + }, + "noItemsInTrashDesc": { + "message": "Sildiğiniz kayÄątlar burada gÃļrÃŧnecek ve 30 gÃŧn sonra kalÄącÄą olarak silinecektir" + }, + "trashWarning": { + "message": "30 gÃŧnden uzun sÃŧre çÃļp kutusunda duran kayÄątlar otomatik olarak silinecektir" + }, + "restore": { + "message": "Geri yÃŧkle" + }, + "deleteForever": { + "message": "KalÄącÄą olarak sil" + }, + "noEditPermissions": { + "message": "Bu kaydÄą dÃŧzenleme yetkisine sahip değilsiniz" + }, + "authenticating": { + "message": "Kimlik doğrulanÄąyor" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 88a9dd902d2..f0de5d7f4d7 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden – ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bitwarden - ҆Đĩ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊиК Ņ– ĐąĐĩСĐēĐžŅˆŅ‚ĐžĐ˛ĐŊиК ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛ Đ´ĐģŅ Đ˛ŅŅ–Ņ… Đ˛Đ°ŅˆĐ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛.", - "description": "Extension description" + "message": "ВдоĐŧа, ĐŊа Ņ€ĐžĐąĐžŅ‚Ņ– Ņ‡Đ¸ в Đ´ĐžŅ€ĐžĐˇŅ–, Bitwarden ĐˇĐ°Ņ…Đ¸Ņ‰Đ°Ņ” Đ˛Đ°ŅˆŅ– ĐŋĐ°Ņ€ĐžĐģŅ–, ĐēĐģŅŽŅ‡Ņ– Đ´ĐžŅŅ‚ŅƒĐŋ҃ Ņ‚Đ° ĐēĐžĐŊŅ„Ņ–Đ´ĐĩĐŊŅ†Ņ–ĐšĐŊ҃ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° ŅƒĐ˛Ņ–ĐšĐ´Ņ–Ņ‚ŅŒ в ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ, айО ŅŅ‚Đ˛ĐžŅ€Ņ–Ņ‚ŅŒ ĐŊОвиК." }, + "inviteAccepted": { + "message": "ЗаĐŋŅ€ĐžŅˆĐĩĐŊĐŊŅ ĐŋŅ€Đ¸ĐšĐŊŅŅ‚Đž" + }, "createAccount": { "message": "ĐĄŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ" }, - "login": { - "message": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸" + "newToBitwarden": { + "message": "ВĐŋĐĩŅ€ŅˆĐĩ ҃ Bitwarden?" + }, + "logInWithPasskey": { + "message": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸ С ĐēĐģŅŽŅ‡ĐĩĐŧ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "useSingleSignOn": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ Ņ”Đ´Đ¸ĐŊиК Đ˛Ņ…Ņ–Đ´" + }, + "welcomeBack": { + "message": "З ĐŋОвĐĩŅ€ĐŊĐĩĐŊĐŊŅĐŧ" + }, + "setAStrongPassword": { + "message": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ĐŊĐ°Đ´Ņ–ĐšĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "ЗавĐĩŅ€ŅˆŅ–Ņ‚ŅŒ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ, Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ¸ ĐŋĐ°Ņ€ĐžĐģҌ" }, "enterpriseSingleSignOn": { "message": "ЄдиĐŊиК ĐēĐžŅ€ĐŋĐžŅ€Đ°Ņ‚Đ¸Đ˛ĐŊиК Đ˛Ņ…Ņ–Đ´ (SSO)" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "Đ¯ĐēŅ‰Đž ви ĐˇĐ°ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ, ĐŋŅ–Đ´ĐēаСĐēа ĐŧĐžĐļĐĩ Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸ ваĐŧ ĐˇĐŗĐ°Đ´Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž." }, + "masterPassHintText": { + "message": "ĐŖ Ņ€Đ°ĐˇŅ– Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģŅ, ĐŧĐžĐļĐŊа ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐŋŅ–Đ´ĐēаСĐē҃ ĐŊа Đ˛Đ°ŅˆŅƒ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊ҃ ĐŋĐžŅˆŅ‚Ņƒ. МаĐēŅĐ¸Đŧ҃Đŧ $CURRENT$/$MAXIMUM$ ŅĐ¸ĐŧвОĐģŅ–Đ˛.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ҉Đĩ Ņ€Đ°Đˇ" }, "masterPassHint": { "message": "ĐŸŅ–Đ´ĐēаСĐēа Đ´ĐģŅ ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ (ĐŊĐĩОйОв'ŅĐˇĐēОвО)" }, + "joinOrganization": { + "message": "ĐŸŅ€Đ¸Ņ”Đ´ĐŊĐ°Ņ‚Đ¸ŅŅ Đ´Đž ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—" + }, + "joinOrganizationName": { + "message": "ĐŸŅ€Đ¸Ņ”Đ´ĐŊĐ°Ņ‚Đ¸ŅŅ Đ´Đž $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "ЗавĐĩŅ€ŅˆŅ–Ņ‚ŅŒ ĐŋŅ€Đ¸Ņ”Đ´ĐŊаĐŊĐŊŅ Đ´Đž ҆ҖҔҗ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—, Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ¸ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ." + }, "tab": { "message": "ВĐēĐģадĐēа" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ" }, + "copyPassphrase": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌĐŊ҃ Ņ„Ņ€Đ°ĐˇŅƒ" + }, "copyNote": { "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŊĐžŅ‚Đ°Ņ‚Đē҃" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐēОд ĐąĐĩСĐŋĐĩĐēи" }, + "copyName": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ Ņ–Đŧ'Ņ" + }, + "copyCompany": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧĐŋаĐŊŅ–ŅŽ" + }, + "copySSN": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŊĐžĐŧĐĩŅ€ ŅĐžŅ†Ņ–Đ°ĐģҌĐŊĐžĐŗĐž ŅŅ‚Ņ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅ" + }, + "copyPassportNumber": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŊĐžĐŧĐĩŅ€ ĐŋĐ°ŅĐŋĐžŅ€Ņ‚Đ°" + }, + "copyLicenseNumber": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŊĐžĐŧĐĩŅ€ ĐģҖ҆ĐĩĐŊĐˇŅ–Ņ—" + }, + "copyPrivateKey": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ СаĐēŅ€Đ¸Ņ‚Đ¸Đš ĐēĐģŅŽŅ‡" + }, + "copyPublicKey": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸Đš ĐēĐģŅŽŅ‡" + }, + "copyFingerprint": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ Đ˛Ņ–Đ´ĐąĐ¸Ņ‚ĐžĐē" + }, + "copyCustomField": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ вĐĩĐąŅĐ°ĐšŅ‚" + }, + "copyNotes": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŊĐžŅ‚Đ°Ņ‚Đēи" + }, + "fill": { + "message": "ЗаĐŋОвĐŊĐ¸Ņ‚Đ¸", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" }, + "autoFillLogin": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Đ˛Ņ…ĐžĐ´Ņƒ" + }, + "autoFillCard": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐēĐ°Ņ€Ņ‚Đēи" + }, + "autoFillIdentity": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊҌ" + }, "generatePasswordCopied": { "message": "ГĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ (С ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅĐŧ)" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "НĐĩĐŧĐ°Ņ” Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛" }, + "noCards": { + "message": "НĐĩĐŧĐ°Ņ” ĐēĐ°Ņ€Ņ‚ĐžĐē" + }, + "noIdentities": { + "message": "НĐĩĐŧĐ°Ņ” ĐžŅĐžĐąĐ¸ŅŅ‚Đ¸Ņ… даĐŊĐ¸Ņ…" + }, + "addLoginMenu": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ СаĐŋĐ¸Ņ Đ˛Ņ…ĐžĐ´Ņƒ" + }, + "addCardMenu": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐēĐ°Ņ€Ņ‚Đē҃" + }, + "addIdentityMenu": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ" + }, "unlockVaultMenu": { "message": "РОСйĐģĐžĐēŅƒĐšŅ‚Đĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ" }, @@ -115,6 +231,18 @@ "addItem": { "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ СаĐŋĐ¸Ņ" }, + "accountEmail": { + "message": "Е-ĐŋĐžŅˆŅ‚Đ° ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ" + }, + "requestHint": { + "message": "ĐŸŅ–Đ´ĐēаСĐēа Đ´ĐģŅ СаĐŋĐ¸Ņ‚Ņƒ" + }, + "requestPasswordHint": { + "message": "ĐŸŅ–Đ´ĐēаСĐēа Đ´ĐģŅ СаĐŋĐ¸Ņ‚Ņƒ ĐŋĐ°Ņ€ĐžĐģŅ" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ Đ°Đ´Ņ€Đĩҁ҃ Đĩ-ĐŋĐžŅˆŅ‚Đ¸ ŅĐ˛ĐžĐŗĐž ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Ņ– ваĐŧ ĐąŅƒĐ´Đĩ ĐŊĐ°Đ´Ņ–ŅĐģаĐŊĐž ĐŋŅ–Đ´ĐēаСĐē҃ Đ´ĐģŅ ĐŋĐ°Ņ€ĐžĐģŅ" + }, "passwordHint": { "message": "ĐŸŅ–Đ´ĐēаСĐēа Đ´ĐģŅ ĐŋĐ°Ņ€ĐžĐģŅ" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "ĐŸŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ŅŒŅ‚Đĩ ŅĐ˛ĐžŅ— ОйĐģŅ–ĐēĐžĐ˛Ņ– даĐŊŅ– Đ´ĐģŅ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ." }, - "account": { - "message": "ОбĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ" - }, "changeMasterPassword": { "message": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" }, + "continueToWebApp": { + "message": "ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸ ҃ вĐĩĐąĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ–?" + }, + "continueToWebAppDesc": { + "message": "ОзĐŊаКОĐŧŅ‚ĐĩŅŅ С Ņ–ĐŊŅˆĐ¸Đŧи Ņ„ŅƒĐŊĐēŅ†Ņ–ŅĐŧи Đ˛Đ°ŅˆĐžĐŗĐž ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Bitwarden ҃ вĐĩĐąĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ–." + }, + "continueToHelpCenter": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ Đ´Đž Đ´ĐžĐ˛Ņ–Đ´ĐēĐžĐ˛ĐžĐŗĐž ҆ĐĩĐŊŅ‚Ņ€Ņƒ?" + }, + "continueToHelpCenterDesc": { + "message": "Đ”Ņ–ĐˇĐŊĐ°ĐšŅ‚ĐĩŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž Ņ‚Đĩ, ŅĐē виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Bitwarden в Đ´ĐžĐ˛Ņ–Đ´ĐēОвОĐŧ҃ ҆ĐĩĐŊ҂ҀҖ." + }, + "continueToBrowserExtensionStore": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ Đ´Đž вĐĩĐąĐŧĐ°ĐŗĐ°ĐˇĐ¸ĐŊ҃ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊҌ?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "ДоĐŋĐžĐŧĐžĐļŅ–Ņ‚ŅŒ Ņ–ĐŊŅˆĐ¸Đŧ Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐŋŅ€Đž Bitwarden. Đ’Ņ–Đ´Đ˛Ņ–Đ´Đ°ĐšŅ‚Đĩ вĐĩĐąĐŧĐ°ĐŗĐ°ĐˇĐ¸ĐŊ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊҌ Đ´ĐģŅ Đ˛Đ°ŅˆĐžĐŗĐž ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ° Ņ– ĐŋĐžŅŅ‚Đ°Đ˛Ņ‚Đĩ ĐžŅ†Ņ–ĐŊĐē҃." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ҃ вĐĩĐąĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ– Bitwarden." + }, "fingerprintPhrase": { "message": "Đ¤Ņ€Đ°ĐˇĐ° Đ˛Ņ–Đ´ĐąĐ¸Ņ‚Đēа", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "Đ’Đ¸ĐšŅ‚Đ¸" }, + "aboutBitwarden": { + "message": "ĐŸŅ€Đž Bitwarden" + }, "about": { "message": "ĐŸŅ€Đž Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ" }, + "moreFromBitwarden": { + "message": "Đ‘Ņ–ĐģҌ҈Đĩ Đ˛Ņ–Đ´ Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸ ĐŊа bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden Đ´ĐģŅ ĐąŅ–ĐˇĐŊĐĩҁ҃" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "Bitwarden Authenticator дОСвОĐģŅŅ” СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ ĐēĐģŅŽŅ‡Ņ– Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ— Ņ‚Đ° ĐŗĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ОдĐŊĐžŅ€Đ°ĐˇĐžĐ˛Ņ– ĐēОди TOTP Đ´ĐģŅ двОĐĩŅ‚Đ°ĐŋĐŊĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи. Đ”Ņ–ĐˇĐŊĐ°ĐšŅ‚ĐĩŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž ҆Đĩ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚Ņ– bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "МĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ҁĐĩĐēŅ€ĐĩŅ‚Ņ–Đ˛ Bitwarden" + }, + "continueToSecretsManagerPageDesc": { + "message": "ĐĐ°Đ´Ņ–ĐšĐŊĐž СйĐĩŅ€Ņ–ĐŗĐ°ĐšŅ‚Đĩ ҁĐĩĐēŅ€ĐĩŅ‚ĐŊŅ– ĐēĐģŅŽŅ‡Ņ– Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēŅ–Đ˛ Ņ‚Đ° Đ´Ņ–ĐģŅ–Ņ‚ŅŒŅŅ ĐŊиĐŧи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€Đ° ҁĐĩĐēŅ€ĐĩŅ‚Ņ–Đ˛ Bitwarden. ДоĐēĐģадĐŊŅ–ŅˆĐĩ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚Ņ– bitwarden.com." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇŅƒĐšŅ‚Đĩ Ņ„ŅƒĐŊĐēŅ†Ņ–ĐžĐŊаĐģҌĐŊ҃ Ņ‚Đ° ĐąĐĩСĐŋĐĩ҇ĐŊ҃ Ņ€ĐžĐąĐžŅ‚Ņƒ ĐąĐĩС виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Ņ‚Ņ€Đ°Đ´Đ¸Ņ†Ņ–ĐšĐŊĐžĐŗĐž ĐŧĐĩŅ‚ĐžĐ´Ņƒ Đ˛Ņ…ĐžĐ´Ņƒ С ĐŋĐ°Ņ€ĐžĐģŅĐŧи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Passwordless.dev. Đ”Ņ–ĐˇĐŊĐ°ĐšŅ‚ĐĩŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚Ņ– bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "Bitwarden Families ĐąĐĩСĐŋĐģĐ°Ņ‚ĐŊĐž" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "ДĐģŅ Đ˛Đ°Ņ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа ĐąĐĩСĐŋĐģĐ°Ņ‚ĐŊа ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ Bitwarden Families. ĐžŅ‚Ņ€Đ¸ĐŧĐ°ĐšŅ‚Đĩ Ņ†ŅŽ ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–ŅŽ ҃ вĐĩĐąĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ–." + }, "version": { "message": "ВĐĩŅ€ŅŅ–Ņ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ" }, + "newFolder": { + "message": "Нова Ņ‚ĐĩĐēа" + }, + "folderName": { + "message": "Назва Ņ‚ĐĩĐēи" + }, + "folderHintText": { + "message": "Đ—Ņ€ĐžĐąŅ–Ņ‚ŅŒ Ņ‚ĐĩĐē҃ вĐēĐģадĐĩĐŊĐžŅŽ, вĐēĐ°ĐˇĐ°Đ˛ŅˆĐ¸ ĐŋҖҁĐģŅ ĐžŅĐŊОвĐŊĐžŅ— Ņ‚ĐĩĐēи \"/\". НаĐŋŅ€Đ¸ĐēĐģад: ĐžĐąĐŗĐžĐ˛ĐžŅ€ĐĩĐŊĐŊŅ/Đ¤ĐžŅ€ŅƒĐŧи" + }, + "noFoldersAdded": { + "message": "НĐĩĐŧĐ°Ņ” дОдаĐŊĐ¸Ņ… Ņ‚ĐĩĐē" + }, + "createFoldersToOrganize": { + "message": "ĐĄŅ‚Đ˛ĐžŅ€Ņ–Ņ‚ŅŒ Ņ‚ĐĩĐēи Đ´ĐģŅ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— СаĐŋĐ¸ŅŅ–Đ˛ ҃ ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–" + }, + "deleteFolderPermanently": { + "message": "Ви Đ´Ņ–ĐšŅĐŊĐž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž видаĐģĐ¸Ņ‚Đ¸ Ņ†ŅŽ Ņ‚ĐĩĐē҃?" + }, "deleteFolder": { "message": "ВидаĐģĐ¸Ņ‚Đ¸ Ņ‚ĐĩĐē҃" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐŗĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ‚Ņ–ĐšĐēĐ¸Ņ…, ҃ĐŊŅ–ĐēаĐģҌĐŊĐ¸Ņ… ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛." }, - "bitWebVault": { - "message": "ВĐĩĐą ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ Bitwarden" + "bitWebVaultApp": { + "message": "ВĐĩĐąĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Bitwarden" }, "importItems": { "message": "ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ СаĐŋĐ¸ŅĐ¸" @@ -235,6 +435,9 @@ "generatePassword": { "message": "ГĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ" }, + "generatePassphrase": { + "message": "ГĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌĐŊ҃ Ņ„Ņ€Đ°ĐˇŅƒ" + }, "regeneratePassword": { "message": "ГĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊОвиК" }, @@ -244,17 +447,60 @@ "length": { "message": "ДовĐļиĐŊа" }, + "passwordMinLength": { + "message": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊа дОвĐļиĐŊа ĐŋĐ°Ņ€ĐžĐģŅ" + }, "uppercase": { - "message": "ВĐĩҀ҅ĐŊŅ–Đš Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€ (A-Z)" + "message": "ВĐĩҀ҅ĐŊŅ–Đš Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "НиĐļĐŊŅ–Đš Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€ (a-z)" + "message": "НиĐļĐŊŅ–Đš Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€ (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Đ§Đ¸ŅĐģа (0-9)" + "message": "Đ§Đ¸ŅĐģа (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "ĐĄĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊŅ– ŅĐ¸ĐŧвОĐģи (!@#$%^&*)" + "message": "ĐĄĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊŅ– ŅĐ¸ĐŧвОĐģи (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "ХиĐŧвОĐģи вĐĩҀ҅ĐŊŅŒĐžĐŗĐž Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€Ņƒ", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "ХиĐŧвОĐģи ĐŊиĐļĐŊŅŒĐžĐŗĐž Ņ€ĐĩĐŗŅ–ŅŅ‚Ņ€Ņƒ", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "ĐĻĐ¸Ņ„Ņ€Đ¸", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "ĐĄĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊŅ– ŅĐ¸ĐŧвОĐģи", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ĐšŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ҁĐģŅ–Đ˛" @@ -276,7 +522,16 @@ "message": "ĐœŅ–ĐŊŅ–Đŧ҃Đŧ ҁĐŋĐĩŅ†Ņ–Đ°ĐģҌĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģŅ–Đ˛" }, "avoidAmbChar": { - "message": "ĐŖĐŊиĐēĐ°Ņ‚Đ¸ ĐŊĐĩОдĐŊОСĐŊĐ°Ņ‡ĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģŅ–Đ˛" + "message": "ĐŖĐŊиĐēĐ°Ņ‚Đ¸ ĐŊĐĩОдĐŊОСĐŊĐ°Ņ‡ĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģŅ–Đ˛", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "ĐŖĐŊиĐēĐ°Ņ‚Đ¸ ĐŊĐĩОдĐŊОСĐŊĐ°Ņ‡ĐŊĐ¸Ņ… ŅĐ¸ĐŧвОĐģŅ–Đ˛", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "До ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛Đ°ĐŊĐž виĐŧĐžĐŗĐ¸ ĐŋĐžĐģŅ–Ņ‚Đ¸Đēи ĐēĐžĐŧĐŋаĐŊŅ–Ņ—.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "ĐŸĐžŅˆŅƒĐē" @@ -299,15 +554,30 @@ "password": { "message": "ĐŸĐ°Ņ€ĐžĐģҌ" }, + "totp": { + "message": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐŊиК ĐēĐģŅŽŅ‡ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—" + }, "passphrase": { "message": "ĐŸĐ°Ņ€ĐžĐģҌĐŊа Ņ„Ņ€Đ°ĐˇĐ°" }, "favorite": { "message": "ĐžĐąŅ€Đ°ĐŊĐĩ" }, + "unfavorite": { + "message": "ВиĐģŅƒŅ‡Đ¸Ņ‚Đ¸ С ĐžĐąŅ€Đ°ĐŊĐžĐŗĐž" + }, + "itemAddedToFavorites": { + "message": "ЗаĐŋĐ¸Ņ дОдаĐŊĐž Đ´Đž ĐžĐąŅ€Đ°ĐŊĐžĐŗĐž" + }, + "itemRemovedFromFavorites": { + "message": "ЗаĐŋĐ¸Ņ виĐģŅƒŅ‡ĐĩĐŊĐž С ĐžĐąŅ€Đ°ĐŊĐžĐŗĐž" + }, "notes": { "message": "ĐĐžŅ‚Đ°Ņ‚Đēи" }, + "privateNote": { + "message": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊа ĐŊĐžŅ‚Đ°Ņ‚Đēа" + }, "note": { "message": "ĐĐžŅ‚Đ°Ņ‚Đēа" }, @@ -326,6 +596,18 @@ "launch": { "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸" }, + "launchWebsite": { + "message": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ вĐĩĐąŅĐ°ĐšŅ‚" + }, + "launchWebsiteName": { + "message": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ вĐĩĐąŅĐ°ĐšŅ‚ $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "ВĐĩĐąŅĐ°ĐšŅ‚" }, @@ -338,14 +620,29 @@ "other": { "message": "ІĐŊ҈Đĩ" }, + "unlockMethods": { + "message": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "НаĐģĐ°ŅˆŅ‚ŅƒĐšŅ‚Đĩ ҁĐŋĐžŅŅ–Đą Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰ĐžĐą СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°." }, + "unlockMethodNeeded": { + "message": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ҁĐŋĐžŅŅ–Đą Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ в ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ…" + }, + "sessionTimeoutHeader": { + "message": "Đ§Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ҁĐĩаĐŊҁ҃" + }, + "vaultTimeoutHeader": { + "message": "Đ§Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" + }, + "otherOptions": { + "message": "ІĐŊŅˆŅ– ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + }, "rateExtension": { "message": "ĐžŅ†Ņ–ĐŊĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ" }, "rateExtensionDesc": { - "message": "Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ĐŋĐžĐ´ŅƒĐŧĐ°ĐšŅ‚Đĩ ĐŋŅ€Đž Ņ‚Đĩ, Ņ‰ĐžĐą Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸ ĐŊаĐŧ Ņ…ĐžŅ€ĐžŅˆĐ¸Đŧ Đ˛Ņ–Đ´ĐŗŅƒĐēĐžĐŧ!" + "message": "РОСĐēаĐļŅ–Ņ‚ŅŒ Ņ–ĐŊŅˆĐ¸Đŧ ĐŋŅ€Đž ŅĐ˛ĐžŅ— Đ˛Ņ€Đ°ĐļĐĩĐŊĐŊŅ, СаĐģĐ¸ŅˆĐ¸Đ˛ŅˆĐ¸ Ņ…ĐžŅ€ĐžŅˆĐ¸Đš Đ˛Ņ–Đ´ĐŗŅƒĐē!" }, "browserNotSupportClipboard": { "message": "Đ’Đ°Ņˆ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ даĐŊĐ¸Ņ… в ĐąŅƒŅ„ĐĩŅ€ ОйĐŧŅ–ĐŊ҃. ĐĄĐēĐžĐŋŅ–ŅŽĐšŅ‚Đĩ Đ˛Ņ€ŅƒŅ‡ĐŊ҃." @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "Đ’Đ°ŅˆĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ СайĐģĐžĐēОваĐŊĐĩ. ДĐģŅ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅ виĐēĐžĐŊĐ°ĐšŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃." }, + "yourVaultIsLockedV2": { + "message": "Đ’Đ°ŅˆĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ СайĐģĐžĐēОваĐŊĐž" + }, + "yourAccountIsLocked": { + "message": "Đ’Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ СайĐģĐžĐēОваĐŊĐž" + }, + "or": { + "message": "айО" + }, "unlock": { "message": "РОСйĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "Đ§Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" }, + "vaultTimeout1": { + "message": "Đ§Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ" + }, "lockNow": { "message": "БĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸ ĐˇĐ°Ņ€Đ°Đˇ" }, + "lockAll": { + "message": "ЗабĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅĐĩ" + }, "immediately": { "message": "НĐĩĐŗĐ°ĐšĐŊĐž" }, @@ -426,6 +738,18 @@ "security": { "message": "БĐĩСĐŋĐĩĐēа" }, + "confirmMasterPassword": { + "message": "ĐŸŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ŅŒŅ‚Đĩ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "masterPassword": { + "message": "ГоĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "masterPassImportant": { + "message": "ГоĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩĐŧĐžĐļĐģивО Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸, ŅĐēŅ‰Đž ви ĐšĐžĐŗĐž Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ!" + }, + "masterPassHintLabel": { + "message": "ĐŸŅ–Đ´ĐēаСĐēа Đ´ĐģŅ ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ" + }, "errorOccurred": { "message": "ĐĄŅ‚Đ°ĐģĐ°ŅŅ ĐŋĐžĐŧиĐģĐēа" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Đ’Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊиК! ĐĸĐĩĐŋĐĩŅ€ ви ĐŧĐžĐļĐĩŅ‚Đĩ ŅƒĐ˛Ņ–ĐšŅ‚Đ¸." }, + "newAccountCreated2": { + "message": "Đ’Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐž!" + }, + "youHaveBeenLoggedIn": { + "message": "Ви ŅƒĐ˛Ņ–ĐšŅˆĐģи!" + }, + "youSuccessfullyLoggedIn": { + "message": "Ви ҃ҁĐŋŅ–ŅˆĐŊĐž ŅƒĐ˛Ņ–ĐšŅˆĐģи в ŅĐ¸ŅŅ‚ĐĩĐŧ҃" + }, + "youMayCloseThisWindow": { + "message": "МоĐļĐĩŅ‚Đĩ СаĐēŅ€Đ¸Ņ‚Đ¸ ҆Đĩ Đ˛Ņ–ĐēĐŊĐž" + }, "masterPassSent": { "message": "Ми ĐŊĐ°Đ´Ņ–ŅĐģаĐģи ваĐŧ ĐģĐ¸ŅŅ‚ С ĐŋŅ–Đ´ĐēаСĐēĐžŅŽ Đ´ĐģŅ ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ." }, "verificationCodeRequired": { "message": "ĐŸĐžŅ‚Ņ€Ņ–ĐąĐŊиК ĐēОд ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ." }, + "webauthnCancelOrTimeout": { + "message": "ĐĐ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ ĐąŅƒĐģĐž ҁĐēĐ°ŅĐžĐ˛Đ°ĐŊĐž айО вОĐŊа Ņ‚Ņ€Đ¸Đ˛Đ°Đģа ĐŊĐ°Đ´Ņ‚Đž Đ´ĐžĐ˛ĐŗĐž. ĐŸĐžĐ˛Ņ‚ĐžŅ€Ņ–Ņ‚ŅŒ ҁĐŋŅ€ĐžĐąŅƒ." + }, "invalidVerificationCode": { "message": "НĐĩĐ´Ņ–ĐšŅĐŊиК ĐēОд ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "НĐĩ Đ˛Đ´Đ°Ņ”Ņ‚ŅŒŅŅ СаĐŋОвĐŊĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ ĐŊа Ņ†Ņ–Đš ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ. ĐĄĐēĐžĐŋŅ–ŅŽĐšŅ‚Đĩ Ņ– Đ˛ŅŅ‚Đ°Đ˛Ņ‚Đĩ Ņ–Đŧ'Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° Ņ‚Đ°/айО ĐŋĐ°Ņ€ĐžĐģҌ." + "message": "НĐĩ Đ˛Đ´Đ°Ņ”Ņ‚ŅŒŅŅ СаĐŋОвĐŊĐ¸Ņ‚Đ¸ Đ˛Đ¸ĐąŅ€Đ°ĐŊиК СаĐŋĐ¸Ņ ĐŊа Ņ†Ņ–Đš ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ. ĐĄĐēĐžĐŋŅ–ŅŽĐšŅ‚Đĩ Ņ– Đ˛ŅŅ‚Đ°Đ˛Ņ‚Đĩ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ Đ˛Ņ€ŅƒŅ‡ĐŊ҃." + }, + "totpCaptureError": { + "message": "НĐĩĐŧĐžĐļĐģивО ҁĐēаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ QR-ĐēОд С ĐŋĐžŅ‚ĐžŅ‡ĐŊĐžŅ— ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи" + }, + "totpCaptureSuccess": { + "message": "КĐģŅŽŅ‡ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— дОдаĐŊĐž" + }, + "totpCapture": { + "message": "ĐĄĐēаĐŊŅƒĐšŅ‚Đĩ QR-ĐēОд ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐžŅŽ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—" + }, + "totpHelperTitle": { + "message": "ĐĄĐŋŅ€ĐžŅŅ‚Ņ–Ņ‚ŅŒ двОĐĩŅ‚Đ°ĐŋĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃" + }, + "totpHelper": { + "message": "Bitwarden ĐŧĐžĐļĐĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СаĐŋОвĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ОдĐŊĐžŅ€Đ°ĐˇĐžĐ˛Ņ– ĐēОди двОĐĩŅ‚Đ°ĐŋĐŊĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи. ĐĄĐēĐžĐŋŅ–ŅŽĐšŅ‚Đĩ Ņ– Đ˛ŅŅ‚Đ°Đ˛Ņ‚Đĩ ĐēĐģŅŽŅ‡ ҃ ҆Đĩ ĐŋĐžĐģĐĩ." + }, + "totpHelperWithCapture": { + "message": "Bitwarden ĐŧĐžĐļĐĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СаĐŋОвĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ОдĐŊĐžŅ€Đ°ĐˇĐžĐ˛Ņ– ĐēОди двОĐĩŅ‚Đ°ĐŋĐŊĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи. Đ’Ņ–Đ´ĐēŅ€Đ¸ĐšŅ‚Đĩ ĐēаĐŧĐĩŅ€Ņƒ, Ņ‰ĐžĐą ҁĐēаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ QR-ĐēОд ĐŊа Ņ†ŅŒĐžĐŧ҃ вĐĩĐąŅĐ°ĐšŅ‚Ņ–, айО ҁĐēĐžĐŋŅ–ŅŽĐšŅ‚Đĩ Ņ– Đ˛ŅŅ‚Đ°Đ˛Ņ‚Đĩ ĐēĐģŅŽŅ‡ ҃ ҆Đĩ ĐŋĐžĐģĐĩ." + }, + "learnMoreAboutAuthenticators": { + "message": "ДоĐēĐģадĐŊŅ–ŅˆĐĩ ĐŋŅ€Đž ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—" + }, + "copyTOTP": { + "message": "ĐĄĐēĐžĐŋŅ–ŅŽĐšŅ‚Đĩ ĐēĐģŅŽŅ‡ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— (TOTP)" }, "loggedOut": { "message": "Ви Đ˛Đ¸ĐšŅˆĐģи" }, + "loggedOutDesc": { + "message": "Ви Đ˛Đ¸ĐšŅˆĐģи С ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ." + }, "loginExpired": { "message": "ĐĸŅ€Đ¸Đ˛Đ°ĐģŅ–ŅŅ‚ŅŒ Đ˛Đ°ŅˆĐžĐŗĐž ҁĐĩаĐŊҁ҃ СавĐĩŅ€ŅˆĐ¸ĐģĐ°ŅŅŒ." }, + "logIn": { + "message": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸" + }, + "logInToBitwarden": { + "message": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸ в Bitwarden" + }, + "restartRegistration": { + "message": "ПĐĩŅ€ĐĩСаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ Ņ€ĐĩŅ”ŅŅ‚Ņ€Đ°Ņ†Ņ–ŅŽ" + }, + "expiredLink": { + "message": "ĐŸŅ€ĐžŅ‚ĐĩŅ€ĐŧŅ–ĐŊОваĐŊĐĩ ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "ПĐĩŅ€ĐĩСаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ Ņ€ĐĩŅ”ŅŅ‚Ņ€Đ°Ņ†Ņ–ŅŽ айО ҁĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đ˛Đ˛Ņ–ĐšŅ‚Đ¸." + }, + "youMayAlreadyHaveAnAccount": { + "message": "МоĐļĐģивО, ви вĐļĐĩ ĐˇĐ°Ņ€ĐĩŅ”ŅŅ‚Ņ€ĐžĐ˛Đ°ĐŊŅ–" + }, "logOutConfirmation": { "message": "Ви Đ´Ņ–ĐšŅĐŊĐž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ˛Đ¸ĐšŅ‚Đ¸?" }, @@ -498,19 +882,19 @@ "message": "ĐĄŅ‚Đ°ĐģĐ°ŅŅ ĐŊĐĩĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊа ĐŋĐžĐŧиĐģĐēа." }, "nameRequired": { - "message": "ĐŸĐžŅ‚Ņ€Ņ–ĐąĐŊа ĐŊаСва." + "message": "НĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ввĐĩŅŅ‚Đ¸ ĐŊĐ°ĐˇĐ˛Ņƒ." }, "addedFolder": { "message": "ĐĸĐĩĐē҃ дОдаĐŊĐž" }, - "changeMasterPass": { - "message": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" - }, - "changeMasterPasswordConfirmation": { - "message": "Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ в ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ– ĐŊа bitwarden.com. ĐĨĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚ ĐˇĐ°Ņ€Đ°Đˇ?" - }, "twoStepLoginConfirmation": { - "message": "ДвоĐĩŅ‚Đ°ĐŋĐŊа ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа Đ´Đ°Ņ” СĐŧĐžĐŗŅƒ ĐŊĐ°Đ´Ņ–ĐšĐŊŅ–ŅˆĐĩ ĐˇĐ°Ņ…Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Đ˛Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ, виĐŧĐ°ĐŗĐ°ŅŽŅ‡Đ¸ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ Đ˛Ņ…ĐžĐ´Ņƒ С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ Ņ–ĐŊŅˆĐžĐŗĐž ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ, ĐŊаĐŋŅ€Đ¸ĐēĐģад, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐžĐ´Ņƒ ĐąĐĩСĐŋĐĩĐēи, ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—, SMS, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊĐžĐŗĐž виĐēĐģиĐē҃, айО Đĩ-ĐŋĐžŅˆŅ‚Đ¸. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ двОĐĩŅ‚Đ°ĐŋĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃ в ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ– ĐŊа bitwarden.com. ĐĨĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚ ĐˇĐ°Ņ€Đ°Đˇ?" + "message": "ДвоĐĩŅ‚Đ°ĐŋĐŊа ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа Đ´Đ°Ņ” СĐŧĐžĐŗŅƒ ĐŊĐ°Đ´Ņ–ĐšĐŊŅ–ŅˆĐĩ ĐˇĐ°Ņ…Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Đ˛Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ, виĐŧĐ°ĐŗĐ°ŅŽŅ‡Đ¸ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ Đ˛Ņ…ĐžĐ´Ņƒ С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ Ņ–ĐŊŅˆĐžĐŗĐž ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ, ĐŊаĐŋŅ€Đ¸ĐēĐģад, Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐģŅŽŅ‡Đ° ĐąĐĩСĐŋĐĩĐēи, ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—, SMS, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊĐžĐŗĐž виĐēĐģиĐē҃, айО Đĩ-ĐŋĐžŅˆŅ‚Đ¸. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ двОĐĩŅ‚Đ°ĐŋĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃ в ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ– ĐŊа bitwarden.com. ĐĨĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚ ĐˇĐ°Ņ€Đ°Đˇ?" + }, + "twoStepLoginConfirmationContent": { + "message": "Đ”ĐžĐ´Đ°ĐšŅ‚Đĩ Đ˛Đ¸Ņ‰Đ¸Đš Ņ€Ņ–Đ˛ĐĩĐŊҌ ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ, ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Đ˛ŅˆĐ¸ двОĐĩŅ‚Đ°ĐŋĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃ ҃ вĐĩĐąĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ– Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸ ҃ вĐĩĐąĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ–?" }, "editedFolder": { "message": "ĐĸĐĩĐē҃ СйĐĩŅ€ĐĩĐļĐĩĐŊĐž" @@ -552,6 +936,10 @@ "newUri": { "message": "Новий URI" }, + "addDomain": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ´ĐžĐŧĐĩĐŊ", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "ЗаĐŋĐ¸Ņ дОдаĐŊĐž" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đž дОдаваĐŊĐŊŅ СаĐŋĐ¸ŅŅƒ" }, + "vaultSaveOptionsTitle": { + "message": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ Đ´Đž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" + }, "addLoginNotificationDesc": { "message": "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đž дОдаваĐŊĐŊŅ СаĐŋĐ¸ŅŅƒ, ŅĐēŅ‰Đž ĐšĐžĐŗĐž ĐŊĐĩĐŧĐ°Ņ” ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–." }, + "addLoginNotificationDescAlt": { + "message": "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đž дОдаваĐŊĐŊŅ СаĐŋĐ¸ŅŅƒ, ŅĐēŅ‰Đž Ņ‚Đ°ĐēĐžĐŗĐž ĐŊĐĩ СĐŊаКдĐĩĐŊĐž ҃ Đ˛Đ°ŅˆĐžĐŧ҃ ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–. Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅ–Ņ… ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛, Đ´Đž ŅĐēĐ¸Ņ… виĐēĐžĐŊаĐŊĐž Đ˛Ņ…Ņ–Đ´." + }, + "showCardsInVaultView": { + "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ€Ņ‚Đēи ŅĐē ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ— Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ в Ņ€ĐĩĐļиĐŧŅ– ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Ņƒ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" + }, "showCardsCurrentTab": { "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ€Ņ‚Đēи ĐŊа вĐēĐģĐ°Đ´Ņ†Ņ–" }, "showCardsCurrentTabDesc": { "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē ĐēĐ°Ņ€Ņ‚ĐžĐē ĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ вĐēĐģадĐēи Đ´ĐģŅ ĐģĐĩĐŗĐēĐžĐŗĐž Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ." }, + "showIdentitiesInVaultView": { + "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ ŅĐē ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ— Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ в Ņ€ĐĩĐļиĐŧŅ– ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Ņƒ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" + }, "showIdentitiesCurrentTab": { "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ ĐŊа вĐēĐģĐ°Đ´Ņ†Ņ–" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đž ĐžĐŊОвĐģĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐžĐģŅ СаĐŋĐ¸ŅŅƒ, ŅĐēŅ‰Đž ĐŊа вĐĩĐąŅĐ°ĐšŅ‚Ņ– Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐšĐžĐŗĐž СĐŧŅ–ĐŊ҃." }, + "changedPasswordNotificationDescAlt": { + "message": "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đž ĐžĐŊОвĐģĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐžĐģŅ Đ´ĐģŅ СаĐŋĐ¸ŅŅƒ, ŅĐēŅ‰Đž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž ĐšĐžĐŗĐž СĐŧŅ–ĐŊ҃ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚Ņ–. Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅ–Ņ… ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛, Đ´Đž ŅĐēĐ¸Ņ… виĐēĐžĐŊаĐŊĐž Đ˛Ņ…Ņ–Đ´." + }, + "enableUsePasskeys": { + "message": "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐēĐģŅŽŅ‡Ņ–Đ˛ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "usePasskeysDesc": { + "message": "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ ĐŊĐžĐ˛Đ¸Ņ… ĐēĐģŅŽŅ‡Ņ–Đ˛ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Ņ‚Đ° виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… ĐēĐģŅŽŅ‡Ņ–Đ˛ Đ´ĐžŅŅ‚ŅƒĐŋ҃. Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅ–Ņ… ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛, Đ´Đž ŅĐēĐ¸Ņ… виĐēĐžĐŊаĐŊĐž Đ˛Ņ…Ņ–Đ´." + }, "notificationChangeDesc": { "message": "Ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ҆ĐĩĐš ĐŋĐ°Ņ€ĐžĐģҌ в Bitwarden?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "РОСйĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸" }, + "additionalOptions": { + "message": "Đ”ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + }, "enableContextMenuItem": { "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ в ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐžĐŧ҃ ĐŧĐĩĐŊŅŽ" }, "contextMenuItemDesc": { - "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛ Ņ‚Đ° Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛ Đ´ĐģŅ вĐĩĐąŅĐ°ĐšŅ‚Ņƒ ҇ĐĩŅ€ĐĩС ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐĩ ĐŧĐĩĐŊŅŽ." + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐĩ ĐŧĐĩĐŊŅŽ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛ Ņ‚Đ° Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛ Đ´ĐģŅ вĐĩĐąŅĐ°ĐšŅ‚Ņƒ." + }, + "contextMenuItemDescAlt": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ĐŊĐĩ ĐŧĐĩĐŊŅŽ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛ Ņ‚Đ° Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛ Đ´ĐģŅ вĐĩĐąŅĐ°ĐšŅ‚Ņƒ. Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅ–Ņ… ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛, Đ´Đž ŅĐēĐ¸Ņ… виĐēĐžĐŊаĐŊĐž Đ˛Ņ…Ņ–Đ´." }, "defaultUriMatchDetection": { "message": "ĐĸиĐŋОвĐĩ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐˇĐąŅ–ĐŗŅ–Đ˛ URI", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ Ņ‚Đ¸ĐŋОвиК ҁĐŋĐžŅŅ–Đą Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐˇĐąŅ–ĐŗŅ–Đ˛ URI Đ´ĐģŅ виĐēĐžĐŊаĐŊĐŊŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Đ˛Ņ…ĐžĐ´Ņƒ." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐēĐžĐģŅ–Ņ€ĐŊ҃ Ņ‚ĐĩĐŧ҃ Đ´ĐžĐ´Đ°Ņ‚Đēа." }, + "themeDescAlt": { + "message": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐēĐžĐģŅ–Ņ€ĐŊ҃ Ņ‚ĐĩĐŧ҃ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи. Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅ–Ņ… ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛, Đ´Đž ŅĐēĐ¸Ņ… виĐēĐžĐŊаĐŊĐž Đ˛Ņ…Ņ–Đ´." + }, "dark": { "message": "ĐĸĐĩĐŧĐŊа", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "Solarized Ņ‚ĐĩĐŧĐŊа", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "ЕĐēҁĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ С" + }, "exportVault": { "message": "ЕĐēҁĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ" }, "fileFormat": { "message": "Đ¤ĐžŅ€ĐŧĐ°Ņ‚ Ņ„Đ°ĐšĐģ҃" }, + "fileEncryptedExportWarningDesc": { + "message": "ĐĻĐĩĐš ĐĩĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊиК Ņ„Đ°ĐšĐģ ĐąŅƒĐ´Đĩ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊиК ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ, ŅĐēиК ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ввĐĩŅŅ‚Đ¸ Đ´ĐģŅ ĐšĐžĐŗĐž Ņ€ĐžĐˇŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ." + }, + "filePassword": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģ҃" + }, + "exportPasswordDescription": { + "message": "ĐĻĐĩĐš ĐŋĐ°Ņ€ĐžĐģҌ ĐąŅƒĐ´Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐž Đ´ĐģŅ ĐĩĐēҁĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ° Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž Ņ„Đ°ĐšĐģ҃" + }, + "accountRestrictedOptionDescription": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐēĐģŅŽŅ‡ ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ ŅĐ˛ĐžĐŗĐž ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ, ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊиК ĐŊа ĐžŅĐŊĐžĐ˛Ņ– Ņ–ĐŧĐĩĐŊŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° Đš ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ, Ņ‰ĐžĐą ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐĩĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊŅ– даĐŊŅ– Ņ‚Đ° ОйĐŧĐĩĐļĐ¸Ņ‚Đ¸ ĐŧĐžĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ Đ´Đž ĐŋĐžŅ‚ĐžŅ‡ĐŊĐžĐŗĐž ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģ҃, Ņ‰ĐžĐą ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐĩĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊŅ– даĐŊŅ– Ņ‚Đ° Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đž ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŗĐž ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Bitwarden Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ†ŅŒĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ." + }, + "exportTypeHeading": { + "message": "ĐĸиĐŋ ĐĩĐēҁĐŋĐžŅ€Ņ‚Ņƒ" + }, + "accountRestricted": { + "message": "ОбĐŧĐĩĐļĐĩĐŊĐž ОйĐģŅ–ĐēОвиĐŧ СаĐŋĐ¸ŅĐžĐŧ" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģ҃ Ņ‚Đ° ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐžĐģŅ Đ˛Ņ–Đ´Ņ€Ņ–ĐˇĐŊŅŅŽŅ‚ŅŒŅŅ." + }, "warning": { "message": "ĐŸĐžĐŸĐ•Đ Đ•Đ”Đ–Đ•ĐĐĐ¯", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "ĐĄĐŋŅ–ĐģҌĐŊŅ–" }, - "learnOrg": { - "message": "ДоĐēĐģадĐŊŅ–ŅˆĐĩ ĐŋŅ€Đž ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—" - }, - "learnOrgConfirmation": { - "message": "Bitwarden дОСвОĐģŅŅ” ваĐŧ ĐŊĐ°Đ´Đ°Đ˛Đ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž СаĐŋĐ¸ŅŅ–Đ˛ ŅĐ˛ĐžĐŗĐž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° Ņ–ĐŊŅˆĐ¸Đŧ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. БаĐļĐ°Ņ”Ņ‚Đĩ ĐŋĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа вĐĩĐą-ŅĐ°ĐšŅ‚ bitwarden.com, Ņ‰ĐžĐą Đ´Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐąŅ–ĐģҌ҈Đĩ?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden Đ´ĐģŅ ĐąŅ–ĐˇĐŊĐĩҁ҃ дОСвОĐģŅŅ” Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž СаĐŋĐ¸ŅŅ–Đ˛ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° ҁĐŋŅ–ĐģҌĐŊĐž С Ņ–ĐŊŅˆĐ¸Đŧи ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°Đŧи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. Đ”Ņ–ĐˇĐŊĐ°ĐšŅ‚ĐĩŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž ҆Đĩ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚Ņ– bitwarden.com." }, "moveToOrganization": { "message": "ПĐĩŅ€ĐĩĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Đ´Đž ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—" @@ -730,7 +1172,7 @@ "message": "ДоĐēĐģадĐŊŅ–ŅˆĐĩ" }, "authenticatorKeyTotp": { - "message": "КĐģŅŽŅ‡ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ— (TOTP)" + "message": "КĐģŅŽŅ‡ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— (TOTP)" }, "verificationCodeTotp": { "message": "Код ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ (TOTP)" @@ -762,6 +1204,9 @@ "file": { "message": "ФаКĐģ" }, + "fileToShare": { + "message": "ФаКĐģ Đ´ĐģŅ ĐŋĐžŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ" + }, "selectFile": { "message": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„Đ°ĐšĐģ" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 ГБ ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐžĐŗĐž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° Đ´ĐģŅ Ņ„Đ°ĐšĐģŅ–Đ˛." }, + "premiumSignUpEmergency": { + "message": "ЕĐēҁ҂ҀĐĩĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ." + }, "premiumSignUpTwoStepOptions": { "message": "Đ”ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛Ņ– ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– двОĐĩŅ‚Đ°ĐŋĐŊĐžŅ— Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—, ŅĐē-ĐžŅ‚ YubiKey Ņ‚Đ° Duo." }, @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐ´ĐŋĐģĐ°Ņ‚Đ¸Ņ‚Đ¸ ĐŋŅ€ĐĩĐŧŅ–ŅƒĐŧ ҃ ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ– ĐŊа bitwarden.com. ĐĨĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐšŅ‚Đ¸ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚ ĐˇĐ°Ņ€Đ°Đˇ?" }, + "premiumPurchaseAlertV2": { + "message": "Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋŅ€Đ¸Đ´ĐąĐ°Ņ‚Đ¸ ĐŸŅ€ĐĩĐŧŅ–ŅƒĐŧ ҃ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ… ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ вĐĩĐąĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ– Bitwarden." + }, "premiumCurrentMember": { "message": "Ви ĐēĐžŅ€Đ¸ŅŅ‚ŅƒŅ”Ņ‚ĐĩŅŅ ĐŋĐĩŅ€ĐĩĐ´ĐŋĐģĐ°Ņ‚ĐžŅŽ ĐŋŅ€ĐĩĐŧŅ–ŅƒĐŧ!" }, "premiumCurrentMemberThanks": { "message": "Đ”ŅĐēŅƒŅ”ĐŧĐž Са ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃ Bitwarden." }, + "premiumFeatures": { + "message": "ПĐĩŅ€ĐĩĐ´ĐŋĐģĐ°Ņ‚Ņ–Ņ‚ŅŒ ĐŋŅ€ĐĩĐŧŅ–ŅƒĐŧ Ņ‚Đ° ĐžŅ‚Ņ€Đ¸ĐŧĐ°ĐšŅ‚Đĩ:" + }, "premiumPrice": { "message": "Đ’ŅŅŒĐžĐŗĐž ĐģĐ¸ŅˆĐĩ $PRICE$ / Са ҀҖĐē!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "ĐŖŅĐĩ ĐģĐ¸ŅˆĐĩ Са $PRICE$ ĐŊа ҀҖĐē!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "ОĐŊОвĐģĐĩĐŊĐŊŅ СавĐĩŅ€ŅˆĐĩĐŊĐž" }, @@ -838,7 +1301,7 @@ "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐēĐžĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐēОди TOTP" }, "disableAutoTotpCopyDesc": { - "message": "Đ¯ĐēŅ‰Đž СаĐŋĐ¸Ņ ĐŧĐ°Ņ” ĐēĐģŅŽŅ‡ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—, ĐēĐžĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐēОд ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ TOTP Đ´Đž ĐąŅƒŅ„ĐĩŅ€Đ° ОйĐŧŅ–ĐŊ҃ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ." + "message": "Đ¯ĐēŅ‰Đž СаĐŋĐ¸Ņ ĐŧĐ°Ņ” ĐēĐģŅŽŅ‡ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—, ĐēĐžĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐēОд ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ TOTP Đ´Đž ĐąŅƒŅ„ĐĩŅ€Đ° ОйĐŧŅ–ĐŊ҃ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ." }, "enableAutoBiometricsPrompt": { "message": "ЗаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐžĐŧĐĩŅ‚Ņ€Ņ–ŅŽ ĐŋŅ–Đ´ Ņ‡Đ°Ņ СаĐŋ҃ҁĐē҃" @@ -850,7 +1313,7 @@ "message": "ДĐģŅ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ҆ҖҔҗ Ņ„ŅƒĐŊĐē҆Җҗ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊа ĐŋĐĩŅ€ĐĩĐ´ĐŋĐģĐ°Ņ‚Đ° ĐŋŅ€ĐĩĐŧŅ–ŅƒĐŧ." }, "enterVerificationCodeApp": { - "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ 6-СĐŊĐ°Ņ‡ĐŊиК ĐēОд ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ С ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—." + "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ 6-СĐŊĐ°Ņ‡ĐŊиК ĐēОд ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ С ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—." }, "enterVerificationCodeEmail": { "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ 6-СĐŊĐ°Ņ‡ĐŊиК ĐēОд ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ, ĐŊĐ°Đ´Ņ–ŅĐģаĐŊиК ĐŊа $EMAIL$.", @@ -892,7 +1355,7 @@ "message": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ĐŊĐžĐ˛Ņƒ вĐēĐģадĐē҃" }, "webAuthnAuthenticate": { - "message": "ĐĐ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ WebAuthn" + "message": "ĐĐ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ WebAuthn" }, "loginUnavailable": { "message": "Đ’Ņ…Ņ–Đ´ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиК" @@ -901,7 +1364,7 @@ "message": "ДĐģŅ Ņ†ŅŒĐžĐŗĐž ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž двОĐĩŅ‚Đ°ĐŋĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃. ОдĐŊаĐē, ĐļОдĐĩĐŊ Ņ–Đˇ ĐŊаĐģĐ°ŅˆŅ‚ĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Ņ–Đ˛ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ Ņ†Đ¸Đŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ĐžĐŧ." }, "noTwoStepProviders2": { - "message": "Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐšŅ‚ĐĩŅŅ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°ĐŊиĐŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ĐžĐŧ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, Chrome) Ņ‚Đ°/айО Ņ–ĐŊŅˆĐ¸Đŧи ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đ°Đŧи, Ņ‰Đž ĐēŅ€Đ°Ņ‰Đĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒŅŅ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°Đŧи (ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—)." + "message": "Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐšŅ‚ĐĩŅŅ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°ĐŊиĐŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ĐžĐŧ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, Chrome) Ņ‚Đ°/айО Ņ–ĐŊŅˆĐ¸Đŧи ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đ°Đŧи, Ņ‰Đž ĐēŅ€Đ°Ņ‰Đĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅŽŅ‚ŅŒŅŅ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°Đŧи (ŅĐē-ĐžŅ‚ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧа Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—)." }, "twoStepOptions": { "message": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ двОĐĩŅ‚Đ°ĐŋĐŊĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи" @@ -913,24 +1376,24 @@ "message": "Код Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ" }, "authenticatorAppTitle": { - "message": "ĐŸŅ€ĐžĐŗŅ€Đ°Đŧа Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ—" + "message": "ĐŸŅ€ĐžĐŗŅ€Đ°Đŧа Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—" }, - "authenticatorAppDesc": { - "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧ҃ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ— (ĐŊаĐŋŅ€Đ¸ĐēĐģад, Authy айО Google Authenticator), Ņ‰ĐžĐą ĐŗĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‚Đ¸ĐŧŅ‡Đ°ŅĐžĐ˛Ņ– ĐēОди ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐēОд, ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊиК ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐžŅŽ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—, ŅĐē-ĐžŅ‚ Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "КĐģŅŽŅ‡ ĐąĐĩСĐŋĐĩĐēи YubiKey OTP" + "yubiKeyTitleV2": { + "message": "КĐģŅŽŅ‡ ĐąĐĩСĐŋĐĩĐēи Yubico OTP" }, "yubiKeyDesc": { "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ YubiKey Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°. ĐŸŅ€Đ°Ņ†ŅŽŅ” С YubiKey 4, 4 Nano, 4C Ņ‚Đ° ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅĐŧи NEO." }, - "duoDesc": { - "message": "ĐĐ˛Ņ‚ĐžŅ€Đ¸ĐˇŅƒĐšŅ‚ĐĩҁҌ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Duo Security С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ ĐŧĐžĐąŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžĐ´Đ°Ņ‚Đē҃ Duo Mobile, SMS, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊĐžĐŗĐž виĐēĐģиĐē҃, айО ĐēĐģŅŽŅ‡Đ° ĐąĐĩСĐŋĐĩĐēи U2F.", + "duoDescV2": { + "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐēОд, ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊиК Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "ĐĐ˛Ņ‚ĐžŅ€Đ¸ĐˇŅƒĐšŅ‚ĐĩҁҌ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Duo Security Đ´ĐģŅ Đ˛Đ°ŅˆĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ ĐŧĐžĐąŅ–ĐģҌĐŊĐžĐŗĐž Đ´ĐžĐ´Đ°Ņ‚Đē҃ Duo Mobile, SMS, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊĐžĐŗĐž виĐēĐģиĐē҃, айО ĐēĐģŅŽŅ‡Đ° ĐąĐĩСĐŋĐĩĐēи U2F.", + "message": "ĐĐ˛Ņ‚ĐžŅ€Đ¸ĐˇŅƒĐšŅ‚ĐĩҁҌ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Duo Security Đ´ĐģŅ Đ˛Đ°ŅˆĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Duo Mobile, SMS, Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊĐžĐŗĐž виĐēĐģиĐē҃, айО ĐēĐģŅŽŅ‡Đ° ĐąĐĩСĐŋĐĩĐēи U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { @@ -942,14 +1405,23 @@ "emailTitle": { "message": "Е-ĐŋĐžŅˆŅ‚Đ°" }, - "emailDesc": { - "message": "Коди ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐŊĐ°Đ´ŅĐ¸ĐģĐ°Ņ‚Đ¸ŅŅ ĐŊа Đ˛Đ°ŅˆŅƒ ĐŋĐžŅˆŅ‚Ņƒ." + "emailDescV2": { + "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐēОд, ĐŊĐ°Đ´Ņ–ŅĐģаĐŊиК ваĐŧ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅŽ ĐŋĐžŅˆŅ‚ĐžŅŽ." }, "selfHostedEnvironment": { "message": "ĐĄĐĩŅ€ĐĩĐ´ĐžĐ˛Đ¸Ņ‰Đĩ вĐģĐ°ŅĐŊĐžĐŗĐž Ņ…ĐžŅŅ‚Đ¸ĐŊĐŗŅƒ" }, "selfHostedEnvironmentFooter": { - "message": "ВĐēаĐļŅ–Ņ‚ŅŒ ĐžŅĐŊОвĐŊ҃ URL-Đ°Đ´Ņ€Đĩҁ҃ Bitwarden ĐŊа Đ˛Đ°ŅˆĐžĐŧ҃ ҁĐĩŅ€Đ˛ĐĩҀҖ." + "message": "ВĐēаĐļŅ–Ņ‚ŅŒ ĐžŅĐŊОвĐŊ҃ URL-Đ°Đ´Ņ€Đĩҁ҃ Đ˛Đ°ŅˆĐžĐŗĐž Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ Bitwarden ĐŊа вĐģĐ°ŅĐŊĐžĐŧ҃ Ņ…ĐžŅŅ‚Đ¸ĐŊĐŗŅƒ." + }, + "selfHostedBaseUrlHint": { + "message": "ВĐēаĐļŅ–Ņ‚ŅŒ ĐžŅĐŊОвĐŊ҃ URL-Đ°Đ´Ņ€Đĩҁ҃ Đ˛Đ°ŅˆĐžĐŗĐž Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ Bitwarden ĐŊа вĐģĐ°ŅĐŊĐžĐŧ҃ Ņ…ĐžŅŅ‚Đ¸ĐŊĐŗŅƒ. Đ—Ņ€Đ°ĐˇĐžĐē: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "ДĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐžŅ— ĐēĐžĐŊŅ„Ņ–ĐŗŅƒŅ€Đ°Ņ†Ņ–Ņ— ви ĐŧĐžĐļĐĩŅ‚Đĩ вĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐžŅĐŊОвĐŊ҃ URL-Đ°Đ´Ņ€Đĩҁ҃ ĐžĐēŅ€ĐĩĐŧĐž Đ´ĐģŅ ĐēĐžĐļĐŊĐžŅ— ҁĐģ҃Đļйи." + }, + "selfHostedEnvFormInvalid": { + "message": "НĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž Đ´ĐžĐ´Đ°Ņ‚Đ¸ URL-Đ°Đ´Ņ€Đĩҁ҃ ĐžŅĐŊОвĐŊĐžĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°, айО ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– ОдĐŊĐĩ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēĐĩ ҁĐĩŅ€ĐĩĐ´ĐžĐ˛Đ¸Ņ‰Đĩ." }, "customEnvironment": { "message": "ВĐģĐ°ŅĐŊĐĩ ҁĐĩŅ€ĐĩĐ´ĐžĐ˛Đ¸Ņ‰Đĩ" @@ -960,11 +1432,15 @@ "baseUrl": { "message": "URL-Đ°Đ´Ņ€ĐĩŅĐ° ҁĐĩŅ€Đ˛ĐĩŅ€Đ°" }, + "selfHostBaseUrl": { + "message": "URL-Đ°Đ´Ņ€ĐĩŅĐ° вĐģĐ°ŅĐŊĐžĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "URL-Đ°Đ´Ņ€ĐĩŅĐ° ҁĐĩŅ€Đ˛ĐĩŅ€Đ° API" }, "webVaultUrl": { - "message": "URL-Đ°Đ´Ņ€ĐĩŅĐ° ҁĐĩŅ€Đ˛ĐĩŅ€Đ° вĐĩĐą ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" + "message": "URL-Đ°Đ´Ņ€ĐĩŅĐ° ҁĐĩŅ€Đ˛ĐĩŅ€Đ° вĐĩĐąŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" }, "identityUrl": { "message": "URL-Đ°Đ´Ņ€ĐĩŅĐ° ҁĐĩŅ€Đ˛ĐĩŅ€Đ° Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—" @@ -978,17 +1454,76 @@ "environmentSaved": { "message": "URL-Đ°Đ´Ņ€ĐĩŅĐ¸ ҁĐĩŅ€ĐĩĐ´ĐžĐ˛Đ¸Ņ‰Đ° СйĐĩŅ€ĐĩĐļĐĩĐŊĐž" }, + "showAutoFillMenuOnFormFields": { + "message": "МĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŊа ĐŋĐžĐģŅŅ… Ņ„ĐžŅ€Đŧ", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "ĐŸŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ— Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" + }, + "showInlineMenuLabel": { + "message": "ĐŸŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ— Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŊа ĐŋĐžĐģŅŅ… Ņ„ĐžŅ€Đŧ" + }, + "showInlineMenuIdentitiesLabel": { + "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ ŅĐē ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ—" + }, + "showInlineMenuCardsLabel": { + "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐ°Ņ€Ņ‚Đēи ŅĐē ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ—" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ—, ŅĐēŅ‰Đž Đ˛Đ¸ĐąŅ€Đ°ĐŊĐž ĐŋŅ–ĐēŅ‚ĐžĐŗŅ€Đ°Đŧ҃" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅ–Ņ… ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛, Đ´Đž ŅĐēĐ¸Ņ… виĐēĐžĐŊаĐŊĐž Đ˛Ņ…Ņ–Đ´." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "ДĐģŅ ҃ĐŊиĐēĐŊĐĩĐŊĐŊŅ ĐēĐžĐŊŅ„ĐģŅ–ĐēŅ‚Ņ–Đ˛ виĐŧĐēĐŊŅ–Ņ‚ŅŒ Đ˛ĐąŅƒĐ´ĐžĐ˛Đ°ĐŊиК ҃ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "ЗĐŧŅ–ĐŊа ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°." + }, + "autofillOverlayVisibilityOff": { + "message": "ВиĐŧĐē", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Đ¯ĐēŅ‰Đž Đ˛Đ¸ĐąŅ€Đ°ĐŊĐž ĐŋĐžĐģĐĩ (҃ Ņ„ĐžĐēŅƒŅŅ–)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Đ¯ĐēŅ‰Đž Đ˛Đ¸ĐąŅ€Đ°ĐŊĐž ĐŋŅ–ĐēŅ‚ĐžĐŗŅ€Đ°Đŧ҃ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ" + }, "enableAutoFillOnPageLoad": { "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ" }, "enableAutoFillOnPageLoadDesc": { "message": "Đ¯ĐēŅ‰Đž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž Ņ„ĐžŅ€Đŧ҃ Đ˛Ņ…ĐžĐ´Ņƒ, Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СаĐŋОвĐŊŅŽĐ˛Đ°Ņ‚Đ¸ Ņ—Ņ— ĐŋŅ–Đ´ Ņ‡Đ°Ņ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ вĐĩĐąŅŅ‚ĐžŅ€Ņ–ĐŊĐēи." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$ОбĐĩŅ€ĐĩĐļĐŊĐž!$CLOSETAG$ ĐĄĐēĐžĐŧĐŋŅ€ĐžĐŧĐĩŅ‚ĐžĐ˛Đ°ĐŊŅ– айО ĐŊĐĩĐŊĐ°Đ´Ņ–ĐšĐŊŅ– вĐĩĐąŅĐ°ĐšŅ‚Đ¸ ĐŧĐžĐļŅƒŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи Đ´ĐģŅ СавдаĐŊĐŊŅ ҈ĐēОди.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "ĐĄĐēĐžĐŧĐŋŅ€ĐžĐŧĐĩŅ‚ĐžĐ˛Đ°ĐŊŅ– айО ĐŊĐĩĐŊĐ°Đ´Ņ–ĐšĐŊŅ– вĐĩĐąŅĐ°ĐšŅ‚Đ¸ ĐŧĐžĐļŅƒŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи Đ´ĐģŅ СавдаĐŊĐŊŅ ҈ĐēОди." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "ДоĐēĐģадĐŊŅ–ŅˆĐĩ ĐŋŅ€Đž Ņ€Đ¸ĐˇĐ¸Đēи" + }, "learnMoreAboutAutofill": { - "message": "Đ”Ņ–ĐˇĐŊĐ°Ņ‚Đ¸ŅŅ ĐąŅ–ĐģҌ҈Đĩ ĐŋŅ€Đž Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" + "message": "ДоĐēĐģадĐŊŅ–ŅˆĐĩ ĐŋŅ€Đž Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" }, "defaultAutoFillOnPageLoad": { "message": "ĐĸиĐŋОвĐĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Đ´ĐģŅ СаĐŋĐ¸ŅŅ–Đ˛ Đ˛Ņ…ĐžĐ´Ņƒ" @@ -1014,18 +1549,21 @@ "commandOpenSidebar": { "message": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ ҃ ĐąŅ–Ņ‡ĐŊŅ–Đš ĐŋаĐŊĐĩĐģŅ–" }, - "commandAutofillDesc": { + "commandAutofillLoginDesc": { "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž вĐĩĐąŅĐ°ĐšŅ‚Ņƒ" }, + "commandAutofillCardDesc": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžŅ— виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžŅ— ĐēĐ°Ņ€Ņ‚Đēи Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž вĐĩĐąŅĐ°ĐšŅ‚Ņƒ" + }, + "commandAutofillIdentityDesc": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐžŅŅ‚Đ°ĐŊĐŊŅŒĐžĐŗĐž виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž вĐĩĐąŅĐ°ĐšŅ‚Ņƒ" + }, "commandGeneratePasswordDesc": { "message": "ГĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ– ĐēĐžĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŊОвиК виĐŋадĐēОвиК ĐŋĐ°Ņ€ĐžĐģҌ в ĐąŅƒŅ„ĐĩŅ€ ОйĐŧŅ–ĐŊ҃" }, "commandLockVaultDesc": { "message": "ЗабĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ" }, - "privateModeWarning": { - "message": "ĐŸŅ€Đ¸Đ˛Đ°Ņ‚ĐŊиК Ņ€ĐĩĐļиĐŧ - ҆Đĩ ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊа Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ Ņ– Đ´ĐĩŅĐēŅ– ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– ОйĐŧĐĩĐļĐĩĐŊŅ–." - }, "customFields": { "message": "ВĐģĐ°ŅĐŊŅ– ĐŋĐžĐģŅ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "Đ›ĐžĐŗŅ–Ņ‡ĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ" }, + "cfTypeCheckbox": { + "message": "ĐŸŅ€Đ°ĐŋĐžŅ€ĐĩŅ†ŅŒ" + }, "cfTypeLinked": { "message": "Пов'ŅĐˇĐ°ĐŊĐž", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ вĐŋŅ–ĐˇĐŊаваĐŊĐĩ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ ĐąŅ–ĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž СаĐŋĐ¸ŅŅƒ." }, + "faviconDescAlt": { + "message": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ вĐŋŅ–ĐˇĐŊаваĐŊĐĩ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ ĐŋĐžŅ€ŅƒŅ‡ С ĐēĐžĐļĐŊиĐŧ СаĐŋĐ¸ŅĐžĐŧ. Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ Đ˛ŅŅ–Ņ… ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛, Đ´Đž ŅĐēĐ¸Ņ… виĐēĐžĐŊаĐŊĐž Đ˛Ņ…Ņ–Đ´." + }, "enableBadgeCounter": { "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐģŅ–Ņ‡Đ¸ĐģҌĐŊиĐē" }, @@ -1167,7 +1711,7 @@ "message": "ПовĐŊĐĩ Ņ–Đŧ'Ņ" }, "identityName": { - "message": "Назва" + "message": "Назва ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ" }, "company": { "message": "КоĐŧĐŋаĐŊŅ–Ņ" @@ -1227,17 +1771,65 @@ "message": "ĐšĐ°Ņ€Ņ‚Đēа" }, "typeIdentity": { - "message": "ĐžŅĐžĐąĐ¸ŅŅ‚Ņ– даĐŊŅ–" + "message": "ĐŸĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ" + }, + "typeSshKey": { + "message": "КĐģŅŽŅ‡ SSH" + }, + "newItemHeader": { + "message": "Новий $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ¸ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } }, "passwordHistory": { "message": "Đ†ŅŅ‚ĐžŅ€Ņ–Ņ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛" }, + "generatorHistory": { + "message": "Đ†ŅŅ‚ĐžŅ€Ņ–Ņ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°" + }, + "clearGeneratorHistoryTitle": { + "message": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Ņ–ŅŅ‚ĐžŅ€Ņ–ŅŽ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°" + }, + "cleargGeneratorHistoryDescription": { + "message": "Đ¯ĐēŅ‰Đž ви ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đĩ, ŅƒŅŅ– СаĐŋĐ¸ŅĐ¸ ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž видаĐģĐĩĐŊŅ– С Ņ–ŅŅ‚ĐžŅ€Ņ–Ņ— ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°. ĐĄĐŋŅ€Đ°Đ˛Đ´Ņ– ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸?" + }, "back": { "message": "Назад" }, "collections": { "message": "Đ—ĐąŅ–Ņ€Đēи" }, + "nCollections": { + "message": "$COUNT$ ĐˇĐąŅ–Ņ€ĐžĐē", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "ĐžĐąŅ€Đ°ĐŊĐĩ" }, @@ -1282,6 +1874,10 @@ "message": "ĐžŅĐŊОвĐŊиК Đ´ĐžĐŧĐĩĐŊ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "ĐžŅĐŊОвĐŊиК Đ´ĐžĐŧĐĩĐŊ (Ņ€ĐĩĐēĐžĐŧĐĩĐŊдОваĐŊĐž)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "ІĐŧ'Ņ Đ´ĐžĐŧĐĩĐŊ҃", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Đ’Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐˇĐąŅ–ĐŗŅ–Đ˛", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "ĐĸиĐŋОвĐĩ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐˇĐąŅ–ĐŗŅ–Đ˛", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "ПĐĩŅ€ĐĩĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" @@ -1327,11 +1923,20 @@ "message": "ĐĸиĐŋи" }, "allItems": { - "message": "Đ’ŅŅ– ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸" + "message": "ĐŖŅŅ– СаĐŋĐ¸ŅĐ¸" }, "noPasswordsInList": { "message": "НĐĩĐŧĐ°Ņ” ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛." }, + "clearHistory": { + "message": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Ņ–ŅŅ‚ĐžŅ€Ņ–ŅŽ" + }, + "nothingToShow": { + "message": "НĐĩĐŧĐ°Ņ” даĐŊĐ¸Ņ… Đ´ĐģŅ ĐŋĐžĐēĐ°ĐˇŅƒ" + }, + "nothingGeneratedRecently": { + "message": "Ви ĐŊŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ ĐŗĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Đģи ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đŧ Ņ‡Đ°ŅĐžĐŧ" + }, "remove": { "message": "ВиĐģŅƒŅ‡Đ¸Ņ‚Đ¸" }, @@ -1354,7 +1959,7 @@ "message": "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž ĐŊŅ–ĐēĐžĐģи ĐŊĐĩ Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐąĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸? Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Đ˛ŅˆĐ¸ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ, ĐēĐģŅŽŅ‡ ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛Đ°ŅˆĐžĐŗĐž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° СйĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ĐŧĐĩŅ‚ŅŒŅŅ ĐŊа Đ˛Đ°ŅˆĐžĐŧ҃ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ, ваĐŧ ҁĐģŅ–Đ´ ĐąŅƒŅ‚Đ¸ ĐŋĐĩвĐŊиĐŧи в Ņ‚ĐžĐŧ҃, Ņ‰Đž Đ˛Đ°Ņˆ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŧĐ°Ņ” ĐŊаĐģĐĩĐļĐŊиК ĐˇĐ°Ņ…Đ¸ŅŅ‚." }, "noOrganizationsList": { - "message": "Ви ĐŊĐĩ Đ˛Ņ…ĐžĐ´Đ¸Ņ‚Đĩ Đ´Đž ĐļОдĐŊĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— дОСвОĐģŅŅŽŅ‚ŅŒ ĐąĐĩСĐŋĐĩ҇ĐŊĐž ОйĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ŅŅ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧи С Ņ–ĐŊŅˆĐ¸Đŧи ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°Đŧи." + "message": "Ви ĐŊĐĩ Đ˛Ņ…ĐžĐ´Đ¸Ņ‚Đĩ Đ´Đž ĐļОдĐŊĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Đ´Đ°ŅŽŅ‚ŅŒ СĐŧĐžĐŗŅƒ ĐąĐĩСĐŋĐĩ҇ĐŊĐž ОйĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ŅŅ СаĐŋĐ¸ŅĐ°Đŧи С Ņ–ĐŊŅˆĐ¸Đŧи ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°Đŧи." }, "noCollectionsInList": { "message": "НĐĩĐŧĐ°Ņ” ĐˇĐąŅ–Ņ€ĐžĐē." @@ -1363,7 +1968,7 @@ "message": "ВĐģĐ°ŅĐŊиĐē" }, "whoOwnsThisItem": { - "message": "ĐĨŅ‚Đž Ņ” вĐģĐ°ŅĐŊиĐēĐžĐŧ Ņ†ŅŒĐžĐŗĐž ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ°?" + "message": "ĐĨŅ‚Đž Ņ” вĐģĐ°ŅĐŊиĐēĐžĐŧ Ņ†ŅŒĐžĐŗĐž СаĐŋĐ¸ŅŅƒ?" }, "strong": { "message": "ĐĐ°Đ´Ņ–ĐšĐŊиК", @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "РОСйĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ С PIN-ĐēОдОĐŧ" }, + "setYourPinTitle": { + "message": "Đ’ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ PIN-ĐēĐžĐ´Ņƒ" + }, + "setYourPinButton": { + "message": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ PIN-ĐēОд" + }, "setYourPinCode": { "message": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ PIN-ĐēОд Đ´ĐģŅ Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ Bitwarden. НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ PIN-ĐēĐžĐ´Ņƒ ĐąŅƒĐ´ŅƒŅ‚ŅŒ ҁĐēиĐŊŅƒŅ‚Ņ–, ŅĐēŅ‰Đž ви ĐēĐžĐģи-ĐŊĐĩĐąŅƒĐ´ŅŒ ĐŋОвĐŊŅ–ŅŅ‚ŅŽ виКдĐĩŅ‚Đĩ С ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи." }, + "setYourPinCode1": { + "message": "PIN-ĐēОд ĐąŅƒĐ´Đĩ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ Đ´ĐģŅ Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ Bitwarden СаĐŧŅ–ŅŅ‚ŅŒ ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ. ĐŖ Ņ€Đ°ĐˇŅ– ĐŋОвĐŊĐžĐŗĐž Đ˛Đ¸Ņ…ĐžĐ´Ņƒ С Bitwarden, Đ˛Đ°Ņˆ PIN-ĐēОд ĐąŅƒĐ´Đĩ ҁĐēиĐŊŅƒŅ‚Đž." + }, "pinRequired": { "message": "НĐĩĐžĐąŅ…Ņ–Đ´ĐŊиК PIN-ĐēОд." }, "invalidPin": { "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊиК PIN-ĐēОд." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "Đ—Đ°ĐąĐ°ĐŗĐ°Ņ‚Đž ĐŊĐĩвдаĐģĐ¸Ņ… ҁĐŋŅ€ĐžĐą ввĐĩĐ´ĐĩĐŊĐŊŅ PIN-ĐēĐžĐ´Ņƒ. Đ’Đ¸Ņ…Ņ–Đ´ С ŅĐ¸ŅŅ‚ĐĩĐŧи." + }, "unlockWithBiometrics": { "message": "РОСйĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸ С ĐąŅ–ĐžĐŧĐĩŅ‚Ņ€Ņ–Ņ”ŅŽ" }, + "unlockWithMasterPassword": { + "message": "РОСйĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸ С ĐŗĐžĐģОвĐŊиĐŧ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ" + }, "awaitDesktop": { "message": "ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ С ĐēĐžĐŧĐŋ'ŅŽŅ‚ĐĩŅ€Đ°" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "БĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸ ĐŗĐžĐģОвĐŊиĐŧ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ ĐŋŅ€Đ¸ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°" }, + "lockWithMasterPassOnRestart1": { + "message": "ВиĐŧĐ°ĐŗĐ°Ņ‚Đ¸ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ĐŋҖҁĐģŅ ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°" + }, "selectOneCollection": { "message": "НĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐŋŅ€Đ¸ĐŊаКĐŧĐŊŅ– ОдĐŊ҃ ĐˇĐąŅ–Ņ€Đē҃." }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "На ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° вĐŋĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŒ ОдĐŊа Ņ‡Đ¸ Đ´ĐĩĐēŅ–ĐģҌĐēа ĐŋĐžĐģŅ–Ņ‚Đ¸Đē ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—." }, + "passwordGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛" + }, + "usernameGenerator": { + "message": "ГĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ Ņ–ĐŧĐĩĐŊŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°" + }, + "useThisPassword": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ҆ĐĩĐš ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "useThisUsername": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ҆Đĩ Ņ–Đŧ'Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°" + }, + "securePasswordGenerated": { + "message": "ĐĐ°Đ´Ņ–ĐšĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐž! Обов'ŅĐˇĐēОвО ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ŅĐ˛Ņ–Đš ĐŋĐ°Ņ€ĐžĐģҌ ĐŊа вĐĩĐąŅĐ°ĐšŅ‚Ņ–." + }, + "useGeneratorHelpTextPartOne": { + "message": "ĐĄĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ĐžĐŧ", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "Đ´ĐģŅ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐŊĐ°Đ´Ņ–ĐšĐŊĐžĐŗĐž, ҃ĐŊŅ–ĐēаĐģҌĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "Đ”Ņ–Ņ ĐŋҖҁĐģŅ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" }, + "vaultTimeoutAction1": { + "message": "Đ”Ņ–Ņ ĐŋҖҁĐģŅ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ" + }, "lock": { "message": "БĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ĐĄĐŧŅ–Ņ‚ĐŊиĐē", @@ -1452,8 +2101,11 @@ "restoredItem": { "message": "ЗаĐŋĐ¸Ņ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐž" }, + "alreadyHaveAccount": { + "message": "ВĐļĐĩ ĐŧĐ°Ņ”Ņ‚Đĩ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ?" + }, "vaultTimeoutLogOutConfirmation": { - "message": "Đ’Đ¸Ņ…Ņ–Đ´ ҁĐēĐ°ŅŅƒŅ” Đ˛ŅŅ– ĐŋŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Đ˛Đ°ŅˆĐžĐŗĐž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° Ņ– виĐŧĐ°ĐŗĐ°Ņ‚Đ¸ĐŧĐĩ Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Ņ–Ņ— ĐŋҖҁĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ. Ви Đ´Ņ–ĐšŅĐŊĐž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ҆ĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ?" + "message": "Đ’Đ¸Ņ…Ņ–Đ´ ҁĐēĐ°ŅŅƒŅ” Đ˛ŅŅ– ĐŋŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Đ˛Đ°ŅˆĐžĐŗĐž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° Ņ– виĐŧĐ°ĐŗĐ°Ņ‚Đ¸ĐŧĐĩ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ ĐŋҖҁĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ. Ви Đ´Ņ–ĐšŅĐŊĐž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ҆ĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "ĐŸŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ Đ´Ņ–Ņ— Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ" @@ -1461,11 +2113,14 @@ "autoFillAndSave": { "message": "ЗаĐŋОвĐŊĐ¸Ņ‚Đ¸ Ņ– СйĐĩŅ€ĐĩĐŗŅ‚Đ¸" }, + "fillAndSave": { + "message": "ЗаĐŋОвĐŊĐ¸Ņ‚Đ¸ Đš СйĐĩŅ€ĐĩĐŗŅ‚Đ¸" + }, "autoFillSuccessAndSavedUri": { "message": "ЗаĐŋĐ¸Ņ СаĐŋОвĐŊĐĩĐŊĐž Ņ– СйĐĩŅ€ĐĩĐļĐĩĐŊĐž" }, "autoFillSuccess": { - "message": "ЗаĐŋĐ¸Ņ СаĐŋОвĐŊĐĩĐŊĐž" + "message": "ЗаĐŋĐ¸Ņ СаĐŋОвĐŊĐĩĐŊĐž " }, "insecurePageWarning": { "message": "ПоĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ: ҆Đĩ ĐŊĐĩĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊĐēа HTTP, Ņ‚ĐžĐŧ҃ ĐąŅƒĐ´ŅŒ-ŅĐēа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ, ŅĐē҃ ви ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ”Ņ‚Đĩ, ĐŋĐžŅ‚ĐĩĐŊŅ†Ņ–ĐšĐŊĐž ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ ĐŋĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ° Ņ‡Đ¸ СĐŧŅ–ĐŊĐĩĐŊа ŅŅ‚ĐžŅ€ĐžĐŊĐŊŅ–Đŧи. ĐĻŅ– ОйĐģŅ–ĐēĐžĐ˛Ņ– даĐŊŅ– ĐąŅƒĐģĐž СйĐĩŅ€ĐĩĐļĐĩĐŊĐž ĐŊа ĐąĐĩСĐŋĐĩ҇ĐŊŅ–Đš ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ (HTTPS)." @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Đ’Đ°Ņˆ ĐŊОвиК ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩ СадОвОĐģҌĐŊŅŅ” виĐŧĐžĐŗĐ¸ ĐŋĐžĐģŅ–Ņ‚Đ¸Đēи." }, + "receiveMarketingEmailsV2": { + "message": "ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐšŅ‚Đĩ ĐŋĐžŅ€Đ°Đ´Đ¸, ĐžĐŗĐžĐģĐžŅˆĐĩĐŊĐŊŅ Ņ‚Đ° ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– Đ´ĐžŅĐģŅ–Đ´ĐļĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ Bitwarden ҃ ŅĐ˛ĐžŅ—Đš ĐŋĐžŅˆŅ‚ĐžĐ˛Ņ–Đš ҁĐēŅ€Đ¸ĐŊŅŒŅ†Ņ–." + }, + "unsubscribe": { + "message": "Đ’Ņ–Đ´ĐŋĐ¸ŅĐ°Ņ‚Đ¸ŅŅ" + }, + "atAnyTime": { + "message": "ĐŧĐžĐļĐŊа ĐąŅƒĐ´ŅŒ-ĐēĐžĐģи." + }, + "byContinuingYouAgreeToThe": { + "message": "ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļŅƒŅŽŅ‡Đ¸, ви ĐŋĐžĐŗĐžĐ´ĐļŅƒŅ”Ņ‚ĐĩŅŅ С" + }, + "and": { + "message": "Ņ–" + }, "acceptPolicies": { "message": "ПозĐŊĐ°Ņ‡Đ¸Đ˛ŅˆĐ¸ ҆ĐĩĐš ĐŋŅ€Đ°ĐŋĐžŅ€ĐĩŅ†ŅŒ, ви ĐŋĐžĐŗĐžĐ´ĐļŅƒŅ”Ņ‚ĐĩŅŅ С:" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "ПоĐŧиĐģĐēа ĐžĐŊОвĐģĐĩĐŊĐŊŅ Ņ‚ĐžĐēĐĩĐŊа Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "errorRefreshingAccessTokenDesc": { + "message": "НĐĩ СĐŊаКдĐĩĐŊĐž Ņ‚ĐžĐēĐĩĐŊ ĐžĐŊОвĐģĐĩĐŊĐŊŅ айО ĐēĐģŅŽŅ‡Ņ– API. ĐĄĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đ˛Đ¸ĐšŅ‚Đ¸, а ĐŋĐžŅ‚Ņ–Đŧ ŅƒĐ˛Ņ–ĐšŅ‚Đ¸ СĐŊĐžĐ˛Ņƒ." + }, "desktopSyncVerificationTitle": { "message": "ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— ĐŊа ĐēĐžĐŧĐŋ'ŅŽŅ‚ĐĩҀҖ" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "НĐĩĐ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ–ŅŅ‚ŅŒ ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Đ‘Ņ–ĐžĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊиК ĐēĐģŅŽŅ‡ Đ˛Ņ–Đ´Ņ€Ņ–ĐˇĐŊŅŅ”Ņ‚ŅŒŅŅ" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Đ—ĐąŅ–Đš ĐąŅ–ĐžĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊĐžĐŗĐž Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ. Đ‘Ņ–ĐžĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊиК ҁĐĩĐēŅ€ĐĩŅ‚ĐŊиК ĐēĐģŅŽŅ‡ ĐŊĐĩ СĐŧŅ–Đŗ Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ. ĐĄĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐąŅ–ĐžĐŧĐĩŅ‚Ņ€Ņ–ŅŽ СĐŊĐžĐ˛Ņƒ." + }, "biometricsNotEnabledTitle": { "message": "Đ‘Ņ–ĐžĐŧĐĩŅ‚Ņ€Ņ–ŅŽ ĐŊĐĩ ĐŊаĐģĐ°ŅˆŅ‚ĐžĐ˛Đ°ĐŊĐž" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "Đ‘Ņ–ĐžĐŧĐĩŅ‚Ņ€Ņ–Ņ в ĐąŅ€Đ°ŅƒĐˇĐĩҀҖ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа Ņ†ŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—." }, + "biometricsNotUnlockedTitle": { + "message": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ СайĐģĐžĐēОваĐŊиК айО Đ˛Đ¸ĐšŅˆĐžĐ˛ Ņ–Đˇ ŅĐ¸ŅŅ‚ĐĩĐŧи" + }, + "biometricsNotUnlockedDesc": { + "message": "РОСйĐģĐžĐēŅƒĐšŅ‚Đĩ Ņ†ŅŒĐžĐŗĐž ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° в ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ– Đ´ĐģŅ ĐēĐžĐŧĐŋ'ŅŽŅ‚ĐĩŅ€Đ° Ņ– ĐŋĐžĐ˛Ņ‚ĐžŅ€Ņ–Ņ‚ŅŒ ҁĐŋŅ€ĐžĐąŅƒ." + }, + "biometricsNotAvailableTitle": { + "message": "Đ‘Ņ–ĐžĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐĩ" + }, + "biometricsNotAvailableDesc": { + "message": "Đ‘Ņ–ĐžĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊĐ°Ņ€Đ°ĐˇŅ– ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐĩ. ĐŸĐžĐ˛Ņ‚ĐžŅ€Ņ–Ņ‚ŅŒ ҁĐŋŅ€ĐžĐąŅƒ ĐŋŅ–ĐˇĐŊŅ–ŅˆĐĩ." + }, "biometricsFailedTitle": { "message": "Đ—ĐąŅ–Đš ĐąŅ–ĐžĐŧĐĩ҂ҀҖҗ" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "ПоĐģŅ–Ņ‚Đ¸Đēа ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— вĐŋĐģĐ¸Đ˛Đ°Ņ” ĐŊа Đ˛Đ°ŅˆŅ– ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ вĐģĐ°ŅĐŊĐžŅŅ‚Ņ–." }, + "personalOwnershipPolicyInEffectImports": { + "message": "ПоĐģŅ–Ņ‚Đ¸Đēа ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— СайĐģĐžĐēŅƒĐ˛Đ°Đģа Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ СаĐŋĐ¸ŅŅ–Đ˛ Đ´Đž Đ˛Đ°ŅˆĐžĐŗĐž ĐžŅĐžĐąĐ¸ŅŅ‚ĐžĐŗĐž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°." + }, + "domainsTitle": { + "message": "ДоĐŧĐĩĐŊи", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "ВиĐēĐģŅŽŅ‡ĐĩĐŊŅ– Đ´ĐžĐŧĐĩĐŊи" }, "excludedDomainsDesc": { "message": "Bitwarden ĐŊĐĩ СаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ ĐŋŅ€Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ даĐŊĐ¸Ņ… Đ˛Ņ…ĐžĐ´Ņƒ Đ´ĐģŅ Ņ†Đ¸Ņ… Đ´ĐžĐŧĐĩĐŊŅ–Đ˛. ĐŸĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ Đ´ĐģŅ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐ˛Đ°ĐŊĐŊŅ СĐŧŅ–ĐŊ." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden ĐŊĐĩ СаĐŋĐ¸Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ĐŧĐĩ ĐŋŅ€Đž СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ даĐŊĐ¸Ņ… Đ˛Ņ…ĐžĐ´Ņƒ Đ´ĐģŅ Ņ†Đ¸Ņ… Đ´ĐžĐŧĐĩĐŊŅ–Đ˛ Đ´ĐģŅ Đ˛ŅŅ–Ņ… ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛, Đ´Đž ŅĐēĐ¸Ņ… виĐēĐžĐŊаĐŊĐž Đ˛Ņ…Ņ–Đ´. ĐŸĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ Đ´ĐģŅ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐ˛Đ°ĐŊĐŊŅ СĐŧŅ–ĐŊ." + }, + "websiteItemLabel": { + "message": "ВĐĩĐąŅĐ°ĐšŅ‚ $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ĐŊĐĩ Ņ” Đ´Ņ–ĐšŅĐŊиĐŧ Đ´ĐžĐŧĐĩĐŊĐžĐŧ", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "ВиĐŊŅŅ‚ĐžĐē Đ´ĐģŅ Đ´ĐžĐŧĐĩĐŊ҃ СйĐĩŅ€ĐĩĐļĐĩĐŊĐž" + }, + "limitSendViews": { + "message": "Đ›Ņ–ĐŧŅ–Ņ‚ ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Ņ–Đ˛" + }, + "limitSendViewsHint": { + "message": "ĐŅ–Ņ…Ņ‚Đž ĐŊĐĩ ĐŧĐžĐļĐĩ ĐŋĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ¸ ҆Đĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐŋҖҁĐģŅ Đ´ĐžŅŅĐŗĐŊĐĩĐŊĐŊŅ ĐģŅ–ĐŧŅ–Ņ‚Ņƒ.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "ЗаĐģĐ¸ŅˆĐžĐē ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Ņ–Đ˛: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ĐŋĐžĐ´Ņ€ĐžĐąĐ¸Ņ†Ņ–", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Đ¨ŅƒĐēĐ°Ņ‚Đ¸ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "ĐĸĐĩĐēҁ҂" }, + "sendTypeTextToShare": { + "message": "ĐĸĐĩĐēҁ҂ Đ´ĐģŅ ĐŋĐžŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ" + }, "sendTypeFile": { "message": "ФаКĐģ" }, @@ -1666,6 +2406,9 @@ "message": "ĐŖŅŅ– Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "ĐĸиĐŋОвО ĐŋŅ€Đ¸Ņ…ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‚ĐĩĐēҁ҂" + }, "maxAccessCountReached": { "message": "Đ”ĐžŅŅĐŗĐŊŅƒŅ‚Đž ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´ĐžŅŅ‚ŅƒĐŋŅ–Đ˛", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "Đ—Đ°Ņ…Đ¸Ņ‰ĐĩĐŊĐž ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ" }, + "copyLink": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ" + }, "copySendLink": { "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "Ви Đ´Ņ–ĐšŅĐŊĐž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ видаĐģĐ¸Ņ‚Đ¸ ҆Đĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Ви Đ´Ņ–ĐšŅĐŊĐž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž видаĐģĐ¸Ņ‚Đ¸ ҆Đĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐąŅƒĐ´Đĩ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž видаĐģĐĩĐŊĐž ҃ вĐēаСаĐŊиК Ņ‡Đ°Ņ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐąŅƒĐ´Đĩ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž видаĐģĐĩĐŊĐž ҃ вĐēаСаĐŊ҃ Đ´Đ°Ņ‚Ņƒ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Đ”Đ°Ņ‚Đ° СавĐĩŅ€ŅˆĐĩĐŊĐŊŅ" }, @@ -1766,7 +2520,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "За йаĐļаĐŊĐŊŅĐŧ виĐŧĐ°ĐŗĐ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ в ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ†ŅŒĐžĐŗĐž Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ.", + "message": "Ви ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž Ņ†ŅŒĐžĐŗĐž Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendPasswordDescV3": { + "message": "За йаĐļаĐŊĐŊŅ Đ´ĐžĐ´Đ°ĐšŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‡Ņ–Đ˛ Ņ†ŅŒĐžĐŗĐž Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { @@ -1810,10 +2568,54 @@ "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐž", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ҃ҁĐŋŅ–ŅˆĐŊĐž ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐž!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "ĐĻĐĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐąŅƒĐ´Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧ ĐąŅƒĐ´ŅŒ-ĐēĐžĐŧ҃ Са ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅĐŧ ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ 1 ĐŗĐžĐ´Đ¸ĐŊи.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "ĐĻĐĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐąŅƒĐ´Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧ ĐąŅƒĐ´ŅŒ-ĐēĐžĐŧ҃ Са ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅĐŧ ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ $HOURS$ ĐŗĐžĐ´Đ¸ĐŊ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "ĐĻĐĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐąŅƒĐ´Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧ ĐąŅƒĐ´ŅŒ-ĐēĐžĐŧ҃ Са ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅĐŧ ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ 1 Đ´ĐŊŅ.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "ĐĻĐĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐąŅƒĐ´Đĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊиĐŧ ĐąŅƒĐ´ŅŒ-ĐēĐžĐŧ҃ Са ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅĐŧ ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ $DAYS$ Đ´ĐŊŅ–Đ˛.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "ĐŸĐžŅĐ¸ĐģаĐŊĐŊŅ ĐŊа Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊĐž", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐž", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Đ’Ņ–Đ´ĐēҀҖĐŋĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "ЊОй ŅŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃, ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž Đ˛Ņ–Đ´ĐēҀҖĐŋĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ в ĐžĐēŅ€ĐĩĐŧĐĩ Đ˛Ņ–ĐēĐŊĐž.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "ЊОй Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģ, Đ˛Ņ–Đ´ĐēŅ€Đ¸ĐšŅ‚Đĩ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ в ĐąŅ–Ņ‡ĐŊŅ–Đš ĐŋаĐŊĐĩĐģŅ– (ŅĐēŅ‰Đž ĐŧĐžĐļĐģивО) айО в ĐŊОвОĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–, ĐŊĐ°Ņ‚Đ¸ŅĐŊŅƒĐ˛ŅˆĐ¸ ҆ĐĩĐš йаĐŊĐĩŅ€." }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "ЊОй Đ˛Đ¸ĐąŅ€Đ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģ С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ Safari, Đ˛Ņ–Đ´ĐēŅ€Đ¸ĐšŅ‚Đĩ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ в ĐŊОвОĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–, ĐŊĐ°Ņ‚Đ¸ŅĐŊŅƒĐ˛ŅˆĐ¸ ĐŊа ҆ĐĩĐš йаĐŊĐĩŅ€." }, + "popOut": { + "message": "Đ’Ņ–Đ´ĐēҀҖĐŋĐ¸Ņ‚Đ¸" + }, "sendFileCalloutHeader": { "message": "ПĐĩŅ€ĐĩĐ´ ĐŋĐžŅ‡Đ°Ņ‚ĐēĐžĐŧ" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "ĐŸŅ€Đ¸Ņ…ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐžŅŽ Đ°Đ´Ņ€Đĩҁ҃ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅ— ĐŋĐžŅˆŅ‚Đ¸ Đ˛Ņ–Đ´ ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‡Ņ–Đ˛." }, + "hideYourEmail": { + "message": "ĐŸŅ€Đ¸Ņ…ĐžĐ˛Đ°Ņ‚Đ¸ Đ°Đ´Ņ€Đĩҁ҃ Đĩ-ĐŋĐžŅˆŅ‚Đ¸ Đ˛Ņ–Đ´ ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‡Ņ–Đ˛." + }, "sendOptionsPolicyInEffect": { "message": "На ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊҌ вĐŋĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŒ ОдĐŊа Ņ‡Đ¸ Đ´ĐĩĐēŅ–ĐģҌĐēа ĐŋĐžĐģŅ–Ņ‚Đ¸Đē ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—." }, @@ -1871,8 +2679,11 @@ "emailVerificationRequired": { "message": "НĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸ Đĩ-ĐŋĐžŅˆŅ‚Ņƒ" }, + "emailVerifiedV2": { + "message": "ЕĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊ҃ ĐŋĐžŅˆŅ‚Ņƒ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐž" + }, "emailVerificationRequiredDesc": { - "message": "ДĐģŅ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ҆ҖҔҗ Ņ„ŅƒĐŊĐē҆Җҗ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊ҃ ĐŋĐžŅˆŅ‚Ņƒ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžĐŊĐ°Ņ‚Đ¸ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ ҃ вĐĩĐą ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–." + "message": "ДĐģŅ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ҆ҖҔҗ Ņ„ŅƒĐŊĐē҆Җҗ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊ҃ ĐŋĐžŅˆŅ‚Ņƒ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ виĐēĐžĐŊĐ°Ņ‚Đ¸ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ ҃ вĐĩĐąŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–." }, "updatedMasterPassword": { "message": "ГоĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ĐžĐŊОвĐģĐĩĐŊĐž" @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "Đ’Đ°Ņˆ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ” ОдĐŊŅ–Đš айО ĐąŅ–ĐģҌ҈Đĩ ĐŋĐžĐģŅ–Ņ‚Đ¸ĐēаĐŧ Đ˛Đ°ŅˆĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ЊОй ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Đ´Đž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°, ваĐŧ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ŅĐ˛Ņ–Đš ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ ĐˇĐ°Ņ€Đ°Đˇ. ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Đ˛ŅˆĐ¸, ви виКдĐĩŅ‚Đĩ С ĐŋĐžŅ‚ĐžŅ‡ĐŊĐžĐŗĐž ҁĐĩаĐŊҁ҃, ĐŋҖҁĐģŅ Ņ‡ĐžĐŗĐž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐąŅƒĐ´Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž виĐēĐžĐŊĐ°Ņ‚Đ¸ Đ˛Ņ…Ņ–Đ´. ĐĄĐĩаĐŊŅĐ¸ ĐŊа Ņ–ĐŊŅˆĐ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŅ… ĐŧĐžĐļŅƒŅ‚ŅŒ СаĐģĐ¸ŅˆĐ°Ņ‚Đ¸ŅŅ аĐēŅ‚Đ¸Đ˛ĐŊиĐŧи ĐŋŅ€ĐžŅ‚ŅĐŗĐžĐŧ ОдĐŊҖҔҗ ĐŗĐžĐ´Đ¸ĐŊи." }, + "tdeDisabledMasterPasswordRequired": { + "message": "Đ’Đ°ŅˆĐ° ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ виĐŧĐēĐŊ҃Đģа ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´ĐžĐ˛Ņ–Ņ€ĐĩĐŊĐ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛. Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´Đž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°." + }, "resetPasswordPolicyAutoEnroll": { "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐŗĐžŅ€Ņ‚Đ°ĐŊĐŊŅ" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "ĐžĐąŅ€Đ°Ņ‚Đ¸ Ņ‚ĐĩĐē҃..." }, - "ssoCompleteRegistration": { - "message": "ЊОй СавĐĩŅ€ŅˆĐ¸Ņ‚Đ¸ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛Ņ…ĐžĐ´Ņƒ С SSO, Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Ņ– ĐˇĐ°Ņ…Đ¸ŅŅ‚Ņƒ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°." + "noFoldersFound": { + "message": "ĐĸĐĩĐē ĐŊĐĩ СĐŊаКдĐĩĐŊĐž", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "ОĐŊОвĐģĐĩĐŊĐž дОСвОĐģи Đ˛Đ°ŅˆĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— – виĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Đ’Đ°ŅˆĐ° ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ виĐŧĐ°ĐŗĐ°Ņ”, Ņ‰ĐžĐą ви Đ˛ŅŅ‚Đ°ĐŊОвиĐģи ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "С $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "ĐŸĐžŅ‚Ņ€Ņ–ĐąĐŊĐĩ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ", + "description": "Default title for the user verification dialog." }, "hours": { "message": "ГодиĐŊ" @@ -1904,6 +2740,9 @@ "minutes": { "message": "ĐĨвиĐģиĐŊ" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "До ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛Đ°ĐŊĐž виĐŧĐžĐŗĐ¸ ĐŋĐžĐģŅ–Ņ‚Đ¸Đēи ĐēĐžĐŧĐŋаĐŊŅ–Ņ—" + }, "vaultTimeoutPolicyInEffect": { "message": "ПоĐģŅ–Ņ‚Đ¸ĐēĐžŅŽ Đ˛Đ°ŅˆĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊиК дОСвОĐģĐĩĐŊиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° $HOURS$ ĐŗĐžĐ´Đ¸ĐŊ, $MINUTES$ Ņ…Đ˛Đ¸ĐģиĐŊ.", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ ĐŗĐžĐ´ Ņ– $MINUTES$ Ņ…Đ˛ ĐŧаĐēŅĐ¸Đŧ҃Đŧ.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Đ§Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ŅƒŅ” ОйĐŧĐĩĐļĐĩĐŊĐŊŅ, Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐĩ Đ˛Đ°ŅˆĐžŅŽ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ”ŅŽ: $HOURS$ ĐŗĐžĐ´ Ņ– $MINUTES$ Ņ…Đ˛ ĐŧаĐēŅĐ¸Đŧ҃Đŧ", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "ПоĐģŅ–Ņ‚Đ¸Đēи Đ˛Đ°ŅˆĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— вĐŋĐģĐ¸Đ˛Đ°ŅŽŅ‚ŅŒ ĐŊа Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°. МаĐēŅĐ¸ĐŧаĐģҌĐŊиК дОСвОĐģĐĩĐŊиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° $HOURS$ ĐŗĐžĐ´Đ¸ĐŊ, $MINUTES$ Ņ…Đ˛Đ¸ĐģиĐŊ. ДĐģŅ Ņ‡Đ°ŅŅƒ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛Đ°ŅˆĐžĐŗĐž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊа Đ´Ņ–Ņ $ACTION$.", "placeholders": { @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "ЕĐēҁĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—" + }, + "exportingOrganizationVaultDesc": { + "message": "Đ‘ŅƒĐ´Đĩ ĐĩĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž ĐģĐ¸ŅˆĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—, ĐŋОв'ŅĐˇĐ°ĐŊĐĩ С $ORGANIZATION$. ЗаĐŋĐ¸ŅĐ¸ ĐžŅĐžĐąĐ¸ŅŅ‚Đ¸Ņ… ŅŅ…ĐžĐ˛Đ¸Ņ‰ айО Ņ–ĐŊŅˆĐ¸Ņ… ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Đš ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ŅŒ вĐēĐģŅŽŅ‡ĐĩĐŊŅ–.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "ПоĐŧиĐģĐēа" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "ГĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ–Đŧ'Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°" }, + "generateEmail": { + "message": "ГĐĩĐŊĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đĩ-ĐŋĐžŅˆŅ‚Ņƒ" + }, + "generatorBoundariesHint": { + "message": "ЗĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ ĐŧŅ–Đļ $MIN$ Ņ‚Đ° $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "ĐĸиĐŋ Ņ–ĐŧĐĩĐŊŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°" }, @@ -2017,7 +2911,7 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊŅ– ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– Đ°Đ´Ņ€Đĩҁ Đ˛Đ°ŅˆĐžĐŗĐž ĐŋĐžŅŅ‚Đ°Ņ‡Đ°ĐģҌĐŊиĐēа ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅ— ĐŋĐžŅˆŅ‚Đ¸." + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊŅ– ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– Đ°Đ´Ņ€Đĩҁ Đ˛Đ°ŅˆĐžĐŗĐž ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€Đ° ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅ— ĐŋĐžŅˆŅ‚Đ¸." }, "catchallEmail": { "message": "ĐĐ´Ņ€ĐĩŅĐ° Đĩ-ĐŋĐžŅˆŅ‚Đ¸ Catch-all" @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "Đ—ĐŗĐĩĐŊĐĩŅ€ŅƒĐšŅ‚Đĩ ĐŋҁĐĩвдОĐŊŅ–Đŧ Đĩ-ĐŋĐžŅˆŅ‚Đ¸ ĐˇŅ– ŅŅ‚ĐžŅ€ĐžĐŊĐŊŅ–Đŧ ҁĐĩŅ€Đ˛Ņ–ŅĐžĐŧ ĐŋĐĩŅ€ĐĩŅĐ¸ĐģаĐŊĐŊŅ." }, + "forwarderDomainName": { + "message": "ДоĐŧĐĩĐŊ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅ— ĐŋĐžŅˆŅ‚Đ¸", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Đ´ĐžĐŧĐĩĐŊ, ŅĐēиК ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ Đ˛Đ¸ĐąŅ€Đ°ĐŊĐžŅŽ ҁĐģ҃ĐļĐąĐžŅŽ", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "ПоĐŧиĐģĐēа $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Đ—ĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐž Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "ВĐĩĐąŅĐ°ĐšŅ‚: $WEBSITE$. Đ—ĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐž Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "НĐĩĐ´Ņ–ĐšŅĐŊиК Ņ‚ĐžĐēĐĩĐŊ API Đ´ĐģŅ $SERVICENAME$", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "НĐĩĐ´Ņ–ĐšŅĐŊиК Ņ‚ĐžĐēĐĩĐŊ API Đ´ĐģŅ $SERVICENAME$: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "НĐĩ вдаĐģĐžŅŅ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ СаĐŧĐ°ŅĐēОваĐŊĐžŅ— Đĩ-ĐŋĐžŅˆŅ‚Đ¸ ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Đ´ĐģŅ $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "НĐĩĐ´Ņ–ĐšŅĐŊиК Đ´ĐžĐŧĐĩĐŊ Đ´ĐģŅ $SERVICENAME$.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "НĐĩĐ´Ņ–ĐšŅĐŊа URL-Đ°Đ´Ņ€ĐĩŅĐ° Đ´ĐģŅ $SERVICENAME$.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "ĐĄŅ‚Đ°ĐģĐ°ŅŅ ĐŊĐĩĐ˛Ņ–Đ´ĐžĐŧа ĐŋĐžĐŧиĐģĐēа $SERVICENAME$.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "НĐĩĐ˛Ņ–Đ´ĐžĐŧиК ĐˇĐ°ŅŅ–Đą ĐŋĐĩŅ€ĐĩҁĐŋŅ€ŅĐŧŅƒĐ˛Đ°ĐŊĐŊŅ: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ІĐŧ'Ņ Đ˛ŅƒĐˇĐģа", "description": "Part of a URL." @@ -2192,7 +3196,7 @@ "message": "Đ¯Đē ĐŋŅ€Đ°Ņ†ŅŽŅ” Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" }, "autofillSelectInfoWithCommand": { - "message": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Ņ–Đˇ ҆ҖҔҗ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи айО виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐšŅ‚Đĩ ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–ŅŽ ĐēĐģĐ°Đ˛Ņ–Ņˆ: $COMMAND$", + "message": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ой'Ņ”ĐēŅ‚ Ņ–Đˇ Ņ†ŅŒĐžĐŗĐž ĐĩĐēŅ€Đ°ĐŊ҃, ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐšŅ‚ĐĩŅŅ ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–Ņ”ŅŽ ĐēĐģĐ°Đ˛Ņ–Ņˆ $COMMAND$, айО Đ´Ņ–ĐˇĐŊĐ°ĐšŅ‚ĐĩŅŅ ĐŋŅ€Đž Ņ–ĐŊŅˆŅ– ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– в ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ….", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ Ņ–Đˇ ҆ҖҔҗ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи айО Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–ŅŽ ĐēĐģĐ°Đ˛Ņ–Ņˆ ҃ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ…." + "message": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ой'Ņ”ĐēŅ‚ Ņ–Đˇ Ņ†ŅŒĐžĐŗĐž ĐĩĐēŅ€Đ°ĐŊ҃ айО Đ´Ņ–ĐˇĐŊĐ°ĐšŅ‚ĐĩŅŅ ĐŋŅ€Đž Ņ–ĐŊŅˆŅ– ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– в ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ…." }, "gotIt": { "message": "Đ—Ņ€ĐžĐˇŅƒĐŧŅ–ĐģĐž" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "КоĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–Ņ ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–ŅŽ ĐēĐģĐ°Đ˛Ņ–Ņˆ" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "КĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–ŅĐŧи ĐēĐģĐ°Đ˛Ņ–Ņˆ" + }, "autofillShortcut": { "message": "КоĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–Ņ— ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" }, - "autofillShortcutNotSet": { + "autofillLoginShortcutNotSet": { "message": "КоĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–ŅŽ ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŊĐĩ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž. ЗĐŧŅ–ĐŊŅ–Ņ‚ŅŒ ҆Đĩ в ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°." }, - "autofillShortcutText": { - "message": "КоĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–Ņ ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ: $COMMAND$. ЗĐŧŅ–ĐŊŅ–Ņ‚ŅŒ ҆Đĩ в ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "autofillLoginShortcutText": { + "message": "КоĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–Ņ ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ: $COMMAND$. КĐĩŅ€ŅƒĐšŅ‚Đĩ Đ˛ŅŅ–Đŧа ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–ŅĐŧи ĐēĐģĐ°Đ˛Ņ–Ņˆ ҃ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸ ĐŊа" - }, "opensInANewWindow": { "message": "Đ’Ņ–Đ´ĐēŅ€Đ¸Đ˛Đ°Ņ”Ņ‚ŅŒŅŅ ҃ ĐŊОвОĐŧ҃ Đ˛Ņ–ĐēĐŊŅ–" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "ĐŸĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ SSO-Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—." }, + "creatingAccountOn": { + "message": "ĐĄŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ" + }, + "checkYourEmail": { + "message": "ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Ņ‚Đĩ ŅĐ˛ĐžŅŽ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊ҃ ĐŋĐžŅˆŅ‚Ņƒ" + }, + "followTheLinkInTheEmailSentTo": { + "message": "ПĐĩŅ€ĐĩĐšĐ´Ņ–Ņ‚ŅŒ Са ĐŋĐžŅĐ¸ĐģаĐŊĐŊŅĐŧ ҃ ĐģĐ¸ŅŅ‚Ņ–, ĐŊĐ°Đ´Ņ–ŅĐģаĐŊĐžĐŧ҃ ĐŊа" + }, + "andContinueCreatingYourAccount": { + "message": "Ņ– СавĐĩŅ€ŅˆŅ–Ņ‚ŅŒ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ." + }, + "noEmail": { + "message": "НĐĩ ĐžŅ‚Ņ€Đ¸ĐŧаĐģи ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžĐŗĐž ĐģĐ¸ŅŅ‚Đ°?" + }, + "goBack": { + "message": "ПовĐĩŅ€ĐŊŅ–Ņ‚ŅŒŅŅ ĐŊаСад" + }, + "toEditYourEmailAddress": { + "message": "Ņ– виĐŋŅ€Đ°Đ˛Ņ‚Đĩ Đ°Đ´Ņ€Đĩҁ҃ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅ— ĐŋĐžŅˆŅ‚Đ¸." + }, "eu": { "message": "ЄС", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "Đ”ĐžŅŅ‚ŅƒĐŋ ĐˇĐ°ĐąĐžŅ€ĐžĐŊĐĩĐŊĐž. ĐŖ Đ˛Đ°Ņ ĐŊĐĩĐŧĐ°Ņ” дОСвОĐģ҃ ĐŊа ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´ ҆ҖҔҗ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи." }, @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "Đ”ĐžĐ˛Ņ–Ņ€ĐĩĐŊиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš" }, + "sendsNoItemsTitle": { + "message": "НĐĩĐŧĐ°Ņ” аĐēŅ‚Đ¸Đ˛ĐŊĐ¸Ņ… Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊҌ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Đ˛Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ, Ņ‰ĐžĐą ĐąĐĩСĐŋĐĩ҇ĐŊĐž ĐŊĐ°Đ´Đ°Đ˛Đ°Ņ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋ Ņ–ĐŊŅˆĐ¸Đŧ Đ´Đž ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ—.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "НĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ввĐĩŅŅ‚Đ¸ даĐŊŅ–." }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 ĐŋĐžĐģĐĩ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒŅ” Đ˛Đ°ŅˆĐžŅ— ŅƒĐ˛Đ°ĐŗĐ¸." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ ĐŋĐžĐģŅ–Đ˛ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒŅŽŅ‚ŅŒ Đ˛Đ°ŅˆĐžŅ— ŅƒĐ˛Đ°ĐŗĐ¸.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- ОбĐĩŅ€Ņ–Ņ‚ŅŒ--" }, @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "Đ—ĐŗĐžŅ€ĐŊŅƒŅ‚Đ¸/Ņ€ĐžĐˇĐŗĐžŅ€ĐŊŅƒŅ‚Đ¸", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Đ°ŅˆŅ– даĐŊŅ– Đ´Đž Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "Đ—Đ°Ņ…Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ Đ˛Đ°ŅˆŅ– даĐŊŅ– LastPass Ņ‚Đ° Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đž Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐŊĐĩĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊиК Ņ„Đ°ĐšĐģ", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ´Đž Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "ĐĸŅ€Đ¸Đ˛Đ°Ņ” Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "ДаĐŊŅ– ҃ҁĐŋŅ–ŅˆĐŊĐž Ņ–ĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "ПоĐŧиĐģĐēа Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ. ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Ņ‚Đĩ ĐēĐžĐŊŅĐžĐģҌ Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Ņƒ ĐŋĐžĐ´Ņ€ĐžĐąĐ¸Ņ†ŅŒ.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "ĐŸŅ–Đ´ Ņ‡Đ°Ņ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ŅŅ‚Đ°ĐģĐ°ŅŅ ĐŧĐĩŅ€ĐĩĐļĐĩва ĐŋĐžĐŧиĐģĐēа.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "ĐŸŅĐĩвдОĐŊŅ–Đŧ Đ´ĐžĐŧĐĩĐŊ҃" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "ЗаĐŋĐ¸ŅĐ¸ С ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊиĐŧ СаĐŋĐ¸Ņ‚ĐžĐŧ ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ ĐŊĐĩ ĐŧĐžĐļĐŊа Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СаĐŋОвĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ Ņ‡Đ°Ņ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи. ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ виĐŧĐēĐŊĐĩĐŊĐž.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ ĐŊаĐģĐ°ŅˆŅ‚ĐžĐ˛Đ°ĐŊĐž С Ņ‚Đ¸ĐŋОвиĐŧи ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ°Đŧи.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊиК СаĐŋĐ¸Ņ‚ ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ, Ņ‰ĐžĐą Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ ҆Đĩ ĐŋĐžĐģĐĩ", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "ПĐĩŅ€ĐĩĐŧĐēĐŊŅƒŅ‚Đ¸ ĐąŅ–Ņ‡ĐŊ҃ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ–ŅŽ" + }, + "skipToContent": { + "message": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸ Đ´Đž вĐŧŅ–ŅŅ‚Ņƒ" + }, + "bitwardenOverlayButton": { + "message": "КĐŊĐžĐŋĐēа ĐŧĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "ПĐĩŅ€ĐĩĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŧĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "МĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "РОСйĐģĐžĐēŅƒĐšŅ‚Đĩ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ, Ņ‰ĐžĐą ĐŋĐžĐąĐ°Ņ‡Đ¸Ņ‚Đ¸ Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊŅ– СаĐŋĐ¸ŅĐ¸", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "РОСйĐģĐžĐēŅƒĐšŅ‚Đĩ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ¸ ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ— Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "РОСйĐģĐžĐēŅƒĐ˛Đ°Ņ‚Đ¸ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "РОСйĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ – Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ”Ņ‚ŅŒŅŅ ĐŊОвĐĩ Đ˛Ņ–ĐēĐŊĐž", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "ЗаĐŋОвĐŊĐ¸Ņ‚Đ¸ ОйĐģŅ–ĐēĐžĐ˛Ņ– даĐŊŅ– Đ´ĐģŅ", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "Đ§Đ°ŅŅ‚ĐēОвĐĩ Ņ–Đŧ'Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "НĐĩĐŧĐ°Ņ” СаĐŋĐ¸ŅŅ–Đ˛ Đ´ĐģŅ ĐŋĐžĐēĐ°ĐˇŅƒ", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "Новий СаĐŋĐ¸Ņ", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŊОвиК СаĐŋĐ¸Ņ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "Новий СаĐŋĐ¸Ņ", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "ДодаваĐŊĐŊŅ ĐŊĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Đ´ĐģŅ Đ˛Ņ…ĐžĐ´Ņƒ – Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ”Ņ‚ŅŒŅŅ ĐŊОвĐĩ Đ˛Ņ–ĐēĐŊĐž", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "Нова ĐēĐ°Ņ€Ņ‚Đēа", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "ДодаваĐŊĐŊŅ ĐŊĐžĐ˛ĐžŅ— ĐēĐ°Ņ€Ņ‚Đēи – Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ”Ņ‚ŅŒŅŅ ĐŊОвĐĩ Đ˛Ņ–ĐēĐŊĐž", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "НовĐĩ ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "ДодаваĐŊĐŊŅ ĐŊĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ Đ´ĐģŅ ĐŋĐžŅĐ˛Ņ–Đ´Ņ‡ĐĩĐŊĐŊŅ – Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ”Ņ‚ŅŒŅŅ ĐŊОвĐĩ Đ˛Ņ–ĐēĐŊĐž", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊĐĩ ĐŧĐĩĐŊŅŽ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Bitwarden. ĐĐ°Ņ‚Đ¸ŅĐŊŅ–Ņ‚ŅŒ ĐēĐģĐ°Đ˛Ņ–ŅˆŅƒ ҁ҂ҀҖĐģĐēи Đ´ĐģŅ Đ˛Đ¸ĐąĐžŅ€Ņƒ.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸" + }, + "ignore": { + "message": "Đ†ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸" + }, + "importData": { + "message": "ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ–", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "ПоĐŧиĐģĐēа Ņ–ĐŧĐŋĐžŅ€Ņ‚Ņƒ" + }, + "importErrorDesc": { + "message": "ĐŸŅ–Đ´ Ņ‡Đ°Ņ ҁĐŋŅ€ĐžĐąĐ¸ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛Đ°ŅˆĐ¸Ņ… даĐŊĐ¸Ņ… виĐŊиĐēĐģа ĐŋŅ€ĐžĐąĐģĐĩĐŧа. Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, виĐŋŅ€Đ°Đ˛Ņ‚Đĩ вĐēаСаĐŊŅ– ĐŊиĐļ҇Đĩ ĐŋĐžĐŧиĐģĐēи ҃ Đ˛Đ¸Ņ…Ņ–Đ´ĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ– Ņ‚Đ° ҁĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ СĐŊĐžĐ˛Ņƒ." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "РОСв'ŅĐļŅ–Ņ‚ŅŒ СаСĐŊĐ°Ņ‡ĐĩĐŊŅ– ĐŋĐžĐŧиĐģĐēи Ņ‚Đ° ĐŋĐžĐ˛Ņ‚ĐžŅ€Ņ–Ņ‚ŅŒ ҁĐŋŅ€ĐžĐąŅƒ." + }, + "description": { + "message": "ОĐŋĐ¸Ņ" + }, + "importSuccess": { + "message": "ДаĐŊŅ– ҃ҁĐŋŅ–ŅˆĐŊĐž Ņ–ĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž" + }, + "importSuccessNumberOfItems": { + "message": "Đ’ŅŅŒĐžĐŗĐž Ņ–ĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž $AMOUNT$ СаĐŋĐ¸ŅŅ–Đ˛.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "ĐĄĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ СĐŊĐžĐ˛Ņƒ" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "ĐĻŅ Đ´Ņ–Ņ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒŅ” ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ. Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ PIN-ĐēОд, Ņ‰ĐžĐą ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸." + }, + "setPin": { + "message": "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ PIN-ĐēОд" + }, + "verifyWithBiometrics": { + "message": "ĐŸŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸ С ĐąŅ–ĐžĐŧĐĩŅ‚Ņ€Ņ–Ņ”ŅŽ" + }, + "awaitingConfirmation": { + "message": "ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ" + }, + "couldNotCompleteBiometrics": { + "message": "НĐĩ вдаĐģĐžŅŅ виĐēĐžĐŊĐ°Ņ‚Đ¸ ĐąŅ–ĐžĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊ҃ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃." + }, + "needADifferentMethod": { + "message": "ĐŸĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ Ņ–ĐŊŅˆĐ¸Đš ҁĐŋĐžŅŅ–Đą?" + }, + "useMasterPassword": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐŗĐžĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "usePin": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ PIN-ĐēОд" + }, + "useBiometrics": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐąŅ–ĐžĐŧĐĩŅ‚Ņ€Ņ–ŅŽ" + }, + "enterVerificationCodeSentToEmail": { + "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐēОд ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ, ĐŊĐ°Đ´Ņ–ŅĐģаĐŊиК ĐŊа Đ˛Đ°ŅˆŅƒ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊ҃ ĐŋĐžŅˆŅ‚Ņƒ." + }, + "resendCode": { + "message": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ĐŊОвиК ĐēОд" + }, + "total": { + "message": "Đ’ŅŅŒĐžĐŗĐž" + }, + "importWarning": { + "message": "Ви Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒŅ”Ņ‚Đĩ даĐŊŅ– Đ´Đž $ORGANIZATION$. Đ’Đ°ŅˆŅ– даĐŊŅ– ĐŧĐžĐļŅƒŅ‚ŅŒ ĐąŅƒŅ‚Đ¸ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ– ŅƒŅ‡Đ°ŅĐŊиĐēаĐŧ ҆ҖҔҗ ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. ĐĨĐžŅ‡ĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "ПоĐŧиĐģĐēа ĐŋŅ–Đ´'Ņ”Đ´ĐŊаĐŊĐŊŅ Đ´Đž ҁĐģ҃Đļйи Duo. ĐĄĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐšŅ‚ĐĩŅŅ Ņ–ĐŊŅˆĐ¸Đŧ ҁĐŋĐžŅĐžĐąĐžĐŧ двОĐĩŅ‚Đ°ĐŋĐŊĐžŅ— ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēи айО СвĐĩŅ€ĐŊŅ–Ņ‚ŅŒŅŅ Đ´Đž ҁĐģ҃Đļйи ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēи Duo ĐŋĐž Đ´ĐžĐŋĐžĐŧĐžĐŗŅƒ." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ Duo Ņ– виĐēĐžĐŊĐ°ĐšŅ‚Đĩ Đ´Ņ–Ņ— Đ´ĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅ Đ˛Ņ…ĐžĐ´Ņƒ." + }, + "duoRequiredForAccount": { + "message": "ДĐģŅ Đ˛Đ°ŅˆĐžĐŗĐž ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊа двОĐĩŅ‚Đ°ĐŋĐŊа ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа С Duo." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Đ’Ņ–Đ´ĐēҀҖĐŋŅ–Ņ‚ŅŒ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ Đ´ĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅ Đ˛Ņ…ĐžĐ´Ņƒ." + }, + "popoutExtension": { + "message": "Đ’Ņ–Đ´ĐēҀҖĐŋĐ¸Ņ‚Đ¸ Đ˛Ņ–ĐēĐŊĐž Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ" + }, + "launchDuo": { + "message": "ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ Duo" + }, + "importFormatError": { + "message": "ДаĐŊŅ– ĐŧĐ°ŅŽŅ‚ŅŒ ĐŊĐĩĐēĐžŅ€ĐĩĐēŅ‚ĐŊĐĩ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ. ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Ņ‚Đĩ Ņ„Đ°ĐšĐģ Ņ–ĐŧĐŋĐžŅ€Ņ‚Ņƒ Ņ– ҁĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ СĐŊĐžĐ˛Ņƒ." + }, + "importNothingError": { + "message": "ĐŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ Ņ–ĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž." + }, + "importEncKeyError": { + "message": "ПоĐŧиĐģĐēа Ņ€ĐžĐˇŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐĩĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃. Đ’Đ°Ņˆ ĐēĐģŅŽŅ‡ ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ˛Ņ–Đ´Ņ€Ņ–ĐˇĐŊŅŅ”Ņ‚ŅŒŅŅ Đ˛Ņ–Đ´ ĐēĐģŅŽŅ‡Đ°, виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐžĐŗĐž Đ´ĐģŅ ĐĩĐēҁĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ даĐŊĐ¸Ņ…." + }, + "invalidFilePassword": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģ҃. ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐšŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ, ŅĐēиК ви ввОдиĐģи ĐŋŅ–Đ´ Ņ‡Đ°Ņ ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐĩĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃." + }, + "destination": { + "message": "ĐŸŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ" + }, + "learnAboutImportOptions": { + "message": "Đ”Ņ–ĐˇĐŊĐ°ĐšŅ‚ĐĩŅŅ ĐŋŅ€Đž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Ņ–ĐŧĐŋĐžŅ€Ņ‚Ņƒ" + }, + "selectImportFolder": { + "message": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ Ņ‚ĐĩĐē҃" + }, + "selectImportCollection": { + "message": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐˇĐąŅ–Ņ€Đē҃" + }, + "importTargetHint": { + "message": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ Ņ†ŅŽ ĐžĐŋŅ†Ņ–ŅŽ, ŅĐēŅ‰Đž ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ, Ņ‰ĐžĐą вĐŧҖҁ҂ Ņ–ĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃ ĐąŅƒĐģĐž СйĐĩŅ€ĐĩĐļĐĩĐŊĐž в $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "ФаКĐģ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐŊĐĩĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊŅ– СаĐŋĐ¸ŅĐ¸." + }, + "selectFormat": { + "message": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Ņ–ĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģ҃" + }, + "selectImportFile": { + "message": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„Đ°ĐšĐģ Đ´ĐģŅ Ņ–ĐŧĐŋĐžŅ€Ņ‚Ņƒ" + }, + "chooseFile": { + "message": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģ" + }, + "noFileChosen": { + "message": "ФаКĐģ ĐŊĐĩ Đ˛Đ¸ĐąŅ€Đ°ĐŊĐž" + }, + "orCopyPasteFileContents": { + "message": "айО ҁĐēĐžĐŋŅ–ŅŽĐšŅ‚Đĩ Ņ– Đ˛ŅŅ‚Đ°Đ˛Ņ‚Đĩ вĐŧҖҁ҂ Ņ„Đ°ĐšĐģ҃ Đ´ĐģŅ Ņ–ĐŧĐŋĐžŅ€Ņ‚Ņƒ" + }, + "instructionsFor": { + "message": "ІĐŊŅŅ‚Ņ€ŅƒĐē҆Җҗ Đ´ĐģŅ $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "ĐŸŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸ Ņ–ĐŧĐŋĐžŅ€Ņ‚ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°" + }, + "confirmVaultImportDesc": { + "message": "ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊиК ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ. Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ввĐĩĐ´Ņ–Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ даĐŊĐ¸Ņ…." + }, + "confirmFilePassword": { + "message": "ĐŸŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ŅŒŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ Ņ„Đ°ĐšĐģ҃" + }, + "exportSuccess": { + "message": "ДаĐŊŅ– ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° ĐĩĐēҁĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž" + }, + "typePasskey": { + "message": "КĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "accessing": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋ" + }, + "passkeyNotCopied": { + "message": "КĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃ ĐŊĐĩ ĐąŅƒĐ´Đĩ ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊĐž" + }, + "passkeyNotCopiedAlert": { + "message": "КĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃ ĐŊĐĩ ĐąŅƒĐ´Đĩ ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊĐž Đ´Đž ĐēĐģĐžĐŊОваĐŊĐžĐŗĐž СаĐŋĐ¸ŅŅƒ. ĐĨĐžŅ‡ĐĩŅ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸ ĐēĐģĐžĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž СаĐŋĐ¸ŅŅƒ?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "ĐĄĐ°ĐšŅ‚ Ņ–ĐŊŅ–Ņ†Ņ–ŅŽŅ” ОйОв'ŅĐˇĐēĐžĐ˛Ņƒ вĐĩŅ€Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ. ĐĻŅ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ ҉Đĩ ĐŊĐĩ Ņ€ĐĩаĐģŅ–ĐˇĐžĐ˛Đ°ĐŊа Đ´ĐģŅ ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛ ĐąĐĩС ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ." + }, + "logInWithPasskeyQuestion": { + "message": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸ С ĐēĐģŅŽŅ‡ĐĩĐŧ Đ´ĐžŅŅ‚ŅƒĐŋ҃?" + }, + "passkeyAlreadyExists": { + "message": "КĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´ĐģŅ ҆ҖҔҗ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи вĐļĐĩ ҖҁĐŊŅƒŅ”." + }, + "noPasskeysFoundForThisApplication": { + "message": "ДĐģŅ ҆ҖҔҗ ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи ĐŊĐĩ СĐŊаКдĐĩĐŊĐž ĐēĐģŅŽŅ‡Ņ–Đ˛ Đ´ĐžŅŅ‚ŅƒĐŋ҃." + }, + "noMatchingPasskeyLogin": { + "message": "ĐŖ Đ˛Đ°Ņ ĐŊĐĩĐŧĐ°Ņ” Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛ Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž ŅĐ°ĐšŅ‚Ņƒ." + }, + "noMatchingLoginsForSite": { + "message": "НĐĩĐŧĐ°Ņ” Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´ĐŊĐ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛ Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž ŅĐ°ĐšŅ‚Ņƒ" + }, + "searchSavePasskeyNewLogin": { + "message": "Đ¨ŅƒĐēĐ°Ņ‚Đ¸ айО СйĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃ ŅĐē ĐŊОвиК СаĐŋĐ¸Ņ" + }, + "confirm": { + "message": "ĐŸŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸" + }, + "savePasskey": { + "message": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "savePasskeyNewLogin": { + "message": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃ ŅĐē ĐŊОвиК СаĐŋĐ¸Ņ" + }, + "chooseCipherForPasskeySave": { + "message": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ СаĐŋĐ¸Ņ Đ´ĐģŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž ĐēĐģŅŽŅ‡Đ° Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "chooseCipherForPasskeyAuth": { + "message": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃ Đ´ĐģŅ Đ˛Ņ…ĐžĐ´Ņƒ" + }, + "passkeyItem": { + "message": "КĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "overwritePasskey": { + "message": "ПĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°Ņ‚Đ¸ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃?" + }, + "overwritePasskeyAlert": { + "message": "ĐĻĐĩĐš СаĐŋĐ¸Ņ ҃ĐļĐĩ ĐŧŅ–ŅŅ‚Đ¸Ņ‚ŅŒ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃. Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩСаĐŋĐ¸ŅĐ°Ņ‚Đ¸ ĐŋĐžŅ‚ĐžŅ‡ĐŊиК ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃?" + }, + "featureNotSupported": { + "message": "Đ¤ŅƒĐŊĐēŅ†Ņ–Ņ ҉Đĩ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ" + }, + "yourPasskeyIsLocked": { + "message": "ДĐģŅ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐēĐģŅŽŅ‡Đ° Đ´ĐžŅŅ‚ŅƒĐŋ҃ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ. ĐŸŅ€ĐžĐšĐ´Ņ–Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃, Ņ‰ĐžĐą ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸." + }, + "multifactorAuthenticationCancelled": { + "message": "Đ‘Đ°ĐŗĐ°Ņ‚ĐžŅ„Đ°ĐēŅ‚ĐžŅ€ĐŊ҃ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ ҁĐēĐ°ŅĐžĐ˛Đ°ĐŊĐž" + }, + "noLastPassDataFound": { + "message": "ДаĐŊŅ– LastPass ĐŊĐĩ СĐŊаКдĐĩĐŊĐž" + }, + "incorrectUsernameOrPassword": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐĩ Ņ–Đŧ'Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° айО ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "incorrectPassword": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "incorrectCode": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊиК ĐēОд" + }, + "incorrectPin": { + "message": "НĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊиК PIN-ĐēОд" + }, + "multifactorAuthenticationFailed": { + "message": "Đ—ĐąŅ–Đš ĐąĐ°ĐŗĐ°Ņ‚ĐžŅ„Đ°ĐēŅ‚ĐžŅ€ĐŊĐžŅ— Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—" + }, + "includeSharedFolders": { + "message": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ ҁĐŋŅ–ĐģҌĐŊŅ– Ņ‚ĐĩĐēи" + }, + "lastPassEmail": { + "message": "ЕĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊа ĐŋĐžŅˆŅ‚Đ° LastPass" + }, + "importingYourAccount": { + "message": "Đ’Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒŅ”Ņ‚ŅŒŅŅ..." + }, + "lastPassMFARequired": { + "message": "НĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐŋŅ€ĐžĐšŅ‚Đ¸ ĐąĐ°ĐŗĐ°Ņ‚ĐžŅ„Đ°ĐēŅ‚ĐžŅ€ĐŊ҃ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ LastPass" + }, + "lastPassMFADesc": { + "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ОдĐŊĐžŅ€Đ°ĐˇĐžĐ˛Đ¸Đš ĐēОд С ĐŋŅ€ĐžĐŗŅ€Đ°Đŧи Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—" + }, + "lastPassOOBDesc": { + "message": "ĐĄŅ…Đ˛Đ°ĐģŅ–Ņ‚ŅŒ СаĐŋĐ¸Ņ‚ Đ˛Ņ…ĐžĐ´Ņƒ в ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧŅ– Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ— айО ввĐĩĐ´Ņ–Ņ‚ŅŒ ОдĐŊĐžŅ€Đ°ĐˇĐžĐ˛Đ¸Đš ĐēОд." + }, + "passcode": { + "message": "Код" + }, + "lastPassMasterPassword": { + "message": "ГоĐģОвĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ LastPass" + }, + "lastPassAuthRequired": { + "message": "НĐĩĐžĐąŅ…Ņ–Đ´ĐŊĐž ĐŋŅ€ĐžĐšŅ‚Đ¸ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ LastPass" + }, + "awaitingSSO": { + "message": "ĐžŅ‡Ņ–ĐēŅƒŅ”Ņ‚ŅŒŅŅ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ SSO" + }, + "awaitingSSODesc": { + "message": "ĐŖĐ˛Ņ–ĐšĐ´Ņ–Ņ‚ŅŒ С виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅĐŧ ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ… Đ˛Đ°ŅˆĐžŅ— ĐēĐžĐŧĐŋаĐŊŅ–Ņ—." + }, + "seeDetailedInstructions": { + "message": "ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅŒŅ‚Đĩ Đ´ĐžĐēĐģадĐŊŅ– Ņ–ĐŊŅŅ‚Ņ€ŅƒĐē҆Җҗ ĐŊа ĐŊĐ°ŅˆĐžĐŧ҃ Đ´ĐžĐ˛Ņ–Đ´ĐēОвОĐŧ҃ ŅĐ°ĐšŅ‚Ņ–", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ĐąĐĩСĐŋĐžŅĐĩŅ€ĐĩĐ´ĐŊŅŒĐž С LastPass" + }, + "importFromCSV": { + "message": "ІĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ С Ņ„Đ°ĐšĐģ҃ CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "ĐĄĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ҉Đĩ Ņ€Đ°Đˇ айО ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Ņ‚Đĩ ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊ҃ ĐŋĐžŅˆŅ‚Ņƒ Đ˛Ņ–Đ´ LastPass Đ´ĐģŅ ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ Đ´Ņ–Ņ—." + }, + "collection": { + "message": "Đ—ĐąŅ–Ņ€Đēа" + }, + "lastPassYubikeyDesc": { + "message": "Đ’ŅŅ‚Đ°Đ˛Ņ‚Đĩ YubiKey ĐŋОв'ŅĐˇĐ°ĐŊиК С ОйĐģŅ–ĐēОвиĐŧ СаĐŋĐ¸ŅĐžĐŧ LastPass в USB ĐŋĐžŅ€Ņ‚ Đ˛Đ°ŅˆĐžĐŗĐž ĐēĐžĐŧĐŋ'ŅŽŅ‚ĐĩŅ€Đ°, ĐŋĐžŅ‚Ņ–Đŧ Ņ‚ĐžŅ€ĐēĐŊŅ–Ņ‚ŅŒŅŅ ĐšĐžĐŗĐž ĐēĐŊĐžĐŋĐēи." + }, + "switchAccount": { + "message": "ПĐĩŅ€ĐĩĐŧĐēĐŊŅƒŅ‚Đ¸ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ" + }, + "switchAccounts": { + "message": "ПĐĩŅ€ĐĩĐŧĐēĐŊŅƒŅ‚Đ¸ ОйĐģŅ–ĐēĐžĐ˛Ņ– СаĐŋĐ¸ŅĐ¸" + }, + "switchToAccount": { + "message": "ПĐĩŅ€ĐĩĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŊа ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ" + }, + "activeAccount": { + "message": "АĐēŅ‚Đ¸Đ˛ĐŊиК ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ" + }, + "availableAccounts": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊŅ– ОйĐģŅ–ĐēĐžĐ˛Ņ– СаĐŋĐ¸ŅĐ¸" + }, + "accountLimitReached": { + "message": "Đ”ĐžŅŅĐŗĐŊŅƒŅ‚Đž ОйĐŧĐĩĐļĐĩĐŊĐŊŅ ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ. Đ’Đ¸ĐšĐ´Ņ–Ņ‚ŅŒ, Ņ‰ĐžĐą Đ´ĐžĐ´Đ°Ņ‚Đ¸ Ņ–ĐŊŅˆĐ¸Đš ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ." + }, + "active": { + "message": "аĐēŅ‚Đ¸Đ˛ĐŊиК" + }, + "locked": { + "message": "СайĐģĐžĐēОваĐŊиК" + }, + "unlocked": { + "message": "Ņ€ĐžĐˇĐąĐģĐžĐēОваĐŊиК" + }, + "server": { + "message": "ҁĐĩŅ€Đ˛ĐĩŅ€" + }, + "hostedAt": { + "message": "Ņ€ĐžĐˇĐŧҖ҉ĐĩĐŊиК ĐŊа" + }, + "useDeviceOrHardwareKey": { + "message": "ĐĄĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐšŅ‚ĐĩŅŅ ŅĐ˛ĐžŅ—Đŧ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ”Đŧ айО аĐŋĐ°Ņ€Đ°Ņ‚ĐŊиĐŧ ĐēĐģŅŽŅ‡ĐĩĐŧ" + }, + "justOnce": { + "message": "Đ›Đ¸ŅˆĐĩ Ņ€Đ°Đˇ" + }, + "alwaysForThisSite": { + "message": "ЗавĐļди Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž ŅĐ°ĐšŅ‚Ņƒ" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ дОдаĐŊĐž Đ´Đž виĐŊŅŅ‚ĐēŅ–Đ˛.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "ĐŸĐžŅˆĐ¸Ņ€ĐĩĐŊŅ– Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸ Đ´ĐžĐ˛Ņ–Đ´ĐēОвиК ҆ĐĩĐŊ҂Ҁ?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Ņ‚Đ° ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐ°Ņ€ĐžĐģŅĐŧи ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Đ°Ņ‚Đ¸ Đš ĐēĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–ŅĐŧи ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊҌ ҃ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "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": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Ņ‚Đ° ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐ°Ņ€ĐžĐģŅĐŧи ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Đ°Ņ‚Đ¸ Đš ĐēĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐēĐžĐŧĐąŅ–ĐŊĐ°Ņ†Ņ–ŅĐŧи ĐēĐģĐ°Đ˛Ņ–Ņˆ Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊҌ ҃ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ… ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Đ—Ņ€ĐžĐąĐ¸Ņ‚Đ¸ Bitwarden Ņ‚Đ¸ĐŋОвиĐŧ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ĐžĐŧ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Đ¯ĐēŅ‰Đž Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ҆ĐĩĐš ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ, ĐŧĐžĐļŅƒŅ‚ŅŒ виĐŊиĐēĐŊŅƒŅ‚Đ¸ ĐēĐžĐŊŅ„ĐģŅ–ĐēŅ‚Đ¸ ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Đš Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŧŅ–Đļ Bitwarden Ņ– ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ĐžĐŧ.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Đ—Ņ€ĐžĐąĐ¸Ņ‚Đ¸ Bitwarden Ņ‚Đ¸ĐŋОвиĐŧ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ĐžĐŧ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "НĐĩĐŧĐžĐļĐģивО ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ Bitwarden Ņ‚Đ¸ĐŋОвиĐŧ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ĐžĐŧ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "ЊОй ĐˇŅ€ĐžĐąĐ¸Ņ‚Đ¸ Bitwarden Ņ‚Đ¸ĐŋОвиĐŧ ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ĐžĐŧ ĐŋĐ°Ņ€ĐžĐģŅ–Đ˛, ви ĐŧĐ°Ņ”Ņ‚Đĩ ĐŊĐ°Đ´Đ°Ņ‚Đ¸ дОСвОĐģи ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐžŅŅ‚Ņ– ҃ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ… Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊҌ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đ°.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Đ—Ņ€ĐžĐąĐ¸Ņ‚Đ¸ Ņ‚Đ¸ĐŋОвиĐŧ", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "ОбĐģŅ–ĐēĐžĐ˛Ņ– даĐŊŅ– ҃ҁĐŋŅ–ŅˆĐŊĐž СйĐĩŅ€ĐĩĐļĐĩĐŊĐž!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ СйĐĩŅ€ĐĩĐļĐĩĐŊĐž!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "ОбĐģŅ–ĐēĐžĐ˛Ņ– даĐŊŅ– ҃ҁĐŋŅ–ŅˆĐŊĐž ĐžĐŊОвĐģĐĩĐŊĐž!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ ĐžĐŊОвĐģĐĩĐŊĐž!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "ПоĐŧиĐģĐēа СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ ОйĐģŅ–ĐēĐžĐ˛Đ¸Ņ… даĐŊĐ¸Ņ…. ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅŒŅ‚Đĩ ĐŋĐžĐ´Ņ€ĐžĐąĐ¸Ņ†Ņ– в ĐēĐžĐŊŅĐžĐģŅ–.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "ĐŖŅĐŋŅ–ŅˆĐŊĐž" + }, + "removePasskey": { + "message": "ВиĐģŅƒŅ‡Đ¸Ņ‚Đ¸ ĐēĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + }, + "passkeyRemoved": { + "message": "КĐģŅŽŅ‡ Đ´ĐžŅŅ‚ŅƒĐŋ҃ виĐģŅƒŅ‡ĐĩĐŊĐž" + }, + "autofillSuggestions": { + "message": "ĐŸŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ— Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" + }, + "autofillSuggestionsTip": { + "message": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ даĐŊŅ– Đ˛Ņ…ĐžĐ´Ņƒ Ņ†ŅŒĐžĐŗĐž ŅĐ°ĐšŅ‚Ņƒ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" + }, + "yourVaultIsEmpty": { + "message": "Đ’Đ°ŅˆĐĩ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đĩ ĐŋĐžŅ€ĐžĐļĐŊŅ”" + }, + "noItemsMatchSearch": { + "message": "За Ņ†Đ¸Đŧ СаĐŋĐ¸Ņ‚ĐžĐŧ ĐŊŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ СĐŊаКдĐĩĐŊĐž" + }, + "clearFiltersOrTryAnother": { + "message": "ĐĄĐēиĐŊŅŒŅ‚Đĩ ҄ҖĐģŅŒŅ‚Ņ€Đ¸ айО ҁĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Ņ–ĐŊ҈҃ ҃ĐŧĐžĐ˛Ņƒ ĐŋĐžŅˆŅƒĐē҃" + }, + "copyInfoTitle": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ – $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŊĐžŅ‚Đ°Ņ‚Đē҃ – $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "ІĐŊŅˆŅ– ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ–, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "ІĐŊŅˆŅ– ĐŧĐžĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– – $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ¸ СаĐŋĐ¸Ņ – $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ – $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "НĐĩĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊҌ Đ´ĐģŅ ĐēĐžĐŋŅ–ŅŽĐ˛Đ°ĐŊĐŊŅ" + }, + "assignToCollections": { + "message": "ĐŸŅ€Đ¸ĐˇĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ Đ´Đž ĐˇĐąŅ–Ņ€ĐžĐē" + }, + "copyEmail": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ Đĩ-ĐŋĐžŅˆŅ‚Ņƒ" + }, + "copyPhone": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊ" + }, + "copyAddress": { + "message": "КоĐŋŅ–ŅŽĐ˛Đ°Ņ‚Đ¸ Đ°Đ´Ņ€Đĩҁ҃" + }, + "adminConsole": { + "message": "ĐēĐžĐŊŅĐžĐģŅ– адĐŧŅ–ĐŊŅ–ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ°," + }, + "accountSecurity": { + "message": "БĐĩСĐŋĐĩĐēа ОйĐģŅ–ĐēĐžĐ˛ĐžĐŗĐž СаĐŋĐ¸ŅŅƒ" + }, + "notifications": { + "message": "ĐĄĐŋĐžĐ˛Ņ–Ņ‰ĐĩĐŊĐŊŅ" + }, + "appearance": { + "message": "Đ’Đ¸ĐŗĐģŅĐ´" + }, + "errorAssigningTargetCollection": { + "message": "ПоĐŧиĐģĐēа ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ҆ҖĐģŅŒĐžĐ˛ĐžŅ— ĐˇĐąŅ–Ņ€Đēи." + }, + "errorAssigningTargetFolder": { + "message": "ПоĐŧиĐģĐēа ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ҆ҖĐģŅŒĐžĐ˛ĐžŅ— Ņ‚ĐĩĐēи." + }, + "viewItemsIn": { + "message": "ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ¸ СаĐŋĐ¸ŅĐ¸ в $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Назад Đ´Đž $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Новий" + }, + "removeItem": { + "message": "ВиĐģŅƒŅ‡Đ¸Ņ‚Đ¸ $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "ЗаĐŋĐ¸ŅĐ¸ ĐąĐĩС Ņ‚ĐĩĐēи" + }, + "itemDetails": { + "message": "ĐŸĐžĐ´Ņ€ĐžĐąĐ¸Ņ†Ņ– СаĐŋĐ¸ŅŅƒ" + }, + "itemName": { + "message": "Назва СаĐŋĐ¸ŅŅƒ" + }, + "cannotRemoveViewOnlyCollections": { + "message": "Ви ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ виĐģŅƒŅ‡Đ°Ņ‚Đ¸ ĐˇĐąŅ–Ņ€Đēи, ĐŧĐ°ŅŽŅ‡Đ¸ Đ´ĐžĐˇĐ˛Ņ–Đģ ĐģĐ¸ŅˆĐĩ ĐŊа ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŽ Đ´ĐĩаĐēŅ‚Đ¸Đ˛ĐžĐ˛Đ°ĐŊĐž" + }, + "owner": { + "message": "ВĐģĐ°ŅĐŊиĐē" + }, + "selfOwnershipLabel": { + "message": "Ви", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "ЗаĐŋĐ¸ŅĐ¸ в Đ´ĐĩаĐēŅ‚Đ¸Đ˛ĐžĐ˛Đ°ĐŊĐ¸Ņ… ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–ŅŅ… ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ–. ЗвĐĩŅ€ĐŊŅ–Ņ‚ŅŒŅŅ Đ´Đž вĐģĐ°ŅĐŊиĐēа Đ˛Đ°ŅˆĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐŋĐžĐŧĐžĐŗĐ¸." + }, + "additionalInformation": { + "message": "Đ”ĐžĐ´Đ°Ņ‚ĐēОва Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ" + }, + "itemHistory": { + "message": "Đ†ŅŅ‚ĐžŅ€Ņ–Ņ СаĐŋĐ¸ŅŅƒ" + }, + "lastEdited": { + "message": "Đ’ĐžŅŅ‚Đ°ĐŊĐŊŅ” Ņ€ĐĩĐ´Đ°ĐŗĐžĐ˛Đ°ĐŊĐž" + }, + "ownerYou": { + "message": "ВĐģĐ°ŅĐŊиĐē: Ви" + }, + "linked": { + "message": "Пов'ŅĐˇĐ°ĐŊĐž" + }, + "copySuccessful": { + "message": "ĐŖŅĐŋŅ–ŅˆĐŊĐž ҁĐēĐžĐŋŅ–ĐšĐžĐ˛Đ°ĐŊĐž" + }, + "upload": { + "message": "ВиваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸" + }, + "addAttachment": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ вĐēĐģадĐĩĐŊĐŊŅ" + }, + "maxFileSizeSansPunctuation": { + "message": "МаĐēŅĐ¸ĐŧаĐģҌĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃ – 500 МБ" + }, + "deleteAttachmentName": { + "message": "ВидаĐģĐ¸Ņ‚Đ¸ вĐēĐģадĐĩĐŊĐŊŅ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Ви Đ´Ņ–ĐšŅĐŊĐž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž видаĐģĐ¸Ņ‚Đ¸ ҆Đĩ вĐēĐģадĐĩĐŊĐŊŅ?" + }, + "premium": { + "message": "ĐŸŅ€ĐĩĐŧŅ–ŅƒĐŧ" + }, + "freeOrgsCannotUseAttachments": { + "message": "ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— ĐąĐĩС ĐŋĐĩŅ€ĐĩĐ´ĐŋĐģĐ°Ņ‚Đ¸ ĐŊĐĩ ĐŧĐžĐļŅƒŅ‚ŅŒ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ вĐēĐģадĐĩĐŊĐŊŅ" + }, + "filters": { + "message": "Đ¤Ņ–ĐģŅŒŅ‚Ņ€Đ¸" + }, + "personalDetails": { + "message": "ĐžŅĐžĐąĐ¸ŅŅ‚Ņ– даĐŊŅ–" + }, + "identification": { + "message": "ІдĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ" + }, + "contactInfo": { + "message": "КоĐŊŅ‚Đ°ĐēŅ‚ĐŊŅ– даĐŊŅ–" + }, + "downloadAttachment": { + "message": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ – $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "ĐŊĐžĐŧĐĩŅ€ ĐēĐ°Ņ€Ņ‚Đēи СаĐēŅ–ĐŊŅ‡ŅƒŅ”Ņ‚ŅŒŅŅ ĐŊа", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "ОбĐģŅ–ĐēĐžĐ˛Ņ– даĐŊŅ– Đ´ĐģŅ Đ˛Ņ…ĐžĐ´Ņƒ" + }, + "authenticatorKey": { + "message": "КĐģŅŽŅ‡ Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—" + }, + "autofillOptions": { + "message": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ" + }, + "websiteUri": { + "message": "ВĐĩĐąŅĐ°ĐšŅ‚ (URI)" + }, + "websiteUriCount": { + "message": "ВĐĩĐąŅĐ°ĐšŅ‚ (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "ВĐĩĐąŅĐ°ĐšŅ‚ дОдаĐŊĐž" + }, + "addWebsite": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ вĐĩĐąŅĐ°ĐšŅ‚" + }, + "deleteWebsite": { + "message": "ВидаĐģĐ¸Ņ‚Đ¸ вĐĩĐąŅĐ°ĐšŅ‚" + }, + "defaultLabel": { + "message": "ĐĸиĐŋОвО ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐˇĐąŅ–ĐŗŅ–Đ˛ $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "ĐŸŅ€Đ¸Ņ…ĐžĐ˛Đ°Ņ‚Đ¸ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ ĐˇĐąŅ–ĐŗŅ–Đ˛ $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СаĐŋОвĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ Ņ‡Đ°Ņ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи?" + }, + "cardExpiredTitle": { + "message": "ĐŸŅ€ĐžŅ‚ĐĩŅ€ĐŧŅ–ĐŊОваĐŊа ĐēĐ°Ņ€Ņ‚Đēа" + }, + "cardExpiredMessage": { + "message": "Đ¯ĐēŅ‰Đž ви Ņ—Ņ— ĐŋĐžĐŊОвиĐģи, ĐžĐŊĐžĐ˛Ņ–Ņ‚ŅŒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ" + }, + "cardDetails": { + "message": "ĐŸĐžĐ´Ņ€ĐžĐąĐ¸Ņ†Ņ– ĐēĐ°Ņ€Ņ‚Đēи" + }, + "cardBrandDetails": { + "message": "ĐŸĐžĐ´Ņ€ĐžĐąĐ¸Ņ†Ņ– $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ аĐŊŅ–ĐŧĐ°Ņ†Ņ–ŅŽ" + }, + "showAnimations": { + "message": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ аĐŊŅ–ĐŧĐ°Ņ†Ņ–Ņ—" + }, + "addAccount": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ" + }, + "loading": { + "message": "ЗаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ" + }, + "data": { + "message": "ДаĐŊŅ–" + }, + "passkeys": { + "message": "КĐģŅŽŅ‡Ņ– Đ´ĐžŅŅ‚ŅƒĐŋ҃", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "ĐŸĐ°Ņ€ĐžĐģŅ–", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸ С ĐēĐģŅŽŅ‡ĐĩĐŧ Đ´ĐžŅŅ‚ŅƒĐŋ҃", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "ĐŸŅ€Đ¸ĐˇĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Đ›Đ¸ŅˆĐĩ ŅƒŅ‡Đ°ŅĐŊиĐēи ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— С Đ´ĐžŅŅ‚ŅƒĐŋĐžĐŧ Đ´Đž Ņ†Đ¸Ņ… ĐˇĐąŅ–Ņ€ĐžĐē СĐŧĐžĐļŅƒŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Đ°Ņ‚Đ¸ СаĐŋĐ¸Ņ." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Đ›Đ¸ŅˆĐĩ ŅƒŅ‡Đ°ŅĐŊиĐēи ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ— С Đ´ĐžŅŅ‚ŅƒĐŋĐžĐŧ Đ´Đž Ņ†Đ¸Ņ… ĐˇĐąŅ–Ņ€ĐžĐē СĐŧĐžĐļŅƒŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´Đ°Ņ‚Đ¸ СаĐŋĐ¸ŅĐ¸." + }, + "bulkCollectionAssignmentWarning": { + "message": "Ви Đ˛Đ¸ĐąŅ€Đ°Đģи $TOTAL_COUNT$ СаĐŋĐ¸ŅŅ–Đ˛. Ви ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ $READONLY_COUNT$ СаĐŋĐ¸ŅŅ–Đ˛, Ņ‚ĐžĐŧ҃ Ņ‰Đž ҃ Đ˛Đ°Ņ ĐŊĐĩĐŧĐ°Ņ” дОСвОĐģ҃ ĐŊа Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐžĐģĐĩ" + }, + "add": { + "message": "Đ”ĐžĐ´Đ°Ņ‚Đ¸" + }, + "fieldType": { + "message": "ĐĸиĐŋ ĐŋĐžĐģŅ" + }, + "fieldLabel": { + "message": "ĐœŅ–Ņ‚Đēа ĐŋĐžĐģŅ" + }, + "textHelpText": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Ņ– ĐŋĐžĐģŅ Đ´ĐģŅ даĐŊĐ¸Ņ…, ŅĐē-ĐžŅ‚ ҁĐĩĐēŅ€ĐĩŅ‚ĐŊŅ– СаĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ" + }, + "hiddenHelpText": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊŅ– ĐŋĐžĐģŅ Đ´ĐģŅ ĐēĐžĐŊŅ„Ņ–Đ´ĐĩĐŊŅ†Ņ–ĐšĐŊĐ¸Ņ… даĐŊĐ¸Ņ…, ŅĐē-ĐžŅ‚ ĐŋĐ°Ņ€ĐžĐģҌ" + }, + "checkBoxHelpText": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋŅ€Đ°ĐŋĐžŅ€Ņ†Ņ–, ŅĐēŅ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž СаĐŋОвĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋĐžĐģŅ, ŅĐē-ĐžŅ‚ Đ°Đ´Ņ€Đĩҁ҃ Đĩ-ĐŋĐžŅˆŅ‚Đ¸" + }, + "linkedHelpText": { + "message": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐŋОв'ŅĐˇĐ°ĐŊĐĩ ĐŋĐžĐģĐĩ ҃ Ņ€Đ°ĐˇŅ– виĐŊиĐēĐŊĐĩĐŊĐŊŅ ĐŋŅ€ĐžĐąĐģĐĩĐŧ С Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅĐŧ Đ´ĐģŅ ĐŋĐĩвĐŊĐžĐŗĐž вĐĩĐąŅĐ°ĐšŅ‚Ņƒ." + }, + "linkedLabelHelpText": { + "message": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ html-Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžŅ€ ĐŋĐžĐģŅ, ĐŊĐ°ĐˇĐ˛Ņƒ, ĐŧŅ–Ņ‚Đē҃ айО СаĐŋОвĐŊŅŽĐ˛Đ°Ņ‡." + }, + "editField": { + "message": "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐžĐģĐĩ" + }, + "editFieldLabel": { + "message": "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "ВидаĐģĐ¸Ņ‚Đ¸ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ дОдаĐŊĐž", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "ПĐĩŅ€ĐĩвĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°Ņ‚Đ¸ $LABEL$. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐēĐģĐ°Đ˛Ņ–ŅˆŅ– ĐˇŅ– ҁ҂ҀҖĐģĐēаĐŧи Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐŊŅ.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž Đ˛ĐŗĐžŅ€Ņƒ, ĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ $INDEX$ С $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ ĐˇĐąŅ–Ņ€Đēи Đ´ĐģŅ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ" + }, + "personalItemTransferWarningSingular": { + "message": "1 СаĐŋĐ¸Ņ ĐąŅƒĐ´Đĩ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐŊĐĩҁĐĩĐŊĐž Đ´Đž Đ˛Đ¸ĐąŅ€Đ°ĐŊĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. Ви ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐģĐ°ŅĐŊиĐēĐžĐŧ Ņ†ŅŒĐžĐŗĐž СаĐŋĐ¸ŅŅƒ." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ СаĐŋĐ¸ŅŅ–Đ˛ ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐŊĐĩҁĐĩĐŊŅ– Đ´Đž Đ˛Đ¸ĐąŅ€Đ°ĐŊĐžŅ— ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ—. Ви ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐģĐ°ŅĐŊиĐēĐžĐŧ Ņ†Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 СаĐŋĐ¸Ņ ĐąŅƒĐ´Đĩ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐŊĐĩҁĐĩĐŊĐž Đ´Đž $ORG$. Ви ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐģĐ°ŅĐŊиĐēĐžĐŧ Ņ†ŅŒĐžĐŗĐž СаĐŋĐ¸ŅŅƒ.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ СаĐŋĐ¸ŅŅ–Đ˛ ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž ĐŋĐĩŅ€ĐĩĐŊĐĩҁĐĩĐŊŅ– Đ´Đž $ORG$. Ви ĐąŅ–ĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚Đĩ вĐģĐ°ŅĐŊиĐēĐžĐŧ Ņ†Đ¸Ņ… СаĐŋĐ¸ŅŅ–Đ˛.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "Đ—ĐąŅ–Ņ€Đēи ҃ҁĐŋŅ–ŅˆĐŊĐž ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐž" + }, + "nothingSelected": { + "message": "Ви ĐŊŅ–Ņ‡ĐžĐŗĐž ĐŊĐĩ Đ˛Đ¸ĐąŅ€Đ°Đģи." + }, + "movedItemsToOrg": { + "message": "Đ’Đ¸ĐąŅ€Đ°ĐŊŅ– СаĐŋĐ¸ŅĐ¸ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž Đ´Đž $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "ЗаĐŋĐ¸ŅĐ¸ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž Đ´Đž $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "ЗаĐŋĐ¸Ņ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž Đ´Đž $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ ĐŋĐĩŅ€ĐĩĐŧҖ҉ĐĩĐŊĐž вĐŊиС, ĐŋĐžĐˇĐ¸Ņ†Ņ–Ņ $INDEX$ С $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Đ ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ СаĐŋĐ¸ŅŅƒ" + }, + "fileSend": { + "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃" + }, + "fileSends": { + "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛" + }, + "textSend": { + "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ" + }, + "textSends": { + "message": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ" + }, + "bitwardenNewLook": { + "message": "Bitwarden ĐŧĐ°Ņ” ĐŊОвиК Đ˛Đ¸ĐŗĐģŅĐ´!" + }, + "bitwardenNewLookDesc": { + "message": "ĐŠĐĩ ĐŋŅ€ĐžŅŅ‚Ņ–ŅˆĐĩ Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ Ņ‚Đ° Ņ–ĐŊŅ‚ŅƒŅ—Ņ‚Đ¸Đ˛ĐŊŅ–ŅˆĐ¸Đš ĐŋĐžŅˆŅƒĐē ҃ ŅŅ…ĐžĐ˛Đ¸Ņ‰Ņ–. ОзĐŊаКОĐŧŅ‚ĐĩŅŅ!" + }, + "accountActions": { + "message": "Đ”Ņ–Ņ— С ОйĐģŅ–ĐēОвиĐŧ СаĐŋĐ¸ŅĐžĐŧ" + }, + "showNumberOfAutofillSuggestions": { + "message": "ПоĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–Đš Đ°Đ˛Ņ‚ĐžĐˇĐ°ĐŋОвĐŊĐĩĐŊĐŊŅ ĐŊа ĐŋŅ–ĐēŅ‚ĐžĐŗŅ€Đ°ĐŧŅ– Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ" + }, + "systemDefault": { + "message": "ĐĸиĐŋОвО (ŅĐ¸ŅŅ‚ĐĩĐŧа)" + }, + "enterprisePolicyRequirementsApplied": { + "message": "До Ņ†ŅŒĐžĐŗĐž ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛Đ°ĐŊĐž виĐŧĐžĐŗĐ¸ ĐŋĐžĐģŅ–Ņ‚Đ¸Đēи ĐēĐžĐŧĐŋаĐŊŅ–Ņ—" + }, + "sshPrivateKey": { + "message": "ЗаĐēŅ€Đ¸Ņ‚Đ¸Đš ĐēĐģŅŽŅ‡" + }, + "sshPublicKey": { + "message": "Đ’Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸Đš ĐēĐģŅŽŅ‡" + }, + "sshFingerprint": { + "message": "ĐĻĐ¸Ņ„Ņ€ĐžĐ˛Đ¸Đš Đ˛Ņ–Đ´ĐąĐ¸Ņ‚ĐžĐē" + }, + "sshKeyAlgorithm": { + "message": "ĐĸиĐŋ ĐēĐģŅŽŅ‡Đ°" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸ ҁĐŋŅ€ĐžĐąŅƒ" + }, + "vaultCustomTimeoutMinimum": { + "message": "ĐœŅ–ĐŊŅ–ĐŧаĐģҌĐŊиК вĐģĐ°ŅĐŊиК Ņ‡Đ°Ņ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ – 1 Ņ…Đ˛Đ¸ĐģиĐŊа." + }, + "additionalContentAvailable": { + "message": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊиК Đ´ĐžĐ´Đ°Ņ‚ĐēОвиК вĐŧҖҁ҂" + }, + "fileSavedToDevice": { + "message": "ФаКĐģ СйĐĩŅ€ĐĩĐļĐĩĐŊĐž ĐŊа ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐšĐžĐŗĐž СĐŊĐ°ĐšŅ‚Đ¸ ҃ Ņ‚Đĩ҆Җ СаваĐŊŅ‚Đ°ĐļĐĩĐŊҌ." + }, + "showCharacterCount": { + "message": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ŅĐ¸ĐŧвОĐģŅ–Đ˛" + }, + "hideCharacterCount": { + "message": "ĐŸŅ€Đ¸Ņ…ĐžĐ˛Đ°Ņ‚Đ¸ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ŅĐ¸ĐŧвОĐģŅ–Đ˛" + }, + "itemsInTrash": { + "message": "ЗаĐŋĐ¸ŅĐ¸ в ҁĐŧŅ–Ņ‚ĐŊиĐē҃" + }, + "noItemsInTrash": { + "message": "НĐĩĐŧĐ°Ņ” СаĐŋĐ¸ŅŅ–Đ˛ ҃ ҁĐŧŅ–Ņ‚ĐŊиĐē҃" + }, + "noItemsInTrashDesc": { + "message": "ВидаĐģĐĩĐŊŅ– СаĐŋĐ¸ŅĐ¸ С'ŅĐ˛ĐģŅŅ‚Đ¸ĐŧŅƒŅ‚ŅŒŅŅ Ņ‚ŅƒŅ‚ Ņ– ĐąŅƒĐ´ŅƒŅ‚ŅŒ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž видаĐģĐĩĐŊŅ– ҇ĐĩŅ€ĐĩС 30 Đ´ĐŊŅ–Đ˛" + }, + "trashWarning": { + "message": "ЗаĐŋĐ¸ŅĐ¸, Ņ‰Đž СĐŊĐ°Ņ…ĐžĐ´ŅŅ‚ŅŒŅŅ в ҁĐŧŅ–Ņ‚ĐŊиĐē҃ ĐŋĐžĐŊад 30 Đ´ĐŊŅ–Đ˛, Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž видаĐģŅŅ‚Đ¸ĐŧŅƒŅ‚ŅŒŅŅ" + }, + "restore": { + "message": "Đ’Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸" + }, + "deleteForever": { + "message": "ВидаĐģĐ¸Ņ‚Đ¸ ĐžŅŅ‚Đ°Ņ‚ĐžŅ‡ĐŊĐž" + }, + "noEditPermissions": { + "message": "ВаĐŧ ĐŊĐĩ дОСвОĐģĐĩĐŊĐž Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸ ҆ĐĩĐš СаĐŋĐ¸Ņ" + }, + "authenticating": { + "message": "ĐŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ" + }, + "fillGeneratedPassword": { + "message": "ЗаĐŋОвĐŊĐ¸Ņ‚Đ¸ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "ĐŸĐ°Ņ€ĐžĐģҌ ĐˇĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊĐž ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ СаĐŋĐ¸Ņ ҃ Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "ĐŸŅ€ĐžĐąŅ–Đģ", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "ĐĸиĐģŅŒĐ´Đ°", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Đ—Đ˛ĐžŅ€ĐžŅ‚ĐŊиК аĐŋĐžŅŅ‚Ņ€ĐžŅ„", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "ЗĐŊаĐē ĐžĐēĐģиĐē҃", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "ЗĐŊаĐē @ (At)", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "ЗĐŊаĐē Ņ€ĐĩŅˆŅ–Ņ‚Đēи", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "ЗĐŊаĐē Đ´ĐžĐģĐ°Ņ€Đ°", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "ЗĐŊаĐē Đ˛Ņ–Đ´ŅĐžŅ‚Đēа", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "ĐšĐ°Ņ€ĐĩŅ‚", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "АĐŧĐŋĐĩŅ€ŅĐ°ĐŊĐ´", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Đ—Ņ–Ņ€ĐžŅ‡Đēа", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Đ›Ņ–Đ˛Đ° Đ´ŅƒĐļĐēа", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "ĐŸŅ€Đ°Đ˛Đ° Đ´ŅƒĐļĐēа", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "ЗĐŊаĐē ĐŋŅ–Đ´ĐēŅ€ĐĩҁĐģĐĩĐŊĐŊŅ", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "ДĐĩ҄Җҁ", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "ПĐģŅŽŅ", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Đ”ĐžŅ€Ņ–Đ˛ĐŊŅŽŅ”", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Đ›Ņ–Đ˛Đ° Ņ„Ņ–ĐŗŅƒŅ€ĐŊа Đ´ŅƒĐļĐēа", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "ĐŸŅ€Đ°Đ˛Đ° Ņ„Ņ–ĐŗŅƒŅ€ĐŊа Đ´ŅƒĐļĐēа", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Đ›Ņ–Đ˛Đ° ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊа Đ´ŅƒĐļĐēа", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "ĐŸŅ€Đ°Đ˛Đ° ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊа Đ´ŅƒĐļĐēа", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "ВĐĩŅ€Ņ‚Đ¸ĐēаĐģҌĐŊа Ņ€Đ¸ŅĐēа", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "ОбĐĩŅ€ĐŊĐĩĐŊа ҁĐēҖҁĐŊа Ņ€Đ¸ŅĐēа", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "ДвоĐēŅ€Đ°ĐŋĐēа", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "ĐšŅ€Đ°ĐŋĐēа С ĐēĐžĐŧĐžŅŽ", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "ĐŸĐžĐ´Đ˛Ņ–ĐšĐŊŅ– ĐģаĐŋĐēи", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "ОдиĐŊĐ°Ņ€ĐŊŅ– ĐģаĐŋĐēи", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "МĐĩĐŊ҈Đĩ", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Đ‘Ņ–ĐģҌ҈Đĩ", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "КоĐŧа", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "ĐšŅ€Đ°ĐŋĐēа", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "ЗĐŊаĐē ĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "ĐĄĐēҖҁĐŊа Ņ€Đ¸ŅĐēа", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "МаĐģŅ– ĐģŅ–Ņ‚ĐĩŅ€Đ¸" + }, + "uppercaseAriaLabel": { + "message": "ВĐĩĐģиĐēŅ– ĐģŅ–Ņ‚ĐĩŅ€Đ¸" + }, + "generatedPassword": { + "message": "Đ—ĐŗĐĩĐŊĐĩŅ€ĐžĐ˛Đ°ĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 7f256311f16..05038eb1125 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - QuáēŖn lÃŊ máē­t kháēŠu miáģ…n phí", + "message": "TrÃŦnh quáēŖn lÃŊ máē­t kháēŠu Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "TrÃŦnh quáēŖn lÃŊ máē­t kháēŠu an toàn và miáģ…n phí cho máģi thiáēŋt báģ‹ cáģ§a báēĄn.", - "description": "Extension description" + "message": "áģž nhà, áģŸ cÆĄ quan, hay trÃĒn đưáģng đi, Bitwarden sáēŊ báēŖo máē­t táēĨt cáēŖ máē­t kháēŠu, mÃŖ khoÃĄ, và thông tin cÃĄ nhÃĸn cáģ§a báēĄn", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Đăng nháē­p hoáēˇc táēĄo tài khoáēŖn máģ›i đáģƒ truy cáē­p kho lưu tráģ¯ cáģ§a báēĄn." }, + "inviteAccepted": { + "message": "Láģi máģi đưáģŖc cháēĨp nháē­n" + }, "createAccount": { "message": "TáēĄo tài khoáēŖn" }, - "login": { - "message": "Đăng nháē­p" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "Đáēˇt máē­t kháēŠu máēĄnh" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "Hoàn thành viáģ‡c táēĄo tài khoáēŖn cáģ§a báēĄn báēąng cÃĄch đáēˇt máē­t kháēŠu" }, "enterpriseSingleSignOn": { "message": "Đăng nháē­p báēąng tài khoáēŖn táģ• cháģŠc" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "GáģŖi ÃŊ máē­t kháēŠu chính cÃŗ tháģƒ giÃēp báēĄn nháģ› láēĄi máē­t kháēŠu cáģ§a mÃŦnh náēŋu báēĄn quÃĒn nÃŗ." }, + "masterPassHintText": { + "message": "Náēŋu báēĄn quÃĒn máē­t kháēŠu, gáģŖi ÃŊ máē­t kháēŠu cÃŗ tháģƒ Ä‘Æ°áģŖc gáģ­i táģ›i email cáģ§a báēĄn. $CURRENT$/$MAXIMUM$ kÃŊ táģą táģ‘i đa.", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "Nháē­p láēĄi máē­t kháēŠu chính" }, "masterPassHint": { "message": "GáģŖi ÃŊ máē­t kháēŠu chính (tÚy cháģn)" }, + "joinOrganization": { + "message": "Tham gia táģ• cháģŠc" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "Hoàn táēĨt gia nháē­p táģ• cháģŠc này báēąng cÃĄch đáēˇt máģ™t máē­t kháēŠu chính." + }, "tab": { "message": "Tab" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "Sao chÊp máē­t kháēŠu" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "Sao chÊp ghi chÃē" }, @@ -88,18 +137,85 @@ "copySecurityCode": { "message": "Sao chÊp mÃŖ báēŖo máē­t" }, + "copyName": { + "message": "Sao chÊp tÃĒn" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Sáģ‘ báēŖo hiáģƒm xÃŖ háģ™i" + }, + "copyPassportNumber": { + "message": "Sao chÊp sáģ‘ háģ™ chiáēŋu" + }, + "copyLicenseNumber": { + "message": "Sao chÊp sáģ‘ giáēĨy phÊp" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "Táģą Ä‘áģ™ng điáģn" }, + "autoFillLogin": { + "message": "Táģą Ä‘áģ™ng điáģn thông tin đăng nháē­p" + }, + "autoFillCard": { + "message": "Táģą Ä‘áģ™ng điáģn tháēģ" + }, + "autoFillIdentity": { + "message": "Táģą Ä‘áģ™ng điáģn danh tính" + }, "generatePasswordCopied": { "message": "TáēĄo máē­t kháēŠu (Ä‘ÃŖ sao chÊp)" }, "copyElementIdentifier": { - "message": "Sao chÊp TÃĒn trưáģng TÚy cháģ‰nh" + "message": "Sao chÊp tÃĒn trưáģng tÚy cháģ‰nh" }, "noMatchingLogins": { "message": "Không cÃŗ thông tin đăng nháē­p phÚ háģŖp." }, + "noCards": { + "message": "Không cÃŗ tháēģ" + }, + "noIdentities": { + "message": "Không cÃŗ danh tính" + }, + "addLoginMenu": { + "message": "ThÃĒm thông tin đăng nháē­p" + }, + "addCardMenu": { + "message": "ThÃĒm tháēģ" + }, + "addIdentityMenu": { + "message": "ThÃĒm danh tính" + }, "unlockVaultMenu": { "message": "MáģŸ khoÃĄ kho lưu tráģ¯ cáģ§a báēĄn" }, @@ -115,6 +231,18 @@ "addItem": { "message": "ThÃĒm máģĨc" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "GáģŖi ÃŊ máē­t kháēŠu" }, @@ -142,18 +270,36 @@ "confirmIdentity": { "message": "XÃĄc nháē­n danh tính cáģ§a báēĄn đáģƒ tiáēŋp táģĨc." }, - "account": { - "message": "Tài khoáēŖn" - }, "changeMasterPassword": { "message": "Thay đáģ•i máē­t kháēŠu chính" }, + "continueToWebApp": { + "message": "Tiáēŋp táģĨc táģ›i áģŠng dáģĨng web?" + }, + "continueToWebAppDesc": { + "message": "KhÃĄm phÃĄ thÃĒm cÃĄc tính năng cáģ§a tài khoáēŖn Bitwarden cáģ§a báēĄn trÃĒn báēŖn web." + }, + "continueToHelpCenter": { + "message": "Tiáēŋp táģĨc táģ›i Trung tÃĸm tráģŖ giÃēp?" + }, + "continueToHelpCenterDesc": { + "message": "TÃŦm hiáģƒu thÃĒm váģ cÃĄch sáģ­ dáģĨng Bitwarden trong Trung tÃĸm tráģŖ giÃēp." + }, + "continueToBrowserExtensionStore": { + "message": "Tiáēŋp táģĨc táģ›i cáģ­a hàng tiáģ‡n ích máģŸ ráģ™ng cáģ§a trÃŦnh duyáģ‡t?" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "GiÃēp ngưáģi khÃĄc tÃŦm hiáģƒu xem Bitwarden cÃŗ phÚ háģŖp váģ›i háģ không. HÃŖy truy cáē­p cáģ­a hàng tiáģ‡n ích máģŸ ráģ™ng trÃĒn trÃŦnh duyáģ‡t cáģ§a báēĄn và Ä‘ÃĄnh giÃĄ ngay bÃĸy giáģ." + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "BáēĄn cÃŗ tháģƒ thay đáģ•i máē­t kháēŠu chính cáģ§a mÃŦnh trÃĒn Bitwarden báēŖn web." + }, "fingerprintPhrase": { - "message": "Fingerprint Phrase", + "message": "CáģĨm vÃĸn tay", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "CáģĨm táģĢ máē­t kháēŠu cáģ§a tài khoáēŖn cáģ§a báēĄn", + "message": "CáģĨm vÃĸn tay cáģ§a tài khoáēŖn cáģ§a báēĄn", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { @@ -162,9 +308,45 @@ "logOut": { "message": "Đăng xuáēĨt" }, + "aboutBitwarden": { + "message": "Giáģ›i thiáģ‡u váģ Bitwarden" + }, "about": { "message": "Thông tin" }, + "moreFromBitwarden": { + "message": "Thông tin khÃĄc táģĢ Bitwarden" + }, + "continueToBitwardenDotCom": { + "message": "Tiáēŋp táģĨc táģ›i bitwarden.com?" + }, + "bitwardenForBusiness": { + "message": "Bitwarden dành cho Doanh Nghiáģ‡p" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden Authenticator" + }, + "continueToAuthenticatorPageDesc": { + "message": "áģ¨ng dáģĨng Bitwarden Authenticator cho phÊp báēĄn lưu tráģ¯ khÃŗa xÃĄc tháģąc và táēĄo mÃŖ TOTP cho quy trÃŦnh xÃĄc minh hai bưáģ›c. TÃŦm hiáģƒu thÃĒm trÃĒn trang web bitwarden.com" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Lưu tráģ¯ báēŖo máē­t, quáēŖn lÃŊ và chia sáēģ bí máē­t cáģ§a nhà phÃĄt triáģƒn váģ›i Bitwarden Secrets Manager. Truy cáē­p bitwarden.com đáģƒ biáēŋt thÃĒm chi tiáēŋt." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "TáēĄo tráēŖi nghiáģ‡m đăng nháē­p mưáģŖt mà và an toàn không cáē§n máē­t kháēŠu truyáģn tháģ‘ng váģ›i Passwordless.dev. TÃŦm hiáģƒu thÃĒm trÃĒn trang web bitwarden.com." + }, + "freeBitwardenFamilies": { + "message": "GÃŗi Gia đÃŦnh Miáģ…n phí cáģ§a Bitwarden" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "BáēĄn đáģ§ Ä‘iáģu kiáģ‡n cho GÃŗi Gia đÃŦnh Miáģ…n phí cáģ§a Bitwarden. HÃŖy nháē­n ưu Ä‘ÃŖi này ngay hôm nay trÃĒn áģŠng dáģĨng web." + }, "version": { "message": "PhiÃĒn báēŖn" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "Cháģ‰nh sáģ­a thư máģĨc" }, + "newFolder": { + "message": "Thư máģĨc máģ›i" + }, + "folderName": { + "message": "TÃĒn thư máģĨc" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "XÃŗa thư máģĨc" }, @@ -214,17 +414,17 @@ "message": "Đáģ“ng báģ™ láē§n cuáģ‘i:" }, "passGen": { - "message": "TáēĄo máē­t kháēŠu" + "message": "TrÃŦnh táēĄo máē­t kháēŠu" }, "generator": { - "message": "TáēĄo máē­t kháēŠu", - "description": "Short for 'Password Generator'." + "message": "TrÃŦnh táēĄo", + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "Táģą Ä‘áģ™ng táēĄo máē­t kháēŠu máēĄnh máēŊ, đáģ™c nháēĨt cho đăng nháē­p cáģ§a báēĄn." }, - "bitWebVault": { - "message": "Trang web kho lưu tráģ¯ Bitwarden" + "bitWebVaultApp": { + "message": "áģ¨ng dáģĨng Bitwarden báēŖn web" }, "importItems": { "message": "Nháē­p máģĨc" @@ -235,6 +435,9 @@ "generatePassword": { "message": "TáēĄo máē­t kháēŠu" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "TáēĄo láēĄi máē­t kháēŠu" }, @@ -244,17 +447,60 @@ "length": { "message": "Đáģ™ dài" }, + "passwordMinLength": { + "message": "Đáģ™ dài máē­t kháēŠu táģ‘i thiáģƒu" + }, "uppercase": { - "message": "Cháģ¯ in hoa (A-Z)" + "message": "Cháģ¯ in hoa (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Cháģ¯ in thưáģng (a-z)" + "message": "Cháģ¯ in thưáģng (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Cháģ¯ sáģ‘ (0-9)" + "message": "Cháģ¯ sáģ‘ (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "KÃŊ táģą Ä‘áēˇc biáģ‡t (!@#$%^&*)" + "message": "KÃŊ táģą Ä‘áēˇc biáģ‡t (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Bao gáģ“m", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Bao gáģ“m cáēŖ sáģ‘", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Bao gÃ´Ė€m caˁc kyˁ tÆ°ĖŖ Ä‘ÄƒĖŖc biÃĒĖŖt", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Sáģ‘ táģĢ" @@ -276,7 +522,16 @@ "message": "Sáģ‘ kí táģą Ä‘áēˇc biáģ‡t táģ‘i thiáģƒu" }, "avoidAmbChar": { - "message": "TrÃĄnh cÃĄc kÃŊ táģą không rÃĩ ràng" + "message": "TrÃĄnh cÃĄc kÃŊ táģą không rÃĩ ràng", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "TÃŦm kiáēŋm trong kho lưu tráģ¯" @@ -299,15 +554,30 @@ "password": { "message": "Máē­t kháēŠu" }, + "totp": { + "message": "KhÃŗa xÃĄc tháģąc" + }, "passphrase": { "message": "CáģĨm táģĢ máē­t kháēŠu" }, "favorite": { "message": "YÃĒu thích" }, + "unfavorite": { + "message": "Báģ thích" + }, + "itemAddedToFavorites": { + "message": "ÄÃŖ thÃĒm vào yÃĒu thích" + }, + "itemRemovedFromFavorites": { + "message": "ÄÃŖ xÃŗa kháģi yÃĒu thích" + }, "notes": { "message": "Ghi chÃē" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Ghi chÃē" }, @@ -326,6 +596,18 @@ "launch": { "message": "KháģŸi cháēĄy" }, + "launchWebsite": { + "message": "MáģŸ trang web" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "Trang web" }, @@ -338,8 +620,23 @@ "other": { "message": "KhÃĄc" }, + "unlockMethods": { + "message": "TÚy cháģn máģŸ khÃŗa" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Thiáēŋt láē­p phÆ°ÆĄng tháģŠc máģŸ khÃŗa đáģƒ thay đáģ•i hành đáģ™ng háēŋt tháģi gian cháģ cáģ§a vault." + }, + "unlockMethodNeeded": { + "message": "Thiáēŋt láē­p phÆ°ÆĄng phÃĄp máģŸ khÃŗa trong Cài đáēˇt" + }, + "sessionTimeoutHeader": { + "message": "Tháģi gian cháģ cáģ§a phiÃĒn" + }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, + "otherOptions": { + "message": "TÚy cháģn khÃĄc" }, "rateExtension": { "message": "ÄÃĄnh giÃĄ tiáģ‡n ích máģŸ ráģ™ng" @@ -354,7 +651,16 @@ "message": "XÃĄc minh danh tính" }, "yourVaultIsLocked": { - "message": "Kho lưu tráģ¯ cáģ§a báēĄn Ä‘ÃŖ báģ‹ khÃŗa. HÃŖy xÃĄc minh danh tính cáģ§a báēĄn đáģƒ máģŸ khoÃĄ." + "message": "Kho cáģ§a báēĄn Ä‘ÃŖ báģ‹ khÃŗa. XÃĄc minh danh tính cáģ§a báēĄn đáģƒ máģŸ khoÃĄ." + }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "Your account is locked" + }, + "or": { + "message": "or" }, "unlock": { "message": "MáģŸ khÃŗa" @@ -376,11 +682,17 @@ "message": "Máē­t kháēŠu chính không háģŖp láģ‡" }, "vaultTimeout": { - "message": "Tháģi gian cháģ cáģ§a kho lưu tráģ¯" + "message": "Tháģi gian cháģ cáģ§a kho" + }, + "vaultTimeout1": { + "message": "Timeout" }, "lockNow": { "message": "KhÃŗa ngay" }, + "lockAll": { + "message": "KhÃŗa táēĨt cáēŖ" + }, "immediately": { "message": "Ngay láē­p táģŠc" }, @@ -426,6 +738,18 @@ "security": { "message": "BáēŖo máē­t" }, + "confirmMasterPassword": { + "message": "Nháē­p láēĄi máē­t kháēŠu chính" + }, + "masterPassword": { + "message": "Máē­t kháēŠu chính" + }, + "masterPassImportant": { + "message": "Máē­t kháēŠu chính cáģ§a báēĄn không tháģƒ pháģĨc háģ“i náēŋu báēĄn quÃĒn nÃŗ!" + }, + "masterPassHintLabel": { + "message": "GáģŖi ÃŊ máē­t kháēŠu chính" + }, "errorOccurred": { "message": "ÄÃŖ xáēŖy ra láģ—i" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "Tài khoáēŖn máģ›i cáģ§a báēĄn Ä‘ÃŖ đưáģŖc táēĄo! BáēĄn cÃŗ tháģƒ Ä‘Äƒng nháē­p táģĢ bÃĸy giáģ." }, + "newAccountCreated2": { + "message": "Tài khoáēŖn cáģ§a báēĄn Ä‘ÃŖ đưáģŖc táēĄo thành công!" + }, + "youHaveBeenLoggedIn": { + "message": "BáēĄn Ä‘ÃŖ đăng nháē­p thành công!" + }, + "youSuccessfullyLoggedIn": { + "message": "BáēĄn Ä‘ÃŖ đăng nháē­p thành công" + }, + "youMayCloseThisWindow": { + "message": "BáēĄn cÃŗ tháģƒ Ä‘Ãŗng cáģ­a sáģ• này" + }, "masterPassSent": { "message": "ChÃēng tôi Ä‘ÃŖ gáģ­i cho báēĄn email cÃŗ cháģŠa gáģŖi ÃŊ máē­t kháēŠu chính cáģ§a báēĄn." }, "verificationCodeRequired": { "message": "YÃĒu cáē§u mÃŖ xÃĄc nháē­n." }, + "webauthnCancelOrTimeout": { + "message": "QuÃĄ trÃŦnh xÃĄc tháģąc Ä‘ÃŖ báģ‹ háģ§y hoáēˇc máēĨt quÃĄ nhiáģu tháģi gian. Vui lÃ˛ng tháģ­ láēĄi." + }, "invalidVerificationCode": { "message": "MÃŖ xÃĄc minh không đÃēng" }, @@ -479,12 +818,57 @@ "autofillError": { "message": "Không tháģƒ táģą Ä‘áģ™ng điáģn máģĨc Ä‘ÃŖ cháģn trÃĒn trang này. HÃŖy tháģąc hiáģ‡n sao chÊp và dÃĄn thông tin máģ™t cÃĄch tháģ§ công." }, + "totpCaptureError": { + "message": "Không tháģƒ quÊt mÃŖ QR táģĢ trang web hiáģ‡n táēĄi" + }, + "totpCaptureSuccess": { + "message": "ÄÃŖ thÃĒm khÃŗa xÃĄc tháģąc" + }, + "totpCapture": { + "message": "QuÊt mÃŖ QR xÃĄc tháģąc táģĢ trang web hiáģ‡n táēĄi" + }, + "totpHelperTitle": { + "message": "Tháģąc hiáģ‡n xÃĄc minh hai bưáģ›c liáģn máēĄch" + }, + "totpHelper": { + "message": "Bitwarden cÃŗ tháģƒ lưu tráģ¯ và điáģn mÃŖ xÃĄc minh 2 bưáģ›c. Sao chÊp và dÃĄn khÃŗa vào trưáģng này." + }, + "totpHelperWithCapture": { + "message": "Bitwarden cÃŗ tháģƒ lưu tráģ¯ và điáģn mÃŖ xÃĄc minh 2 bưáģ›c. HÃŖy cháģn biáģƒu tưáģŖng mÃĄy áēŖnh đáģƒ cháģĨp mÃŖ QR xÃĄc tháģąc cáģ§a trang web, hoáēˇc sao chÊp và dÃĄn khoÃĄ vào ô này." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "Sao chÊp khÃŗa Authenticator (TOTP)" + }, "loggedOut": { "message": "ÄÃŖ đăng xuáēĨt" }, + "loggedOutDesc": { + "message": "BáēĄn Ä‘ÃŖ đăng xuáēĨt kháģi tài khoáēŖn cáģ§a mÃŦnh." + }, "loginExpired": { "message": "PhiÃĒn đăng nháē­p cáģ§a báēĄn Ä‘ÃŖ háēŋt háēĄn." }, + "logIn": { + "message": "Đăng nháē­p" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Tiáēŋn hành đăng kÃŊ láēĄi" + }, + "expiredLink": { + "message": "LiÃĒn káēŋt Ä‘ÃŖ háēŋt háēĄn" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Vui lÃ˛ng đăng kÃŊ láēĄi hoáēˇc tháģ­ Ä‘Äƒng nháē­p." + }, + "youMayAlreadyHaveAnAccount": { + "message": "BáēĄn cÃŗ tháģƒ Ä‘ÃŖ cÃŗ tài khoáēŖn" + }, "logOutConfirmation": { "message": "BáēĄn cÃŗ cháē¯c cháē¯n muáģ‘n đăng xuáēĨt không?" }, @@ -503,15 +887,15 @@ "addedFolder": { "message": "ÄÃŖ thÃĒm thư máģĨc" }, - "changeMasterPass": { - "message": "Thay đáģ•i máē­t kháēŠu chính" - }, - "changeMasterPasswordConfirmation": { - "message": "BáēĄn cÃŗ tháģƒ thay đáģ•i máē­t kháēŠu chính trong trang web kho lưu tráģ¯ cáģ§a Bitwarden. BáēĄn cÃŗ muáģ‘n truy cáē­p trang web ngay bÃĸy giáģ không?" - }, "twoStepLoginConfirmation": { "message": "XÃĄc tháģąc hai láģ›p giÃēp cho tài khoáēŖn cáģ§a báēĄn an toàn hÆĄn báēąng cÃĄch yÃĒu cáē§u báēĄn xÃĄc minh thông tin đăng nháē­p cáģ§a báēĄn báēąng máģ™t thiáēŋt báģ‹ khÃĄc như khÃŗa báēŖo máē­t, áģŠng dáģĨng xÃĄc tháģąc, SMS, cuáģ™c gáģi điáģ‡n thoáēĄi hoáēˇc email. BáēĄn cÃŗ tháģƒ báē­t xÃĄc tháģąc hai láģ›p trong kho bitwarden náģn web. BáēĄn cÃŗ muáģ‘n ghÊ thăm trang web bÃĸy giáģ?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "ÄÃŖ lưu thư máģĨc" }, @@ -552,6 +936,10 @@ "newUri": { "message": "URI máģ›i" }, + "addDomain": { + "message": "ThÃĒm tÃĒn miáģn", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "ÄÃŖ thÃĒm máģĨc" }, @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "Háģi đáģƒ thÃĒm đăng nháē­p" }, + "vaultSaveOptionsTitle": { + "message": "Lưu vào cÃĄc tÚy cháģn kho" + }, "addLoginNotificationDesc": { "message": "'Thông bÃĄo ThÃĒm đăng nháē­p' sáēŊ táģą Ä‘áģ™ng nháē¯c báēĄn lưu cÃĄc đăng nháē­p máģ›i vào háē§m an toàn cáģ§a báēĄn báēĨt cáģŠ khi nào báēĄn đăng nháē­p trang web láē§n đáē§u tiÃĒn." }, + "addLoginNotificationDescAlt": { + "message": "Đưa ra láģąa cháģn đáģƒ thÃĒm máģ™t máģĨc náēŋu không tÃŦm tháēĨy máģĨc Ä‘Ãŗ trong hÃ˛m cáģ§a báēĄn. Áp dáģĨng váģ›i máģi tài khoáēŖn đăng nháē­p trÃĒn thiáēŋt báģ‹." + }, + "showCardsInVaultView": { + "message": "Hiáģƒn tháģ‹ cÃĄc tháēģ như cÃĄc gáģŖi ÃŊ táģą Ä‘áģ™ng điáģn trÃĒn giao diáģ‡n kho" + }, "showCardsCurrentTab": { "message": "Hiáģƒn tháģ‹ tháēģ trÃĒn trang Tab" }, "showCardsCurrentTabDesc": { "message": "Liáģ‡t kÃĒ cÃĄc máģĨc tháēģ trÃĒn trang Tab đáģƒ dáģ… dàng táģą Ä‘áģ™ng điáģn." }, + "showIdentitiesInVaultView": { + "message": "Hiáģƒn tháģ‹ cÃĄc danh tính như cÃĄc gáģŖi ÃŊ táģą Ä‘áģ™ng điáģn trÃĒn giao diáģ‡n kho" + }, "showIdentitiesCurrentTab": { "message": "Hiáģƒn tháģ‹ danh tính trÃĒn trang Tab" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "YÃĒu cáē§u cáē­p nháē­t máē­t kháēŠu đăng nháē­p khi phÃĄt hiáģ‡n thay đáģ•i trÃĒn trang web." }, + "changedPasswordNotificationDescAlt": { + "message": "Đưa ra láģąa cháģn đáģƒ cáē­p nháē­t máē­t kháēŠu khi phÃĄt hiáģ‡n cÃŗ sáģą thay đáģ•i trÃĒn trang web. Áp dáģĨng váģ›i máģi tài khoáēŖn đăng nháē­p trÃĒn thiáēŋt báģ‹." + }, + "enableUsePasskeys": { + "message": "Đưa ra láģąa cháģn đáģƒ lưu và sáģ­ dáģĨng mÃŖ khoÃĄ" + }, + "usePasskeysDesc": { + "message": "Đưa ra láģąa cháģn đáģƒ lưu mÃŖ khoÃĄ máģ›i hoáēˇc đăng nháē­p báēąng mÃŖ khoÃĄ Ä‘ÃŖ lưu trong kho. Áp dáģĨng váģ›i máģi tài khoáēŖn đăng nháē­p trÃĒn thiáēŋt báģ‹." + }, "notificationChangeDesc": { "message": "BáēĄn cÃŗ muáģ‘n cáē­p nháē­t máē­t kháēŠu này trÃĒn Bitwarden không?" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "MáģŸ khÃŗa" }, + "additionalOptions": { + "message": "TÚy cháģn báģ• sung" + }, "enableContextMenuItem": { "message": "Hiáģƒn tháģ‹ tuáģŗ cháģn menu ngáģ¯ cáēŖnh" }, "contextMenuItemDesc": { "message": "Sáģ­ dáģĨng máģ™t đÃēp chuáģ™t đáģƒ truy cáē­p vào viáģ‡c táēĄo máē­t kháēŠu và thông tin đăng nháē­p phÚ háģŖp cho trang web. " }, + "contextMenuItemDescAlt": { + "message": "Truy cáē­p trÃŦnh kháģŸi táēĄo máē­t kháēŠu và cÃĄc máģĨc đăng nháē­p Ä‘ÃŖ lưu cáģ§a trang web báēąng cÃĄch nháēĨn đÃēp chuáģ™t. Áp dáģĨng váģ›i máģi tài khoáēŖn đăng nháē­p trÃĒn thiáēŋt báģ‹." + }, "defaultUriMatchDetection": { "message": "PhÆ°ÆĄng tháģŠc kiáģƒm tra URI máēˇc đáģ‹nh", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "Cháģn phÆ°ÆĄng tháģŠc máēˇc đáģ‹nh đáģƒ kiáģƒm tra so sÃĄnh URI cho cÃĄc đăng nháē­p khi xáģ­ lí cÃĄc hành đáģ™ng như là táģą Ä‘áģ™ng điáģn." @@ -658,6 +1073,9 @@ "themeDesc": { "message": "Thay đáģ•i màu sáē¯c áģŠng dáģĨng." }, + "themeDescAlt": { + "message": "Thay đáģ•i tông màu giao diáģ‡n cáģ§a áģŠng dáģĨng. Áp dáģĨng váģ›i máģi tài khoáēŖn đăng nháē­p trÃĒn thiáēŋt báģ‹." + }, "dark": { "message": "Táģ‘i", "description": "Dark color" @@ -670,39 +1088,63 @@ "message": "Solarized Dark", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "XuáēĨt táģĢ" + }, "exportVault": { - "message": "XuáēĨt kho lưu tráģ¯" + "message": "XuáēĨt kho" }, "fileFormat": { - "message": "File Format" + "message": "Đáģ‹nh dáēĄng táē­p tin" + }, + "fileEncryptedExportWarningDesc": { + "message": "Táē­p tin xuáēĨt này sáēŊ đưáģŖc báēŖo váģ‡ báēąng máē­t kháēŠu và yÃĒu cáē§u máē­t kháēŠu đáģƒ giáēŖi mÃŖ." + }, + "filePassword": { + "message": "Máē­t kháēŠu táē­p tin" + }, + "exportPasswordDescription": { + "message": "Máē­t kháēŠu này sáēŊ đưáģŖc sáģ­ dáģĨng đáģƒ xuáēĨt và nháē­p táē­p tin này" + }, + "accountRestrictedOptionDescription": { + "message": "Sáģ­ dáģĨng khÃŗa mÃŖ hÃŗa tài khoáēŖn cáģ§a báēĄn, đưáģŖc táēĄo táģĢ tÃĒn ngưáģi dÚng và máē­t kháēŠu chính cáģ§a báēĄn đáģƒ mÃŖ hÃŗa táģ‡p xuáēĨt và giáģ›i háēĄn viáģ‡c nháē­p cháģ‰ cho tài khoáēŖn Bitwarden hiáģ‡n táēĄi." + }, + "passwordProtectedOptionDescription": { + "message": "Thiáēŋt láē­p máē­t kháēŠu cho táģ‡p đáģƒ mÃŖ hÃŗa dáģ¯ liáģ‡u xuáēĨt và nháē­p nÃŗ vào báēĨt káģŗ tài khoáēŖn Bitwarden nào báēąng cÃĄch sáģ­ dáģĨng máē­t kháēŠu Ä‘Ãŗ đáģƒ giáēŖi mÃŖ." + }, + "exportTypeHeading": { + "message": "LoáēĄi xuáēĨt" + }, + "accountRestricted": { + "message": "Tài khoáēŖn báģ‹ háēĄn cháēŋ" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“Máē­t kháēŠu táē­p tin” và “Nháē­p láēĄi máē­t kháēŠu táē­p tin” không kháģ›p." }, "warning": { "message": "CáēĸNH BÁO", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "XÃĄc nháē­n xuáēĨt kho lưu tráģ¯" + "message": "XÃĄc nháē­n xuáēĨt kho" }, "exportWarningDesc": { - "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it." + "message": "BáēŖn xuáēĨt này cháģŠa dáģ¯ liáģ‡u kho báēĄn và không đưáģŖc mÃŖ hÃŗa. BáēĄn không nÃĒn lưu tráģ¯ hay gáģ­i táē­p tin Ä‘ÃŖ xuáēĨt thông qua phÆ°ÆĄng tháģŠc ráģ§i ro (như email). Vui lÃ˛ng xÃŗa nÃŗ ngay láē­p táģŠc khi báēĄn Ä‘ÃŖ sáģ­ dáģĨng xong." }, "encExportKeyWarningDesc": { - "message": "QuÃĄ trÃŦnh xuáēĨt này sáēŊ mÃŖ hÃŗa dáģ¯ liáģ‡u cáģ§a báēĄn báēąng khÃŗa mÃŖ hÃŗa cáģ§a tài khoáēŖn. Náēŋu báēĄn táģĢng xoay khÃŗa mÃŖ hÃŗa tài khoáēŖn cáģ§a mÃŦnh, báēĄn nÃĒn xuáēĨt láēĄi vÃŦ báēĄn sáēŊ không tháģƒ giáēŖi mÃŖ táģ‡p xuáēĨt này." + "message": "QuÃĄ trÃŦnh xuáēĨt này sáēŊ mÃŖ hÃŗa dáģ¯ liáģ‡u cáģ§a báēĄn báēąng khÃŗa mÃŖ hÃŗa cáģ§a tài khoáēŖn. Náēŋu báēĄn táģĢng xoay khÃŗa mÃŖ hÃŗa tài khoáēŖn cáģ§a mÃŦnh, báēĄn nÃĒn xuáēĨt láēĄi vÃŦ báēĄn sáēŊ không tháģƒ giáēŖi mÃŖ táē­p tin xuáēĨt này." }, "encExportAccountWarningDesc": { - "message": "CÃĄc khÃŗa mÃŖ hÃŗa tài khoáēŖn là duy nháēĨt cho máģ—i tài khoáēŖn ngưáģi dÚng Bitwarden, vÃŦ váē­y báēĄn không tháģƒ nháē­p máģ™t báēŖn xuáēĨt đưáģŖc mÃŖ hÃŗa vào máģ™t tài khoáēŖn khÃĄc." + "message": "KhÃŗa mÃŖ hÃŗa tài khoáēŖn là duy nháēĨt cho máģ—i tài khoáēŖn Bitwarden, vÃŦ váē­y báēĄn không tháģƒ nháē­p táģ‡p xuáēĨt đưáģŖc mÃŖ hÃŗa vào máģ™t tài khoáēŖn khÃĄc." }, "exportMasterPassword": { - "message": "Nháē­p máē­t kháēŠu chính đáģƒ xuáēĨt kho lưu tráģ¯ cáģ§a báēĄn." + "message": "Nháē­p máē­t kháēŠu chính đáģƒ xuáēĨt kho cáģ§a báēĄn." }, "shared": { "message": "ÄÃŖ chia sáēģ" }, - "learnOrg": { - "message": "Xem táģ• cháģŠc cáģ§a báēĄn" - }, - "learnOrgConfirmation": { - "message": "Bitwarden cho phÊp báēĄn chia sáēģ cÃĄc máģĨc trong kho cáģ§a mÃŦnh váģ›i nháģ¯ng ngưáģi khÃĄc báēąng cÃĄch sáģ­ dáģĨng tài khoáēŖn táģ• cháģŠc. BáēĄn cÃŗ muáģ‘n truy cáē­p trang web bitwarden.com đáģƒ tÃŦm hiáģƒu thÃĒm không?" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden cho Doanh Nghiáģ‡p cho phÊp báēĄn chia sáēģ cÃĄc máģĨc trong kho máē­t kháēŠu váģ›i ngưáģi khÃĄc báēąng cÃĄch táēĄo máģ™t táģ• cháģŠc. TÃŦm hiáģƒu thÃĒm trÃĒn bitwarden.com." }, "moveToOrganization": { "message": "Di chuyáģƒn đáēŋn táģ• cháģŠc" @@ -762,17 +1204,20 @@ "file": { "message": "Táē­p tin" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Cháģn táē­p tin" }, "maxFileSize": { - "message": "Kích thưáģ›c táģ‘i đa cáģ§a táģ‡p tin là 500MB." + "message": "Kích thưáģ›c táģ‘i đa cáģ§a táē­p tin là 500MB." }, "featureUnavailable": { "message": "Tính năng không cÃŗ sáēĩn" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "Cáē§n di chuyáģƒn khÃŗa mÃŖ hÃŗa. Vui lÃ˛ng đăng nháē­p trang web Bitwaden đáģƒ cáē­p nháē­t khÃŗa mÃŖ hÃŗa cáģ§a báēĄn." }, "premiumMembership": { "message": "Thành viÃĒn Cao CáēĨp" @@ -793,10 +1238,13 @@ "message": "Đăng kÃŊ làm thành viÃĒn cao cáēĨp và nháē­n đưáģŖc:" }, "ppremiumSignUpStorage": { - "message": "1GB báģ™ nháģ› lưu tráģ¯ táē­p tin đưáģŖc mÃŖ hÃŗa." + "message": "1GB báģ™ nháģ› lưu tráģ¯ Ä‘Æ°áģŖc mÃŖ hÃŗa cho cÃĄc táģ‡p đính kèm." + }, + "premiumSignUpEmergency": { + "message": "Emergency access." }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "CÃĄc tÚy cháģn xÃĄc minh hai bưáģ›c như YubiKey và Duo." }, "ppremiumSignUpReports": { "message": "Thanh láģc máē­t kháēŠu, kiáģƒm tra an toàn tài khoáēŖn và cÃĄc bÃĄo cÃĄo rÃ˛ rÄŠ dáģ¯ liáģ‡u là đáģƒ giáģ¯ cho kho cáģ§a báēĄn an toàn." @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "BáēĄn cÃŗ tháģƒ nÃĸng cáēĨp làm thành viÃĒn cao cáēĨp trong kho bitwarden náģn web. BáēĄn cÃŗ muáģ‘n truy cáē­p trang web bÃĸy giáģ?" }, + "premiumPurchaseAlertV2": { + "message": "BáēĄn cÃŗ tháģƒ mua gÃŗi Premium táģĢ cài đáēˇt tài khoáēŖn trÃĒn trang Bitwarden." + }, "premiumCurrentMember": { "message": "BáēĄn là máģ™t thành viÃĒn cao cáēĨp!" }, "premiumCurrentMemberThanks": { "message": "CáēŖm ÆĄn báēĄn vÃŦ Ä‘ÃŖ háģ— tráģŖ Bitwarden." }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "TáēĨt cáēŖ cháģ‰ váģ›i $PRICE$/năm!", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "TáēĨt cáēŖ cháģ‰ váģ›i $PRICE$ /năm!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "Làm máģ›i hoàn táēĨt" }, @@ -915,18 +1378,18 @@ "authenticatorAppTitle": { "message": "áģ¨ng dáģĨng Authenticator" }, - "authenticatorAppDesc": { - "message": "Sáģ­ dáģĨng máģ™t áģŠng dáģĨng xÃĄc tháģąc (cháēŗng háēĄn như Authy hoáēˇc Google Authenticator) đáģƒ táēĄo cÃĄc mÃŖ xÃĄc nháē­n theo tháģi gian tháģąc.", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Nháē­p mÃŖ đưáģŖc táēĄo báģŸi áģŠng dáģĨng xÃĄc tháģąc như Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "KhÃŗa báēŖo máē­t YubiKey OTP" + "yubiKeyTitleV2": { + "message": "KhÃŗa báēŖo máē­t OTP Yubico" }, "yubiKeyDesc": { "message": "Sáģ­ dáģĨng YubiKey đáģƒ truy cáē­p tài khoáēŖn cáģ§a báēĄn. HoáēĄt đáģ™ng váģ›i thiáēŋt báģ‹ YubiKey 4, 4 Nano, 4C và NEO." }, - "duoDesc": { - "message": "XÃĄc minh váģ›i Duo Security báēąng áģŠng dáģĨng Duo Mobile, SMS, cuáģ™c gáģi điáģ‡n thoáēĄi, hoáēˇc khoÃĄ báēŖo máē­t U2F.", + "duoDescV2": { + "message": "Nháē­p mÃŖ đưáģŖc táēĄo báģŸi Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "Email" }, - "emailDesc": { - "message": "MÃŖ xÃĄc tháģąc sáēŊ đưáģŖc gáģ­i qua email cho báēĄn." + "emailDescV2": { + "message": "Nháē­p mÃŖ đưáģŖc gáģ­i váģ email cáģ§a báēĄn." }, "selfHostedEnvironment": { "message": "Môi trưáģng táģą lưu tráģ¯" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "Cháģ‰ Ä‘áģ‹nh liÃĒn káēŋt cÆĄ báēŖn cáģ§a cài đáēˇt bitwarden táēĄi cháģ— cáģ§a báēĄn." }, + "selfHostedBaseUrlHint": { + "message": "Nháē­p đáģ‹a cháģ‰ cÆĄ sáģŸ cáģ§a báēŖn cài đáēˇt Bitwarden đưáģŖc lưu tráģ¯ táēĄi mÃĄy cháģ§ cáģ§a báēĄn. Ví dáģĨ: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "Đáģ‘i váģ›i cáēĨu hÃŦnh nÃĸng cao. BáēĄn cÃŗ tháģƒ cháģ‰ Ä‘áģ‹nh đáģ‹a cháģ‰ cÆĄ sáģŸ cáģ§a máģ—i dáģ‹ch váģĨ máģ™t cÃĄch đáģ™c láē­p." + }, + "selfHostedEnvFormInvalid": { + "message": "BáēĄn pháēŖi thÃĒm đáģ‹a cháģ‰ mÃĄy cháģ§ cÆĄ sáģŸ hoáēˇc ít nháēĨt máģ™t môi trưáģng tÚy cháģ‰nh." + }, "customEnvironment": { "message": "Môi trưáģng tÚy cháģ‰nh" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "URL mÃĄy cháģ§" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "Đáģ‹a cháģ‰ API mÃĄy cháģ§" }, @@ -978,15 +1454,74 @@ "environmentSaved": { "message": "Đáģ‹a cháģ‰ môi trưáģng Ä‘ÃŖ đưáģŖc lưu." }, + "showAutoFillMenuOnFormFields": { + "message": "Hiáģƒn tháģ‹ menu táģą Ä‘áģ™ng điáģn trÃĒn cÃĄc trưáģng biáģƒu máēĢu", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "CÃĄc gáģŖi ÃŊ điáģn táģą Ä‘áģ™ng" + }, + "showInlineMenuLabel": { + "message": "Hiáģƒn tháģ‹ cÃĄc gáģŖi ÃŊ táģą Ä‘áģ™ng điáģn trÃĒn cÃĄc trưáģng biáģƒu máēĢu" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Hiáģ‡n gáģŖi ÃŊ khi nháēĨp vào biáģƒu tưáģŖng" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Áp dáģĨng cho táēĨt cáēŖ tài khoáēŖn Ä‘ÃŖ đăng nháē­p." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "Táē¯t cài đáēˇt trÃŦnh quáēŖn lÃŊ máē­t kháēŠu tích háģŖp trong trÃŦnh duyáģ‡t cáģ§a báēĄn đáģƒ trÃĄnh xung đáģ™t." + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "Thay đáģ•i cài đáēˇt cáģ§a trÃŦnh duyáģ‡t." + }, + "autofillOverlayVisibilityOff": { + "message": "Táē¯t", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "Khi trưáģng đưáģŖc cháģn (khi báēĨm vào)", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "Khi cháģn biáģƒu tưáģŖng táģą Ä‘áģ™ng điáģn", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Táģą Ä‘áģ™ng điáģn khi táēŖi trang" + }, "enableAutoFillOnPageLoad": { "message": "Táģą Ä‘áģ™ng điáģn khi táēŖi trang" }, "enableAutoFillOnPageLoadDesc": { "message": "Náēŋu phÃĄt hiáģ‡n biáģƒu máēĢu đăng nháē­p, tháģąc hiáģ‡n táģą Ä‘áģ™ng điáģn khi trang web táēŖi xong." }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$CáēŖnh bÃĄo:$CLOSETAG$ CÃĄc trang web báģ‹ xÃĸm pháēĄm hoáēˇc không Ä‘ÃĄng tin cáē­y cÃŗ tháģƒ láģŖi dáģĨng tính năng táģą Ä‘áģ™ng điáģn khi trang web đưáģŖc táēŖi.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { "message": "CÃĄc trang web báģ‹ xÃĸm pháēĄm hoáēˇc không Ä‘ÃĄng tin cáē­y cÃŗ tháģƒ khai thÃĄc tính năng táģą Ä‘áģ™ng điáģn khi táēŖi trang." }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "TÃŦm hiáģƒu thÃĒm váģ ráģ§i ro" + }, "learnMoreAboutAutofill": { "message": "TÃŦm hiáģƒu thÃĒm váģ táģą Ä‘áģ™ng điáģn" }, @@ -1014,17 +1549,20 @@ "commandOpenSidebar": { "message": "MáģŸ kho áģŸ thanh bÃĒn" }, - "commandAutofillDesc": { - "message": "Táģą Ä‘áģ™ng điáģn thông tin đăng nháē­p ngưáģi dÚng cho trang web hiáģ‡n táēĄi." + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "TáēĄo và sao chÊp máģ™t máē­t kháēŠu ngáēĢu nhiÃĒn máģ›i vào khay nháģ› táēĄm" }, "commandLockVaultDesc": { - "message": "KhoÃĄ kho lưu tráģ¯" - }, - "privateModeWarning": { - "message": "Háģ— tráģŖ cho cháēŋ đáģ™ riÃĒng tư đang đưáģŖc tháģ­ nghiáģ‡m và háēĄn cháēŋ máģ™t sáģ‘ tính năng." + "message": "KhoÃĄ kho" }, "customFields": { "message": "Trưáģng tÚy cháģ‰nh" @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "ĐÃēng/Sai" }, + "cfTypeCheckbox": { + "message": "Ô tích cháģn" + }, "cfTypeLinked": { "message": "ÄÃŖ liÃĒn káēŋt", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,11 +1611,14 @@ "faviconDesc": { "message": "Hiáģƒn tháģ‹ máģ™t áēŖnh nháē­n dáēĄng bÃĒn cáēĄnh máģ—i láē§n đăng nháē­p." }, + "faviconDescAlt": { + "message": "Hiáģƒn tháģ‹ máģ™t biáģƒu tưáģŖng dáģ… nháē­n dáēĄng bÃĒn cáēĄnh máģ—i máģĨc đăng nháē­p. Áp dáģĨng váģ›i máģi tài khoáēŖn đăng nháē­p trÃĒn thiáēŋt báģ‹." + }, "enableBadgeCounter": { "message": "Hiáģƒn tháģ‹ biáģƒu tưáģŖng báģ™ Ä‘áēŋm" }, "badgeCounterDesc": { - "message": "Cho biáēŋt báēĄn cÃŗ bao nhiÃĒu láē§n đăng nháē­p cho trang web hiáģ‡n táēĄi." + "message": "Cho biáēŋt báēĄn cÃŗ bao nhiÃĒu thông tin đăng nháē­p cho trang web hiáģ‡n táēĄi." }, "cardholderName": { "message": "TÃĒn cháģ§ tháēģ" @@ -1086,7 +1630,7 @@ "message": "ThÆ°ÆĄng hiáģ‡u" }, "expirationMonth": { - "message": "ThÃĄng Háēŋt HáēĄn" + "message": "ThÃĄng háēŋt háēĄn" }, "expirationYear": { "message": "Năm háēŋt háēĄn" @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "Danh tính" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "$TYPE$ máģ›i", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "Cháģ‰nh sáģ­a $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "Xem $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "Láģ‹ch sáģ­ máē­t kháēŠu" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "Quay láēĄi" }, "collections": { "message": "Báģ™ sưu táē­p" }, + "nCollections": { + "message": "$COUNT$ báģ™ sưu táē­p", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "YÃĒu thích" }, @@ -1282,12 +1874,16 @@ "message": "TÃĒn miáģn cÆĄ sáģŸ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "Base domain (recommended)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "TÃĒn miáģn", "description": "Domain name. Ex. website.com" }, "host": { - "message": "Maˁy chuˉ lưu trÆ°Ėƒ", + "message": "MÃĄy cháģ§", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "Đáģ™ phÚ háģŖp", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "Đáģ™ phÚ háģŖp máēˇc đáģ‹nh", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "Báē­t/táē¯t tÚy cháģn" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "Không cÃŗ máē­t kháēŠu đáģƒ liáģ‡t kÃĒ." }, + "clearHistory": { + "message": "XÃŗa láģ‹ch sáģ­" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "XoÃĄ" }, @@ -1347,11 +1952,11 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Ngày cáē­p nháē­t máē­t kháēŠu", + "message": "ÄÃŖ cáē­p nháē­t máē­t kháēŠu", "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "BáēĄn cÃŗ cháē¯c báēĄn muáģ‘n sáģ­ dáģĨng tÚy cháģn \"Không bao giáģ\"? Đáēˇt cÃĄc tÚy cháģn khÃŗa váģ \"Không bao giáģ\" sáēŊ lưu key mÃŖ hÃŗa kho cáģ§a ngay trÃĒn thiáēŋt báģ‹ cáģ§a báēĄn. Náēŋu báēĄn sáģ­ dáģĨng tÚy cháģn này, báēĄn nÃĒn cháē¯c cháē¯n là thiáēŋt báģ‹ báēĄn đang đưáģŖc báēŖo váģ‡." + "message": "BáēĄn cÃŗ cháē¯c cháē¯n muáģ‘n cháģn \"Không bao giáģ\" không? Láģąa cháģn này sáēŊ lưu khÃŗa mÃŖ hÃŗa kho cáģ§a báēĄn tráģąc tiáēŋp trÃĒn thiáēŋt báģ‹. HÃŖy nháģ› báēŖo váģ‡ thiáēŋt báģ‹ cáģ§a báēĄn tháē­t cáēŠn tháē­n náēŋu báēĄn cháģn tÚy cháģn này." }, "noOrganizationsList": { "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "MáģŸ khÃŗa báēąng mÃŖ PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Đáēˇt mÃŖ PIN cáģ§a báēĄn đáģƒ máģŸ khÃŗa Bitwarden. Cài đáēˇt mÃŖ PIN cáģ§a báēĄn sáēŊ báģ‹ xÃŗa náēŋu báēĄn hoàn toàn đăng xuáēĨt kháģi áģŠng dáģĨng." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "MÃŖ PIN là báē¯t buáģ™c." }, "invalidPin": { "message": "MÃŖ PIN không háģŖp láģ‡." }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "MÃŖ PIN báģ‹ gÃĩ sai quÃĄ nhiáģu láē§n. Đang đăng xuáēĨt." + }, "unlockWithBiometrics": { "message": "MáģŸ khÃŗa báēąng sinh tráē¯c háģc" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "ĐáģŖi xÃĄc nháē­n táģĢ mÃĄy tính" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "KhÃŗa váģ›i máē­t kháēŠu chính khi trÃŦnh duyáģ‡t kháģŸi đáģ™ng láēĄi" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "BáēĄn pháēŖi cháģn ít nháēĨt máģ™t báģ™ sưu táē­p." }, @@ -1421,14 +2044,40 @@ "message": "TáēĄo báēŖn sao" }, "passwordGeneratorPolicyInEffect": { - "message": "CÃŗ máģ™t hoáēˇc vài chính sÃĄch cáģ§a táģ• cháģŠc đang làm áēŖnh hưáģŸng đáēŋn cài đáēˇt táēĄo máē­t kháēŠu cáģ§a báēĄn." + "message": "CÃĄc chính sÃĄch cáģ§a táģ• cháģŠc đang áēŖnh hưáģŸng đáēŋn cài đáēˇt táēĄo máē­t kháēŠu cáģ§a báēĄn." + }, + "passwordGenerator": { + "message": "TrÃŦnh táēĄo máē­t kháēŠu" + }, + "usernameGenerator": { + "message": "Báģ™ táēĄo tÃĒn ngưáģi dÚng" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { "message": "Hành đáģ™ng khi háēŋt tháģi gian cháģ cáģ§a kho lưu tráģ¯" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "KhÃŗa", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ThÚng rÃĄc", @@ -1452,8 +2101,11 @@ "restoredItem": { "message": "MáģĨc Ä‘ÃŖ đưáģŖc khôi pháģĨc" }, + "alreadyHaveAccount": { + "message": "BáēĄn Ä‘ÃŖ cÃŗ tài khoáēŖn?" + }, "vaultTimeoutLogOutConfirmation": { - "message": "Viáģ‡c đăng xuáēĨt sáēŊ loáēĄi báģ táēĨt cáēŖ truy cáē­p vào kho lưu tráģ¯ cáģ§a báēĄn và yÃĒu cáē§u xÃĄc minh tráģąc tuyáēŋn sau khi háēŋt giai đoáēĄn tháģi gian cháģ. BáēĄn cÃŗ cháē¯c cháē¯n muáģ‘n dÚng cài đáēˇt này không?" + "message": "Đăng xuáēĨt sáēŊ xÃŗa táēĨt cáēŖ quyáģn truy cáē­p vào kho cáģ§a báēĄn và yÃĒu cáē§u xÃĄc minh tráģąc tuyáēŋn sau khi háēŋt tháģi gian cháģ. BáēĄn cÃŗ cháē¯c cháē¯n muáģ‘n sáģ­ dáģĨng cài đáēˇt này không?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "XÃĄc nháē­n hành đáģ™ng khi háēŋt tháģi gian cháģ" @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "Táģą Ä‘áģ™ng điáģn và Lưu" }, + "fillAndSave": { + "message": "Điáģn và lưu" + }, "autoFillSuccessAndSavedUri": { "message": "ÄÃŖ táģą Ä‘áģ™ng điáģn máģĨc và lưu URI" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "Máē­t kháēŠu chính báēĄn cháģn không Ä‘ÃĄp áģŠng yÃĒu cáē§u." }, + "receiveMarketingEmailsV2": { + "message": "Nháē­n đáģ xuáēĨt, thông bÃĄo và cÆĄ háģ™i nghiÃĒn cáģŠu táģĢ Bitwarden trong háģ™p thư đáēŋn cáģ§a báēĄn." + }, + "unsubscribe": { + "message": "Háģ§y đăng kÃŊ" + }, + "atAnyTime": { + "message": "báēĨt cáģŠ lÃēc nào." + }, + "byContinuingYouAgreeToThe": { + "message": "Náēŋu tiáēŋp táģĨc, báēĄn đáģ“ng ÃŊ" + }, + "and": { + "message": "và" + }, "acceptPolicies": { "message": "BáēĄn đáģ“ng ÃŊ váģ›i nháģ¯ng điáģu sau khi nháēĨn cháģn ô này:" }, @@ -1557,11 +2227,17 @@ "ok": { "message": "Ok" }, + "errorRefreshingAccessToken": { + "message": "Láģ—i làm máģ›i khoÃĄ truy cáē­p" + }, + "errorRefreshingAccessTokenDesc": { + "message": "BáēĄn cÃŗ tháģƒ Ä‘ÃŖ báģ‹ Ä‘Äƒng xuáēĨt. Vui lÃ˛ng đăng xuáēĨt và đăng nháē­p láēĄi." + }, "desktopSyncVerificationTitle": { "message": "XÃĄc minh đáģ“ng báģ™ mÃĄy tính" }, "desktopIntegrationVerificationText": { - "message": "Vui lÃ˛ng xÃĄc minh ráēąng áģŠng dáģĨng trÃĒn mÃĄy tính tháēĨy vÃĸn tay này:" + "message": "Vui lÃ˛ng xÃĄc minh áģŠng dáģĨng trÃĒn mÃĄy tính hiáģƒn tháģ‹ cáģĨm vÃĸn tay này: " }, "desktopIntegrationDisabledTitle": { "message": "Tích háģŖp trÃŦnh duyáģ‡t chưa đưáģŖc kích hoáēĄt" @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "Tài khoáēŖn không đÃēng" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Sinh tráē¯c háģc chưa đưáģŖc cài đáēˇt" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "Nháē­n dáēĄng sinh tráē¯c háģc trÃĒn trÃŦnh duyáģ‡t không đưáģŖc háģ— tráģŖ trÃĒn thiáēŋt báģ‹ này" }, + "biometricsNotUnlockedTitle": { + "message": "Ngưáģi dÚng Ä‘ÃŖ khoÃĄ hoáēˇc Ä‘ÃŖ đăng xuáēĨt" + }, + "biometricsNotUnlockedDesc": { + "message": "Vui lÃ˛ng máģŸ khÃŗa ngưáģi dÚng này trong áģŠng dáģĨng mÃĄy tính và tháģ­ láēĄi." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "Sinh tráē¯c háģc không thành công" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "Không tháģƒ hoàn thành sinh tráē¯c háģc, hÃŖy cÃĸn nháē¯c sáģ­ dáģĨng máē­t kháēŠu chính hoáēˇc đăng xuáēĨt. Náēŋu sáģą cáģ‘ váēĢn tiáēŋp diáģ…n, vui lÃ˛ng liÃĒn háģ‡ báģ™ pháē­n háģ— tráģŖ cáģ§a Bitwarden." }, "nativeMessaginPermissionErrorTitle": { "message": "Quyáģn chưa đưáģŖc cáēĨp" @@ -1629,45 +2323,94 @@ "personalOwnershipPolicyInEffect": { "message": "Chính sÃĄch cáģ§a táģ• cháģŠc đang áēŖnh hưáģŸng đáēŋn cÃĄc tÚy cháģn quyáģn sáģŸ háģ¯u cáģ§a báēĄn." }, + "personalOwnershipPolicyInEffectImports": { + "message": "Chính sÃĄch cáģ§a táģ• cháģŠc Ä‘ÃŖ cháēˇn viáģ‡c nháē­p cÃĄc máģĨc vào kho cÃĄ nhÃĸn cáģ§a báēĄn." + }, + "domainsTitle": { + "message": "CÃĄc tÃĒn miáģn", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "TÃĒn miáģn Ä‘ÃŖ loáēĄi tráģĢ" }, "excludedDomainsDesc": { "message": "Bitwarden sáēŊ không yÃĒu cáē§u lưu thông tin đăng nháē­p cho cÃĄc miáģn này. BáēĄn pháēŖi làm máģ›i trang đáģƒ cÃĄc thay đáģ•i cÃŗ hiáģ‡u láģąc." }, + "excludedDomainsDescAlt": { + "message": "Bitwarden sáēŊ không yÃĒu cáē§u lưu thông tin đăng nháē­p cho cÃĄc miáģn này. BáēĄn pháēŖi làm máģ›i trang đáģƒ cÃĄc thay đáģ•i cÃŗ hiáģ‡u láģąc." + }, + "websiteItemLabel": { + "message": "Trang Web $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ không pháēŖi là tÃĒn miáģn háģŖp láģ‡", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "CÃĄc thay đáģ•i tÃĒn miáģn loáēĄi tráģĢ Ä‘ÃŖ đưáģŖc lưu" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, "send": { - "message": "Send", + "message": "Gáģ­i", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDetails": { + "message": "Send details", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "TÃŦm kiáēŋm Send", + "message": "TÃŦm kiáēŋm máģĨc Gáģ­i", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "ThÃĒm Send", + "message": "ThÃĒm máģĨc Gáģ­i", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { "message": "Văn báēŖn" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Táē­p tin" }, "allSends": { - "message": "Toàn báģ™ Send", + "message": "TáēĨt cáēŖ máģĨc Gáģ­i", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { - "message": "ÄÃŖ đáēĄt đáēŋn sáģ‘ lưáģŖng truy cáē­p táģ‘i đa", + "message": "ÄÃŖ vưáģŖt sáģ‘ láē§n truy cáē­p táģ‘i đa", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { @@ -1679,8 +2422,11 @@ "passwordProtected": { "message": "Máē­t kháēŠu Ä‘ÃŖ đưáģŖc báēŖo váģ‡" }, + "copyLink": { + "message": "Sao chÊp liÃĒn káēŋt" + }, "copySendLink": { - "message": "Sao chÊp liÃĒn káēŋt Send", + "message": "Sao chÊp liÃĒn káēŋt máģĨc Gáģ­i", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { @@ -1693,11 +2439,11 @@ "message": "ÄÃŖ xÃŗa máē­t kháēŠu" }, "deletedSend": { - "message": "ÄÃŖ xÃŗa Send", + "message": "ÄÃŖ xÃŗa máģĨc Gáģ­i", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Gáģ­i liÃĒn káēŋt", + "message": "LiÃĒn káēŋt Gáģ­i", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { @@ -1707,15 +2453,19 @@ "message": "BáēĄn cÃŗ cháē¯c cháē¯n muáģ‘n xÃŗa máē­t kháēŠu này không?" }, "deleteSend": { - "message": "XÃŗa Send", + "message": "XÃŗa máģĨc Gáģ­i", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "BáēĄn cÃŗ cháē¯c cháē¯n muáģ‘n xÃŗa Send này?", + "message": "BáēĄn cÃŗ cháē¯c muáģ‘n máģĨc Gáģ­i này?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "Cháģ‰nh sáģ­a Send", + "message": "Sáģ­a máģĨc Gáģ­i", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { @@ -1733,14 +2483,18 @@ "message": "Ngày xÃŗa" }, "deletionDateDesc": { - "message": "Send sáēŊ đưáģŖc xÃŗa vÄŠnh viáģ…n vào ngày và giáģ Ä‘Æ°áģŖc cháģ‰ Ä‘áģ‹nh.", + "message": "MáģĨc Gáģ­i sáēŊ đưáģŖc xÃŗa vÄŠnh viáģ…n vào ngày và giáģ cháģ‰ Ä‘áģ‹nh.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { "message": "Ngày háēŋt háēĄn" }, "expirationDateDesc": { - "message": "Náēŋu đưáģŖc thiáēŋt láē­p, truy cáē­p vào Send này sáēŊ háēŋt háēĄn vào ngày và giáģ Ä‘Æ°áģŖc cháģ‰ Ä‘áģ‹nh.", + "message": "Náēŋu đưáģŖc thiáēŋt láē­p, máģĨc Gáģ­i này sáēŊ háēŋt háēĄn vào ngày và giáģ Ä‘Æ°áģŖc cháģ‰ Ä‘áģ‹nh.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { @@ -1762,11 +2516,15 @@ "message": "Sáģ‘ lưáģŖng truy cáē­p táģ‘i đa" }, "maximumAccessCountDesc": { - "message": "Náēŋu đưáģŖc thiáēŋt láē­p, khi Ä‘ÃŖ đáēĄt táģ›i sáģ‘ lưáģŖng truy cáē­p táģ‘i đa, ngưáģi dÚng sáēŊ không tháģƒ truy cáē­p Send này náģ¯a.", + "message": "Náēŋu đưáģŖc thiáēŋt láē­p, khi Ä‘ÃŖ đáēĄt táģ›i sáģ‘ lưáģŖng truy cáē­p táģ‘i đa, ngưáģi dÚng sáēŊ không tháģƒ truy cáē­p máģĨc Gáģ­i này náģ¯a.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "TÚy cháģn yÃĒu cáē§u máē­t kháēŠu đáģƒ ngưáģi dÚng truy cáē­p Gáģ­i này.", + "message": "YÃĒu cáē§u nháē­p máē­t kháēŠu khi ngưáģi dÚng truy cáē­p vào pháē§n Gáģ­i này.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { @@ -1774,7 +2532,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Deactivate this Send so that no one can access it.", + "message": "Vô hiáģ‡u hoÃĄ máģĨc Gáģ­i này đáģƒ không ai cÃŗ tháģƒ truy cáē­p nÃŗ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1803,31 +2561,78 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Do chính sÃĄch doanh nghiáģ‡p, báēĄn cháģ‰ cÃŗ tháģƒ xÃŗa nháģ¯ng Send hiáģ‡n cÃŗ.", + "message": "Do chính sÃĄch doanh nghiáģ‡p, báēĄn cháģ‰ cÃŗ tháģƒ xÃŗa nháģ¯ng máģĨc Gáģ­i hiáģ‡n cÃŗ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "ÄÃŖ táēĄo Send", + "message": "ÄÃŖ táēĄo máģĨc Gáģ­i", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "ÄÃŖ cháģ‰nh sáģ­a Send", + "message": "ÄÃŖ lưu máģĨc Gáģ­i", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { - "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." + "message": "Đáģƒ cháģn táē­p tin, máģŸ tiáģ‡n ích máģŸ ráģ™ng trong thanh bÃĒn (náēŋu cÃŗ tháģƒ) hoáēˇc máģŸ ra cáģ­a sáģ• máģ›i báēąng cÃĄch nháēĨp vào biáģƒu ngáģ¯ này." }, "sendFirefoxFileWarning": { - "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner." + "message": "Đáģƒ cháģn táē­p tin báēąng Firefox, máģŸ tiáģ‡n ích máģŸ ráģ™ng trong thanh bÃĒn hoáēˇc máģŸ ra cáģ­a sáģ• máģ›i báēąng cÃĄch nháēĨp vào biáģƒu ngáģ¯ này." }, "sendSafariFileWarning": { - "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + "message": "Đáģƒ cháģn táē­p tin báēąng Safari, máģŸ ra cáģ­a sáģ• máģ›i báēąng cÃĄch nháēĨp vào biáģƒu ngáģ¯ này." + }, + "popOut": { + "message": "Pop out" }, "sendFileCalloutHeader": { "message": "Trưáģ›c khi báēĄn báē¯t đáē§u" }, "sendFirefoxCustomDatePopoutMessage1": { - "message": "To use a calendar style date picker", + "message": "Đáģƒ dÚng báģ™ cháģn ngày dáēĄng láģ‹ch", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage2": { @@ -1835,29 +2640,32 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage3": { - "message": "to pop out your window.", + "message": "đáģƒ báē­t cáģ­a sáģ• cáģ§a báēĄn ra.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "Ngày háēŋt háēĄn báēĄn nháē­p không háģŖp láģ‡." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "Ngày xÃŗa báēĄn nháē­p không háģŖp láģ‡." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "Ngày và giáģ háēŋt háēĄn là báē¯t buáģ™c." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "Ngày và giáģ xÃŗa là báē¯t buáģ™c." }, "dateParsingError": { - "message": "There was an error saving your deletion and expiration dates." + "message": "ÄÃŖ xáēŖy ra láģ—i khi lưu ngày xoÃĄ và ngày háēŋt háēĄn cáģ§a báēĄn." }, "hideEmail": { - "message": "Hide my email address from recipients." + "message": "áē¨n đáģ‹a cháģ‰ email cáģ§a tôi kháģi ngưáģi nháē­n." + }, + "hideYourEmail": { + "message": "Hide your email address from viewers." }, "sendOptionsPolicyInEffect": { - "message": "One or more organization policies are affecting your Send options." + "message": "CÃĄc chính sÃĄch cáģ§a táģ• cháģŠc đang áēŖnh hưáģŸng đáēŋn tÚy cháģn Gáģ­i cáģ§a báēĄn." }, "passwordPrompt": { "message": "Nháē¯c láēĄi máē­t kháēŠu chính" @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "YÃĒu cáē§u xÃĄc nháē­n danh tính qua email" }, + "emailVerifiedV2": { + "message": "Email Ä‘ÃŖ xÃĄc minh" + }, "emailVerificationRequiredDesc": { "message": "BáēĄn pháēŖi xÃĄc nháē­n email đáģƒ sáģ­ dáģĨng tính năng này. BáēĄn cÃŗ tháģƒ xÃĄc minh email trÃĒn web." }, @@ -1881,22 +2692,47 @@ "message": "Cáē­p nháē­t máē­t kháēŠu chính" }, "updateMasterPasswordWarning": { - "message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Máē­t kháēŠu chính cáģ§a báēĄn gáē§n đÃĸy Ä‘ÃŖ đưáģŖc thay đáģ•i báģŸi ngưáģi quáēŖn tráģ‹ trong táģ• cháģŠc cáģ§a báēĄn. Đáģƒ truy cáē­p kho, báēĄn pháēŖi cáē­p nháē­t nÃŗ ngay bÃĸy giáģ. Viáģ‡c tiáēŋp táģĨc sáēŊ đăng xuáēĨt kháģi kho và báēĄn sáēŊ cáē§n đăng nháē­p láēĄi. áģ¨ng dáģĨng Bitwaden trÃĒn cÃĄc thiáēŋt báģ‹ khÃĄc cÃŗ tháģƒ tiáēŋp táģĨc hoáēĄt đáģ™ng trong táģ‘i đa máģ™t giáģ sau Ä‘Ãŗ sáēŊ báģ‹ Ä‘Äƒng xuáēĨt." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Máē­t kháēŠu chính cáģ§a báēĄn không Ä‘ÃĄp áģŠng chính sÃĄch táģ• cháģŠc cáģ§a báēĄn. Đáģƒ truy cáē­p kho, báēĄn pháēŖi cáē­p nháē­t máē­t kháēŠu chính cáģ§a mÃŦnh ngay bÃĸy giáģ. Viáģ‡c tiáēŋp táģĨc sáēŊ đăng xuáēĨt báēĄn kháģi phiÃĒn hiáģ‡n táēĄi và báē¯t buáģ™c đăng nháē­p láēĄi. CÃĄc phiÃĒn hoáēĄt đáģ™ng trÃĒn cÃĄc thiáēŋt báģ‹ khÃĄc cÃŗ tháģƒ tiáēŋp táģĨc duy trÃŦ hoáēĄt đáģ™ng trong táģ‘i đa máģ™t giáģ." + }, + "tdeDisabledMasterPasswordRequired": { + "message": "Táģ• cháģŠc cáģ§a báēĄn Ä‘ÃŖ vô hiáģ‡u hÃŗa mÃŖ hÃŗa báēąng thiáēŋt báģ‹ Ä‘ÃĄng tin cáē­y. Vui lÃ˛ng đáēˇt máē­t kháēŠu chính đáģƒ truy cáē­p Kho cáģ§a báēĄn." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic enrollment" + "message": "Đăng kÃŊ táģą Ä‘áģ™ng" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + "message": "Táģ• cháģŠc này cÃŗ chính sÃĄch doanh nghiáģ‡p sáēŊ táģą Ä‘áģ™ng đáēˇt láēĄi máē­t kháēŠu chính cho báēĄn. Đăng kÃŊ sáēŊ cho phÊp quáēŖn tráģ‹ viÃĒn táģ• cháģŠc thay đáģ•i máē­t kháēŠu chính cáģ§a báēĄn." }, "selectFolder": { "message": "Cháģn thư máģĨc..." }, - "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "noFoldersFound": { + "message": "Không tÃŦm tháēĨy thư máģĨc nào", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "Quyáģn táģ• cháģŠc cáģ§a báēĄn Ä‘ÃŖ đưáģŖc cáē­p nháē­t, yÃĒu cáē§u báēĄn đáēˇt máē­t kháēŠu chính.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "Táģ• cháģŠc cáģ§a báēĄn yÃĒu cáē§u báēĄn đáēˇt máē­t kháēŠu chính.", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "YÃĒu cáē§u xÃĄc minh", + "description": "Default title for the user verification dialog." }, "hours": { "message": "Giáģ" @@ -1904,8 +2740,37 @@ "minutes": { "message": "PhÃēt" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "Táģ• cháģŠc cáģ§a báēĄn Ä‘ÃŖ đáēˇt tháģi gian máģŸ kho táģ‘i đa là $HOURS$ giáģ và $MINUTES$ phÃēt.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", "placeholders": { "hours": { "content": "$1", @@ -1918,7 +2783,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "Táģ• cháģŠc cáģ§a báēĄn đang áēŖnh hưáģŸng đáēŋn tháģi gian máģŸ kho. Tháģi gian máģŸ kho táģ‘i đa là $HOURS$ giáģ và $MINUTES$ phÃēt. Kho sáēŊ $ACTION$ sau khi háēŋt tháģi gian máģŸ kho.", "placeholders": { "hours": { "content": "$1", @@ -1935,7 +2800,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "Táģ• cháģŠc cáģ§a báēĄn sáēŊ $ACTION$ sau khi háēŋt tháģi gian máģŸ kho.", "placeholders": { "action": { "content": "$1", @@ -1944,22 +2809,22 @@ } }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Tháģi gian máģŸ kho vưáģŖt quÃĄ giáģ›i háēĄn do táģ• cháģŠc cáģ§a báēĄn đáēˇt ra." }, "vaultExportDisabled": { - "message": "XuáēĨt kho lưu tráģ¯ không cÃŗ sáēĩn" + "message": "XuáēĨt kho không cÃŗ sáēĩn" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your individual vault." + "message": "CÃĄc chính sÃĄch cáģ§a táģ• cháģŠc ngăn cáēŖn báēĄn xuáēĨt kho lưu tráģ¯ cÃĄ nhÃĸn cáģ§a mÃŦnh." }, "copyCustomFieldNameInvalidElement": { - "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + "message": "Không tháģƒ xÃĄc đáģ‹nh đưáģŖc pháē§n táģ­ biáģƒu máēĢu háģŖp láģ‡. Thay vào Ä‘Ãŗ hÃŖy tháģ­ kiáģƒm tra trong HTML." }, "copyCustomFieldNameNotUnique": { - "message": "No unique identifier found." + "message": "Không tÃŦm tháēĨy danh tính duy nháēĨt." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ hiáģ‡n đang dÚng SSO váģ›i khoÃĄ mÃĄy cháģ§ táģą lưu tráģ¯. TáģĢ giáģ không cáē§n máē­t kháēŠu chính đáģƒ Ä‘Äƒng nháē­p vào táģ• cháģŠc này náģ¯a.", + "message": "$ORGANIZATION$ đang sáģ­ dáģĨng SSO váģ›i khÃŗa mÃĄy cháģ§ táģą lưu tráģ¯. Máē­t kháēŠu chính không cÃ˛n cáē§n đáģƒ Ä‘Äƒng nháē­p cho cÃĄc thành viÃĒn cáģ§a táģ• cháģŠc này.", "placeholders": { "organization": { "content": "$1", @@ -1986,13 +2851,13 @@ "message": "Báē­t táē¯t đáēŋm kí táģą" }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "PhiÃĒn đăng nháē­p cáģ§a báēĄn Ä‘ÃŖ háēŋt háēĄn. Vui lÃ˛ng quay tráģŸ láēĄi và tháģ­ Ä‘Äƒng nháē­p láēĄi." }, "exportingPersonalVaultTitle": { - "message": "Exporting individual vault" + "message": "Đang xuáēĨt dáģ¯ liáģ‡u kho cÃĄ nhÃĸn" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Cháģ‰ dáģ¯ liáģ‡u trong kho cÃĄ nhÃĸn liÃĒn káēŋt váģ›i $EMAIL$ máģ›i đưáģŖc xuáēĨt. Không bao gáģ“m \ncÃĄc dáģ¯ liáģ‡u trong kho táģ• cháģŠc. Cháģ‰ thông tin máģĨc kho máģ›i đưáģŖc xuáēĨt, sáēŊ không cÃŗ cÃĄc táģ‡p đính kèm.", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Đang xuáēĨt dáģ¯ liáģ‡u kho táģ• cháģŠc" + }, + "exportingOrganizationVaultDesc": { + "message": "Cháģ‰ dáģ¯ liáģ‡u trong kho táģ• cháģŠc $ORGANIZATION$ máģ›i đưáģŖc xuáēĨt. CÃĄc kho cÃĄ nhÃĸn hoáēˇc cáģ§a táģ• cháģŠc khÃĄc sáēŊ không đưáģŖc bao gáģ“m.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "Láģ—i" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "TáēĄo tÃĒn ngưáģi dÚng" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "LoáēĄi tÃĒn ngưáģi dÚng" }, @@ -2017,13 +2911,13 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "Sáģ­ dáģĨng kháēŖ năng đáģ‹a cháģ‰ pháģĨ cáģ§a nhà cung cáēĨp dáģ‹ch váģĨ mail cáģ§a báēĄn." }, "catchallEmail": { "message": "Email Catch-all" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Sáģ­ dáģĨng háģ™p thư báēĄn Ä‘ÃŖ thiáēŋt láē­p đáģƒ nháē­n táēĨt cáēŖ email gáģ­i đáēŋn tÃĒn miáģn cáģ§a báēĄn." }, "random": { "message": "NgáēĢu nhiÃĒn" @@ -2044,10 +2938,120 @@ "message": "Dáģ‹ch váģĨ" }, "forwardedEmail": { - "message": "Forwarded email alias" + "message": "ÄÃŖ chuyáģƒn tiáēŋp bí danh email" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "TáēĄo bí danh email váģ›i dáģ‹ch váģĨ chuyáģƒn tiáēŋp bÃĒn ngoài." + }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "Láģ—i $SERVICENAME$: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "ĐưáģŖc táēĄo báģŸi Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Trang web: $WEBSITE$. ĐưáģŖc táēĄo báģŸi Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "KhoÃĄ API $SERVICENAME$ không háģŖp láģ‡", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "KhoÃĄ API $SERVICENAME$ không háģŖp láģ‡: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Không tháģƒ láēĨy ID tài khoáēŖn email áēŠn táģĢ $SERVICENAME$.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "TÃĒn miáģn $SERVICENAME$ không háģŖp láģ‡.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Đáģ‹a cháģ‰ $SERVICENAME$ không háģŖp láģ‡.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "$SERVICENAME$ Ä‘ÃŖ xáēŖy ra láģ—i không xÃĄc đáģ‹nh.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Ngưáģi chuyáģƒn tiáēŋp không xÃĄc đáģ‹nh: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } }, "hostname": { "message": "TÃĒn mÃĄy cháģ§", @@ -2060,16 +3064,16 @@ "message": "KhÃŗa API" }, "ssoKeyConnectorError": { - "message": "Key connector error: make sure key connector is available and working correctly." + "message": "Láģ—i káēŋt náģ‘i khÃŗa: hÃŖy đáēŖm báēŖo káēŋt náģ‘i khÃŗa kháēŖ dáģĨng và hoáēĄt đáģ™ng chính xÃĄc." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "YÃĒu cáē§u đăng kÃŊ gÃŗi Premium" }, "organizationIsDisabled": { - "message": "Organization suspended." + "message": "Táģ• cháģŠc Ä‘ÃŖ ngưng hoáēĄt đáģ™ng." }, "disabledOrganizationFilterError": { - "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Không tháģƒ truy cáē­p cÃĄc máģĨc trong táģ• cháģŠc Ä‘ÃŖ ngưng hoáēĄt đáģ™ng. HÃŖy liÃĒn háģ‡ váģ›i cháģ§ sáģŸ háģ¯u táģ• cháģŠc đáģƒ Ä‘Æ°áģŖc háģ— tráģŖ." }, "loggingInTo": { "message": "Đang đăng nháē­p vào $DOMAIN$", @@ -2093,13 +3097,13 @@ "message": "PhiÃĒn báēŖn mÃĄy cháģ§" }, "selfHostedServer": { - "message": "self-hosted" + "message": "táģą lưu tráģ¯" }, "thirdParty": { "message": "BÃĒn tháģŠ ba" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "BáēĄn đang káēŋt náģ‘i đáēŋn mÃĄy cháģ§ $SERVERNAME$ cáģ§a bÃĒn tháģŠ ba. Vui lÃ˛ng kiáģƒm tra láģ—i báēąng cÃĄch sáģ­ dáģĨng mÃĄy cháģ§ chính tháģŠc hoáēˇc bÃĄo láģ—i cho bÃĒn tháģŠ ba.", "placeholders": { "servername": { "content": "$1", @@ -2123,7 +3127,7 @@ "message": "Đang đăng nháē­p váģ›i tÃĒn" }, "notYou": { - "message": "Không pháēŖi báēĄn sao?" + "message": "Không pháēŖi báēĄn?" }, "newAroundHere": { "message": "BáēĄn máģ›i táģ›i đÃĸy sao?" @@ -2135,13 +3139,13 @@ "message": "Đăng nháē­p báēąng thiáēŋt báģ‹" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "Đăng nháē­p báēąng thiáēŋt báģ‹ pháēŖi đưáģŖc thiáēŋt láē­p trong cài đáēˇt cáģ§a áģŠng dáģĨng Bitwarden. DÚng cÃĄch khÃĄc?" }, "fingerprintPhraseHeader": { - "message": "CáģĨm táģĢ dáēĨu vÃĸn tay" + "message": "CáģĨm vÃĸn tay" }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + "message": "Vui lÃ˛ng đáēŖm báēŖo ráēąng báēĄn Ä‘ÃŖ máģŸ khoÃĄ kho và cáģĨm vÃĸn tay kháģ›p trÃĒn thiáēŋt báģ‹ khÃĄc." }, "resendNotification": { "message": "Gáģ­i láēĄi thông bÃĄo" @@ -2153,28 +3157,28 @@ "message": "Máģ™t thông bÃĄo Ä‘ÃŖ đưáģŖc gáģ­i đáēŋn thiáēŋt báģ‹ cáģ§a báēĄn." }, "loginInitiated": { - "message": "Login initiated" + "message": "Báē¯t đáē§u đăng nháē­p" }, "exposedMasterPassword": { "message": "Máē­t kháēŠu chính báģ‹ láģ™" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Máē­t kháēŠu này Ä‘ÃŖ báģ‹ rÃ˛ ráģ‰ trong máģ™t váģĨ táēĨn công dáģ¯ liáģ‡u. DÚng máē­t kháēŠu máģ›i và an toàn đáģƒ báēŖo váģ‡ tài khoáēŖn báēĄn. BáēĄn cÃŗ cháē¯c muáģ‘n sáģ­ dáģĨng máē­t kháēŠu Ä‘ÃŖ báģ‹ rÃ˛ ráģ‰?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Máē­t kháēŠu chính yáēŋu và báģ‹ láģ™" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Máē­t kháēŠu yáēŋu này Ä‘ÃŖ báģ‹ rÃ˛ ráģ‰ trong máģ™t váģĨ táēĨn công dáģ¯ liáģ‡u. DÚng máē­t kháēŠu máģ›i và an toàn đáģƒ báēŖo váģ‡ tài khoáēŖn báēĄn. BáēĄn cÃŗ cháē¯c muáģ‘n sáģ­ dáģĨng máē­t kháēŠu Ä‘ÃŖ báģ‹ rÃ˛ ráģ‰?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Kiáģƒm tra máē­t kháēŠu cÃŗ láģ™ trong cÃĄc váģĨ rÃ˛ ráģ‰ dáģ¯ liáģ‡u hay không" }, "important": { "message": "Quan tráģng:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Máē­t kháēŠu chính cáģ§a báēĄn không tháģƒ pháģĨc háģ“i náēŋu báēĄn quÃĒn nÃŗ!" }, "characterMinimum": { "message": "$LENGTH$ kÃŊ táģą táģ‘i thiáģƒu", @@ -2192,7 +3196,7 @@ "message": "CÃĄch táģą Ä‘áģ“ng điáģn" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Cháģn máģ™t máģĨc táģĢ màn hÃŦnh này, sáģ­ dáģĨng phím táē¯t $COMMAND$, hoáēˇc khÃĄm phÃĄ cÃĄc tÚy cháģn khÃĄc trong cài đáēˇt.", "placeholders": { "command": { "content": "$1", @@ -2201,22 +3205,31 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Cháģn máģ™t máģĨc táģĢ màn hÃŦnh này, hoáēˇc khÃĄm phÃĄ cÃĄc tÚy cháģn khÃĄc trong cài đáēˇt." }, "gotIt": { - "message": "Got it" + "message": "ÄÃŖ hiáģƒu" }, "autofillSettings": { "message": "Cài đáēˇt táģą Ä‘áģ™ng điáģn" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Phím táē¯t táģą Ä‘áģ™ng điáģn" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Thay đáģ•i phím táē¯t" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "QuáēŖn lÃŊ cÃĄc láģ‘i táē¯t" + }, "autofillShortcut": { "message": "Phím táē¯t táģą Ä‘áģ™ng điáģn" }, - "autofillShortcutNotSet": { - "message": "Chưa cài đáēˇt phím táē¯t cho cháģŠc năng táģą Ä‘áģ™ng điáģn. Vui lÃ˛ng thay đáģ•i trong cài đáēˇt cáģ§a trÃŦnh duyáģ‡t." + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "Phím táē¯t cho cháģŠc năng táģą Ä‘áģ™ng điáģn là $COMMAND$. Vui lÃ˛ng thay đáģ•i trong cài đáēˇt cáģ§a trÃŦnh duyáģ‡t.", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2233,87 +3246,107 @@ } } }, - "loggingInOn": { - "message": "Logging in on" - }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "MÆĄĖ‰ trong cÆ°Ė‰a sÃ´Ė‰ mÆĄĖi" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "YÃĒu cáē§u phÃĒ duyáģ‡t thiáēŋt báģ‹. Cháģn máģ™t tuáģŗ cháģn phÃĒ duyáģ‡t bÃĒn dưáģ›i:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Lưu thiáēŋt báģ‹ này" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "Báģ cháģn náēŋu sáģ­ dáģĨng thiáēŋt báģ‹ công cáģ™ng" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "PhÃĒ duyáģ‡t báēąng thiáēŋt báģ‹ khÃĄc" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "YÃĒu cáē§u quáēŖn tráģ‹ viÃĒn phÃĒ duyáģ‡t" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "PhÃĒ duyáģ‡t báēąng máē­t kháēŠu chính" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "Cáē§n cÃŗ mÃŖ đáģ‹nh danh SSO cáģ§a táģ• cháģŠc." + }, + "creatingAccountOn": { + "message": "Đang táēĄo tài khoáēŖn trÃĒn" + }, + "checkYourEmail": { + "message": "Kiáģƒm tra email cáģ§a báēĄn" + }, + "followTheLinkInTheEmailSentTo": { + "message": "NháēĨp vào liÃĒn káēŋt trong email đưáģŖc gáģ­i đáēŋn" + }, + "andContinueCreatingYourAccount": { + "message": "và tiáēŋp táģĨc táēĄo tài khoáēŖn cáģ§a báēĄn." + }, + "noEmail": { + "message": "Không cÃŗ email?" + }, + "goBack": { + "message": "Quay láēĄi" + }, + "toEditYourEmailAddress": { + "message": "đáģƒ cháģ‰nh sáģ­a đáģ‹a cháģ‰ email cáģ§a báēĄn." }, "eu": { - "message": "EU", + "message": "ChÃĸu Âu", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { - "message": "Access denied. You do not have permission to view this page." + "message": "Truy cáē­p báģ‹ táģĢ cháģ‘i. BáēĄn không cÃŗ quyáģn xem trang này." }, "general": { - "message": "General" + "message": "Chung" }, "display": { - "message": "Display" + "message": "Hiáģƒn tháģ‹" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "TáēĄo tài khoáēŖn thành công!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "YÃĒu cáē§u quáēŖn tráģ‹ viÃĒn phÃĒ duyáģ‡t" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "YÃĒu cáē§u cáģ§a báēĄn Ä‘ÃŖ đưáģŖc gáģ­i đáēŋn quáēŖn tráģ‹ viÃĒn." }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "BáēĄn sáēŊ cÃŗ thông bÃĄo náēŋu đưáģŖc phÃĒ duyáģ‡t." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "Không tháģƒ Ä‘Äƒng nháē­p?" }, "loginApproved": { - "message": "Login approved" + "message": "LưáģŖt đăng nháē­p Ä‘ÃŖ duyáģ‡t" }, "userEmailMissing": { - "message": "User email missing" + "message": "Thiáēŋu email ngưáģi dÚng" }, "deviceTrusted": { - "message": "Device trusted" + "message": "Thiáēŋt báģ‹ tin cáē­y" + }, + "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." + }, + "sendsNoItemsMessage": { + "message": "Sáģ­ dáģĨng Gáģ­i đáģƒ chia sáēģ thông tin mÃŖ hÃŗa máģ™t cÃĄch an toàn váģ›i báēĨt káģŗ ai.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "Trưáģng này là báē¯t buáģ™c." }, "required": { - "message": "required" + "message": "băˁt buÃ´ĖŖc" }, "search": { - "message": "Search" + "message": "TÃŦm kiáēŋm" }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "GiÃĄ tráģ‹ nháē­p vào pháēŖi ít nháēĨt $COUNT$ kÃŊ táģą.", "placeholders": { "count": { "content": "$1", @@ -2322,7 +3355,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "GiÃĄ tráģ‹ nháē­p vào không đưáģŖc vưáģŖt quÃĄ $COUNT$ kÃŊ táģą.", "placeholders": { "count": { "content": "$1", @@ -2331,7 +3364,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "CÃĄc kÃŊ táģą sau không đưáģŖc phÊp sáģ­ dáģĨng: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "GiÃĄ tráģ‹ nháē­p vào pháēŖi ít nháēĨt $MIN$.", "placeholders": { "min": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "GiÃĄ tráģ‹ nháē­p vào không đưáģŖc vưáģŖt quÃĄ $MAX$.", "placeholders": { "max": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "CÃŗ ít nháēĨt 1 đáģ‹a cháģ‰ email không háģŖp láģ‡" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "GiÃĄ tráģ‹ nháē­p vào không đưáģŖc cháģ‰ cÃŗ khoáēŖng tráē¯ng.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "GiÃĄ tráģ‹ nháē­p vào không pháēŖi là đáģ‹a cháģ‰ email." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "CÃŗ $COUNT$ trưáģng cáē§n báēĄn xem xÊt áģŸ trÃĒn.", "placeholders": { "count": { "content": "$1", @@ -2376,23 +3409,35 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Cháģn --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- Nháē­p đáģƒ láģc --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "Đang táēŖi cÃĄc tuáģŗ cháģn..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "Không tÃŦm tháēĨy máģĨc nào" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "XoÃĄ táēĨt cáēŖ" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ nhiáģu hÆĄn", "placeholders": { "quantity": { "content": "$1", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "Menu con" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "Báē­t/táē¯t thu gáģn", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "Nháē­p dáģ¯ liáģ‡u cáģ§a báēĄn vào Bitwarden?", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "BáēŖo váģ‡ dáģ¯ liáģ‡u LastPass cáģ§a báēĄn và nháē­p vào Bitwarden?", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "Lưu dưáģ›i dáēĄng táē­p tin không đưáģŖc mÃŖ hÃŗa", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "Nháē­p vào Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "Đang nháē­p...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "Dáģ¯ liáģ‡u Ä‘ÃŖ đưáģŖc nháē­p thành công!", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "XáēŖy ra láģ—i trong quÃĄ trÃŦnh nháē­p. Kiáģƒm tra báēŖng điáģu khiáģƒn đáģƒ biáēŋt thÃĒm chi tiáēŋt.", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "ÄÃŖ xáēŖy ra láģ—i máēĄng trong quÃĄ trÃŦnh nháē­p dáģ¯ liáģ‡u.", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "TÃĒn miáģn thay tháēŋ" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "CÃĄc máģĨc yÃĒu cáē§u nháē­p láēĄi máē­t kháēŠu chính không tháģƒ táģą Ä‘áģ™ng điáģn khi táēŖi trang. Táģą Ä‘áģ™ng điáģn khi táēŖi trang Ä‘ÃŖ táē¯t.", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "Táģą Ä‘áģ™ng điáģn khi táēŖi trang đưáģŖc đáēˇt thành máēˇc đáģ‹nh trong cài đáēˇt.", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "Táē¯t yÃĒu cáē§u nháē­p láēĄi máē­t kháēŠu chính đáģƒ cháģ‰nh sáģ­a trưáģng này", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "áē¨n/hiáģ‡n thanh điáģu hưáģ›ng bÃĒn" + }, + "skipToContent": { + "message": "Chuyáģƒn đáēŋn náģ™i dung" + }, + "bitwardenOverlayButton": { + "message": "NÃēt menu táģą Ä‘áģ™ng điáģn Bitwarden", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "Báē­t/táē¯t menu táģą Ä‘áģ™ng điáģn Bitwarden", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Menu táģą Ä‘áģ™ng điáģn Bitwarden", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "MáģŸ khÃŗa tài khoáēŖn cáģ§a báēĄn đáģƒ xem cÃĄc thông tin đăng nháē­p phÚ háģŖp", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "MáģŸ khÃŗa tài khoáēŖn", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "Điáģn thông tin đăng nháē­p cho", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "TÃĒn ngưáģi dÚng táģĢng pháē§n", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "Không cÃŗ máģĨc nào đáģƒ hiáģƒn tháģ‹", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "MáģĨc máģ›i", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "ThÃĒm máģĨc máģ›i", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "New login", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Danh sÃĄch táģą Ä‘áģ™ng điáģn cáģ§a Bitwarden sáēĩn sàng. Sáģ­ dáģĨng phím mÅŠi tÃĒn xuáģ‘ng đáģƒ cháģn.", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "Báē­t" + }, + "ignore": { + "message": "Báģ qua" + }, + "importData": { + "message": "Nháē­p dáģ¯ liáģ‡u", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "Láģ—i nháē­p" + }, + "importErrorDesc": { + "message": "CÃŗ váēĨn đáģ váģ›i dáģ¯ liáģ‡u báēĄn cáģ‘ gáē¯ng nháē­p. Vui lÃ˛ng kháē¯c pháģĨc cÃĄc láģ—i đưáģŖc liáģ‡t kÃĒ bÃĒn dưáģ›i trong táē­p tin nguáģ“n cáģ§a báēĄn và tháģ­ láēĄi." + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "GiáēŖi quyáēŋt cÃĄc láģ—i bÃĒn dưáģ›i và tháģ­ láēĄi." + }, + "description": { + "message": "Mô táēŖ" + }, + "importSuccess": { + "message": "Dáģ¯ liáģ‡u Ä‘ÃŖ đưáģŖc nháē­p thành công" + }, + "importSuccessNumberOfItems": { + "message": "ÄÃŖ nháē­p táģ•ng cáģ™ng $AMOUNT$ máģĨc.", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "Tháģ­ láēĄi" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "Cáē§n xÃĄc minh cho thao tÃĄc này. HÃŖy đáēˇt mÃŖ PIN đáģƒ tiáēŋp táģĨc." + }, + "setPin": { + "message": "Thiáēŋt láē­p mÃŖ PIN" + }, + "verifyWithBiometrics": { + "message": "XÃĄc tháģąc báēąng sinh tráē¯c háģc" + }, + "awaitingConfirmation": { + "message": "Đang cháģ xÃĄc nháē­n" + }, + "couldNotCompleteBiometrics": { + "message": "Không tháģƒ hoàn táēĨt sinh tráē¯c háģc." + }, + "needADifferentMethod": { + "message": "Cáē§n máģ™t phÆ°ÆĄng phÃĄp khÃĄc?" + }, + "useMasterPassword": { + "message": "DÚng máē­t kháēŠu chính" + }, + "usePin": { + "message": "DÚng mÃŖ PIN" + }, + "useBiometrics": { + "message": "DÚng sinh tráē¯c háģc" + }, + "enterVerificationCodeSentToEmail": { + "message": "Nháē­p mÃŖ xÃĄc minh đưáģŖc gáģ­i đáēŋn email cáģ§a báēĄn." + }, + "resendCode": { + "message": "Gáģ­i láēĄi mÃŖ" + }, + "total": { + "message": "Táģ•ng" + }, + "importWarning": { + "message": "BáēĄn đang nháē­p dáģ¯ liáģ‡u vào $ORGANIZATION$. Dáģ¯ liáģ‡u cáģ§a báēĄn cÃŗ tháģƒ Ä‘Æ°áģŖc chia sáēģ váģ›i cÃĄc thành viÃĒn cáģ§a táģ• cháģŠc này. BáēĄn cÃŗ muáģ‘n tiáēŋp táģĨc không?", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Láģ—i káēŋt náģ‘i váģ›i dáģ‹ch váģĨ Duo. Sáģ­ dáģĨng phÆ°ÆĄng tháģŠc đăng nháē­p hai bưáģ›c khÃĄc hoáēˇc liÃĒn háģ‡ váģ›i Duo đáģƒ Ä‘Æ°áģŖc háģ— tráģŖ." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "KháģŸi cháēĄy Duo và làm theo cÃĄc bưáģ›c đáģƒ hoàn táēĨt đăng nháē­p." + }, + "duoRequiredForAccount": { + "message": "Tài khoáēŖn cáģ§a báēĄn yÃĒu cáē§u xÃĄc minh hai bưáģ›c váģ›i Duo." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Báē­t tiáģ‡n ích máģŸ ráģ™ng đáģƒ hoàn táēĨt đăng nháē­p." + }, + "popoutExtension": { + "message": "Tiáģ‡n ích máģŸ ráģ™ng dáēĄng cáģ­a sáģ• báē­t lÃĒn" + }, + "launchDuo": { + "message": "KháģŸi cháēĄy Dou" + }, + "importFormatError": { + "message": "Dáģ¯ liáģ‡u không đưáģŖc đáģ‹nh dáēĄng đÃēng. Vui lÃ˛ng kiáģƒm tra táē­p tin nháē­p và tháģ­ láēĄi." + }, + "importNothingError": { + "message": "Không cÃŗ gÃŦ đưáģŖc nháē­p." + }, + "importEncKeyError": { + "message": "Láģ—i giáēŖi mÃŖ táē­p tin Ä‘ÃŖ xuáēĨt. KhÃŗa mÃŖ hÃŗa cáģ§a báēĄn không kháģ›p váģ›i khÃŗa mÃŖ hÃŗa đưáģŖc sáģ­ dáģĨng đáģƒ xuáēĨt dáģ¯ liáģ‡u." + }, + "invalidFilePassword": { + "message": "Máē­t kháēŠu táē­p tin không háģŖp láģ‡, vui lÃ˛ng sáģ­ dáģĨng máē­t kháēŠu báēĄn Ä‘ÃŖ nháē­p khi xuáēĨt táē­p tin." + }, + "destination": { + "message": "Đáēŋn" + }, + "learnAboutImportOptions": { + "message": "TÃŦm hiáģƒu cÃĄc tuáģŗ cháģn nháē­p cáģ§a báēĄn" + }, + "selectImportFolder": { + "message": "Cháģn thư máģĨc" + }, + "selectImportCollection": { + "message": "Cháģn báģ™ sưu táē­p" + }, + "importTargetHint": { + "message": "Cháģn tÚy cháģn này đáģƒ di chuyáģƒn náģ™i dung táē­p tin Ä‘ÃŖ đưáģŖc nháē­p đáēŋn $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Táē­p tin cháģŠa cÃĄc máģĨc không xÃĄc đáģ‹nh." + }, + "selectFormat": { + "message": "Cháģn đáģ‹nh dáēĄng táē­p tin nháē­p" + }, + "selectImportFile": { + "message": "Cháģn táē­p tin nháē­p" + }, + "chooseFile": { + "message": "Cháģn táē­p tin" + }, + "noFileChosen": { + "message": "Chưa cháģn táē­p tin nào" + }, + "orCopyPasteFileContents": { + "message": "hoáēˇc sao chÊp/dÃĄn náģ™i dung cáģ§a táē­p tin nháē­p" + }, + "instructionsFor": { + "message": "Hưáģ›ng dáēĢn dÚng $NAME$", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "XÃĄc nháē­n nháē­p kho" + }, + "confirmVaultImportDesc": { + "message": "Táē­p tin này đưáģŖc báēŖo váģ‡ báēąng máē­t kháēŠu. Vui lÃ˛ng nháē­p máē­t kháēŠu đáģƒ nháē­p dáģ¯ liáģ‡u." + }, + "confirmFilePassword": { + "message": "Nháē­p láēĄi máē­t kháēŠu táē­p tin" + }, + "exportSuccess": { + "message": "ÄÃŖ xuáēĨt dáģ¯ liáģ‡u kho cáģ§a báēĄn" + }, + "typePasskey": { + "message": "MÃŖ khoÃĄ" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "Không tháģƒ sao chÊp mÃŖ khoÃĄ" + }, + "passkeyNotCopiedAlert": { + "message": "BáēŖn sao sáēŊ không bao gáģ“m mÃŖ khoÃĄ. BáēĄn cÃŗ muáģ‘n tiáēŋp táģĨc táēĄo báēŖn sao máģĨc này?" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "Trang web yÃĒu cáē§u xÃĄc minh. Tính năng này hiáģ‡n chưa đưáģŖc háģ— tráģŖ cho tài khoáēŖn không cÃŗ máē­t kháēŠu chính." + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "áģ¨ng dáģĨng này Ä‘ÃŖ cÃŗ mÃŖ khoÃĄ." + }, + "noPasskeysFoundForThisApplication": { + "message": "Không cÃŗ mÃŖ khoÃĄ cho áģŠng dáģĨng này." + }, + "noMatchingPasskeyLogin": { + "message": "BáēĄn không cÃŗ thông tin đăng nháē­p phÚ háģŖp cho trang web này." + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "XÃĄc nháē­n" + }, + "savePasskey": { + "message": "Lưu mÃŖ khoÃĄ" + }, + "savePasskeyNewLogin": { + "message": "Lưu mÃŖ khoÃĄ như đăng nháē­p máģ›i" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "MáģĨc mÃŖ khoÃĄ" + }, + "overwritePasskey": { + "message": "Ghi đè mÃŖ khoÃĄ?" + }, + "overwritePasskeyAlert": { + "message": "MáģĨc này Ä‘ÃŖ cháģŠa mÃŖ khoÃĄ. BáēĄn cÃŗ cháē¯c muáģ‘n ghi đè mÃŖ khoÃĄ hiáģ‡n táēĄi không?" + }, + "featureNotSupported": { + "message": "Chưa háģ— tráģŖ tính năng này" + }, + "yourPasskeyIsLocked": { + "message": "YÃĒu cáē§u xÃĄc tháģąc đáģƒ sáģ­ dáģĨng mÃŖ khoÃĄ. XÃĄc minh danh tính cáģ§a báēĄn đáģƒ tiáēŋp táģĨc." + }, + "multifactorAuthenticationCancelled": { + "message": "ÄÃŖ háģ§y xÃĄc tháģąc đa yáēŋu táģ‘" + }, + "noLastPassDataFound": { + "message": "Không tÃŦm tháēĨy dáģ¯ liáģ‡u LastPass" + }, + "incorrectUsernameOrPassword": { + "message": "TÃĒn ngưáģi dÚng hoáēˇc máē­t kháēŠu không đÃēng" + }, + "incorrectPassword": { + "message": "Máē­t kháēŠu không đÃēng" + }, + "incorrectCode": { + "message": "MÃŖ không đÃēng" + }, + "incorrectPin": { + "message": "MÃŖ PIN không đÃēng" + }, + "multifactorAuthenticationFailed": { + "message": "XÃĄc tháģąc đa yáēŋu táģ‘ tháēĨt báēĄi" + }, + "includeSharedFolders": { + "message": "Bao gáģ“m cÃĄc thư máģĨc đưáģŖc chia sáēģ" + }, + "lastPassEmail": { + "message": "Email LastPass" + }, + "importingYourAccount": { + "message": "Đang nháē­p tài khoáēŖn cáģ§a báēĄn..." + }, + "lastPassMFARequired": { + "message": "YÃĒu cáē§u xÃĄc tháģąc đa yáēŋu táģ‘ LastPass" + }, + "lastPassMFADesc": { + "message": "Nháē­p mÃŖ OTP táģĢ áģŠng dáģĨng xÃĄc tháģąc cáģ§a báēĄn" + }, + "lastPassOOBDesc": { + "message": "PhÃĒ duyáģ‡t yÃĒu cáē§u đăng nháē­p trÃĒn áģŠng dáģĨng xÃĄc tháģąc cáģ§a báēĄn hoáēˇc nháē­p mÃŖ OTP." + }, + "passcode": { + "message": "Máē­t mÃŖ" + }, + "lastPassMasterPassword": { + "message": "Máē­t kháēŠu chính LastPass" + }, + "lastPassAuthRequired": { + "message": "YÃĒu cáē§u xÃĄc tháģąc LastPass" + }, + "awaitingSSO": { + "message": "Đang cháģ xÃĄc tháģąc SSO" + }, + "awaitingSSODesc": { + "message": "Vui lÃ˛ng tiáēŋp táģĨc đăng nháē­p báēąng thông tin đăng nháē­p cáģ§a công ty báēĄn." + }, + "seeDetailedInstructions": { + "message": "Xem hưáģ›ng dáēĢn chi tiáēŋt trÃĒn trang tráģŖ giÃēp cáģ§a chÃēng tôi táēĄi", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "Nháē­p tráģąc tiáēŋp táģĢ LastPass" + }, + "importFromCSV": { + "message": "Nháē­p táģĢ CSV" + }, + "lastPassTryAgainCheckEmail": { + "message": "Tháģ­ láēĄi hoáēˇc tÃŦm email táģĢ LastPass đáģƒ xÃĄc minh Ä‘Ãŗ là báēĄn." + }, + "collection": { + "message": "Báģ™ Sưu Táē­p" + }, + "lastPassYubikeyDesc": { + "message": "Cáē¯m khÃŗa YubiKey đưáģŖc liÃĒn káēŋt váģ›i tài khoáēŖn LastPass cáģ§a báēĄn vào cáģ•ng USB cáģ§a mÃĄy tính, sau Ä‘Ãŗ nháēĨn nÃēt trÃĒn YubiKey." + }, + "switchAccount": { + "message": "Chuyáģƒn tài khoáēŖn" + }, + "switchAccounts": { + "message": "Chuyáģƒn đáģ•i tài khoáēŖn" + }, + "switchToAccount": { + "message": "Chuyáģƒn sang tài khoáēŖn" + }, + "activeAccount": { + "message": "Tài khoáēŖn đang hoáēĄt đáģ™ng" + }, + "availableAccounts": { + "message": "CÃĄc tài khoáēŖn kháēŖ dáģĨng" + }, + "accountLimitReached": { + "message": "Sáģ‘ lưáģŖng tài khoáēŖn Ä‘ÃŖ đáēĄt giáģ›i háēĄn. Đăng xuáēĨt kháģi máģ™t tài khoáēŖn đáģƒ thÃĒm tài khoáēŖn khÃĄc." + }, + "active": { + "message": "hoáēĄt đáģ™ng" + }, + "locked": { + "message": "Ä‘ÃŖ khÃŗa" + }, + "unlocked": { + "message": "Ä‘ÃŖ máģŸ khÃŗa" + }, + "server": { + "message": "mÃĄy cháģ§" + }, + "hostedAt": { + "message": "đưáģŖc lưu tráģ¯ táēĄi" + }, + "useDeviceOrHardwareKey": { + "message": "Sáģ­ dáģĨng thiáēŋt báģ‹ hoáēˇc khÃŗa pháē§n cáģŠng cáģ§a báēĄn" + }, + "justOnce": { + "message": "Cháģ‰ máģ™t láē§n" + }, + "alwaysForThisSite": { + "message": "Luôn cho trang này" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ Ä‘ÃŖ đưáģŖc thÃĒm vào danh sÃĄch cÃĄc tÃĒn miáģn loáēĄi tráģĢ.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Đáģ‹nh dáēĄng chung", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Tiáēŋp táģĨc táģ›i Cài đáēˇt trÃŦnh duyáģ‡t?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Tiáēŋp táģĨc táģ›i Trung tÃĸm tráģŖ giÃēp?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Thay đáģ•i cài đáēˇt táģą Ä‘áģ™ng điáģn và quáēŖn lÃŊ máē­t kháēŠu cáģ§a trÃŦnh duyáģ‡t cáģ§a báēĄn.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "BáēĄn cÃŗ tháģƒ xem và đáēˇt cÃĄc phím táē¯t cáģ§a tiáģ‡n ích máģŸ ráģ™ng trong pháē§n cài đáēˇt trÃŦnh duyáģ‡t.", + "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": "Thay đáģ•i cài đáēˇt táģą Ä‘áģ™ng điáģn và quáēŖn lÃŊ máē­t kháēŠu cáģ§a trÃŦnh duyáģ‡t cáģ§a báēĄn.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "BáēĄn cÃŗ tháģƒ xem và thiáēŋt láē­p cÃĄc phím táē¯t cáģ§a tiáģ‡n ích máģŸ ráģ™ng trong pháē§n cài đáēˇt trÃŦnh duyáģ‡t.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Đáēˇt Bitwarden làm trÃŦnh quáēŖn lÃŊ máē­t kháēŠu máēˇc đáģ‹nh cáģ§a báēĄn?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Báģ qua tÚy cháģn này cÃŗ tháģƒ gÃĸy ra xung đáģ™t giáģ¯a cÃĄc đáģ xuáēĨt táģą Ä‘áģ™ng điáģn cáģ§a Bitwarden và trÃŦnh duyáģ‡t cáģ§a báēĄn.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Bitwarden làm trÃŦnh quáēŖn lÃŊ máē­t kháēŠu máēˇc đáģ‹nh", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Không tháģƒ Ä‘áēˇt Bitwarden làm trÃŦnh quáēŖn lÃŊ máē­t kháēŠu máēˇc đáģ‹nh", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "BáēĄn pháēŖi cáēĨp quyáģn riÃĒng tư cáģ§a trÃŦnh duyáģ‡t cho Bitwarden đáģƒ Ä‘áēˇt nÃŗ làm trÃŦnh quáēŖn lÃŊ máē­t kháēŠu máēˇc đáģ‹nh.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "Đáēˇt làm máēˇc đáģ‹nh", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Thông tin đăng nháē­p Ä‘ÃŖ lưu thành công!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Thông tin đăng nháē­p Ä‘ÃŖ đưáģŖc cáē­p nháē­t thành công!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "XáēŖy ra láģ—i trong quÃĄ trÃŦnh lưu thông tin đăng nháē­p. Kiáģƒm tra báēŖng điáģu khiáģƒn đáģƒ biáēŋt thÃĒm chi tiáēŋt.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Thành công" + }, + "removePasskey": { + "message": "XÃŗa mÃŖ khoÃĄ" + }, + "passkeyRemoved": { + "message": "ÄÃŖ xÃŗa mÃŖ khoÃĄ" + }, + "autofillSuggestions": { + "message": "GáģŖi ÃŊ điáģn táģą Ä‘áģ™ng" + }, + "autofillSuggestionsTip": { + "message": "Lưu thông tin đăng nháē­p cho trang này đáģƒ táģą Ä‘áģ™ng điáģn" + }, + "yourVaultIsEmpty": { + "message": "Kho cáģ§a báēĄn tráģ‘ng" + }, + "noItemsMatchSearch": { + "message": "Không cÃŗ káēŋt quáēŖ nào phÚ háģŖp váģ›i tÃŦm kiáēŋm cáģ§a báēĄn" + }, + "clearFiltersOrTryAnother": { + "message": "XÃŗa báģ™ láģc hoáēˇc tháģ­ táģĢ khÃŗa tÃŦm kiáēŋm khÃĄc" + }, + "copyInfoTitle": { + "message": "Sao chÊp thông tin - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Sao chÊp ghi chÃē - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "ThÃĒm tÚy cháģn, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "ThÃĒm tÚy cháģn - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "Xem máģĨc - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Táģą Ä‘áģ™ng điáģn - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "Không cÃŗ giÃĄ tráģ‹ Ä‘áģƒ sao chÊp" + }, + "assignToCollections": { + "message": "GÃĄn vào báģ™ sưu táē­p" + }, + "copyEmail": { + "message": "Sao chÊp email" + }, + "copyPhone": { + "message": "Sao chÊp sáģ‘ Ä‘iáģ‡n thoáēĄi" + }, + "copyAddress": { + "message": "Sao chÊp đáģ‹a cháģ‰" + }, + "adminConsole": { + "message": "BáēŖng điáģu khiáģƒn dành cho quáēŖn tráģ‹ viÃĒn" + }, + "accountSecurity": { + "message": "BáēŖo máē­t tài khoáēŖn" + }, + "notifications": { + "message": "Thông bÃĄo" + }, + "appearance": { + "message": "Giao diáģ‡n" + }, + "errorAssigningTargetCollection": { + "message": "Láģ—i khi gÃĄn vào báģ™ sưu táē­p cháģ‰ Ä‘áģ‹nh." + }, + "errorAssigningTargetFolder": { + "message": "Láģ—i khi gÃĄn vào thư máģĨc cháģ‰ Ä‘áģ‹nh." + }, + "viewItemsIn": { + "message": "Xem cÃĄc máģĨc trong $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Quay láēĄi $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "Máģ›i" + }, + "removeItem": { + "message": "XoÃĄ $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "CÃĄc máģĨc không đưáģŖc phÃĸn loáēĄi" + }, + "itemDetails": { + "message": "Chi tiáēŋt máģĨc" + }, + "itemName": { + "message": "TÃĒn máģĨc" + }, + "cannotRemoveViewOnlyCollections": { + "message": "BáēĄn không tháģƒ xÃŗa cÃĄc báģ™ sưu táē­p váģ›i quyáģn cháģ‰ xem: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Táģ• cháģŠc không cÃ˛n hoáēĄt đáģ™ng" + }, + "owner": { + "message": "Cháģ§ sáģŸ háģ¯u" + }, + "selfOwnershipLabel": { + "message": "BáēĄn", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Không tháģƒ truy cáē­p cÃĄc máģĨc trong táģ• cháģŠc Ä‘ÃŖ ngưng hoáēĄt đáģ™ng. HÃŖy liÃĒn háģ‡ váģ›i cháģ§ sáģŸ háģ¯u táģ• cháģŠc đáģƒ Ä‘Æ°áģŖc háģ— tráģŖ." + }, + "additionalInformation": { + "message": "Thông tin báģ• sung" + }, + "itemHistory": { + "message": "Láģ‹ch sáģ­ máģĨc" + }, + "lastEdited": { + "message": "Cháģ‰nh sáģ­a láē§n cuáģ‘i" + }, + "ownerYou": { + "message": "Cháģ§ sáģŸ háģ¯u: BáēĄn" + }, + "linked": { + "message": "ÄÃŖ liÃĒn káēŋt" + }, + "copySuccessful": { + "message": "Sao chÊp thành công" + }, + "upload": { + "message": "TáēŖi lÃĒn" + }, + "addAttachment": { + "message": "ThÃĒm táģ‡p đính kèm" + }, + "maxFileSizeSansPunctuation": { + "message": "Kích thưáģ›c táģ‘i đa cáģ§a táē­p tin là 500MB" + }, + "deleteAttachmentName": { + "message": "XoÃĄ táģ‡p đính kèm $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "TáēŖi xuáģ‘ng $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "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?" + }, + "premium": { + "message": "Cao cáēĨp" + }, + "freeOrgsCannotUseAttachments": { + "message": "CÃĄc táģ• cháģŠc miáģ…n phí không tháģƒ sáģ­ dáģĨng táģ‡p đính kèm" + }, + "filters": { + "message": "Báģ™ láģc" + }, + "personalDetails": { + "message": "Thông tin cÃĄ nhÃĸn" + }, + "identification": { + "message": "ID" + }, + "contactInfo": { + "message": "Thông tin liÃĒn háģ‡" + }, + "downloadAttachment": { + "message": "TáēŖi xuáģ‘ng - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Thông tin đăng nháē­p" + }, + "authenticatorKey": { + "message": "KhÃŗa xÃĄc tháģąc" + }, + "autofillOptions": { + "message": "Autofill options" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Thông tin tháēģ" + }, + "cardBrandDetails": { + "message": "Chi tiáēŋt $BRAND$", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "Enable animations" + }, + "showAnimations": { + "message": "Show animations" + }, + "addAccount": { + "message": "ThÃĒm tài khoáēŖn" + }, + "loading": { + "message": "Đang táēŖi" + }, + "data": { + "message": "Dáģ¯ liáģ‡u" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "GÃĄn" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Cháģ‰ nháģ¯ng thành viÃĒn cáģ§a táģ• cháģŠc cÃŗ quyáģn truy cáē­p vào cÃĄc báģ™ sưu táē­p này máģ›i cÃŗ tháģƒ xem máģĨc này." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Cháģ‰ nháģ¯ng thành viÃĒn cáģ§a táģ• cháģŠc cÃŗ quyáģn truy cáē­p vào cÃĄc báģ™ sưu táē­p này máģ›i cÃŗ tháģƒ xem cÃĄc máģĨc này." + }, + "bulkCollectionAssignmentWarning": { + "message": "BáēĄn Ä‘ÃŖ cháģn $TOTAL_COUNT$ máģĨc. BáēĄn không tháģƒ cáē­p nháē­t $READONLY_COUNT$ máģĨc vÃŦ báēĄn không cÃŗ quyáģn cháģ‰nh sáģ­a.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "ThÃĒm trưáģng" + }, + "add": { + "message": "ThÃĒm" + }, + "fieldType": { + "message": "LoáēĄi trưáģng" + }, + "fieldLabel": { + "message": "TiÃĒu đáģ trưáģng" + }, + "textHelpText": { + "message": "Sáģ­ dáģĨng cÃĄc trưáģng nháē­p liáģ‡u văn báēŖn cho dáģ¯ liáģ‡u như cÃĸu háģi báēŖo máē­t" + }, + "hiddenHelpText": { + "message": "Sáģ­ dáģĨng cÃĄc trưáģng nháē­p liáģ‡u áēŠn cho thông tin nháēĄy cáēŖm như máē­t kháēŠu" + }, + "checkBoxHelpText": { + "message": "DÚng cÃĄc ô tích cháģn náēŋu báēĄn muáģ‘n táģą Ä‘áģ™ng điáģn vào ô tích cháģn cáģ§a biáģƒu máēĢu, cháēŗng háēĄn như ghi nháģ› email" + }, + "linkedHelpText": { + "message": "Sáģ­ dáģĨng trưáģng nháē­p liáģ‡u Ä‘ÃŖ liÃĒn káēŋt khi báēĄn gáēˇp váēĨn đáģ váģ›i viáģ‡c táģą Ä‘áģ™ng điáģn trÃĒn máģ™t trang web cáģĨ tháģƒ." + }, + "linkedLabelHelpText": { + "message": "Nháē­p thông tin đáģ‹nh danh cáģ§a trưáģng như id, name, aria-label hoáēˇc placeholder." + }, + "editField": { + "message": "Cháģ‰nh sáģ­a trưáģng" + }, + "editFieldLabel": { + "message": "Cháģ‰nh sáģ­a $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "XoÃĄ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "ÄÃŖ thÃĒm $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Sáē¯p xáēŋp láēĄi $LABEL$. Sáģ­ dáģĨng phím mÅŠi tÃĒn đáģƒ di chuyáģƒn máģĨc lÃĒn hoáēˇc xuáģ‘ng.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ Ä‘ÃŖ di chuyáģƒn lÃĒn váģ‹ trí $INDEX$ / $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "Cháģn báģ™ sưu táē­p đáģƒ gÃĄn" + }, + "personalItemTransferWarningSingular": { + "message": "1 máģĨc sáēŊ đưáģŖc chuyáģƒn vÄŠnh viáģ…n đáēŋn táģ• cháģŠc Ä‘ÃŖ cháģn. BáēĄn sáēŊ không cÃ˛n sáģŸ háģ¯u máģĨc này náģ¯a." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ máģĨc sáēŊ đưáģŖc chuyáģƒn vÄŠnh viáģ…n đáēŋn táģ• cháģŠc Ä‘ÃŖ cháģn. BáēĄn sáēŊ không cÃ˛n sáģŸ háģ¯u cÃĄc máģĨc này náģ¯a.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 máģĨc sáēŊ đưáģŖc chuyáģƒn vÄŠnh viáģ…n đáēŋn $ORG$. BáēĄn sáēŊ không cÃ˛n sáģŸ háģ¯u máģĨc này náģ¯a.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ máģĨc sáēŊ đưáģŖc chuyáģƒn vÄŠnh viáģ…n đáēŋn $ORG$. BáēĄn sáēŊ không cÃ˛n sáģŸ háģ¯u cÃĄc máģĨc này náģ¯a.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "ÄÃŖ gÃĄn vào báģ™ sưu táē­p thành công" + }, + "nothingSelected": { + "message": "BáēĄn chưa cháģn gÃŦ." + }, + "movedItemsToOrg": { + "message": "ÄÃŖ chuyáģƒn cÃĄc máģĨc đưáģŖc cháģn đáēŋn $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "CÃĄc máģĨc Ä‘ÃŖ đưáģŖc chuyáģƒn táģ›i $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "MáģĨc Ä‘ÃŖ đưáģŖc chuyáģƒn táģ›i $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ Ä‘ÃŖ di chuyáģƒn xuáģ‘ng váģ‹ trí $INDEX$ / $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Váģ‹ trí máģĨc" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 04c9d9484c6..ad92ca8bbae 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -3,21 +3,39 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - å…č´šå¯†į įŽĄį†å™¨", + "message": "Bitwarden å¯†į įŽĄį†å™¨", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "åŽ‰å…¨ä¸”å…č´šįš„čˇ¨åšŗå°å¯†į įŽĄį†å™¨ã€‚", - "description": "Extension description" + "message": "无čŽē是在åŽļ里、åˇĨäŊœä¸­čŋ˜æ˜¯åœ¨å¤–å‡ēæ—ļīŧŒBitwarden éƒŊ可äģĨčŊģæžåœ°äŋæŠ¤æ‚¨įš„æ‰€æœ‰å¯†į ã€é€ščĄŒå¯†é’Ĩ和敏感äŋĄæ¯ã€‚", + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "į™ģåŊ•æˆ–č€…åˆ›åģē一ä¸Ēč´ĻæˆˇæĨčŽŋé—Žæ‚¨įš„åŽ‰å…¨å¯†į åē“。" + "message": "į™ģåŊ•或创åģē一ä¸Ē新č´ĻæˆˇäģĨčŽŋé—Žæ‚¨įš„åŽ‰å…¨å¯†į åē“。" + }, + "inviteAccepted": { + "message": "邀蝎厞æŽĨ受" }, "createAccount": { "message": "创åģēč´Ļæˆˇ" }, - "login": { - "message": "į™ģåŊ•" + "newToBitwarden": { + "message": "Bitwarden 新手吗īŧŸ" + }, + "logInWithPasskey": { + "message": "äŊŋį”¨é€ščĄŒå¯†é’Ĩį™ģåŊ•" + }, + "useSingleSignOn": { + "message": "äŊŋį”¨å•į‚šį™ģåŊ•" + }, + "welcomeBack": { + "message": "æŦĸčŋŽå›žæĨ" + }, + "setAStrongPassword": { + "message": "莞įŊŽåŧē坆᠁" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "莞įŊŽå¯†į äģĨ厌成č´Ļæˆˇįš„åˆ›åģē" }, "enterpriseSingleSignOn": { "message": "äŧä¸šå•į‚šį™ģåŊ•" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ä¸ģå¯†į æį¤ē可äģĨ在您åŋ˜čް坆᠁æ—ļ帎您回åŋ†čĩˇæĨ。" }, + "masterPassHintText": { + "message": "åĻ‚æžœæ‚¨åŋ˜čްäē†å¯†į īŧŒå¯äģĨå‘é€å¯†į æį¤ēåˆ°æ‚¨įš„į”ĩå­é‚ŽįŽąã€‚$CURRENT$ / 最多 $MAXIMUM$ ä¸Ē字įŦĻ。", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "再æŦĄčž“å…Ĩä¸ģ坆᠁" }, "masterPassHint": { "message": "ä¸ģå¯†į æį¤ēīŧˆå¯é€‰īŧ‰" }, + "joinOrganization": { + "message": "加å…Ĩįģ„įģ‡" + }, + "joinOrganizationName": { + "message": "加å…Ĩ $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "通čŋ‡čŽžįŊŽä¸ģå¯†į åŽŒæˆåŠ å…Ĩæ­¤įģ„įģ‡ã€‚" + }, "tab": { "message": "æ ‡į­žéĄĩ" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "复åˆļ坆᠁" }, + "copyPassphrase": { + "message": "复åˆļå¯†į įŸ­č¯­" + }, "copyNote": { "message": "复åˆļå¤‡æŗ¨" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "复åˆļåŽ‰å…¨į " }, + "copyName": { + "message": "复åˆļåį§°" + }, + "copyCompany": { + "message": "复åˆļå…Ŧ司äŋĄæ¯" + }, + "copySSN": { + "message": "复åˆļį¤žäŧšäŋéšœåˇį " + }, + "copyPassportNumber": { + "message": "复åˆļæŠ¤į…§åˇį " + }, + "copyLicenseNumber": { + "message": "复åˆļčŽ¸å¯č¯åˇį " + }, + "copyPrivateKey": { + "message": "复åˆļᧁé’Ĩ" + }, + "copyPublicKey": { + "message": "复åˆļå…Ŧé’Ĩ" + }, + "copyFingerprint": { + "message": "复åˆļ指įēš" + }, + "copyCustomField": { + "message": "复åˆļ $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "复åˆļįŊ‘įĢ™" + }, + "copyNotes": { + "message": "复åˆļå¤‡æŗ¨" + }, + "fill": { + "message": "åĄĢ充", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "č‡Ē动åĄĢ充" }, + "autoFillLogin": { + "message": "č‡Ē动åĄĢ充į™ģåŊ•" + }, + "autoFillCard": { + "message": "č‡Ē动åĄĢ充支äģ˜åĄ" + }, + "autoFillIdentity": { + "message": "č‡Ē动åĄĢ充čēĢäģŊ" + }, "generatePasswordCopied": { "message": "į”Ÿæˆå¯†į īŧˆåšļ复åˆļīŧ‰" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "æ— åŒšé…įš„į™ģåŊ•éĄšį›Ž" }, + "noCards": { + "message": "无支äģ˜åĄ" + }, + "noIdentities": { + "message": "无čēĢäģŊ" + }, + "addLoginMenu": { + "message": "æˇģ加į™ģåŊ•éĄšį›Ž" + }, + "addCardMenu": { + "message": "æˇģ加支äģ˜åĄ" + }, + "addIdentityMenu": { + "message": "æˇģ加čēĢäģŊ" + }, "unlockVaultMenu": { "message": "č§Ŗé”æ‚¨įš„å¯†į åē“" }, @@ -115,6 +231,18 @@ "addItem": { "message": "æˇģåŠ éĄšį›Ž" }, + "accountEmail": { + "message": "č´Ļæˆˇé‚Žäģļ地址" + }, + "requestHint": { + "message": "č¯ˇæą‚æį¤ē" + }, + "requestPasswordHint": { + "message": "č¯ˇæą‚å¯†į æį¤ē" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "输å…Ĩæ‚¨įš„č´Ļæˆˇį”ĩ子邎äģļ地址īŧŒæ‚¨įš„å¯†į æį¤ē将发送į왿‚¨" + }, "passwordHint": { "message": "å¯†į æį¤ē" }, @@ -142,18 +270,36 @@ "confirmIdentity": { "message": "įĄŽčŽ¤æ‚¨įš„čēĢäģŊäģĨįģ§įģ­ã€‚" }, - "account": { - "message": "č´Ļæˆˇ" - }, "changeMasterPassword": { "message": "更攚ä¸ģ坆᠁" }, + "continueToWebApp": { + "message": "前垀įŊ‘éĄĩ App 吗īŧŸ" + }, + "continueToWebAppDesc": { + "message": "在įŊ‘éĄĩåē”į”¨ä¸ŠæŽĸį´ĸ Bitwarden č´Ļæˆˇįš„æ›´å¤šåŠŸčƒŊ。" + }, + "continueToHelpCenter": { + "message": "前垀帎劊中åŋƒå—īŧŸ" + }, + "continueToHelpCenterDesc": { + "message": "čŽŋ闎帎劊中åŋƒäē†č§Ŗæ›´å¤šåĻ‚äŊ•äŊŋᔍ Bitwarden įš„äŋĄæ¯ã€‚" + }, + "continueToBrowserExtensionStore": { + "message": "前垀æĩč§ˆå™¨æ‰Šåą•商åē—吗īŧŸ" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "帎劊åˆĢäēēäē†č§Ŗ Bitwarden 是åĻ适合äģ–äģŦ。įĢ‹åŗčŽŋ问æĩč§ˆå™¨įš„æ‰Šåą•ፋåēå•†åē—åšļį•™ä¸‹č¯„åˆ†ã€‚" + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "您可äģĨ在 Bitwarden įŊ‘éĄĩåē”į”¨ä¸Šæ›´æ”šæ‚¨įš„ä¸ģå¯†į ã€‚" + }, "fingerprintPhrase": { "message": "指įēšįŸ­č¯­", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "æ‚¨įš„č´Ļæˆˇįš„æŒ‡įēšįŸ­č¯­", + "message": "æ‚¨įš„č´ĻæˆˇæŒ‡įēšįŸ­č¯­", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { @@ -162,9 +308,45 @@ "logOut": { "message": "æŗ¨é”€" }, + "aboutBitwarden": { + "message": "å…ŗäēŽ Bitwarden" + }, "about": { "message": "å…ŗäēŽ" }, + "moreFromBitwarden": { + "message": "更多æĨč‡Ē Bitwarden įš„äē§å“" + }, + "continueToBitwardenDotCom": { + "message": "前垀 bitwarden.com 吗īŧŸ" + }, + "bitwardenForBusiness": { + "message": "Bitwarden å•†ä¸šį‰ˆ" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden éĒŒč¯å™¨" + }, + "continueToAuthenticatorPageDesc": { + "message": "您可äģĨäŊŋᔍ Bitwarden éĒŒč¯å™¨å­˜å‚¨éĒŒč¯å™¨å¯†é’ĨīŧŒåšļä¸ē两æ­Ĩénj蝁æĩį¨‹į”Ÿæˆ TOTP äģŖį ã€‚čŽŋ问 bitwarden.com įŊ‘įĢ™äē†č§Ŗæ›´å¤šäŋĄæ¯ã€‚" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden æœēå¯†įŽĄį†å™¨" + }, + "continueToSecretsManagerPageDesc": { + "message": "äŊŋᔍ Bitwarden æœēå¯†įŽĄį†å™¨åŽ‰å…¨åœ°å­˜å‚¨ã€įŽĄį†äģĨåŠå…ąäēĢåŧ€å‘äēēå‘˜įš„æœē密。čŽŋ问 bitwarden.com įŊ‘įĢ™äē†č§Ŗæ›´å¤šäŋĄæ¯ã€‚" + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "äŊŋᔍ Passwordless.dev æ‘†č„ąäŧ įģŸå¯†į æŸįŧšīŧŒæ‰“造æĩį•…ä¸”åŽ‰å…¨įš„į™ģåŊ•äŊ“éĒŒã€‚čŽŋ问 bitwarden.com įŊ‘įĢ™äē†č§Ŗæ›´å¤šäŋĄæ¯ã€‚" + }, + "freeBitwardenFamilies": { + "message": "å…č´š Bitwarden åŽļåē­" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "您有čĩ„æ ŧčŽˇåž—å…č´šįš„ Bitwarden åŽļåē­ã€‚įĢ‹åŗåœ¨įŊ‘éĄĩåē”ᔍ䏭兑æĸæ­¤äŧ˜æƒ ã€‚" + }, "version": { "message": "į‰ˆæœŦ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "įŧ–čž‘æ–‡äģļ多" }, + "newFolder": { + "message": "新åĸžæ–‡äģļ多" + }, + "folderName": { + "message": "文äģļå¤šåį§°" + }, + "folderHintText": { + "message": "通čŋ‡åœ¨įˆļ文äģļ多名后éĸ跟随一ä¸Ē「/」æĨåĩŒåĨ—æ–‡äģļ多。䞋åĻ‚īŧšSocial/Forums" + }, + "noFoldersAdded": { + "message": "æœĒæˇģ加文äģļ多" + }, + "createFoldersToOrganize": { + "message": "创åģēæ–‡äģļ多äģĨæ•´į†äŊ įš„坆᠁åē“éĄšį›Ž" + }, + "deleteFolderPermanently": { + "message": "æ‚¨įĄŽåŽščĻæ°¸äš…åˆ é™¤čŋ™ä¸Ē文äģļ多吗īŧŸ" + }, "deleteFolder": { "message": "删除文äģļ多" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "į”Ÿæˆå™¨", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "č‡ĒåŠ¨į”ŸæˆåŽ‰å…¨å¯é å”¯ä¸€įš„į™ģåŊ•å¯†į ã€‚" }, - "bitWebVault": { - "message": "Bitwarden įŊ‘éĄĩį‰ˆå¯†į åē“" + "bitWebVaultApp": { + "message": "Bitwarden įŊ‘éĄĩ App" }, "importItems": { "message": "å¯ŧå…ĨéĄšį›Ž" @@ -235,6 +435,9 @@ "generatePassword": { "message": "į”Ÿæˆå¯†į " }, + "generatePassphrase": { + "message": "į”Ÿæˆå¯†į įŸ­č¯­" + }, "regeneratePassword": { "message": "é‡æ–°į”Ÿæˆå¯†į " }, @@ -244,17 +447,60 @@ "length": { "message": "é•ŋåēĻ" }, + "passwordMinLength": { + "message": "æœ€å°å¯†į é•ŋåēĻ" + }, "uppercase": { - "message": "大写 (A-Z)" + "message": "大写 (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "小写 (a-z)" + "message": "小写 (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "数字 (0-9)" + "message": "数字 (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "į‰šæŽŠå­—įŦĻ (!@#$%^&*)" + "message": "į‰šæŽŠå­—įŦĻ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "包åĢ", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "包åĢ大写字įŦĻ", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "包åĢ小写字įŦĻ", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "包åĢ数字", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "包åĢį‰šæŽŠå­—įŦĻ", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "å•č¯ä¸Ē数" @@ -276,7 +522,16 @@ "message": "įŦĻåˇæœ€å°‘ä¸Ē数" }, "avoidAmbChar": { - "message": "éŋå…æ˜“æˇˇæˇ†įš„å­—įŦĻ" + "message": "éŋå…æ˜“æˇˇæˇ†įš„å­—įŦĻ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "éŋå…æ˜“æˇˇæˇ†įš„å­—įŦĻ", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "äŧä¸šį­–į•ĨčĻæą‚åˇ˛åē”į”¨åˆ°æ‚¨įš„į”Ÿæˆå™¨é€‰éĄšä¸­ã€‚", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "搜į´ĸ坆᠁åē“" @@ -299,15 +554,30 @@ "password": { "message": "坆᠁" }, + "totp": { + "message": "éĒŒč¯å™¨æœē密" + }, "passphrase": { "message": "å¯†į įŸ­č¯­" }, "favorite": { "message": "æ”ļ藏" }, + "unfavorite": { + "message": "取æļˆæ”ļ藏" + }, + "itemAddedToFavorites": { + "message": "éĄšį›Žåˇ˛æˇģ加到æ”ļč—å¤š" + }, + "itemRemovedFromFavorites": { + "message": "éĄšį›Žåˇ˛į§ģå‡ēæ”ļč—å¤š" + }, "notes": { "message": "å¤‡æŗ¨" }, + "privateNote": { + "message": "į§å¯†å¤‡æŗ¨" + }, "note": { "message": "å¤‡æŗ¨" }, @@ -326,6 +596,18 @@ "launch": { "message": "前垀" }, + "launchWebsite": { + "message": "启动įŊ‘įĢ™" + }, + "launchWebsiteName": { + "message": "前垀 $ITEMNAME$ įš„įŊ‘įĢ™", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "įŊ‘įĢ™" }, @@ -338,9 +620,24 @@ "other": { "message": "å…ļäģ–" }, + "unlockMethods": { + "message": "č§Ŗé”é€‰éĄš" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "莞įŊŽä¸€ä¸Ēč§Ŗé”æ–šåŧäģĨæ›´æ”šæ‚¨įš„å¯†į åē“čļ…æ—ļ动äŊœã€‚" }, + "unlockMethodNeeded": { + "message": "åœ¨čŽžįŊŽä¸­čŽžįŊŽä¸€ä¸Ēč§Ŗé”æ–šåŧ" + }, + "sessionTimeoutHeader": { + "message": "äŧšč¯čļ…æ—ļ" + }, + "vaultTimeoutHeader": { + "message": "坆᠁åē“čļ…æ—ļæ—ļ间" + }, + "otherOptions": { + "message": "å…ļäģ–选饚" + }, "rateExtension": { "message": "ä¸ēæœŦæ‰Šåą•æ‰“åˆ†" }, @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "æ‚¨įš„å¯†į åē“åˇ˛é”åŽšã€‚č¯ˇå…ˆéĒŒč¯æ‚¨įš„čēĢäģŊ。" }, + "yourVaultIsLockedV2": { + "message": "æ‚¨įš„å¯†į åē“厞锁åޚ" + }, + "yourAccountIsLocked": { + "message": "æ‚¨įš„č´Ļæˆˇåˇ˛é”åŽš" + }, + "or": { + "message": "或" + }, "unlock": { "message": "觪锁" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "坆᠁åē“čļ…æ—ļæ—ļ间" }, + "vaultTimeout1": { + "message": "čļ…æ—ļ" + }, "lockNow": { "message": "įĢ‹åŗé”åŽš" }, + "lockAll": { + "message": "全部锁厚" + }, "immediately": { "message": "įĢ‹åŗ" }, @@ -426,6 +738,18 @@ "security": { "message": "厉全" }, + "confirmMasterPassword": { + "message": "įĄŽčŽ¤ä¸ģ坆᠁" + }, + "masterPassword": { + "message": "ä¸ģ坆᠁" + }, + "masterPassImportant": { + "message": "ä¸ģ坆᠁åŋ˜čŽ°åŽīŧŒå°†æ— æŗ•æĸ复īŧ" + }, + "masterPassHintLabel": { + "message": "ä¸ģå¯†į æį¤ē" + }, "errorOccurred": { "message": "å‘į”Ÿäē†ä¸€ä¸Ē错蝝" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "æ‚¨įš„æ–°č´Ļæˆˇåˇ˛åˆ›åģēīŧæ‚¨įŽ°åœ¨å¯äģĨį™ģåŊ•äē†ã€‚" }, + "newAccountCreated2": { + "message": "æ‚¨įš„æ–°č´Ļæˆˇåˇ˛æˆåŠŸåˆ›åģēīŧ" + }, + "youHaveBeenLoggedIn": { + "message": "æ‚¨åˇ˛į™ģåŊ•īŧ" + }, + "youSuccessfullyLoggedIn": { + "message": "æ‚¨åˇ˛æˆåŠŸį™ģåŊ•" + }, + "youMayCloseThisWindow": { + "message": "您可äģĨå…ŗé—­æ­¤įĒ—åŖ" + }, "masterPassSent": { "message": "我äģŦ厞įģä¸ē您发送äē†åŒ…åĢä¸ģå¯†į æį¤ēįš„é‚Žäģļ。" }, "verificationCodeRequired": { "message": "åŋ…éĄģåĄĢ写éĒŒč¯į ã€‚" }, + "webauthnCancelOrTimeout": { + "message": "čēĢäģŊénj蝁čĸĢ取æļˆæˆ–耗æ—ļčŋ‡é•ŋã€‚č¯ˇé‡č¯•ã€‚" + }, "invalidVerificationCode": { "message": "æ— æ•ˆįš„énj蝁᠁" }, @@ -477,16 +816,61 @@ } }, "autofillError": { - "message": "æ— æŗ•åœ¨æ­¤éĄĩéĸ上č‡Ē动åĄĢå……æ‰€é€‰éĄšį›Žã€‚č¯ˇæ”šä¸ē手åˇĨ复åˆļåšļį˛˜č´´ã€‚" + "message": "æ— æŗ•åœ¨æ­¤éĄĩéĸ上č‡Ē动åĄĢå……æ‰€é€‰éĄšį›Žã€‚č¯ˇæ”šä¸ē手动复åˆļåšļį˛˜č´´ã€‚" + }, + "totpCaptureError": { + "message": "æ— æŗ•äģŽåŊ“前įŊ‘éĄĩæ‰Ģ描äēŒįģ´į " + }, + "totpCaptureSuccess": { + "message": "厞æˇģ加éĒŒč¯å™¨å¯†é’Ĩ" + }, + "totpCapture": { + "message": "äģŽåŊ“前įŊ‘éĄĩæ‰Ģ描éĒŒč¯å™¨äēŒįģ´į " + }, + "totpHelperTitle": { + "message": "无įŧä¸¤æ­Ĩénj蝁" + }, + "totpHelper": { + "message": "Bitwarden 可äģĨ存储åšļåĄĢ充两æ­ĨéĒŒč¯į ã€‚å¤åˆļåšļį˛˜č´´å¯†é’Ĩ到此字æŽĩ。" + }, + "totpHelperWithCapture": { + "message": "Bitwarden 可äģĨ存储åšļåĄĢ充两æ­ĨéĒŒč¯į ã€‚é€‰æ‹Šį›¸æœē回标æĨæˆĒ取此įŊ‘įĢ™įš„éĒŒč¯å™¨äēŒįģ´į īŧŒæˆ–č€…æ‰‹åŠ¨å¤åˆļåšļį˛˜č´´å¯†é’Ĩ到此字æŽĩ。" + }, + "learnMoreAboutAuthenticators": { + "message": "äē†č§Ŗæ›´å¤šå…ŗäēŽéĒŒč¯å™¨įš„äŋĄæ¯" + }, + "copyTOTP": { + "message": "复åˆļéĒŒč¯å™¨å¯†é’Ĩ (TOTP)" }, "loggedOut": { "message": "åˇ˛æŗ¨é”€" }, + "loggedOutDesc": { + "message": "æ‚¨åˇ˛æŗ¨é”€æ‚¨įš„č´Ļæˆˇã€‚" + }, "loginExpired": { "message": "æ‚¨įš„į™ģåŊ•äŧšč¯åˇ˛čŋ‡æœŸã€‚" }, + "logIn": { + "message": "į™ģåŊ•" + }, + "logInToBitwarden": { + "message": "į™ģåŊ•到 Bitwarden" + }, + "restartRegistration": { + "message": "重新åŧ€å§‹æŗ¨å†Œ" + }, + "expiredLink": { + "message": "å¤ąæ•ˆé“žæŽĨ" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "č¯ˇé‡æ–°æŗ¨å†Œæˆ–å°č¯•į™ģåŊ•。" + }, + "youMayAlreadyHaveAnAccount": { + "message": "您可čƒŊ厞įģæœ‰ä¸€ä¸Ēč´Ļæˆˇäē†" + }, "logOutConfirmation": { - "message": "æ‚¨įĄŽåŽščĻæŗ¨é”€å—īŧŸ" + "message": "įĄŽåŽščĻæŗ¨é”€å—īŧŸ" }, "yes": { "message": "是" @@ -503,20 +887,20 @@ "addedFolder": { "message": "文äģļå¤šåˇ˛æˇģ加" }, - "changeMasterPass": { - "message": "äŋŽæ”šä¸ģ坆᠁" - }, - "changeMasterPasswordConfirmation": { - "message": "您可äģĨ在 bitwarden.com įŊ‘éĄĩį‰ˆå¯†į åē“äŋŽæ”šä¸ģå¯†į ã€‚æ‚¨įŽ°åœ¨čρčŽŋ问čŋ™ä¸ĒįŊ‘į̙吗īŧŸ" - }, "twoStepLoginConfirmation": { - "message": "两æ­Ĩį™ģåŊ•čĻæą‚æ‚¨äģŽå…ļäģ–čŽžå¤‡īŧˆäž‹åĻ‚åŽ‰å…¨é’Ĩ匙、éĒŒč¯å™¨åē”į”¨ã€įŸ­äŋĄã€į”ĩč¯æˆ–č€…į”ĩ子邎äģļīŧ‰æĨéĒŒč¯æ‚¨įš„į™ģåŊ•īŧŒčŋ™čƒŊäŊŋæ‚¨įš„č´Ļæˆˇæ›´åŠ åŽ‰å…¨ã€‚ä¸¤æ­Ĩį™ģåŊ•需čρ圍 bitwarden.com įŊ‘éĄĩį‰ˆå¯†į åē“中莞įŊŽã€‚įŽ°åœ¨čŽŋé—Žæ­¤įŊ‘į̙吗īŧŸ" + "message": "两æ­Ĩį™ģåŊ•čĻæą‚æ‚¨äģŽå…ļäģ–čŽžå¤‡īŧˆäž‹åĻ‚åŽ‰å…¨é’Ĩ匙、éĒŒč¯å™¨ Appã€įŸ­äŋĄã€į”ĩč¯æˆ–č€…į”ĩ子邎äģļīŧ‰æĨéĒŒč¯æ‚¨įš„į™ģåŊ•īŧŒčŋ™čƒŊäŊŋæ‚¨įš„č´Ļæˆˇæ›´åŠ åŽ‰å…¨ã€‚ä¸¤æ­Ĩį™ģåŊ•需čρ圍 bitwarden.com įŊ‘éĄĩį‰ˆå¯†į åē“中莞įŊŽã€‚įŽ°åœ¨čŽŋé—Žæ­¤įŊ‘į̙吗īŧŸ" + }, + "twoStepLoginConfirmationContent": { + "message": "通čŋ‡åœ¨ Bitwarden įŊ‘éĄĩ App 中莞įŊŽä¸¤æ­Ĩį™ģåŊ•īŧŒå¯äģĨäŊŋæ‚¨įš„č´Ļæˆˇæ›´åŠ åŽ‰å…¨ã€‚" + }, + "twoStepLoginConfirmationTitle": { + "message": "前垀įŊ‘éĄĩ App 吗īŧŸ" }, "editedFolder": { "message": "文äģļå¤šåˇ˛äŋå­˜" }, "deleteFolderConfirmation": { - "message": "æ‚¨įĄŽåŽščĻåˆ é™¤æ­¤æ–‡äģļ多吗īŧŸ" + "message": "įĄŽåŽščĻåˆ é™¤æ­¤æ–‡äģļ多吗īŧŸ" }, "deletedFolder": { "message": "文äģļå¤šåˇ˛åˆ é™¤" @@ -552,6 +936,10 @@ "newUri": { "message": "新åĸž URI" }, + "addDomain": { + "message": "æˇģ加域名", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "éĄšį›Žåˇ˛æˇģ加" }, @@ -568,13 +956,13 @@ "message": "čφᛖ坆᠁" }, "overwritePasswordConfirmation": { - "message": "æ‚¨įĄŽåŽščρčφᛖåŊ“å‰å¯†į å—īŧŸ" + "message": "įĄŽåŽščρčφᛖåŊ“å‰å¯†į å—īŧŸ" }, "overwriteUsername": { "message": "čĻ†į›–į”¨æˆˇå" }, "overwriteUsernameConfirmation": { - "message": "æ‚¨įĄŽåŽščρčφᛖåŊ“å‰į”¨æˆˇåå—īŧŸ" + "message": "įĄŽåŽščρčφᛖåŊ“å‰į”¨æˆˇåå—īŧŸ" }, "searchFolder": { "message": "搜į´ĸ文äģļ多" @@ -592,15 +980,27 @@ "enableAddLoginNotification": { "message": "č¯ĸ问æˇģ加į™ģåŊ•" }, + "vaultSaveOptionsTitle": { + "message": "äŋå­˜åˆ°å¯†į åē“选饚" + }, "addLoginNotificationDesc": { "message": "åœ¨å¯†į åē“ä¸­æ‰žä¸åˆ°åŒšé…éĄšį›Žæ—ļč¯ĸ问æˇģ加一ä¸Ē。" }, + "addLoginNotificationDescAlt": { + "message": "åĻ‚æžœåœ¨å¯†į åē“ä¸­æ‰žä¸åˆ°éĄšį›ŽīŧŒč¯ĸ问æˇģ加一ä¸Ēã€‚é€‚į”¨äēŽæ‰€æœ‰åˇ˛į™ģåŊ•įš„č´Ļæˆˇã€‚" + }, + "showCardsInVaultView": { + "message": "åœ¨å¯†į åē“č§†å›žä¸­å°†æ”¯äģ˜åĄæ˜žį¤ēä¸ēč‡Ē动åĄĢ充åģē莎" + }, "showCardsCurrentTab": { "message": "åœ¨æ ‡į­žéĄĩ上昞į¤ē支äģ˜åĄ" }, "showCardsCurrentTabDesc": { "message": "åœ¨æ ‡į­žéĄĩ上列å‡ē支äģ˜åĄéĄšį›ŽīŧŒäģĨäžŋäēŽč‡Ē动åĄĢ充。" }, + "showIdentitiesInVaultView": { + "message": "åœ¨å¯†į åē“č§†å›žä¸­å°†čēĢäģŊ昞į¤ēä¸ēč‡Ē动åĄĢ充åģē莎" + }, "showIdentitiesCurrentTab": { "message": "åœ¨æ ‡į­žéĄĩ上昞į¤ēčēĢäģŊ" }, @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "在įŊ‘įĢ™ä¸ŠæŖ€æĩ‹åˆ°æ›´æ”šæ—ļč¯ĸé—Žæ›´æ–°į™ģåŊ•å¯†į ã€‚" }, + "changedPasswordNotificationDescAlt": { + "message": "åŊ“在įŊ‘įĢ™ä¸ŠæŖ€æĩ‹åˆ°æ›´æ”šæ—ļīŧŒč¯ĸé—Žæ›´æ–°į™ģåŊ•éĄšį›Žįš„å¯†į ã€‚é€‚į”¨äēŽæ‰€æœ‰åˇ˛į™ģåŊ•įš„č´Ļæˆˇã€‚" + }, + "enableUsePasskeys": { + "message": "č¯ĸ问äŋå­˜å’ŒäŊŋį”¨é€ščĄŒå¯†é’Ĩ" + }, + "usePasskeysDesc": { + "message": "č¯ĸ问äŋå­˜æ–°įš„é€ščĄŒå¯†é’Ĩ或äŊŋį”¨å­˜å‚¨åœ¨å¯†į åē“ä¸­įš„é€ščĄŒå¯†é’Ĩį™ģåŊ•ã€‚é€‚į”¨äēŽæ‰€æœ‰åˇ˛į™ģåŊ•įš„č´Ļæˆˇã€‚" + }, "notificationChangeDesc": { "message": "是åĻčρ圍 Bitwarden ä¸­æ›´æ–°æ­¤å¯†į īŧŸ" }, @@ -639,15 +1048,21 @@ "notificationUnlock": { "message": "č§Ŗé”â€‹â€‹â€‹â€‹" }, + "additionalOptions": { + "message": "é™„åŠ é€‰éĄš" + }, "enableContextMenuItem": { "message": "昞į¤ēä¸Šä¸‹æ–‡čœå•é€‰éĄš" }, "contextMenuItemDesc": { - "message": "äŊŋį”¨čž…åŠŠį‚šå‡ģæĨčŽŋé—Žå¯†į į”Ÿæˆå’ŒåŒšé…įš„įŊ‘įĢ™į™ģåŊ•éĄšį›Žã€‚ " + "message": "äŊŋį”¨čž…åŠŠį‚šå‡ģæĨčŽŋé—Žå¯†į į”Ÿæˆå’ŒåŒšé…įš„įŊ‘įĢ™į™ģåŊ•éĄšį›Žã€‚" + }, + "contextMenuItemDescAlt": { + "message": "äŊŋį”¨čž…åŠŠį‚šå‡ģæĨčŽŋé—Žå¯†į į”Ÿæˆå’ŒåŒšé…įš„įŊ‘įĢ™į™ģåŊ•éĄšį›Žã€‚é€‚į”¨äēŽæ‰€æœ‰åˇ˛į™ģåŊ•įš„č´Ļæˆˇã€‚" }, "defaultUriMatchDetection": { "message": "éģ˜čޤ URI åŒšé…æŖ€æĩ‹", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { "message": "é€‰æ‹Šåœ¨æ‰§čĄŒč¯¸åĻ‚č‡Ē动åĄĢå……äš‹įąģįš„æ“äŊœæ—ļ寚į™ģåŊ•čŋ›čĄŒ URI åŒšé…æŖ€æĩ‹įš„éģ˜čŽ¤æ–šåŧã€‚" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "更攚æœŦåē”ᔍፋåēįš„éĸœč‰˛ä¸ģéĸ˜ã€‚" }, + "themeDescAlt": { + "message": "更攚åē”ᔍፋåēįš„éĸœč‰˛ä¸ģéĸ˜ã€‚适ᔍäēŽæ‰€æœ‰åˇ˛į™ģåŊ•įš„č´Ļæˆˇã€‚" + }, "dark": { "message": "æˇąč‰˛", "description": "Dark color" @@ -670,12 +1088,39 @@ "message": "čŋ‡æ›æš—", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "å¯ŧå‡ēč‡Ē" + }, "exportVault": { "message": "å¯ŧå‡ē坆᠁åē“" }, "fileFormat": { "message": "文äģļæ ŧåŧ" }, + "fileEncryptedExportWarningDesc": { + "message": "此文äģļå¯ŧå‡ēå°†å—å¯†į äŋæŠ¤īŧŒéœ€čĻæ–‡äģļå¯†į æ‰čƒŊč§Ŗå¯†ã€‚" + }, + "filePassword": { + "message": "文äģļ坆᠁" + }, + "exportPasswordDescription": { + "message": "æ­¤å¯†į å°†į”¨äēŽå¯ŧå‡ē和å¯ŧå…Ĩ此文äģļ" + }, + "accountRestrictedOptionDescription": { + "message": "äŊŋį”¨čĄį”Ÿč‡Ē您č´Ļæˆˇįš„į”¨æˆˇåå’Œä¸ģå¯†į įš„č´ĻæˆˇåŠ å¯†å¯†é’ĨīŧŒäģĨ加密此å¯ŧå‡ēåšļ限åˆļåĒčƒŊå¯ŧå…Ĩ到åŊ“å‰įš„ Bitwarden č´Ļæˆˇã€‚" + }, + "passwordProtectedOptionDescription": { + "message": "莞įŊŽä¸€ä¸Ē文äģļ坆᠁ᔍæĨ加密此å¯ŧå‡ēīŧŒåšļäŊŋį”¨æ­¤å¯†į č§Ŗå¯†äģĨå¯ŧå…Ĩ到äģģæ„ Bitwarden č´Ļæˆˇã€‚" + }, + "exportTypeHeading": { + "message": "å¯ŧå‡ēįąģ型" + }, + "accountRestricted": { + "message": "č´Ļæˆˇå—é™" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "「文äģļå¯†į ã€ä¸Žã€ŒįĄŽčŽ¤æ–‡äģļå¯†į ã€ä¸ä¸€č‡´ã€‚" + }, "warning": { "message": "č­Ļ告", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -693,16 +1138,13 @@ "message": "每ä¸Ē Bitwarden į”¨æˆˇč´Ļæˆˇįš„č´ĻæˆˇåŠ å¯†å¯†é’ĨéƒŊæ˜¯å”¯ä¸€įš„īŧŒå› æ­¤æ‚¨æ— æŗ•å°†åŠ å¯†įš„å¯ŧå‡ēå¯ŧå…Ĩ到åĻ一ä¸Ēč´Ļæˆˇã€‚" }, "exportMasterPassword": { - "message": "输å…Ĩä¸ģ坆᠁æĨå¯ŧå‡ēäŊ įš„坆᠁åē“。" + "message": "输å…Ĩæ‚¨įš„ä¸ģ坆᠁äģĨå¯ŧå‡ēäŊ įš„坆᠁å瓿•°æŽã€‚" }, "shared": { "message": "åˇ˛å…ąäēĢ" }, - "learnOrg": { - "message": "äē†č§Ŗįģ„įģ‡" - }, - "learnOrgConfirmation": { - "message": "Bitwarden å…čŽ¸æ‚¨äŊŋᔍįģ„įģ‡ä¸Žäģ–äēēå…ąäēĢæ‚¨įš„坆᠁åē“éĄšį›Žã€‚čρčŽŋ问 bitwarden.com įŊ‘įĢ™äģĨäē†č§Ŗæ›´å¤šå†…厚吗īŧŸ" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden å•†ä¸šį‰ˆå…čŽ¸æ‚¨äŊŋᔍįģ„įģ‡ä¸Žäģ–äēēå…ąäēĢæ‚¨įš„坆᠁åē“éĄšį›Žã€‚čŽŋ问 bitwarden.com įŊ‘įĢ™äē†č§Ŗæ›´å¤šäŋĄæ¯ã€‚" }, "moveToOrganization": { "message": "į§ģ动到įģ„įģ‡" @@ -745,7 +1187,7 @@ "message": "删除附äģļ" }, "deleteAttachmentConfirmation": { - "message": "æ‚¨įĄŽåŽščĻåˆ é™¤æ­¤é™„äģļ吗īŧŸ" + "message": "įĄŽåŽščĻåˆ é™¤æ­¤é™„äģļ吗īŧŸ" }, "deletedAttachment": { "message": "附äģļåˇ˛åˆ é™¤" @@ -762,6 +1204,9 @@ "file": { "message": "文äģļ" }, + "fileToShare": { + "message": "čĻåˆ†äēĢįš„æ–‡äģļ" + }, "selectFile": { "message": "选拊一ä¸Ē文äģļ" }, @@ -795,6 +1240,9 @@ "ppremiumSignUpStorage": { "message": "1 GB 文äģļ附äģļ加密存储。" }, + "premiumSignUpEmergency": { + "message": "į´§æ€ĨčŽŋ闎。" + }, "premiumSignUpTwoStepOptions": { "message": "ä¸“æœ‰įš„ä¸¤æ­Ĩį™ģåŊ•选饚īŧŒåĻ‚ YubiKey 和 Duo。" }, @@ -808,7 +1256,7 @@ "message": "äŧ˜å…ˆåŽĸæˆˇæ”¯æŒã€‚" }, "ppremiumSignUpFuture": { - "message": "æœĒæĨäŧšåĸžåŠ æ›´å¤šé̘įē§åŠŸčƒŊ。æ•Ŧč¯ˇæœŸåž…īŧ" + "message": "æœĒæĨįš„æ›´å¤šé̘įē§åŠŸčƒŊ。æ•Ŧč¯ˇæœŸåž…īŧ" }, "premiumPurchase": { "message": "č´­äš°é̘įē§į‰ˆ" @@ -816,14 +1264,29 @@ "premiumPurchaseAlert": { "message": "您可äģĨ在 bitwarden.com įŊ‘éĄĩį‰ˆå¯†į åē“č´­äš°é̘įē§äŧšå‘˜ã€‚įŽ°åœ¨čρčŽŋ闎吗īŧŸ" }, + "premiumPurchaseAlertV2": { + "message": "您可äģĨ在 Bitwarden įŊ‘éĄĩ App įš„č´ĻæˆˇčŽžįŊŽä¸­č´­äš°é̘įē§į‰ˆã€‚" + }, "premiumCurrentMember": { "message": "æ‚¨į›Žå‰æ˜¯é̘įē§äŧšå‘˜īŧ" }, "premiumCurrentMemberThanks": { "message": "感č°ĸ您支持 Bitwarden。" }, + "premiumFeatures": { + "message": "升įē§åˆ°é̘įē§į‰ˆåšļæŽĨæ”ļīŧš" + }, "premiumPrice": { - "message": "每嚴åĒ需 $PRICE$ īŧ", + "message": "全部äģ…需 $PRICE$ /åš´īŧ", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, + "premiumPriceV2": { + "message": "全部äģ…需 $PRICE$ 每嚴īŧ", "placeholders": { "price": { "content": "$1", @@ -838,7 +1301,7 @@ "message": "č‡Ē动复åˆļ TOTP" }, "disableAutoTotpCopyDesc": { - "message": "åĻ‚æžœį™ģåŊ•包åĢéĒŒč¯å™¨å¯†é’ĨīŧŒåŊ“č‡Ē动åĄĢ充此į™ģåŊ•æ—ļīŧŒTOTP éĒŒč¯į å°†å¤åˆļ到å‰Ēč´´æŋ。" + "message": "åĻ‚æžœį™ģåŊ•包åĢéĒŒč¯å™¨å¯†é’ĨīŧŒåŊ“č‡Ē动åĄĢ充此į™ģåŊ•æ—ļīŧŒå°† TOTP éĒŒč¯į å¤åˆļ到å‰Ēč´´æŋ。" }, "enableAutoBiometricsPrompt": { "message": "启动æ—ļčĻæą‚į”Ÿį‰Šč¯†åˆĢ" @@ -850,7 +1313,7 @@ "message": "äŊŋį”¨æ­¤åŠŸčƒŊ需čρé̘įē§äŧšå‘˜čĩ„æ ŧ。" }, "enterVerificationCodeApp": { - "message": "č¯ˇčž“å…Ĩæ‚¨įš„éĒŒč¯å™¨åē”į”¨ä¸­įš„ 6 äŊéĒŒč¯į ã€‚" + "message": "č¯ˇčž“å…Ĩæ‚¨įš„éĒŒč¯å™¨ App ä¸­įš„ 6 äŊæ•°éĒŒč¯į ã€‚" }, "enterVerificationCodeEmail": { "message": "č¯ˇčž“å…Ĩ发送įģ™į”ĩ子邎äģļ $EMAIL$ įš„ 6 äŊæ•°éĒŒč¯į ã€‚", @@ -880,10 +1343,10 @@ "message": "äŊŋᔍå…ļäģ–两æ­Ĩį™ģåŊ•æ–šåŧ" }, "insertYubiKey": { - "message": "å°†æ‚¨įš„ YubiKey 插å…ĨčŽĄįŽ—æœēįš„ USB įĢ¯åŖīŧŒį„ļ后按下按钎。" + "message": "å°†æ‚¨įš„ YubiKey 插å…ĨčŽĄįŽ—æœēįš„ USB įĢ¯åŖīŧŒį„ļ后č§Ļ摸å…ļ按钎。" }, "insertU2f": { - "message": "å°†æ‚¨įš„åŽ‰å…¨é’Ĩ匙插å…ĨčŽĄįŽ—æœēįš„ USB įĢ¯åŖã€‚åĻ‚æžœåŽƒæœ‰æŒ‰é’ŽīŧŒč¯ˇæŒ‰ä¸‹åŽƒã€‚" + "message": "å°†æ‚¨įš„åŽ‰å…¨é’Ĩ匙插å…ĨčŽĄįŽ—æœēįš„ USB įĢ¯åŖã€‚åĻ‚æžœåŽƒæœ‰æŒ‰é’ŽīŧŒč¯ˇč§Ļ摸厃。" }, "webAuthnNewTab": { "message": "čρåŧ€å§‹ WebAuthn 2FA énj蝁īŧŒč¯ˇį‚šå‡ģ下éĸįš„æŒ‰é’Žæ‰“åŧ€ä¸€ä¸Ēæ–°æ ‡į­žéĄĩīŧŒåšļæŒ‰į…§æ–°æ ‡į­žéĄĩä¸­æäž›įš„č¯´æ˜Žæ“äŊœã€‚" @@ -901,7 +1364,7 @@ "message": "æ­¤č´Ļæˆˇåˇ˛čŽžįŊŽä¸¤æ­Ĩį™ģåŊ•īŧŒäŊ†æ­¤æĩč§ˆå™¨ä¸æ”¯æŒäģģäŊ•åˇ˛é…įŊŽįš„两æ­Ĩį™ģåŊ•æäž›į¨‹åēã€‚" }, "noTwoStepProviders2": { - "message": "蝎äŊŋį”¨æ”¯æŒįš„įŊ‘éĄĩæĩč§ˆå™¨īŧˆäž‹åĻ‚ Chromeīŧ‰īŧŒå’Œ/或æˇģ加å…ļäģ–å¯ščˇ¨æĩč§ˆå™¨æ”¯æŒæ›´åšŋæŗ›įš„æäž›į¨‹åēīŧˆäž‹åĻ‚éĒŒč¯å™¨åē”ᔍīŧ‰ã€‚" + "message": "蝎äŊŋį”¨æ”¯æŒįš„įŊ‘éĄĩæĩč§ˆå™¨īŧˆäž‹åĻ‚ Chromeīŧ‰å’Œ/或æˇģ加å…ļäģ–æ”¯æŒæ›´åšŋæŗ›įš„æäž›į¨‹åēīŧˆäž‹åĻ‚éĒŒč¯å™¨ Appīŧ‰ã€‚" }, "twoStepOptions": { "message": "两æ­Ĩį™ģåŊ•选饚" @@ -913,20 +1376,20 @@ "message": "æĸ复äģŖį " }, "authenticatorAppTitle": { - "message": "éĒŒč¯å™¨åē”ᔍ" + "message": "éĒŒč¯å™¨ App" }, - "authenticatorAppDesc": { - "message": "äŊŋᔍéĒŒč¯å™¨åē”ᔍīŧˆäž‹åĻ‚ Authy 或 Google Authenticatorīŧ‰æĨį”ŸæˆåŸēäēŽæ—ļé—´įš„éĒŒč¯į ã€‚", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "输å…ĨéĒŒč¯å™¨ Appīŧˆäž‹åĻ‚ Bitwarden éĒŒč¯å™¨īŧ‰į”Ÿæˆįš„äģŖį ã€‚", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP 厉全é’Ĩ匙" + "yubiKeyTitleV2": { + "message": "Yubico OTP 厉全é’Ĩ匙" }, "yubiKeyDesc": { "message": "äŊŋᔍ YubiKey æĨčŽŋé—Žæ‚¨įš„č´Ļæˆˇã€‚æ”¯æŒ YubiKey 4、4 Nano、4C äģĨ及 NEO čŽžå¤‡ã€‚" }, - "duoDesc": { - "message": "äŊŋᔍ Duo Security įš„ Duo į§ģ动åē”į”¨ã€įŸ­äŋĄã€į”ĩč¯æˆ– U2F 厉全é’Ĩ匙æĨčŋ›čĄŒéĒŒč¯ã€‚", + "duoDescV2": { + "message": "输å…Ĩį”ą Duo Security į”Ÿæˆįš„äģŖį ã€‚", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -942,8 +1405,8 @@ "emailTitle": { "message": "į”ĩ子邎äģļ" }, - "emailDesc": { - "message": "éĒŒč¯į å°†äŧšå‘é€åˆ°æ‚¨įš„į”ĩå­é‚ŽįŽąã€‚" + "emailDescV2": { + "message": "输å…Ĩå‘é€åˆ°æ‚¨įš„į”ĩå­é‚ŽįŽąįš„äģŖį ã€‚" }, "selfHostedEnvironment": { "message": "č‡Ēæ‰˜įŽĄįŽ¯åĸƒ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "指厚您æœŦåœ°æ‰˜įŽĄįš„ Bitwarden åŽ‰čŖ…įš„åŸēįĄ€ URL。" }, + "selfHostedBaseUrlHint": { + "message": "æŒ‡åŽšæ‚¨įš„æœŦåœ°æ‰˜įŽĄ Bitwarden åŽ‰čŖ…įš„åŸēįĄ€ URL。䞋åĻ‚īŧšhttps://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "寚äēŽé̘įē§é…įŊŽīŧŒæ‚¨å¯äģĨ单į‹Ŧ指厚每ä¸ĒæœåŠĄįš„åŸēįĄ€ URL。" + }, + "selfHostedEnvFormInvalid": { + "message": "您åŋ…éĄģæˇģ加åŸēįĄ€æœåŠĄå™¨ URL æˆ–č‡ŗå°‘æˇģ加一ä¸Ēč‡ĒåŽšäš‰įŽ¯åĸƒã€‚" + }, "customEnvironment": { "message": "č‡ĒåŽšäš‰įŽ¯åĸƒ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "æœåŠĄå™¨ URL" }, + "selfHostBaseUrl": { + "message": "č‡Ēæ‰˜įŽĄæœåŠĄå™¨ URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API æœåŠĄå™¨ URL" }, @@ -978,14 +1454,73 @@ "environmentSaved": { "message": "įŽ¯åĸƒ URL 厞äŋå­˜" }, + "showAutoFillMenuOnFormFields": { + "message": "åœ¨čĄ¨å•å­—æŽĩ上昞į¤ēč‡Ē动åĄĢå……čœå•", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "č‡Ē动åĄĢ充åģē莎" + }, + "showInlineMenuLabel": { + "message": "åœ¨čĄ¨å•å­—æŽĩ中昞į¤ēč‡Ē动åĄĢ充åģē莎" + }, + "showInlineMenuIdentitiesLabel": { + "message": "将čēĢäģŊ昞į¤ēä¸ēåģē莎" + }, + "showInlineMenuCardsLabel": { + "message": "将支äģ˜åĄæ˜žį¤ēä¸ēåģē莎" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "选拊回标æ—ļ昞į¤ēåģē莎" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "适ᔍäēŽæ‰€æœ‰åˇ˛į™ģåŊ•įš„č´Ļæˆˇã€‚" + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "å…ŗé—­æ‚¨æĩč§ˆå™¨å†…įŊŽįš„å¯†į įŽĄį†å™¨čŽžįŊŽäģĨéŋå…å†˛įĒã€‚" + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "įŧ–čž‘æĩč§ˆå™¨čŽžįŊŽã€‚" + }, + "autofillOverlayVisibilityOff": { + "message": "å…ŗé—­", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "选中字æŽĩæ—ļīŧˆį„Ļį‚šä¸Šīŧ‰", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "选中č‡Ē动åĄĢ充回标æ—ļ", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "éĄĩéĸ加čŊŊæ—ļč‡Ē动åĄĢ充" + }, "enableAutoFillOnPageLoad": { "message": "éĄĩéĸ加čŊŊæ—ļč‡Ē动åĄĢ充" }, "enableAutoFillOnPageLoadDesc": { "message": "įŊ‘éĄĩ加čŊŊæ—ļåĻ‚æžœæŖ€æĩ‹åˆ°į™ģåŊ•čĄ¨å•īŧŒåˆ™æ‰§čĄŒč‡Ē动åĄĢ充。" }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$č­Ļ告īŧš$CLOSETAG$不厌整或不äŋĄäģģįš„įŊ‘įĢ™å¯äģĨåˆŠį”¨éĄĩéĸ加čŊŊæ—ļįš„č‡Ē动åĄĢ充功čƒŊ。", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "不厌整或不äŋĄäģģįš„įŊ‘įĢ™å¯äģĨ在éĄĩéĸ加čŊŊæ—ļč‡Ē动åĄĢ充。" + "message": "不厌整或不äŋĄäģģįš„įŊ‘įĢ™å¯äģĨåˆŠį”¨éĄĩéĸ加čŊŊæ—ļįš„č‡Ē动åĄĢ充功čƒŊ。" + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "äē†č§Ŗæ›´å¤šå…ŗäēŽéŖŽé™Šįš„äŋĄæ¯" }, "learnMoreAboutAutofill": { "message": "äē†č§Ŗæ›´å¤šå…ŗäēŽč‡Ē动åĄĢå……įš„äŋĄæ¯" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "åœ¨äž§čžšæ ä¸­æ‰“åŧ€å¯†į åē“" }, - "commandAutofillDesc": { - "message": "ä¸ēåŊ“前įŊ‘įĢ™č‡Ē动åĄĢ充最后äŊŋį”¨įš„į™ģåŊ•äŋĄæ¯" + "commandAutofillLoginDesc": { + "message": "ä¸ēåŊ“前įŊ‘įĢ™č‡Ē动åĄĢ充最后一æŦĄäŊŋį”¨įš„į™ģåŊ•äŋĄæ¯" + }, + "commandAutofillCardDesc": { + "message": "ä¸ēåŊ“前įŊ‘įĢ™č‡Ē动åĄĢ充最后一æŦĄäŊŋį”¨įš„æ”¯äģ˜åĄäŋĄæ¯" + }, + "commandAutofillIdentityDesc": { + "message": "ä¸ēåŊ“前įŊ‘įĢ™č‡Ē动åĄĢ充最后一æŦĄäŊŋį”¨įš„čēĢäģŊäŋĄæ¯" }, "commandGeneratePasswordDesc": { "message": "į”Ÿæˆä¸€ä¸Ēæ–°įš„éšæœē坆᠁åšļ将å…ļ复åˆļ到å‰Ēč´´æŋ中。" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "é”åŽšå¯†į åē“" }, - "privateModeWarning": { - "message": "į§å¯†æ¨Ąåŧįš„æ”¯æŒæ˜¯åŽžéĒŒæ€§įš„īŧŒæŸäē›åŠŸčƒŊäŧšå—到限åˆļ。" - }, "customFields": { "message": "č‡Ē厚䚉字æŽĩ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "布尔型" }, + "cfTypeCheckbox": { + "message": "å¤é€‰æĄ†åž‹" + }, "cfTypeLinked": { "message": "链æŽĨ型", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1068,7 +1609,10 @@ "message": "昞į¤ēįŊ‘įĢ™å›žæ ‡" }, "faviconDesc": { - "message": "在每ä¸Ēį™ģåŊ•旁昞į¤ē一ä¸Ēå¯č¯†åˆĢįš„å›žåƒã€‚" + "message": "在每ä¸Ēį™ģåŊ•éĄšį›Žæ—čžšæ˜žį¤ē一ä¸Ēå¯č¯†åˆĢįš„å›žåƒã€‚" + }, + "faviconDescAlt": { + "message": "在每ä¸Ēį™ģåŊ•įš„æ—čžšæ˜žį¤ē一ä¸Ēå¯č¯†åˆĢįš„å›žåƒã€‚é€‚į”¨äēŽæ‰€æœ‰åˇ˛į™ģåŊ•įš„č´Ļæˆˇã€‚" }, "enableBadgeCounter": { "message": "昞į¤ēč§’æ ‡čŽĄæ•°å™¨" @@ -1092,7 +1636,7 @@ "message": "čŋ‡æœŸåš´äģŊ" }, "expiration": { - "message": "čŋ‡æœŸæ—Ĩ" + "message": "有效期" }, "january": { "message": "一月" @@ -1173,7 +1717,7 @@ "message": "å…Ŧ司" }, "ssn": { - "message": "į¤žäŧšäŋé™Šåˇį " + "message": "į¤žäŧšäŋéšœåˇį " }, "passportNumber": { "message": "æŠ¤į…§åˇį " @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "čēĢäģŊ" }, + "typeSshKey": { + "message": "SSH 密é’Ĩ" + }, + "newItemHeader": { + "message": "新åĸž $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "įŧ–čž‘ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "æŸĨįœ‹ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "å¯†į åŽ†å˛čŽ°åŊ•" }, + "generatorHistory": { + "message": "į”Ÿæˆå™¨åŽ†å˛čŽ°åŊ•" + }, + "clearGeneratorHistoryTitle": { + "message": "æ¸…é™¤į”Ÿæˆå™¨åŽ†å˛čŽ°åŊ•" + }, + "cleargGeneratorHistoryDescription": { + "message": "č‹Ĩįģ§įģ­īŧŒæ‰€æœ‰æĄį›Žå°†äģŽį”Ÿæˆå™¨åŽ†å˛čްåŊ•ä¸­æ°¸äš…åˆ é™¤ã€‚įĄŽåޚčρįģ§įģ­å—īŧŸ" + }, "back": { "message": "后退" }, "collections": { "message": "集合" }, + "nCollections": { + "message": "$COUNT$ ä¸Ē集合", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "æ”ļč—å¤š" }, @@ -1282,6 +1874,10 @@ "message": "åŸēįĄ€åŸŸ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "åŸēįĄ€åŸŸīŧˆæŽ¨čīŧ‰", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "域名", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "åŒšé…æŖ€æĩ‹", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "éģ˜čŽ¤åŒšé…æŖ€æĩ‹", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "切æĸ选项" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "æ˛Ąæœ‰å¯åˆ—å‡ēįš„å¯†į ã€‚" }, + "clearHistory": { + "message": "æ¸…é™¤åŽ†å˛čŽ°åŊ•" + }, + "nothingToShow": { + "message": "æ˛Ąæœ‰å¯æ˜žį¤ēįš„å†…åŽš" + }, + "nothingGeneratedRecently": { + "message": "您最čŋ‘æ˛Ąæœ‰į”ŸæˆäģģäŊ•内厚" + }, "remove": { "message": "į§ģ除" }, @@ -1351,7 +1956,7 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "æ‚¨įĄŽåŽščρäŊŋį”¨ã€ŒäģŽä¸ã€é€‰éĄšå—īŧŸå°†é”åŽšé€‰éĄščŽžįŊŽä¸ē「äģŽä¸ã€äŧšå°†å¯†į åē“įš„åŠ å¯†å¯†é’Ĩå­˜å‚¨åœ¨æ‚¨įš„čŽžå¤‡ä¸Šã€‚åĻ‚æžœäŊŋį”¨æ­¤é€‰éĄšīŧŒæ‚¨åŋ…éĄģįĄŽäŋæ‚¨įš„čŽžå¤‡åŽ‰å…¨ã€‚" + "message": "įĄŽåŽščρäŊŋį”¨ã€ŒäģŽä¸ã€é€‰éĄšå—īŧŸå°†é”åŽšé€‰éĄščŽžįŊŽä¸ē「äģŽä¸ã€äŧšå°†å¯†į åē“įš„åŠ å¯†å¯†é’Ĩå­˜å‚¨åœ¨æ‚¨įš„čŽžå¤‡ä¸Šã€‚åĻ‚æžœäŊŋį”¨æ­¤é€‰éĄšīŧŒæ‚¨åŋ…éĄģįĄŽäŋæ‚¨įš„čŽžå¤‡åŽ‰å…¨ã€‚" }, "noOrganizationsList": { "message": "æ‚¨æ˛Ąæœ‰åŠ å…ĨäģģäŊ•įģ„įģ‡ã€‚įģ„įģ‡å…čŽ¸æ‚¨ä¸Žå…ļäģ–į”¨æˆˇåŽ‰å…¨åœ°å…ąäēĢéĄšį›Žã€‚" @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "äŊŋᔍ PIN ᠁觪锁" }, + "setYourPinTitle": { + "message": "莞įŊŽ PIN ᠁" + }, + "setYourPinButton": { + "message": "莞įŊŽ PIN ᠁" + }, "setYourPinCode": { "message": "čŽžåŽšæ‚¨į”¨æĨ觪锁 Bitwarden įš„ PIN į ã€‚æ‚¨įš„ PIN 莞įŊŽå°†åœ¨æ‚¨åŽŒå…¨æŗ¨é”€æ­¤åē”ᔍፋåēæ—ļčĸĢ重įŊŽã€‚" }, + "setYourPinCode1": { + "message": "æ‚¨įš„ PIN ᠁将äģŖæ›ŋä¸ģ坆᠁ᔍäēŽč§Ŗé” Bitwarden。åĻ‚æžœæ‚¨åŽŒå…¨æŗ¨é”€ BitwardenīŧŒPIN ᠁将čĸĢ重įŊŽã€‚" + }, "pinRequired": { "message": "需čρ PIN į ã€‚" }, "invalidPin": { "message": "无效 PIN į ã€‚" }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "æ— æ•ˆįš„ PIN 输å…Ĩå°č¯•æŦĄæ•°čŋ‡å¤šīŧŒæ­Ŗåœ¨æŗ¨é”€ã€‚" + }, "unlockWithBiometrics": { "message": "äŊŋį”¨į”Ÿį‰Šč¯†åˆĢ觪锁" }, + "unlockWithMasterPassword": { + "message": "äŊŋᔍä¸ģ坆᠁觪锁" + }, "awaitDesktop": { "message": "į­‰åž…æĨč‡ĒæĄŒéĸåē”ᔍፋåēįš„įĄŽčޤ" }, @@ -1411,6 +2031,9 @@ "lockWithMasterPassOnRestart": { "message": "æĩč§ˆå™¨é‡å¯åŽäŊŋᔍä¸ģå¯†į é”åŽš" }, + "lockWithMasterPassOnRestart1": { + "message": "æĩč§ˆå™¨é‡å¯æ—ļ需čρä¸ģ坆᠁" + }, "selectOneCollection": { "message": "您åŋ…éĄģč‡ŗå°‘é€‰æ‹Šä¸€ä¸Ē集合。" }, @@ -1423,12 +2046,38 @@ "passwordGeneratorPolicyInEffect": { "message": "一ä¸Ē或多ä¸Ēįģ„įģ‡į­–į•Ĩæ­Ŗåœ¨åŊąå“æ‚¨įš„į”Ÿæˆå™¨čŽžįŊŽã€‚" }, + "passwordGenerator": { + "message": "å¯†į į”Ÿæˆå™¨" + }, + "usernameGenerator": { + "message": "į”¨æˆˇåį”Ÿæˆå™¨" + }, + "useThisPassword": { + "message": "äŊŋį”¨æ­¤å¯†į " + }, + "useThisUsername": { + "message": "äŊŋį”¨æ­¤į”¨æˆˇå" + }, + "securePasswordGenerated": { + "message": "åŽ‰å…¨å¯†į į”ŸæˆåĨŊäē†īŧåˆĢåŋ˜äē†äšŸåœ¨įŊ‘įĢ™ä¸Šæ›´æ–°ä¸€ä¸‹æ‚¨įš„å¯†į ã€‚" + }, + "useGeneratorHelpTextPartOne": { + "message": "äŊŋį”¨į”Ÿæˆå™¨", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "创åģē一ä¸Ēåŧēå¤§ä¸”å”¯ä¸€įš„å¯†į ", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "坆᠁åē“čļ…æ—ļ动äŊœ" }, + "vaultTimeoutAction1": { + "message": "čļ…æ—ļ动äŊœ" + }, "lock": { "message": "锁厚", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "回æ”ļįĢ™", @@ -1441,7 +2090,7 @@ "message": "æ°¸äš…åˆ é™¤éĄšį›Ž" }, "permanentlyDeleteItemConfirmation": { - "message": "æ‚¨įĄŽåŽščĻæ°¸äš…åˆ é™¤æ­¤éĄšį›Žå—īŧŸ" + "message": "įĄŽåŽščĻæ°¸äš…åˆ é™¤æ­¤éĄšį›Žå—īŧŸ" }, "permanentlyDeletedItem": { "message": "éĄšį›Žåˇ˛æ°¸äš…åˆ é™¤" @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "éĄšį›Žåˇ˛æĸ复" }, + "alreadyHaveAccount": { + "message": "厞įģæ‹Ĩ有č´Ļæˆˇäē†å—īŧŸ" + }, "vaultTimeoutLogOutConfirmation": { "message": "čļ…æ—ļåŽæŗ¨é”€č´Ļæˆˇå°†č§Ŗé™¤å¯šå¯†į åē“įš„æ‰€æœ‰čŽŋ闎权限īŧŒåšļ需čρčŋ›čĄŒåœ¨įēŋčēĢäģŊéĒŒč¯ã€‚įĄŽåŽšäŊŋį”¨æ­¤čŽžįŊŽå—īŧŸ" }, @@ -1461,6 +2113,9 @@ "autoFillAndSave": { "message": "č‡Ē动åĄĢ充åšļäŋå­˜" }, + "fillAndSave": { + "message": "åĄĢ充åšļäŋå­˜" + }, "autoFillSuccessAndSavedUri": { "message": "éĄšį›Žåˇ˛č‡Ē动åĄĢ充且 URI 厞äŋå­˜" }, @@ -1539,6 +2194,21 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "æ‚¨įš„æ–°ä¸ģå¯†į ä¸įŦĻåˆį­–į•ĨčĻæą‚ã€‚" }, + "receiveMarketingEmailsV2": { + "message": "čŽˇå–æĨč‡Ē Bitwarden įš„åģēčŽŽã€å…Ŧå‘Šå’Œč°ƒį ”į”ĩ子邎äģļ。" + }, + "unsubscribe": { + "message": "取æļˆčŽĸ阅" + }, + "atAnyTime": { + "message": "随æ—ļ" + }, + "byContinuingYouAgreeToThe": { + "message": "č‹Ĩįģ§įģ­īŧŒäģŖčĄ¨æ‚¨åŒæ„" + }, + "and": { + "message": "äģĨ及" + }, "acceptPolicies": { "message": "é€‰ä¸­æ­¤æĄ†čĄ¨į¤ē您同意īŧš" }, @@ -1557,6 +2227,12 @@ "ok": { "message": "įĄŽåŽš" }, + "errorRefreshingAccessToken": { + "message": "čŽŋ问äģ¤į‰Œåˆˇæ–°é”™č¯¯" + }, + "errorRefreshingAccessTokenDesc": { + "message": "æœĒæ‰žåˆ°åˆˇæ–°äģ¤į‰Œæˆ– API 密é’Ĩã€‚č¯ˇå°č¯•æŗ¨é”€į„ļ后重新į™ģåŊ•。" + }, "desktopSyncVerificationTitle": { "message": "æĄŒéĸ同æ­Ĩénj蝁" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "č´Ļæˆˇä¸åŒšé…" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "į”Ÿį‰Šč¯†åˆĢ密é’Ĩ不匚配" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "į”Ÿį‰Šč¯†åˆĢč§Ŗé”å¤ąč´Ĩã€‚į”Ÿį‰Šč¯†åˆĢ厉全é’ĨåŒ™č§Ŗé”å¯†į åē“å¤ąč´Ĩã€‚č¯ˇå°č¯•é‡æ–°čŽžįŊŽį”Ÿį‰Šč¯†åˆĢ。" + }, "biometricsNotEnabledTitle": { "message": "į”Ÿį‰Šč¯†åˆĢæœĒ莞įŊŽ" }, @@ -1605,6 +2287,18 @@ "biometricsNotSupportedDesc": { "message": "æ­¤čŽžå¤‡ä¸æ”¯æŒæĩč§ˆå™¨į”Ÿį‰Šč¯†åˆĢ。" }, + "biometricsNotUnlockedTitle": { + "message": "į”¨æˆˇåˇ˛é”åŽšæˆ–åˇ˛æŗ¨é”€" + }, + "biometricsNotUnlockedDesc": { + "message": "č¯ˇåœ¨æĄŒéĸåē”ᔍፋåēä¸­č§Ŗé”æ­¤į”¨æˆˇīŧŒį„ļåŽé‡č¯•ã€‚" + }, + "biometricsNotAvailableTitle": { + "message": "į”Ÿį‰Šč¯†åˆĢč§Ŗé”ä¸å¯į”¨" + }, + "biometricsNotAvailableDesc": { + "message": "į”Ÿį‰Šč¯†åˆĢ觪锁åŊ“å‰ä¸å¯į”¨ã€‚č¯ˇį¨åŽå†č¯•ã€‚" + }, "biometricsFailedTitle": { "message": "į”Ÿį‰Šč¯†åˆĢå¤ąč´Ĩ" }, @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "一ä¸Ēįģ„įģ‡į­–į•Ĩæ­ŖåŊąå“æ‚¨įš„æ‰€æœ‰æƒé€‰éĄšã€‚" }, + "personalOwnershipPolicyInEffectImports": { + "message": "įģ„įģ‡į­–į•Ĩ厞é˜ģæ­ĸå°†éĄšį›Žå¯ŧå…Ĩæ‚¨įš„ä¸Ēäēē坆᠁åē“。" + }, + "domainsTitle": { + "message": "域名", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "排除域名" }, "excludedDomainsDesc": { "message": "Bitwarden 将不äŧšč¯ĸ闎是åĻä¸ēčŋ™äē›åŸŸåäŋå­˜į™ģåŊ•äŋĄæ¯ã€‚您åŋ…éĄģåˆˇæ–°éĄĩéĸ才čƒŊäŊŋæ›´æ”šį”Ÿæ•ˆã€‚" }, + "excludedDomainsDescAlt": { + "message": "Bitwarden 不äŧšč¯ĸ问äŋå­˜æ‰€æœ‰åˇ˛į™ģåŊ•įš„č´Ļæˆˇįš„čŋ™äē›åŸŸåįš„į™ģåŊ•äŋĄæ¯ã€‚åŋ…éĄģåˆˇæ–°éĄĩéĸ才čƒŊäŊŋæ›´æ”šį”Ÿæ•ˆã€‚" + }, + "websiteItemLabel": { + "message": "įŊ‘įĢ™ $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ 不是一ä¸Ēæœ‰æ•ˆįš„åŸŸå", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "æŽ’é™¤åŸŸåæ›´æ”šåˇ˛äŋå­˜" + }, + "limitSendViews": { + "message": "限åˆļæŸĨįœ‹" + }, + "limitSendViewsHint": { + "message": "åœ¨čžžåˆ°é™éĸåŽīŧŒäģģäŊ•äēēæ— æŗ•æŸĨįœ‹æ­¤ Send。", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "削äŊ™ $ACCESSCOUNT$ æŦĄæŸĨįœ‹æŦĄæ•°", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send č¯Ļįģ†äŋĄæ¯", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "搜į´ĸ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "文æœŦ" }, + "sendTypeTextToShare": { + "message": "čĻåˆ†äēĢįš„æ–‡æœŦ" + }, "sendTypeFile": { "message": "文äģļ" }, @@ -1666,6 +2406,9 @@ "message": "所有 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "éģ˜čŽ¤éšč—æ–‡æœŦ" + }, "maxAccessCountReached": { "message": "åˇ˛čžžæœ€å¤§čŽŋ问æŦĄæ•°", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "坆᠁äŋæŠ¤" }, + "copyLink": { + "message": "复åˆļ链æŽĨ" + }, "copySendLink": { "message": "复åˆļ Send 链æŽĨ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "įĄŽåŽščĻåˆ é™¤æ­¤ Send 吗īŧŸ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "æ‚¨įĄŽåŽščĻæ°¸äš…åˆ é™¤čŋ™ä¸Ē Send 吗īŧŸ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "įŧ–čž‘ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "æ­¤ Send å°†åœ¨æŒ‡åŽšįš„æ—Ĩ期和æ—ļ间后čĸĢæ°¸äš…删除。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "æ­¤ Send 将在此æ—Ĩ期后čĸĢæ°¸äš…删除。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "čŋ‡æœŸæ—Ĩ期" }, @@ -1769,6 +2523,10 @@ "message": "可选īŧŒį”¨æˆˇéœ€čĻæäž›å¯†į æ‰čƒŊčŽŋé—Žæ­¤ Send。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "æˇģ加一ä¸ĒᔍäēŽæ”ļäģļäēēčŽŋé—Žæ­¤ Send įš„å¯é€‰å¯†į ã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "å…ŗäēŽæ­¤ Send įš„į§å¯†å¤‡æŗ¨ã€‚", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send åˇ˛åˆ›åģē", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send 创åģ翈åŠŸīŧ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "在æŽĨ下æĨįš„ 1 小æ—ļ内īŧŒäģģäŊ•äēēéƒŊ可äģĨ通čŋ‡é“žæŽĨčŽŋé—Žæ­¤ Send。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "在æŽĨ下æĨįš„ $HOURS$ 小æ—ļ内īŧŒäģģäŊ•äēēéƒŊ可äģĨ通čŋ‡é“žæŽĨčŽŋé—Žæ­¤ Send。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "在æŽĨ下æĨįš„ 1 夊内īŧŒäģģäŊ•äēēéƒŊ可äģĨ通čŋ‡é“žæŽĨčŽŋé—Žæ­¤ Send。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "在æŽĨ下æĨįš„ $DAYS$ 夊内īŧŒäģģäŊ•äēēéƒŊ可äģĨ通čŋ‡é“žæŽĨčŽŋé—Žæ­¤ Send。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send 链æŽĨåˇ˛å¤åˆļ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send 厞äŋå­˜", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "åŧšå‡ēæ‰Šåą•īŧŸ", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "čĻåˆ›åģēæ–‡äģļ SendīŧŒæ‚¨éœ€čρåŧšå‡ēæ‰Šåą•åˆ°ä¸€ä¸Ē新įĒ—åŖã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "čĻé€‰æ‹Šæ–‡äģļīŧŒč¯ˇåœ¨äž§čžšæ ä¸­æ‰“åŧ€æ‰Šåą•īŧˆåĻ‚æžœå¯äģĨīŧ‰īŧŒæˆ–č€…į‚šå‡ģæ­¤æ¨Ēåš…æĨåŧšå‡ē一ä¸Ē新įĒ—åŖã€‚" }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "čρ圍 Safari 中选拊文äģļīŧŒč¯ˇį‚šå‡ģæ­¤æ¨Ēåš…æĨåŧšå‡ē一ä¸Ē新įĒ—åŖã€‚" }, + "popOut": { + "message": "åŧšå‡ē" + }, "sendFileCalloutHeader": { "message": "在åŧ€å§‹äš‹å‰" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "寚æ”ļäģļäēēéšč—æˆ‘įš„į”ĩ子邎äģļ地址。" }, + "hideYourEmail": { + "message": "寚æŸĨįœ‹č€…éšč—æ‚¨įš„į”ĩ子邎äģļ地址。" + }, "sendOptionsPolicyInEffect": { "message": "一ä¸Ē或多ä¸Ēįģ„įģ‡į­–į•Ĩæ­Ŗåœ¨åŊąå“æ‚¨įš„ Send é€‰éĄšã€‚" }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "需čρénj蝁į”ĩ子邎äģļ" }, + "emailVerifiedV2": { + "message": "į”ĩå­é‚ŽįŽąåˇ˛énj蝁" + }, "emailVerificationRequiredDesc": { "message": "您åŋ…éĄģénj蝁į”ĩ子邎äģ￉čƒŊäŊŋį”¨æ­¤åŠŸčƒŊ。您可äģĨ在įŊ‘éĄĩ坆᠁åē“中éĒŒč¯æ‚¨įš„į”ĩ子邎äģļ。" }, @@ -1886,6 +2697,9 @@ "updateWeakMasterPasswordWarning": { "message": "æ‚¨įš„ä¸ģå¯†į ä¸įŦĻåˆæŸä¸€éĄšæˆ–å¤šéĄšįģ„įģ‡į­–į•ĨčĻæą‚ã€‚čρčŽŋé—Žå¯†į åē“īŧŒåŋ…éĄģįĢ‹åŗæ›´æ–°æ‚¨įš„ä¸ģå¯†į ã€‚įģ§įģ­æ“äŊœå°†äŊŋ您退å‡ēåŊ“前äŧšč¯īŧŒåšļčĻæą‚æ‚¨é‡æ–°į™ģåŊ•。å…ļäģ–čŽžå¤‡ä¸Šįš„æ´ģ动äŧšč¯å¯čƒŊäŧšįģ§įģ­äŋæŒæ´ģ动įŠļ态é•ŋčžžä¸€å°æ—ļ。" }, + "tdeDisabledMasterPasswordRequired": { + "message": "æ‚¨įš„įģ„įģ‡įρᔍäē†äŋĄäģģčŽžå¤‡åŠ å¯†ã€‚čρčŽŋé—Žæ‚¨įš„å¯†į åē“īŧŒč¯ˇčŽžįŊŽä¸€ä¸Ēä¸ģå¯†į ã€‚" + }, "resetPasswordPolicyAutoEnroll": { "message": "č‡ĒåŠ¨æŗ¨å†Œ" }, @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "选拊文äģļ多..." }, - "ssoCompleteRegistration": { - "message": "čĻåŽŒæˆ SSO į™ģåŊ•配įŊŽīŧŒč¯ˇčŽžįŊŽä¸€ä¸Ēä¸ģ坆᠁äģĨčŽŋé—Žå’ŒäŋæŠ¤æ‚¨įš„坆᠁åē“。" + "noFoldersFound": { + "message": "扞不到文äģļ多", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "æ‚¨įš„įģ„į쇿ƒé™åˇ˛æ›´æ–°īŧŒčĻæą‚æ‚¨čŽžįŊŽä¸ģå¯†į ã€‚", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "æ‚¨įš„įģ„įģ‡čĻæą‚æ‚¨čŽžįŊŽä¸ģå¯†į ã€‚", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "$TOTAL$ 不čļŗ", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "需čρénj蝁", + "description": "Default title for the user verification dialog." }, "hours": { "message": "小æ—ļ" @@ -1904,6 +2740,9 @@ "minutes": { "message": "分钟" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "äŧä¸šį­–į•ĨčĻæą‚åˇ˛åē”į”¨åˆ°æ‚¨įš„čļ…æ—ļ选项中" + }, "vaultTimeoutPolicyInEffect": { "message": "æ‚¨įš„įģ„įģ‡į­–į•Ĩåˇ˛å°†æ‚¨æœ€å¤§å…čŽ¸įš„å¯†į åē“čļ…æ—ļæ—ļ间设įŊŽä¸ē $HOURS$ 小æ—ļ $MINUTES$ 分钟。", "placeholders": { @@ -1917,6 +2756,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "最多 $HOURS$ 小æ—ļ $MINUTES$ 分钟", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "čļ…æ—ļæ—ļ间čļ…å‡ēä熿‚¨įģ„įģ‡čŽžįŊŽįš„æ­¤é™åˆļīŧšæœ€å¤š $HOURS$ 小æ—ļ $MINUTES$ 分钟", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "æ‚¨įš„įģ„įģ‡į­–į•Ĩæ­Ŗåœ¨åŊąå“æ‚¨įš„坆᠁åē“čļ…æ—ļæ—ļé—´ã€‚æœ€å¤§å…čŽ¸įš„å¯†į åē“čļ…æ—ļæ—ļ间是 $HOURS$ 小æ—ļ $MINUTES$ åˆ†é’Ÿã€‚æ‚¨įš„å¯†į åē“čļ…æ—ļ动äŊœčĸĢ莞įŊŽä¸ē $ACTION$。", "placeholders": { @@ -1977,7 +2842,7 @@ "message": "ä¸ģ坆᠁厞į§ģ除" }, "leaveOrganizationConfirmation": { - "message": "æ‚¨įĄŽåŽščρ退å‡ēč¯Ĩįģ„įģ‡å—īŧŸ" + "message": "įĄŽåŽščρ退å‡ēč¯Ĩįģ„įģ‡å—īŧŸ" }, "leftOrganization": { "message": "æ‚¨åˇ˛įģé€€å‡ēč¯Ĩįģ„įģ‡ã€‚" @@ -1989,7 +2854,7 @@ "message": "æ‚¨įš„äŧšč¯åˇ˛čļ…æ—ļã€‚č¯ˇčŋ”回į„ļåŽå°č¯•é‡æ–°į™ģåŊ•。" }, "exportingPersonalVaultTitle": { - "message": "å¯ŧå‡ēä¸Ēäēē坆᠁åē“" + "message": "æ­Ŗåœ¨å¯ŧå‡ēä¸Ēäēē坆᠁åē“" }, "exportingIndividualVaultDescription": { "message": "äģ…äŧšå¯ŧå‡ē与 $EMAIL$ å…ŗč”įš„ä¸Ēäēē坆᠁åē“éĄšį›ŽīŧŒä¸åŒ…æ‹Ŧįģ„įģ‡å¯†į åē“éĄšį›Žã€‚äģ…äŧšå¯ŧå‡ē坆᠁åē“éĄšį›ŽäŋĄæ¯īŧŒä¸åŒ…æ‹Ŧå…ŗč”įš„é™„äģļ。", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "æ­Ŗåœ¨å¯ŧå‡ēįģ„įģ‡å¯†į åē“" + }, + "exportingOrganizationVaultDesc": { + "message": "äģ…äŧšå¯ŧå‡ē与 $ORGANIZATION$ å…ŗč”įš„įģ„įģ‡å¯†į å瓿•°æŽã€‚不包æ‹Ŧä¸Ēäēē坆᠁åē“å’Œå…ļäģ–įģ„įģ‡ä¸­įš„éĄšį›Žã€‚", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "错蝝" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "į”Ÿæˆį”¨æˆˇå" }, + "generateEmail": { + "message": "į”Ÿæˆį”ĩ子邎äģļ地址" + }, + "generatorBoundariesHint": { + "message": "å€ŧåŋ…éĄģ在 $MIN$ 和 $MAX$ 之间", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "į”¨æˆˇåįąģ型" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "äŊŋį”¨å¤–éƒ¨čŊŦå‘æœåŠĄį”Ÿæˆä¸€ä¸Ēį”ĩ子邎äģļåˆĢ名。" }, + "forwarderDomainName": { + "message": "į”ĩ子邎äģļ域名", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "选拊一ä¸Ēæ‰€é€‰æœåŠĄæ”¯æŒįš„åŸŸå", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ 错蝝īŧš$ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "į”ą Bitwarden į”Ÿæˆã€‚", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "įŊ‘įĢ™īŧš$WEBSITE$ã€‚į”ą Bitwarden į”Ÿæˆã€‚", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "æ— æ•ˆįš„ $SERVICENAME$ API äģ¤į‰Œ", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "æ— æ•ˆįš„ $SERVICENAME$ API äģ¤į‰Œīŧš$ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "æ— æŗ•čŽˇå– $SERVICENAME$ į”ĩ子邎äģļč´Ļæˆˇ ID。", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "æ— æ•ˆįš„ $SERVICENAME$ 域名。", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "æ— æ•ˆįš„ $SERVICENAME$ URL。", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "å‘į”ŸæœĒįŸĨįš„ $SERVICENAME$ é”™č¯¯ã€‚", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "æœĒįŸĨįš„čŊŦå‘æœåŠĄīŧš$SERVICENAME$。", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ä¸ģæœē名", "description": "Part of a URL." @@ -2117,13 +3121,13 @@ } }, "loginWithMasterPassword": { - "message": "ä¸ģ坆᠁į™ģåŊ•" + "message": "äŊŋᔍä¸ģ坆᠁į™ģåŊ•" }, "loggingInAs": { "message": "æ­Ŗį™ģåŊ•ä¸ē" }, "notYou": { - "message": "不是äŊ īŧŸ" + "message": "不是您吗īŧŸ" }, "newAroundHere": { "message": "初æĨ䚍到吗īŧŸ" @@ -2132,10 +3136,10 @@ "message": "莰äŊį”ĩ子邎äģļ地址" }, "loginWithDevice": { - "message": "čŽžå¤‡į™ģåŊ•" + "message": "äŊŋį”¨čŽžå¤‡į™ģåŊ•" }, "loginWithDeviceEnabledInfo": { - "message": "čŽžå¤‡į™ģåŊ•åŋ…éĄģ在 Bitwarden åē”ᔍፋåēįš„莞įŊŽä¸­å¯į”¨ã€‚需čρå…ļäģ–į™ģåŊ•é€‰éĄšå—īŧŸ" + "message": "åŋ…éĄģ在 Bitwarden App įš„čŽžįŊŽä¸­å¯į”¨čŽžå¤‡į™ģåŊ•。需čρå…ļäģ–į™ģåŊ•é€‰éĄšå—īŧŸ" }, "fingerprintPhraseHeader": { "message": "指įēšįŸ­č¯­" @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "æ‚¨įš„įģ„įģ‡į­–į•Ĩ厞åŧ€å¯åœ¨éĄĩéĸ加čŊŊæ—ļįš„č‡Ē动åĄĢ充。" + "message": "æ‚¨įš„įģ„įģ‡į­–į•Ĩ厞åŧ€å¯éĄĩéĸ加čŊŊæ—ļč‡Ē动åĄĢ充。" }, "howToAutofill": { "message": "åĻ‚äŊ•č‡Ē动åĄĢ充" }, "autofillSelectInfoWithCommand": { - "message": "äģŽæ­¤éĄĩéĸ选拊一ä¸ĒéĄšį›ŽīŧŒæˆ–äŊŋᔍåŋĢæˇæ–šåŧīŧš$COMMAND$", + "message": "äģŽæ­¤į•Œéĸ选拊一ä¸ĒéĄšį›ŽīŧŒäŊŋᔍåŋĢæˇé”Ž $COMMAND$īŧŒæˆ–æŽĸį´ĸ莞įŊŽä¸­įš„å…ļäģ–é€‰éĄšã€‚", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "äģŽæ­¤éĄĩéĸ选拊一ä¸ĒéĄšį›ŽīŧŒæˆ–č€…åœ¨čŽžįŊŽä¸­čŽžįŊŽä¸€ä¸ĒåŋĢæˇæ–šåŧã€‚" + "message": "äģŽæ­¤į•Œéĸ选拊一ä¸ĒéĄšį›ŽīŧŒæˆ–æŽĸį´ĸ莞įŊŽä¸­įš„å…ļäģ–é€‰éĄšã€‚" }, "gotIt": { "message": "明į™Ŋäē†" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "č‡Ē动åĄĢå……čŽžįŊŽ" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "č‡Ē动åĄĢ充åŋĢæˇé”Ž" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "更攚åŋĢæˇé”Ž" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "įŽĄį†åŋĢæˇé”Ž" + }, "autofillShortcut": { "message": "č‡Ē动åĄĢå……é”Žį›˜åŋĢæˇé”Ž" }, - "autofillShortcutNotSet": { - "message": "æœĒ莞įŊŽč‡Ē动åĄĢ充åŋĢæˇæ–šåŧã€‚č¯ˇåœ¨æĩč§ˆå™¨čŽžįŊŽä¸­æ›´æ”šæ­¤čŽžįŊŽã€‚" + "autofillLoginShortcutNotSet": { + "message": "æœĒ莞įŊŽč‡Ē动åĄĢ充į™ģåŊ•åŋĢæˇé”Žã€‚č¯ˇåœ¨æĩč§ˆå™¨čŽžįŊŽä¸­æ›´æ”šåŽƒã€‚" }, - "autofillShortcutText": { - "message": "č‡Ē动åĄĢ充åŋĢæˇæ–šåŧä¸ēīŧš $COMMAND$。在æĩč§ˆå™¨čŽžįŊŽä¸­æ›´æ”šæ­¤éĄšã€‚", + "autofillLoginShortcutText": { + "message": "č‡Ē动åĄĢ充į™ģåŊ•åŋĢæˇé”Žæ˜¯ $COMMAND$ã€‚č¯ˇåœ¨æĩč§ˆå™¨čŽžįŊŽä¸­įŽĄį†æ‰€æœ‰åŋĢæˇé”Žã€‚", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "éģ˜čޤč‡Ē动åĄĢ充åŋĢæˇæ–šåŧīŧš$COMMAND$。", + "message": "éģ˜čŽ¤įš„č‡Ē动åĄĢ充åŋĢæˇé”Žīŧš$COMMAND$", "placeholders": { "command": { "content": "$1", @@ -2233,9 +3246,6 @@ } } }, - "loggingInOn": { - "message": "į™ģåŊ•到" - }, "opensInANewWindow": { "message": "在新įĒ—åŖä¸­æ‰“åŧ€" }, @@ -2260,16 +3270,31 @@ "ssoIdentifierRequired": { "message": "åŋ…éĄģåĄĢ写įģ„įģ‡ SSO æ ‡č¯†įŦĻ。" }, + "creatingAccountOn": { + "message": "æ­Ŗåˆ›åģēč´ĻæˆˇäēŽ" + }, + "checkYourEmail": { + "message": "æŖ€æŸĨæ‚¨įš„į”ĩå­é‚ŽįŽą" + }, + "followTheLinkInTheEmailSentTo": { + "message": "į‚šå‡ģ发送到į”ĩ子邎äģļä¸­įš„é“žæŽĨ" + }, + "andContinueCreatingYourAccount": { + "message": "į„ļ后įģ§įģ­åˆ›åģēæ‚¨įš„č´Ļæˆˇã€‚" + }, + "noEmail": { + "message": "æ˛Ąæ”ļ到į”ĩ子邎äģļ吗īŧŸ" + }, + "goBack": { + "message": "čŋ”回" + }, + "toEditYourEmailAddress": { + "message": "įŧ–čž‘æ‚¨įš„į”ĩ子邎äģļ地址。" + }, "eu": { "message": "æŦ§į›Ÿ", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "čŽŋ问čĸĢæ‹’įģã€‚æ‚¨æ˛Ąæœ‰æƒé™æŸĨįœ‹æ­¤éĄĩéĸ。" }, @@ -2292,7 +3317,7 @@ "message": "扚准后īŧŒæ‚¨å°†æ”ļ到通įŸĨ。" }, "troubleLoggingIn": { - "message": "į™ģåŊ•遇到闎éĸ˜īŧŸ" + "message": "į™ģåŊ•遇到闎éĸ˜å—īŧŸ" }, "loginApproved": { "message": "į™ģåŊ•åˇ˛æ‰šå‡†" @@ -2303,6 +3328,14 @@ "deviceTrusted": { "message": "čŽžå¤‡åˇ˛äŋĄäģģ" }, + "sendsNoItemsTitle": { + "message": "æ˛Ąæœ‰æ´ģčˇƒįš„ Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendsNoItemsMessage": { + "message": "äŊŋᔍ Send 与äģģäŊ•äēē厉全地分äēĢ加密äŋĄæ¯ã€‚", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "inputRequired": { "message": "åŋ…éĄģ输å…Ĩ内厚。" }, @@ -2376,6 +3409,18 @@ } } }, + "singleFieldNeedsAttention": { + "message": "有 1 ä¸Ē字æŽĩ需čĻæ‚¨æŗ¨æ„ã€‚" + }, + "multipleFieldsNeedAttention": { + "message": "有 $COUNT$ ä¸Ē字æŽĩ需čĻæ‚¨æŗ¨æ„ã€‚", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { "message": "-- 选拊 --" }, @@ -2392,7 +3437,7 @@ "message": "清除全部" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "čŋ˜æœ‰ $QUANTITY$ ä¸Ē", "placeholders": { "quantity": { "content": "$1", @@ -2406,5 +3451,1377 @@ "toggleCollapse": { "message": "切æĸ折叠", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "å¯ŧå…Ĩæ‚¨įš„æ•°æŽåˆ° Bitwarden 吗īŧŸ", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "äŋæŠ¤æ‚¨įš„ LastPass 数捎åšļå¯ŧå…Ĩ到 Bitwarden 吗īŧŸ", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "äŋå­˜ä¸ēæœĒåŠ å¯†įš„æ–‡äģļ", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "å¯ŧå…Ĩ到 Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "å¯ŧå…Ĩ中...", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "数捎å¯ŧå…Ĩ成功īŧ", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "å¯ŧå…Ĩæ—ļå‡ēé”™ã€‚æŖ€æŸĨ控åˆļ台äģĨčŽˇå–č¯Ļįģ†äŋĄæ¯ã€‚", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "å¯ŧå…Ĩčŋ‡į¨‹ä¸­é‡åˆ°įŊ‘įģœé”™č¯¯ã€‚", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "åˆĢ名域" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "å…ˇæœ‰ä¸ģå¯†į é‡æ–°æį¤ēįš„éĄšį›Žæ— æŗ•åœ¨éĄĩéĸ加čŊŊæ—ļč‡Ē动åĄĢ充。éĄĩéĸ加čŊŊæ—ļįš„č‡Ē动åĄĢ充功čƒŊåˇ˛å…ŗé—­ã€‚", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "éĄĩéĸ加čŊŊæ—ļč‡Ē动åĄĢå……čŽžįŊŽä¸ēäŊŋᔍéģ˜čŽ¤čŽžįŊŽã€‚", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "å…ŗé—­ä¸ģå¯†į é‡æ–°æį¤ēäģĨįŧ–čž‘æ­¤å­—æŽĩ", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "切æĸäž§čžšå¯ŧčˆĒ" + }, + "skipToContent": { + "message": "莺čŊŦåˆ°æ­Ŗæ–‡" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden č‡Ē动åĄĢå……čœå•æŒ‰é’Ž", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "切æĸ Bitwarden č‡Ē动åĄĢå……čœå•", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden č‡Ē动åĄĢå……čœå•", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "č§Ŗé”æ‚¨įš„č´ĻæˆˇäģĨæŸĨįœ‹åŒšé…įš„į™ģåŊ•", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "č§Ŗé”æ‚¨įš„č´ĻæˆˇäģĨæŸĨįœ‹č‡Ē动åĄĢ充åģē莎", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "觪锁č´Ļæˆˇ", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "č§Ŗé”æ‚¨įš„č´Ļæˆˇīŧˆåœ¨æ–°įĒ—åŖä¸­æ‰“åŧ€īŧ‰", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "ä¸ēå…ļåĄĢ写凭捎", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "éƒ¨åˆ†į”¨æˆˇå", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "æ˛Ąæœ‰å¯æ˜žį¤ēįš„éĄšį›Ž", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "新åĸžéĄšį›Ž", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "æˇģåŠ æ–°įš„å¯†į åē“éĄšį›Ž", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "新åĸžį™ģåŊ•", + "description": "Button text to display within inline menu when there are no matching items on a login field" + }, + "addNewLoginItemAria": { + "message": "æˇģåŠ æ–°įš„å¯†į åē“į™ģåŊ•éĄšį›Žīŧˆåœ¨æ–°įĒ—åŖä¸­æ‰“åŧ€īŧ‰", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "新åĸžæ”¯äģ˜åĄ", + "description": "Button text to display within inline menu when there are no matching items on a credit card field" + }, + "addNewCardItemAria": { + "message": "æˇģåŠ æ–°įš„å¯†į å瓿”¯äģ˜åĄéĄšį›Žīŧˆåœ¨æ–°įĒ—åŖä¸­æ‰“åŧ€īŧ‰", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "新åĸžčēĢäģŊ", + "description": "Button text to display within inline menu when there are no matching items on an identity field" + }, + "addNewIdentityItemAria": { + "message": "æˇģåŠ æ–°įš„å¯†į åē“čēĢäģŊéĄšį›Žīŧˆåœ¨æ–°įĒ—åŖä¸­æ‰“åŧ€īŧ‰", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "Bitwarden č‡Ē动åĄĢå……čœå•å¯į”¨ã€‚æŒ‰å‘ä¸‹įŽ­å¤´é”Žčŋ›čĄŒé€‰æ‹Šã€‚", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "åŧ€å¯" + }, + "ignore": { + "message": "åŋŊį•Ĩ" + }, + "importData": { + "message": "å¯ŧå…Ĩ数捎", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "å¯ŧå…Ĩå‡ē错" + }, + "importErrorDesc": { + "message": "æ‚¨å°č¯•å¯ŧå…Ĩįš„æ•°æŽæœ‰é—Žéĸ˜ã€‚蝎觪冺åĻ‚ä¸‹åˆ—å‡ēįš„æēæ–‡äģļä¸­įš„é”™č¯¯īŧŒį„ļåŽé‡č¯•ã€‚" + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "觪冺䏋éĸįš„é”™č¯¯īŧŒį„ļåŽé‡č¯•ã€‚" + }, + "description": { + "message": "描čŋ°" + }, + "importSuccess": { + "message": "数捎å¯ŧå…Ĩ成功" + }, + "importSuccessNumberOfItems": { + "message": "ä¸€å…ąå¯ŧå…Ĩäē† $AMOUNT$ ä¸ĒéĄšį›Žã€‚", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "č¯ˇé‡č¯•" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "此操äŊœéœ€čρéĒŒč¯ã€‚čŽžįŊŽä¸€ä¸Ē PIN ᠁äģĨįģ§įģ­ã€‚" + }, + "setPin": { + "message": "莞įŊŽ PIN ᠁" + }, + "verifyWithBiometrics": { + "message": "äŊŋį”¨į”Ÿį‰Šč¯†åˆĢénj蝁" + }, + "awaitingConfirmation": { + "message": "į­‰åž…įĄŽčŽ¤" + }, + "couldNotCompleteBiometrics": { + "message": "æ— æŗ•åŽŒæˆį”Ÿį‰Šč¯†åˆĢ。" + }, + "needADifferentMethod": { + "message": "å°č¯•å…ļäģ–æ–šåŧå—īŧŸ" + }, + "useMasterPassword": { + "message": "äŊŋᔍä¸ģ坆᠁" + }, + "usePin": { + "message": "äŊŋᔍ PIN ᠁" + }, + "useBiometrics": { + "message": "äŊŋį”¨į”Ÿį‰Šč¯†åˆĢ" + }, + "enterVerificationCodeSentToEmail": { + "message": "输å…Ĩ发送到您į”ĩå­é‚ŽįŽąįš„éĒŒč¯į ã€‚" + }, + "resendCode": { + "message": "重新发送äģŖį " + }, + "total": { + "message": "æ€ģ莥" + }, + "importWarning": { + "message": "æ‚¨æ­Ŗåœ¨å°†æ•°æŽå¯ŧå…Ĩ到 $ORGANIZATION$ã€‚æ‚¨įš„æ•°æŽå¯čƒŊäŧšä¸Žæ­¤įģ„įģ‡ä¸­įš„æˆå‘˜å…ąäēĢ。čρįģ§įģ­å—īŧŸ", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "与 Duo æœåŠĄčŋžæŽĨæ—ļå‡ēé”™ã€‚č¯ˇäŊŋį”¨ä¸åŒįš„ä¸¤æ­Ĩį™ģåŊ•æ–šåŧæˆ–联įŗģ Duo å¯ģæą‚å¸ŽåŠŠã€‚" + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "启动 DUO åšļæŒ‰į…§æ­ĨéĒ¤åŽŒæˆį™ģåŊ•。" + }, + "duoRequiredForAccount": { + "message": "æ‚¨įš„č´ĻæˆˇčĻæą‚äŊŋᔍ Duo 两æ­Ĩį™ģåŊ•。" + }, + "popoutTheExtensionToCompleteLogin": { + "message": "åŧšå‡ēæ‰Šåą•äģĨ厌成į™ģåŊ•。" + }, + "popoutExtension": { + "message": "åŧšå‡ēæ‰Šåą•" + }, + "launchDuo": { + "message": "启动 Duo" + }, + "importFormatError": { + "message": "数捎æ ŧåŧä¸æ­ŖįĄŽã€‚č¯ˇæŖ€æŸĨæ‚¨įš„å¯ŧå…Ĩ文äģļį„ļåŽé‡č¯•ã€‚" + }, + "importNothingError": { + "message": "æ˛Ąæœ‰å¯ŧå…ĨäģģäŊ•内厚。" + }, + "importEncKeyError": { + "message": "觪坆å¯ŧå‡ēįš„æ–‡äģļæ—ļå‡ēé”™ã€‚æ‚¨įš„åŠ å¯†å¯†é’Ĩ与å¯ŧå‡ē数捎æ—ļäŊŋį”¨įš„åŠ å¯†å¯†é’Ĩ不匚配。" + }, + "invalidFilePassword": { + "message": "æ— æ•ˆįš„æ–‡äģļ坆᠁īŧŒč¯ˇäŊŋį”¨æ‚¨åˆ›åģēå¯ŧå‡ē文äģļæ—ļ输å…Ĩįš„å¯†į ã€‚" + }, + "destination": { + "message": "į›Žįš„åœ°" + }, + "learnAboutImportOptions": { + "message": "äē†č§Ŗæ‚¨įš„å¯ŧå…Ĩ选项" + }, + "selectImportFolder": { + "message": "选拊一ä¸Ē文äģļ多" + }, + "selectImportCollection": { + "message": "选拊一ä¸Ē集合" + }, + "importTargetHint": { + "message": "åĻ‚æžœæ‚¨å¸Œæœ›å°†å¯ŧå…Ĩįš„æ–‡äģļ内厚į§ģ动到某ä¸Ē $DESTINATION$īŧŒč¯ˇé€‰æ‹Šæ­¤é€‰éĄš", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "文äģļ包åĢæœĒåˆ†é…éĄšį›Žã€‚" + }, + "selectFormat": { + "message": "选拊å¯ŧå…Ĩ文äģļįš„æ ŧåŧ" + }, + "selectImportFile": { + "message": "选拊čρå¯ŧå…Ĩįš„æ–‡äģļ" + }, + "chooseFile": { + "message": "选拊文äģļ" + }, + "noFileChosen": { + "message": "æœĒ选拊文äģļ" + }, + "orCopyPasteFileContents": { + "message": "或复åˆļ/ម贴čρå¯ŧå…Ĩįš„æ–‡äģļ内厚" + }, + "instructionsFor": { + "message": "$NAME$ č¯´æ˜Ž", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "įĄŽčŽ¤å¯†į åē“å¯ŧå…Ĩ" + }, + "confirmVaultImportDesc": { + "message": "此文äģļå—å¯†į äŋæŠ¤ã€‚č¯ˇčž“å…Ĩ文äģļ坆᠁äģĨå¯ŧå…Ĩ数捎。" + }, + "confirmFilePassword": { + "message": "įĄŽčŽ¤æ–‡äģļ坆᠁" + }, + "exportSuccess": { + "message": "坆᠁å瓿•°æŽåˇ˛å¯ŧå‡ē" + }, + "typePasskey": { + "message": "é€ščĄŒå¯†é’Ĩ" + }, + "accessing": { + "message": "æ­Ŗåœ¨čŽŋ问" + }, + "passkeyNotCopied": { + "message": "é€ščĄŒå¯†é’Ĩ不äŧščĸĢ复åˆļ" + }, + "passkeyNotCopiedAlert": { + "message": "é€ščĄŒå¯†é’Ĩ将不äŧščĸĢ复åˆļåˆ°å…‹éš†įš„éĄšį›Žã€‚čρįģ§įģ­å…‹éš†čŋ™ä¸ĒéĄšį›Žå—īŧŸ" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "启动įĢ™į‚šéœ€čρéĒŒč¯ã€‚å¯šäēŽæ˛Ąæœ‰ä¸ģå¯†į įš„č´ĻæˆˇīŧŒæ­¤åŠŸčƒŊ尚æœĒåŽžįŽ°ã€‚" + }, + "logInWithPasskeyQuestion": { + "message": "äŊŋį”¨é€ščĄŒå¯†é’Ĩį™ģåŊ•吗īŧŸ" + }, + "passkeyAlreadyExists": { + "message": "æ­¤åē”ᔍፋåēåˇ˛å­˜åœ¨ä¸€ä¸Ēé€ščĄŒå¯†é’Ĩ。" + }, + "noPasskeysFoundForThisApplication": { + "message": "æ˛Ąæœ‰æ‰žåˆ°æ­¤åē”ᔍፋåēįš„é€ščĄŒå¯†é’Ĩ。" + }, + "noMatchingPasskeyLogin": { + "message": "不存在匚配此įĢ™į‚šįš„į™ģåŊ•éĄšį›Žã€‚" + }, + "noMatchingLoginsForSite": { + "message": "æ­¤įĢ™į‚šæ˛Ąæœ‰åŒšé…įš„į™ģåŊ•éĄšį›Ž" + }, + "searchSavePasskeyNewLogin": { + "message": "搜į´ĸæˆ–å°†é€ščĄŒå¯†é’Ĩäŋå­˜ä¸ē一ä¸Ēæ–°įš„į™ģåŊ•" + }, + "confirm": { + "message": "įĄŽčŽ¤" + }, + "savePasskey": { + "message": "äŋå­˜é€ščĄŒå¯†é’Ĩ" + }, + "savePasskeyNewLogin": { + "message": "äŊœä¸ēæ–°įš„į™ģåŊ•éĄšį›Žäŋå­˜é€ščĄŒå¯†é’Ĩ" + }, + "chooseCipherForPasskeySave": { + "message": "选拊一ä¸ĒᔍäēŽäŋå­˜æ­¤é€ščĄŒå¯†é’Ĩįš„į™ģåŊ•éĄšį›Ž" + }, + "chooseCipherForPasskeyAuth": { + "message": "选拊一ä¸ĒᔍäēŽį™ģåŊ•įš„é€ščĄŒå¯†é’Ĩ" + }, + "passkeyItem": { + "message": "é€ščĄŒå¯†é’ĨéĄšį›Ž" + }, + "overwritePasskey": { + "message": "čĻ†į›–é€ščĄŒå¯†é’Ĩ吗īŧŸ" + }, + "overwritePasskeyAlert": { + "message": "æ­¤éĄšį›Žåˇ˛åŒ…åĢ一ä¸Ēé€ščĄŒå¯†é’Ĩã€‚įĄŽåŽščρčφᛖåŊ“å‰įš„é€ščĄŒå¯†é’Ĩ吗īŧŸ" + }, + "featureNotSupported": { + "message": "功čƒŊ尚不čĸĢæ”¯æŒ" + }, + "yourPasskeyIsLocked": { + "message": "äŊŋį”¨é€ščĄŒå¯†é’Ĩ需čρčēĢäģŊéĒŒč¯ã€‚č¯ˇénj蝁čēĢäģŊäģĨįģ§įģ­ã€‚" + }, + "multifactorAuthenticationCancelled": { + "message": "多重čēĢäģŊéĒŒč¯åˇ˛å–æļˆ" + }, + "noLastPassDataFound": { + "message": "æœĒ扞到 LastPass 数捎" + }, + "incorrectUsernameOrPassword": { + "message": "į”¨æˆˇåæˆ–å¯†į ä¸æ­ŖįĄŽ" + }, + "incorrectPassword": { + "message": "å¯†į ä¸æ­ŖįĄŽ" + }, + "incorrectCode": { + "message": "éĒŒč¯į ä¸æ­ŖįĄŽ" + }, + "incorrectPin": { + "message": "PIN į ä¸æ­ŖįĄŽ" + }, + "multifactorAuthenticationFailed": { + "message": "多重čēĢäģŊéĒŒč¯å¤ąč´Ĩ" + }, + "includeSharedFolders": { + "message": "包åĢå…ąäēĢįš„æ–‡äģļ多" + }, + "lastPassEmail": { + "message": "LastPass Email" + }, + "importingYourAccount": { + "message": "æ­Ŗåœ¨å¯ŧå…Ĩæ‚¨įš„č´Ļæˆˇ..." + }, + "lastPassMFARequired": { + "message": "需čρ LastPass 多重čēĢäģŊénj蝁" + }, + "lastPassMFADesc": { + "message": "输å…ĨæĨč‡ĒčēĢäģŊénj蝁 App įš„ä¸€æŦĄæ€§é€ščĄŒäģŖį " + }, + "lastPassOOBDesc": { + "message": "åœ¨æ‚¨įš„čēĢäģŊénj蝁 App 中扚准į™ģåŊ•č¯ˇæą‚æˆ–čž“å…Ĩ一æŦĄæ€§é€ščĄŒäģŖį ã€‚" + }, + "passcode": { + "message": "通行äģŖį " + }, + "lastPassMasterPassword": { + "message": "LastPass ä¸ģ坆᠁" + }, + "lastPassAuthRequired": { + "message": "需čρ LastPass čēĢäģŊénj蝁" + }, + "awaitingSSO": { + "message": "į­‰åž… SSO čēĢäģŊénj蝁" + }, + "awaitingSSODesc": { + "message": "蝎äŊŋį”¨æ‚¨įš„å…Ŧ司凭捎įģ§įģ­į™ģåŊ•。" + }, + "seeDetailedInstructions": { + "message": "č¯ˇå‚é˜…æˆ‘äģŦįš„å¸ŽåŠŠįŊ‘įĢ™ä¸Šįš„č¯Ļįģ†č¯´æ˜Žīŧš", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "äģŽ LastPass į›´æŽĨå¯ŧå…Ĩ" + }, + "importFromCSV": { + "message": "äģŽ CSV å¯ŧå…Ĩ" + }, + "lastPassTryAgainCheckEmail": { + "message": "č¯ˇé‡č¯•æˆ–æŸĨ扞æĨč‡Ē LastPass įš„å¯äģĨéĒŒč¯æ‚¨įš„čēĢäģŊįš„į”ĩ子邎äģļ。" + }, + "collection": { + "message": "集合" + }, + "lastPassYubikeyDesc": { + "message": "å°†ä¸Žæ‚¨įš„ LastPass č´Ļæˆˇå…ŗč”įš„ YubiKey 插å…ĨčŽĄįŽ—æœēįš„ USB įĢ¯åŖīŧŒį„ļ后č§Ļ摸å…ļ按钎。" + }, + "switchAccount": { + "message": "切æĸč´Ļæˆˇ" + }, + "switchAccounts": { + "message": "切æĸč´Ļæˆˇ" + }, + "switchToAccount": { + "message": "切æĸ到č´Ļæˆˇ" + }, + "activeAccount": { + "message": "æ´ģ动č´Ļæˆˇ" + }, + "availableAccounts": { + "message": "å¯į”¨č´Ļæˆˇ" + }, + "accountLimitReached": { + "message": "åˇ˛čžžåˆ°č´Ļæˆˇä¸Šé™ã€‚č¯ˇæŗ¨é”€ä¸€ä¸Ēč´ĻæˆˇåŽå†æˇģ加å…ļäģ–č´Ļæˆˇã€‚" + }, + "active": { + "message": "æ´ģåŠ¨įš„" + }, + "locked": { + "message": "åˇ˛é”åŽš" + }, + "unlocked": { + "message": "厞觪锁" + }, + "server": { + "message": "æœåŠĄå™¨" + }, + "hostedAt": { + "message": "æ‰˜įŽĄäēŽ" + }, + "useDeviceOrHardwareKey": { + "message": "äŊŋį”¨æ‚¨įš„čŽžå¤‡æˆ–åŽžäŊ“é’Ĩ匙" + }, + "justOnce": { + "message": "äģ…æ­¤ä¸€æŦĄ" + }, + "alwaysForThisSite": { + "message": "æ€ģ是ä¸ēæ­¤įĢ™į‚š" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ 厞æˇģåŠ åˆ°æŽ’é™¤åŸŸååˆ—čĄ¨ã€‚", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "叏规æ ŧåŧ", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "前垀æĩč§ˆå™¨čŽžįŊŽå—īŧŸ", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "前垀帎劊中åŋƒå—īŧŸ", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "更攚æĩč§ˆå™¨įš„č‡Ē动åĄĢå……å’Œå¯†į įŽĄį†čŽžįŊŽã€‚", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "您可äģĨ在æĩč§ˆå™¨įš„莞įŊŽä¸­æŸĨįœ‹å’ŒčŽžįŊŽæ‰Šåą•įš„åŋĢæˇé”Žã€‚", + "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": "更攚æĩč§ˆå™¨įš„č‡Ē动åĄĢå……å’Œå¯†į įŽĄį†čŽžįŊŽã€‚", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "您可äģĨ在æĩč§ˆå™¨įš„莞įŊŽä¸­æŸĨįœ‹å’ŒčŽžįŊŽæ‰Šåą•įš„åŋĢæˇé”Žã€‚", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "将 Bitwarden 莞įŊŽä¸ēæ‚¨įš„éģ˜čŽ¤å¯†į įŽĄį†å™¨å—īŧŸ", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "åŋŊį•Ĩæ­¤é€‰éĄšå¯čƒŊäŧšå¯ŧ致 Bitwarden č‡Ē动åĄĢ充åģē议与æĩč§ˆå™¨äē§į”Ÿå†˛įĒã€‚", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "将 Bitwarden 莞įŊŽä¸ēæ‚¨įš„éģ˜čŽ¤å¯†į įŽĄį†å™¨", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "æ— æŗ•å°† Bitwarden 莞įŊŽä¸ēéģ˜čŽ¤å¯†į įŽĄį†å™¨", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "您åŋ…éĄģ授äēˆ Bitwarden æĩč§ˆå™¨éšį§æƒé™æ‰čƒŊ将å…ļ莞įŊŽä¸ēéģ˜čŽ¤å¯†į įŽĄį†å™¨ã€‚", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "莞ä¸ēéģ˜čޤ", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "凭捎äŋå­˜æˆåŠŸīŧ", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "坆᠁厞äŋå­˜īŧ", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "凭捎更新成功īŧ", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "å¯†į åˇ˛æ›´æ–°īŧ", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "äŋå­˜å‡­æŽæ—ļå‡ēé”™ã€‚æŖ€æŸĨ控åˆļ台äģĨčŽˇå–č¯Ļįģ†äŋĄæ¯ã€‚", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "成功" + }, + "removePasskey": { + "message": "į§ģé™¤é€ščĄŒå¯†é’Ĩ" + }, + "passkeyRemoved": { + "message": "é€ščĄŒå¯†é’Ĩ厞į§ģ除" + }, + "autofillSuggestions": { + "message": "č‡Ē动åĄĢ充åģē莎" + }, + "autofillSuggestionsTip": { + "message": "äŋå­˜æ­¤įĢ™į‚šįš„į™ģåŊ•éĄšį›Žį”¨æĨč‡Ē动åĄĢ充" + }, + "yourVaultIsEmpty": { + "message": "æ‚¨įš„å¯†į å瓿˜¯įŠēįš„" + }, + "noItemsMatchSearch": { + "message": "æ˛Ąæœ‰æœį´ĸåˆ°åŒšé…įš„éĄšį›Ž" + }, + "clearFiltersOrTryAnother": { + "message": "æ¸…é™¤į­›é€‰å™¨æˆ–å°č¯•åĻ一ä¸Ē搜į´ĸč¯" + }, + "copyInfoTitle": { + "message": "复åˆļäŋĄæ¯ - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "复åˆļå¤‡æŗ¨ - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "æ›´å¤šé€‰éĄšīŧŒ$ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "æ›´å¤šé€‰éĄš - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "æŸĨįœ‹éĄšį›Ž - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "č‡Ē动åĄĢ充 - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "æ˛Ąæœ‰čĻå¤åˆļįš„å€ŧ" + }, + "assignToCollections": { + "message": "分配到集合" + }, + "copyEmail": { + "message": "复åˆļį”ĩ子邎äģļ地址" + }, + "copyPhone": { + "message": "复åˆļį”ĩč¯åˇį " + }, + "copyAddress": { + "message": "复åˆļ地址" + }, + "adminConsole": { + "message": "įŽĄį†æŽ§åˆļ台" + }, + "accountSecurity": { + "message": "č´ĻæˆˇåŽ‰å…¨" + }, + "notifications": { + "message": "通įŸĨ" + }, + "appearance": { + "message": "外观" + }, + "errorAssigningTargetCollection": { + "message": "åˆ†é…į›Žæ ‡é›†åˆæ—ļå‡ē错。" + }, + "errorAssigningTargetFolder": { + "message": "åˆ†é…į›Žæ ‡æ–‡äģļ多æ—ļå‡ē错。" + }, + "viewItemsIn": { + "message": "æŸĨįœ‹ $NAME$ ä¸­įš„éĄšį›Ž", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "čŋ”回 $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "新åĸž" + }, + "removeItem": { + "message": "删除 $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "无文äģļå¤šįš„éĄšį›Ž" + }, + "itemDetails": { + "message": "éĄšį›Žč¯Ļįģ†äŋĄæ¯" + }, + "itemName": { + "message": "éĄšį›Žåį§°" + }, + "cannotRemoveViewOnlyCollections": { + "message": "æ‚¨æ— æŗ•åˆ é™¤äģ…å…ˇæœ‰ã€ŒæŸĨįœ‹ã€æƒé™įš„é›†åˆīŧš$COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "įģ„įģ‡åˇ˛åœį”¨" + }, + "owner": { + "message": "æ‰€æœ‰č€…" + }, + "selfOwnershipLabel": { + "message": "您", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "æ— æŗ•čŽŋé—Žåˇ˛åœį”¨įģ„įģ‡ä¸­įš„éĄšį›Žã€‚č¯ˇč”įŗģæ‚¨įš„įģ„į쇿‰€æœ‰č€…čŽˇå–ååŠŠã€‚" + }, + "additionalInformation": { + "message": "更多äŋĄæ¯" + }, + "itemHistory": { + "message": "éĄšį›ŽåŽ†å˛čŽ°åŊ•" + }, + "lastEdited": { + "message": "上æŦĄįŧ–čž‘" + }, + "ownerYou": { + "message": "æ‰€æœ‰č€…īŧ𿂍" + }, + "linked": { + "message": "åˇ˛é“žæŽĨ" + }, + "copySuccessful": { + "message": "复åˆļ成功" + }, + "upload": { + "message": "上äŧ " + }, + "addAttachment": { + "message": "æˇģ加附äģļ" + }, + "maxFileSizeSansPunctuation": { + "message": "最大文äģļ大小ä¸ē 500 MB" + }, + "deleteAttachmentName": { + "message": "删除附äģļ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "下čŊŊ $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "æ‚¨įĄŽåŽščĻæ°¸äš…åˆ é™¤æ­¤é™„äģļ吗īŧŸ" + }, + "premium": { + "message": "é̘įē§äŧšå‘˜" + }, + "freeOrgsCannotUseAttachments": { + "message": "å…č´šįģ„į쇿— æŗ•äŊŋᔍ附äģļ" + }, + "filters": { + "message": "᭛选" + }, + "personalDetails": { + "message": "ä¸Ēäēēč¯Ļįģ†äŋĄæ¯" + }, + "identification": { + "message": "čēĢäģŊ" + }, + "contactInfo": { + "message": "联įŗģäŋĄæ¯" + }, + "downloadAttachment": { + "message": "下čŊŊ - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "åĄåˇįģ“å°žä¸ē", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "į™ģåŊ•凭捎" + }, + "authenticatorKey": { + "message": "éĒŒč¯å™¨å¯†é’Ĩ" + }, + "autofillOptions": { + "message": "č‡Ē动åĄĢå……é€‰éĄš" + }, + "websiteUri": { + "message": "įŊ‘įĢ™ (URI)" + }, + "websiteUriCount": { + "message": "įŊ‘įĢ™ (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "įŊ‘å€åˇ˛æˇģ加" + }, + "addWebsite": { + "message": "æˇģ加įŊ‘įĢ™" + }, + "deleteWebsite": { + "message": "删除įŊ‘įĢ™" + }, + "defaultLabel": { + "message": "éģ˜čޤ ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "昞į¤ēåŒšé…æŖ€æĩ‹ $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "éšč—åŒšé…æŖ€æĩ‹ $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "éĄĩéĸ加čŊŊæ—ļč‡Ē动åĄĢ充吗īŧŸ" + }, + "cardExpiredTitle": { + "message": "čŋ‡æœŸįš„æ”¯äģ˜åĄ" + }, + "cardExpiredMessage": { + "message": "åĻ‚æžœæ‚¨įš„æ”¯äģ˜åĄåˇ˛įģ­æœŸīŧŒč¯ˇæ›´æ–°č¯ĨåĄįš„äŋĄæ¯ã€‚" + }, + "cardDetails": { + "message": "支äģ˜åĄč¯Ļįģ†äŋĄæ¯" + }, + "cardBrandDetails": { + "message": "$BRAND$ č¯Ļįģ†äŋĄæ¯", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "å¯į”¨åŠ¨į”ģ" + }, + "showAnimations": { + "message": "昞į¤ē动į”ģ" + }, + "addAccount": { + "message": "æˇģ加č´Ļæˆˇ" + }, + "loading": { + "message": "加čŊŊ中" + }, + "data": { + "message": "数捎" + }, + "passkeys": { + "message": "é€ščĄŒå¯†é’Ĩ", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "坆᠁", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "äŊŋį”¨é€ščĄŒå¯†é’Ĩį™ģåŊ•", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "分配" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "åĒæœ‰å…ˇæœ‰čŋ™äē›é›†åˆčŽŋé—Žæƒé™įš„įģ„į쇿ˆå‘˜æ‰čƒŊįœ‹åˆ°čŋ™ä¸ĒéĄšį›Žã€‚" + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "åĒæœ‰å…ˇæœ‰čŋ™äē›é›†åˆčŽŋé—Žæƒé™įš„įģ„į쇿ˆå‘˜æ‰čƒŊįœ‹åˆ°čŋ™äē›éĄšį›Žã€‚" + }, + "bulkCollectionAssignmentWarning": { + "message": "您选拊äē† $TOTAL_COUNT$ ä¸ĒéĄšį›Žã€‚å…ļä¸­įš„ $READONLY_COUNT$ ä¸ĒéĄšį›Žį”ąäēŽæ‚¨æ˛Ąæœ‰įŧ–čž‘æƒé™īŧŒæ‚¨å°†æ— æŗ•æ›´æ–°åރäģŦ。", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "æˇģ加字æŽĩ" + }, + "add": { + "message": "æˇģ加" + }, + "fieldType": { + "message": "字æŽĩįąģ型" + }, + "fieldLabel": { + "message": "字æŽĩæ ‡į­ž" + }, + "textHelpText": { + "message": "寚äēŽåĻ‚åŽ‰å…¨é—Žéĸ˜äš‹įąģįš„æ•°æŽīŧŒč¯ˇäŊŋį”¨æ–‡æœŦ型字æŽĩ" + }, + "hiddenHelpText": { + "message": "寚äēŽåĻ‚å¯†į äš‹įąģįš„æ•æ„Ÿæ•°æŽīŧŒč¯ˇäŊŋį”¨éšč—åž‹å­—æŽĩ" + }, + "checkBoxHelpText": { + "message": "åĻ‚æžœæ‚¨æƒŗč‡ĒåŠ¨å‹žé€‰čĄ¨å•å¤é€‰æĄ†īŧˆäž‹åĻ‚čŽ°äŊį”ĩ子邎äģļ地址īŧ‰īŧŒč¯ˇäŊŋį”¨å¤é€‰æĄ†" + }, + "linkedHelpText": { + "message": "åŊ“æ‚¨å¤„į†į‰šåޚįŊ‘įĢ™įš„č‡Ē动åĄĢå……é—Žéĸ˜æ—ļīŧŒč¯ˇäŊŋį”¨é“žæŽĨ型字æŽĩ。" + }, + "linkedLabelHelpText": { + "message": "输å…Ĩ字æŽĩįš„ html idã€åį§°ã€aria-label 或占äŊįŦĻ。" + }, + "editField": { + "message": "įŧ–čž‘å­—æŽĩ" + }, + "editFieldLabel": { + "message": "įŧ–čž‘ $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "删除 $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ 厞æˇģ加", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "重新排åē $LABEL$。äŊŋį”¨æ–šå‘é”Žå‘ä¸Šæˆ–å‘ä¸‹į§ģåŠ¨éĄšį›Žã€‚", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ 厞䏊į§ģīŧŒäŊįŊŽ $INDEX$ / $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "选拊čĻåˆ†é…įš„é›†åˆ" + }, + "personalItemTransferWarningSingular": { + "message": "1 ä¸ĒéĄšį›Žå°†æ°¸äš…čŊŦį§ģ到所选įģ„įģ‡ã€‚您将不再æ‹Ĩ有č¯ĨéĄšį›Žã€‚" + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ä¸ĒéĄšį›Žå°†æ°¸äš…čŊŦį§ģ到所选įģ„įģ‡ã€‚您将不再æ‹Ĩ有čŋ™äē›éĄšį›Žã€‚", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 ä¸ĒéĄšį›Žå°†æ°¸äš…čŊŦį§ģ到 $ORG$ 。您将不再æ‹Ĩ有č¯ĨéĄšį›Žã€‚", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ ä¸ĒéĄšį›Žå°†æ°¸äš…čŊŦį§ģ到 $ORG$ 。您将不再æ‹Ĩ有čŋ™äē›éĄšį›Žã€‚", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "成功分配äē†é›†åˆ" + }, + "nothingSelected": { + "message": "您尚æœĒ选拊äģģäŊ•内厚。" + }, + "movedItemsToOrg": { + "message": "æ‰€é€‰éĄšį›Žåˇ˛į§ģ动到 $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "éĄšį›Žåˇ˛į§ģ动到 $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "éĄšį›Žåˇ˛į§ģ动到 $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ 厞䏋į§ģīŧŒäŊįŊŽ $INDEX$ / $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "éĄšį›ŽäŊįŊŽ" + }, + "fileSend": { + "message": "文äģļ Send" + }, + "fileSends": { + "message": "文äģļ Send" + }, + "textSend": { + "message": "文æœŦ Send" + }, + "textSends": { + "message": "文æœŦ Send" + }, + "bitwardenNewLook": { + "message": "Bitwarden æ‹Ĩ有一ä¸Ēæ–°įš„å¤–č§‚īŧ" + }, + "bitwardenNewLookDesc": { + "message": "äģŽå¯†į å瓿 ‡į­žéĄĩč‡Ē动åĄĢ充和搜į´ĸ比äģĨ垀äģģäŊ•æ—ļ候éƒŊæ›´įŽ€å•į›´č§‚ã€‚æĨįœ‹įœ‹å§īŧ" + }, + "accountActions": { + "message": "č´Ļæˆˇæ“äŊœ" + }, + "showNumberOfAutofillSuggestions": { + "message": "åœ¨æ‰Šåą•å›žæ ‡ä¸Šæ˜žį¤ēč‡Ē动åĄĢ充åģēčŽŽįš„į™ģåŊ•įš„æ•°é‡" + }, + "systemDefault": { + "message": "跟随įŗģįģŸ" + }, + "enterprisePolicyRequirementsApplied": { + "message": "äŧä¸šį­–į•ĨčĻæą‚åˇ˛åē”ᔍäēŽæ­¤čŽžįŊŽ" + }, + "sshPrivateKey": { + "message": "ᧁé’Ĩ" + }, + "sshPublicKey": { + "message": "å…Ŧé’Ĩ" + }, + "sshFingerprint": { + "message": "指įēš" + }, + "sshKeyAlgorithm": { + "message": "密é’Ĩįąģ型" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "é‡č¯•" + }, + "vaultCustomTimeoutMinimum": { + "message": "č‡Ē厚䚉čļ…æ—ļæ—ļ间最小ä¸ē 1 分钟。" + }, + "additionalContentAvailable": { + "message": "å…ļäģ–å†…åŽšå¯į”¨" + }, + "fileSavedToDevice": { + "message": "文äģļ厞äŋå­˜åˆ°čŽžå¤‡ã€‚å¯äģĨåœ¨čŽžå¤‡ä¸‹čŊŊ中čŋ›čĄŒįŽĄį†ã€‚" + }, + "showCharacterCount": { + "message": "昞į¤ē字įŦĻčŽĄæ•°" + }, + "hideCharacterCount": { + "message": "éšč—å­—įŦĻčŽĄæ•°" + }, + "itemsInTrash": { + "message": "回æ”ļįĢ™ä¸­įš„éĄšį›Ž" + }, + "noItemsInTrash": { + "message": "回æ”ļįĢ™ä¸­æ˛Ąæœ‰éĄšį›Ž" + }, + "noItemsInTrashDesc": { + "message": "æ‚¨åˆ é™¤įš„éĄšį›Žå°†æ˜žį¤ē在čŋ™é‡ŒīŧŒåšļ在 30 夊后永䚅删除" + }, + "trashWarning": { + "message": "回æ”ļį̙䏭čļ…čŋ‡ 30 å¤Šįš„éĄšį›Žå°†čĸĢč‡Ē动删除" + }, + "restore": { + "message": "æĸ复" + }, + "deleteForever": { + "message": "永䚅删除" + }, + "noEditPermissions": { + "message": "æ‚¨æ˛Ąæœ‰įŧ–čž‘æ­¤éĄšį›Žįš„æƒé™" + }, + "authenticating": { + "message": "æ­Ŗåœ¨énj蝁" + }, + "fillGeneratedPassword": { + "message": "åĄĢå……åˇ˛į”Ÿæˆįš„å¯†į ", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "å¯†į åˇ˛é‡æ–°į”Ÿæˆ", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "将į™ģåŊ•äŋå­˜åˆ° Bitwarden 吗īŧŸ", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "įŠēæ ŧ", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "æŗĸæĩĒåˇ", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "反åŧ•åˇ", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "æ„Ÿåšåˇ", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "č‰žį‰šåˇ", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "äē•åˇ", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "įžŽå…ƒįŦĻåˇ", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "į™žåˆ†åˇ", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "插å…ĨįŦĻ", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "与和įŦĻ", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "æ˜Ÿåˇ", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "åˇĻæ‹Ŧåˇ", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "åŗæ‹Ŧåˇ", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "下划įēŋ", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "čŋžå­—įŦĻ", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "åŠ åˇ", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "į­‰åˇ", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "åˇĻ大æ‹Ŧåˇ", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "åŗå¤§æ‹Ŧåˇ", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "åˇĻ中æ‹Ŧåˇ", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "åŗä¸­æ‹Ŧåˇ", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "įĢ–įēŋ", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "反斜杠", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "å†’åˇ", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "åˆ†åˇ", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "双åŧ•åˇ", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "单åŧ•åˇ", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "小äēŽåˇ", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "大äēŽåˇ", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "é€—åˇ", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "åĨåˇ", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "é—Žåˇ", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "æ­Ŗæ–œæ ", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "小写" + }, + "uppercaseAriaLabel": { + "message": "大写" + }, + "generatedPassword": { + "message": "į”Ÿæˆäē†å¯†į " } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 3612d93edb3..8a4ff40e9c5 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -8,16 +8,34 @@ }, "extDesc": { "message": "Bitwarden 是一æŦžåŽ‰å…¨ã€å…č˛ģã€čˇ¨åšŗå°įš„å¯†įĸŧįŽĄį†åˇĨå…ˇã€‚", - "description": "Extension description" + "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "į™ģå…Ĩ或åģēį̋叺æˆļäģĨå­˜å–æ‚¨įš„åŽ‰å…¨å¯†įĸŧåēĢ。" }, + "inviteAccepted": { + "message": "邀č̋厞æŽĨ受" + }, "createAccount": { "message": "åģēį̋叺æˆļ" }, - "login": { - "message": "į™ģå…Ĩ" + "newToBitwarden": { + "message": "New to Bitwarden?" + }, + "logInWithPasskey": { + "message": "Log in with passkey" + }, + "useSingleSignOn": { + "message": "Use single sign-on" + }, + "welcomeBack": { + "message": "Welcome back" + }, + "setAStrongPassword": { + "message": "č¨­åŽšä¸€å€‹åŧˇå¯†įĸŧ" + }, + "finishCreatingYourAccountBySettingAPassword": { + "message": "č¨­åŽšå¯†įĸŧäģĨ厌成å‰ĩåģēæ‚¨įš„叺æˆļ。" }, "enterpriseSingleSignOn": { "message": "äŧæĨ­å–Žä¸€į™ģå…Ĩ" @@ -43,12 +61,40 @@ "masterPassHintDesc": { "message": "ä¸ģ密įĸŧ提į¤ē可äģĨ在您åŋ˜č¨˜ä¸ģ密įĸŧ時åšĢ劊您回æ†ļä¸ģ密įĸŧ。" }, + "masterPassHintText": { + "message": "åĻ‚æžœæ‚¨åŋ˜č¨˜äē†å¯†įĸŧīŧŒå¯äģĨ傺送坆įĸŧ提į¤ēåˆ°æ‚¨įš„é›ģ子éƒĩäģļ。$CURRENT$ / 最多 $MAXIMUM$ 個字元", + "placeholders": { + "current": { + "content": "$1", + "example": "0" + }, + "maximum": { + "content": "$2", + "example": "50" + } + } + }, "reTypeMasterPass": { "message": "再æŦĄčŧ¸å…Ĩä¸ģ密įĸŧ" }, "masterPassHint": { "message": "ä¸ģ密įĸŧ提į¤ēīŧˆé¸į”¨īŧ‰" }, + "joinOrganization": { + "message": "加å…Ĩįĩ„įš”" + }, + "joinOrganizationName": { + "message": "Join $ORGANIZATIONNAME$", + "placeholders": { + "organizationName": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "finishJoiningThisOrganizationBySettingAMasterPassword": { + "message": "č¨­åŽšä¸ģ密įĸŧäģĨ厌成加å…Ĩ這個įĩ„įš”" + }, "tab": { "message": "分頁" }, @@ -73,6 +119,9 @@ "copyPassword": { "message": "複čŖŊ密įĸŧ" }, + "copyPassphrase": { + "message": "Copy passphrase" + }, "copyNote": { "message": "複čŖŊ備č¨ģ" }, @@ -88,9 +137,61 @@ "copySecurityCode": { "message": "複čŖŊ厉全äģŖįĸŧ" }, + "copyName": { + "message": "複čŖŊåį¨ą" + }, + "copyCompany": { + "message": "複čŖŊå…Ŧå¸åį¨ą" + }, + "copySSN": { + "message": "複čŖŊį¤žæœƒäŋéšĒ號įĸŧ" + }, + "copyPassportNumber": { + "message": "複čŖŊč­ˇį…§č™Ÿįĸŧ" + }, + "copyLicenseNumber": { + "message": "複čŖŊé§•į…§č™Ÿįĸŧ" + }, + "copyPrivateKey": { + "message": "Copy private key" + }, + "copyPublicKey": { + "message": "Copy public key" + }, + "copyFingerprint": { + "message": "Copy fingerprint" + }, + "copyCustomField": { + "message": "複čŖŊ $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "複čŖŊįļ˛įĢ™" + }, + "copyNotes": { + "message": "複čŖŊ備č¨ģ" + }, + "fill": { + "message": "Fill", + "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." + }, "autoFill": { "message": "č‡Ē動åĄĢå…Ĩ" }, + "autoFillLogin": { + "message": "č‡Ē動åĄĢå…Ĩį™ģå…Ĩčŗ‡č¨Š" + }, + "autoFillCard": { + "message": "č‡Ē動åĄĢå…Ĩ支äģ˜åĄ" + }, + "autoFillIdentity": { + "message": "č‡Ē動åĄĢå…ĨčēĢåˆ†čŗ‡č¨Š" + }, "generatePasswordCopied": { "message": "į”ĸį”ŸåŠč¤‡čŖŊ密įĸŧ" }, @@ -100,6 +201,21 @@ "noMatchingLogins": { "message": "į„ĄįŦĻåˆįš„į™ģå…Ĩčŗ‡æ–™" }, + "noCards": { + "message": "į„Ąæ”¯äģ˜åĄ" + }, + "noIdentities": { + "message": "į„ĄčēĢåˆ†čŗ‡č¨Š" + }, + "addLoginMenu": { + "message": "新åĸžį™ģå…Ĩčŗ‡č¨Š" + }, + "addCardMenu": { + "message": "新åĸžæ”¯äģ˜åĄ" + }, + "addIdentityMenu": { + "message": "新åĸžčēĢåˆ†čŗ‡č¨Š" + }, "unlockVaultMenu": { "message": "č§ŖéŽ–æ‚¨įš„å¯†įĸŧåēĢ" }, @@ -107,7 +223,7 @@ "message": "į™ģå…Ĩæ‚¨įš„å¯†įĸŧåēĢ" }, "autoFillInfo": { - "message": "æ˛’æœ‰å¯äģĨč‡Ē動åĄĢå…Ĩį›Žå‰į€čĻŊå™¨åˆ†é įš„į™ģå…Ĩčŗ‡æ–™ã€‚" + "message": "æ˛’æœ‰å¯äģĨåœ¨į›Žå‰į€čĻŊ器分頁č‡Ē動åĄĢå…Ĩįš„į™ģå…Ĩčŗ‡č¨Šã€‚" }, "addLogin": { "message": "新åĸžį™ģå…Ĩčŗ‡æ–™" @@ -115,6 +231,18 @@ "addItem": { "message": "新åĸžé …į›Ž" }, + "accountEmail": { + "message": "叺æˆļé›ģ子éƒĩäģļ" + }, + "requestHint": { + "message": "čĢ‹æą‚æį¤ē" + }, + "requestPasswordHint": { + "message": "čĢ‹æą‚å¯†įĸŧ提į¤ē" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "čŧ¸å…Ĩæ‚¨įš„å¸ŗč™Ÿé›ģ子éƒĩäģļīŧŒæ‚¨įš„密įĸŧ提į¤ēæœƒå‚ŗé€įĩĻæ‚¨" + }, "passwordHint": { "message": "密įĸŧ提į¤ē" }, @@ -142,12 +270,30 @@ "confirmIdentity": { "message": "čĢ‹å…ˆįĸēčĒčēĢ分垌再įšŧįēŒã€‚" }, - "account": { - "message": "叺æˆļ" - }, "changeMasterPassword": { "message": "čŽŠæ›´ä¸ģ密įĸŧ" }, + "continueToWebApp": { + "message": "æŽĨ下來造č¨Ē Web App 嗎īŧŸ" + }, + "continueToWebAppDesc": { + "message": "在 Web æ‡‰į”¨į¨‹åŧä¸ŠæŽĸį´ĸ Bitwarden 叺æˆļįš„æ›´å¤šåŠŸčƒŊ。" + }, + "continueToHelpCenter": { + "message": "æŽĨ下䞆前垀čĒĒæ˜Žä¸­åŋƒå—ŽīŧŸ" + }, + "continueToHelpCenterDesc": { + "message": "在čĒĒæ˜Žä¸­åŋƒäē†č§Ŗæœ‰é—œåĻ‚äŊ•äŊŋᔍ Bitwarden įš„æ›´å¤ščŗ‡č¨Šã€‚" + }, + "continueToBrowserExtensionStore": { + "message": "æŽĨä¸‹äž†åˆ°į€čĻŊå™¨įš„æ“´å……åĨ—äģļ商åē—īŧŸ" + }, + "continueToBrowserExtensionStoreDesc": { + "message": "åšĢ劊å…ļäģ–äēēäē†č§Ŗ Bitwarden 是åĻ遊合äģ–們。įĢ‹åŗé€ č¨Ēį€čĻŊå™¨įš„æ“´å……åĨ—äģļ商åē—ä¸Ļį•™ä¸‹čŠ•åˆ†ã€‚" + }, + "changeMasterPasswordOnWebConfirmation": { + "message": "您可äģĨ在 Bitwarden Web æ‡‰į”¨į¨‹åŧä¸ŠčŽŠæ›´ä¸ģ密įĸŧ。" + }, "fingerprintPhrase": { "message": "æŒ‡į´‹įŸ­čĒž", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -162,9 +308,45 @@ "logOut": { "message": "į™ģå‡ē" }, + "aboutBitwarden": { + "message": "關æ–ŧ Bitwarden" + }, "about": { "message": "關æ–ŧ" }, + "moreFromBitwarden": { + "message": "來č‡Ē Bitwarden įš„æ›´å¤šį”ĸ品" + }, + "continueToBitwardenDotCom": { + "message": "æŽĨ下䞆到 bitwarden.comīŧŸ" + }, + "bitwardenForBusiness": { + "message": "Bitwarden 商æĨ­į‰ˆ" + }, + "bitwardenAuthenticator": { + "message": "Bitwarden éŠ—č­‰å™¨" + }, + "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" + }, + "bitwardenSecretsManager": { + "message": "Bitwarden Secrets Manager" + }, + "continueToSecretsManagerPageDesc": { + "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + }, + "passwordlessDotDev": { + "message": "Passwordless.dev" + }, + "continueToPasswordlessDotDevPageDesc": { + "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + }, + "freeBitwardenFamilies": { + "message": "Free Bitwarden Families" + }, + "freeBitwardenFamiliesPageDesc": { + "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + }, "version": { "message": "į‰ˆæœŦ" }, @@ -183,6 +365,24 @@ "editFolder": { "message": "ᎍčŧ¯čŗ‡æ–™å¤ž" }, + "newFolder": { + "message": "新åĸžčŗ‡æ–™å¤ž" + }, + "folderName": { + "message": "čŗ‡æ–™å¤žåį¨ą" + }, + "folderHintText": { + "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + }, + "noFoldersAdded": { + "message": "No folders added" + }, + "createFoldersToOrganize": { + "message": "Create folders to organize your vault items" + }, + "deleteFolderPermanently": { + "message": "Are you sure you want to permanently delete this folder?" + }, "deleteFolder": { "message": "åˆĒé™¤čŗ‡æ–™å¤ž" }, @@ -218,13 +418,13 @@ }, "generator": { "message": "į”ĸį”Ÿå™¨", - "description": "Short for 'Password Generator'." + "description": "Short for 'credential generator'." }, "passGenInfo": { "message": "č‡Ē動į”ĸį”ŸåŽ‰å…¨ã€å”¯ä¸€įš„į™ģå…Ĩ密įĸŧ。" }, - "bitWebVault": { - "message": "Bitwarden įļ˛é į‰ˆå¯†įĸŧåēĢ" + "bitWebVaultApp": { + "message": "Bitwarden web app" }, "importItems": { "message": "匯å…Ĩé …į›Ž" @@ -235,6 +435,9 @@ "generatePassword": { "message": "į”ĸį”Ÿå¯†įĸŧ" }, + "generatePassphrase": { + "message": "Generate passphrase" + }, "regeneratePassword": { "message": "重新į”ĸį”Ÿå¯†įĸŧ" }, @@ -244,17 +447,60 @@ "length": { "message": "長åēĻ" }, + "passwordMinLength": { + "message": "最小密įĸŧ長åēĻ" + }, "uppercase": { - "message": "大å¯Ģ (A-Z)" + "message": "大å¯Ģ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "小å¯Ģ (a-z)" + "message": "小å¯Ģ (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "數字 (0-9)" + "message": "數字 (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "į‰šæŽŠå­—å…ƒ (!@#$%^&*)" + "message": "į‰šæŽŠå­—å…ƒ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "包åĢ", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "喎字數量" @@ -276,7 +522,16 @@ "message": "最少įŦĻ號äŊæ•¸" }, "avoidAmbChar": { - "message": "éŋå…æ˜“æˇˇæˇ†įš„å­—å…ƒ" + "message": "éŋå…æ˜“æˇˇæˇ†įš„å­—å…ƒ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." + }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "搜尋密įĸŧåēĢ" @@ -299,15 +554,30 @@ "password": { "message": "密įĸŧ" }, + "totp": { + "message": "ፋåŧį”ĸį”ŸéŠ—č­‰įĸŧ" + }, "passphrase": { "message": "密įĸŧ៭čĒž" }, "favorite": { "message": "æˆ‘įš„æœ€æ„›" }, + "unfavorite": { + "message": "Unfavorite" + }, + "itemAddedToFavorites": { + "message": "Item added to favorites" + }, + "itemRemovedFromFavorites": { + "message": "Item removed from favorites" + }, "notes": { "message": "備č¨ģ" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "備č¨ģ" }, @@ -326,6 +596,18 @@ "launch": { "message": "前垀" }, + "launchWebsite": { + "message": "開啟įļ˛įĢ™" + }, + "launchWebsiteName": { + "message": "Launch website $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret item" + } + } + }, "website": { "message": "įļ˛įĢ™" }, @@ -338,8 +620,23 @@ "other": { "message": "å…ļäģ–" }, + "unlockMethods": { + "message": "č§ŖéŽ–é¸é …" + }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "č¨­åŽšč§ŖéŽ–æ–šæŗ•äž†čŽŠæ›´æ‚¨įš„å¯†įĸŧåēĢ逞時動äŊœã€‚" + }, + "unlockMethodNeeded": { + "message": "åœ¨č¨­åŽšä¸­č¨­åŽšä¸€å€‹č§ŖéŽ–æ–šåŧ" + }, + "sessionTimeoutHeader": { + "message": "åˇĨäŊœéšŽæŽĩ逞時" + }, + "vaultTimeoutHeader": { + "message": "密įĸŧåēĢ逞時時間" + }, + "otherOptions": { + "message": "å…ļ厃選項" }, "rateExtension": { "message": "į‚ēæœŦåĨ—äģļčŠ•åˆ†" @@ -356,6 +653,15 @@ "yourVaultIsLocked": { "message": "æ‚¨įš„å¯†įĸŧåēĢåˇ˛éŽ–åŽšã€‚čĢ‹éŠ—č­‰čēĢ分äģĨįšŧįēŒã€‚" }, + "yourVaultIsLockedV2": { + "message": "Your vault is locked" + }, + "yourAccountIsLocked": { + "message": "æ‚¨įš„å¸ŗæˆļ厞čĸĢ鎖厚。" + }, + "or": { + "message": "或" + }, "unlock": { "message": "č§ŖéŽ–" }, @@ -378,9 +684,15 @@ "vaultTimeout": { "message": "密įĸŧåēĢ逞時時間" }, + "vaultTimeout1": { + "message": "逞時" + }, "lockNow": { "message": "įĢ‹åŗéŽ–åŽš" }, + "lockAll": { + "message": "鎖厚全部" + }, "immediately": { "message": "įĢ‹åŗ" }, @@ -426,6 +738,18 @@ "security": { "message": "厉全" }, + "confirmMasterPassword": { + "message": "įĸēčĒä¸ģ密įĸŧ" + }, + "masterPassword": { + "message": "ä¸ģ密įĸŧ" + }, + "masterPassImportant": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "masterPassHintLabel": { + "message": "æ‚¨åˇ˛æˆåŠŸå‰ĩåģēæ–°å¸ŗæˆļīŧ" + }, "errorOccurred": { "message": "į™ŧį”ŸéŒ¯čǤ" }, @@ -457,12 +781,27 @@ "newAccountCreated": { "message": "叺æˆļ厞åģēįĢ‹īŧįžåœ¨å¯äģĨį™ģå…Ĩäē†ã€‚" }, + "newAccountCreated2": { + "message": "æ‚¨åˇ˛æˆåŠŸå‰ĩåģēæ–°å¸ŗæˆļīŧ" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, + "youSuccessfullyLoggedIn": { + "message": "į™ģå…Ĩ成功" + }, + "youMayCloseThisWindow": { + "message": "您可äģĨ關閉此čĻ–įĒ—" + }, "masterPassSent": { "message": "厞坄å‡ē包åĢ您ä¸ģ密įĸŧ提į¤ēįš„é›ģ子éƒĩäģļ。" }, "verificationCodeRequired": { "message": "åŋ…é ˆåĄĢå…Ĩ驗證įĸŧ。" }, + "webauthnCancelOrTimeout": { + "message": "The authentication was cancelled or took too long. Please try again." + }, "invalidVerificationCode": { "message": "į„Ąæ•ˆįš„éŠ—č­‰įĸŧ" }, @@ -477,14 +816,59 @@ } }, "autofillError": { - "message": "į„Ąæŗ•åœ¨æ­¤é éĸč‡Ē動åĄĢå…Ĩæ‰€é¸é …į›Žã€‚čĢ‹æ‰‹å‹•č¤‡čŖŊč˛ŧ上。" + "message": "į„Ąæŗ•åœ¨æ­¤é éĸč‡Ē動åĄĢå…Ĩæ‰€é¸é …į›ŽīŧŒčĢ‹æ‰‹å‹•č¤‡čŖŊč˛ŧ上。" + }, + "totpCaptureError": { + "message": "į„Ąæŗ•æŽƒææ­¤įļ˛é įš„äēŒįļ­įĸŧ" + }, + "totpCaptureSuccess": { + "message": "åˇ˛æ–°åĸžéŠ—č­‰å™¨é‡‘é‘°ã€‚" + }, + "totpCapture": { + "message": "åžžį›Žå‰įļ˛é æŽƒæéЗ證噍äēŒįļ­įĸŧ" + }, + "totpHelperTitle": { + "message": "Make 2-step verification seamless" + }, + "totpHelper": { + "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + }, + "totpHelperWithCapture": { + "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + }, + "learnMoreAboutAuthenticators": { + "message": "Learn more about authenticators" + }, + "copyTOTP": { + "message": "複čŖŊéŠ—č­‰å™¨é‡‘é‘° (TOTP)" }, "loggedOut": { "message": "厞į™ģå‡ē" }, + "loggedOutDesc": { + "message": "äŊ åˇ˛įļ“į™ģå‡ēäē†äŊ įš„å¸ŗč™Ÿã€‚" + }, "loginExpired": { "message": "æ‚¨įš„į™ģå…Ĩ階æŽĩåˇ˛éŽæœŸã€‚" }, + "logIn": { + "message": "į™ģå…Ĩ" + }, + "logInToBitwarden": { + "message": "Log in to Bitwarden" + }, + "restartRegistration": { + "message": "Restart registration" + }, + "expiredLink": { + "message": "Expired link" + }, + "pleaseRestartRegistrationOrTryLoggingIn": { + "message": "Please restart registration or try logging in." + }, + "youMayAlreadyHaveAnAccount": { + "message": "You may already have an account" + }, "logOutConfirmation": { "message": "您įĸē厚čρį™ģå‡ē嗎īŧŸ" }, @@ -503,14 +887,14 @@ "addedFolder": { "message": "čŗ‡æ–™å¤žåˇ˛æ–°åĸž" }, - "changeMasterPass": { - "message": "čŽŠæ›´ä¸ģ密įĸŧ" - }, - "changeMasterPasswordConfirmation": { - "message": "您可äģĨ在 bitwarden.com įļ˛é į‰ˆå¯†įĸŧåēĢčŽŠæ›´ä¸ģ密įĸŧã€‚įžåœ¨čĻå‰åž€å—ŽīŧŸ" - }, "twoStepLoginConfirmation": { - "message": "å…Šæ­Ĩ驟į™ģå…Ĩ需čĻæ‚¨åžžå…ļäģ–čŖįŊŽīŧˆäž‹åĻ‚åŽ‰å…¨é‡‘é‘°ã€éŠ—č­‰å™¨į¨‹åŧã€SMS、手抟或é›ģ子éƒĩäģļīŧ‰äž†éŠ—č­‰æ‚¨įš„į™ģå…ĨīŧŒé€™äŊŋæ‚¨įš„å¸ŗæˆļ更加厉全。兊æ­Ĩ驟į™ģå…Ĩ可äģĨ在 bitwarden.com įļ˛é į‰ˆå¯†įĸŧåēĢå•Ÿį”¨ã€‚įžåœ¨čĻå‰åž€å—ŽīŧŸ" + "message": "å…Šæ­Ĩ驟į™ģå…Ĩ需čĻæ‚¨åžžå…ļäģ–čŖįŊŽīŧˆäž‹åĻ‚åŽ‰å…¨é‘°åŒ™ã€éŠ—č­‰å™¨į¨‹åŧã€SMS、手抟或é›ģ子éƒĩäģļīŧ‰äž†éŠ—č­‰æ‚¨įš„į™ģå…ĨīŧŒé€™äŊŋæ‚¨įš„å¸ŗæˆļ更加厉全。兊æ­Ĩ驟į™ģå…Ĩ可äģĨ在 bitwarden.com įļ˛é į‰ˆå¯†įĸŧåēĢå•Ÿį”¨ã€‚įžåœ¨čĻå‰åž€å—ŽīŧŸ" + }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" }, "editedFolder": { "message": "čŗ‡æ–™å¤žåˇ˛å„˛å­˜" @@ -552,6 +936,10 @@ "newUri": { "message": "新åĸž URI" }, + "addDomain": { + "message": "Add domain", + "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." + }, "addedItem": { "message": "é …į›Žåˇ˛æ–°åĸž" }, @@ -592,14 +980,26 @@ "enableAddLoginNotification": { "message": "čŠĸ問新åĸžį™ģå…Ĩčŗ‡æ–™" }, + "vaultSaveOptionsTitle": { + "message": "å„˛å­˜č‡ŗå¯†įĸŧåēĢ選項" + }, "addLoginNotificationDesc": { "message": "在密įĸŧåēĢä¸­æ‰žä¸åˆ°į›¸įŦĻįš„é …į›Žæ™‚čŠĸ問是åĻ新åĸžé …į›Žã€‚" }, + "addLoginNotificationDescAlt": { + "message": "åĻ‚æžœåœ¨æ‚¨įš„å¯†įĸŧåēĢä¸­æ‰žä¸åˆ°é …į›ŽīŧŒå‰‡čŠĸ問是åĻ新åĸžé …į›Žã€‚éŠį”¨æ–ŧæ‰€æœ‰åˇ˛į™ģå…Ĩįš„å¸ŗæˆļ。" + }, + "showCardsInVaultView": { + "message": "Show cards as Autofill suggestions on Vault view" + }, "showCardsCurrentTab": { "message": "æ–ŧ分頁頁éĸéĄ¯į¤ē支äģ˜åĄ" }, "showCardsCurrentTabDesc": { - "message": "æ–ŧ分頁頁éĸéĄ¯į¤ē支äģ˜åĄäģĨäžŋæ–ŧč‡Ē動åĄĢå…Ĩ。" + "message": "æ–ŧ分頁頁éĸéĄ¯į¤ēäŋĄį”¨åĄäģĨäžŋæ–ŧč‡Ē動åĄĢå…Ĩ。" + }, + "showIdentitiesInVaultView": { + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "æ–ŧ分頁頁éĸéĄ¯į¤ēčēĢ分" @@ -627,6 +1027,15 @@ "changedPasswordNotificationDesc": { "message": "åĩæ¸Ŧ到įļ˛į̙坆įĸŧčŽŠæ›´æ™‚īŧŒčŠĸ問是åĻ更新į™ģå…Ĩčŗ‡æ–™å¯†įĸŧ。" }, + "changedPasswordNotificationDescAlt": { + "message": "į•ļåĩæ¸Ŧ到įļ˛įĢ™ä¸Šįš„čŽŠæ›´æ™‚īŧŒčŠĸ問是åĻ更新į™ģå…Ĩįš„å¯†įĸŧã€‚éŠį”¨æ–ŧæ‰€æœ‰åˇ˛į™ģå…Ĩįš„å¸ŗæˆļ。" + }, + "enableUsePasskeys": { + "message": "čŠĸ問是åĻå„˛å­˜ä¸ĻäŊŋᔍ坆įĸŧ金鑰" + }, + "usePasskeysDesc": { + "message": "čŠĸ問是åĻå„˛å­˜æ–°įš„å¯†įĸŧ金鑰或äŊŋį”¨å„˛å­˜åœ¨æ‚¨įš„å¯†įĸŧåēĢä¸­įš„å¯†įĸŧ金鑰į™ģå…Ĩã€‚éŠį”¨æ–ŧæ‰€æœ‰åˇ˛į™ģå…Ĩįš„å¸ŗæˆļ。" + }, "notificationChangeDesc": { "message": "是åĻčρ圍 Bitwarden 中更新此密įĸŧīŧŸ" }, @@ -634,23 +1043,29 @@ "message": "更新" }, "notificationUnlockDesc": { - "message": "Unlock your Bitwarden vault to complete the auto-fill request." + "message": "č§ŖéŽ–æ‚¨įš„ Bitwarden 密įĸŧåēĢäģĨ厌成č‡Ē動åĄĢå…ĨčĢ‹æą‚ã€‚" }, "notificationUnlock": { "message": "č§ŖéŽ–" }, + "additionalOptions": { + "message": "éĄå¤–é¸é …" + }, "enableContextMenuItem": { "message": "éĄ¯į¤ē內厚選喎選項" }, "contextMenuItemDesc": { - "message": "äŊŋᔍčŧ”劊éģžé¸īŧˆåŗéĩ選喎īŧ‰äž†å­˜å–密įĸŧį”ĸį”Ÿå’ŒåŒšé…įš„įļ˛įĢ™į™ģå…Ĩé …į›Žã€‚ " + "message": "äŊŋᔍčŧ”劊éģžé¸īŧˆåŗéĩ選喎īŧ‰äž†å­˜å–密įĸŧį”ĸį”Ÿå’ŒįŦĻåˆįš„įļ˛įĢ™į™ģå…Ĩé …į›Žã€‚ " + }, + "contextMenuItemDescAlt": { + "message": "äŊŋį”¨åŗéĩéģžé¸äž†å­˜å–密įĸŧį”ĸį”Ÿå’Œįļ˛įĢ™įš„įŦĻ合į™ģå…Ĩčŗ‡č¨Šã€‚éŠį”¨æ–ŧæ‰€æœ‰åˇ˛į™ģå…Ĩįš„å¸ŗæˆļ。" }, "defaultUriMatchDetection": { "message": "é č¨­įš„ URI ä¸€č‡´æ€§åĩæ¸Ŧ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "é¸æ“‡åœ¨åŸˇčĄŒč‡Ē動åĄĢå…Ĩᭉ動äŊœæ™‚對į™ģå…Ĩčŗ‡æ–™é€˛čĄŒ URI ä¸€č‡´æ€§åĩæ¸Ŧįš„é č¨­æ–šåŧã€‚" + "message": "é¸æ“‡åœ¨åŸˇčĄŒč‡Ē動åĄĢå…Ĩᭉ動äŊœæ™‚īŧŒį™ģå…Ĩčŗ‡č¨Šįš„é č¨­įĩąä¸€čŗ‡æēæ¨™č­˜įŦĻīŧˆURIīŧ‰æ¯”對斚åŧã€‚" }, "theme": { "message": "ä¸ģ題" @@ -658,6 +1073,9 @@ "themeDesc": { "message": "čŽŠæ›´æ‡‰į”¨į¨‹åŧįš„ä¸ģ題色åŊŠã€‚" }, + "themeDescAlt": { + "message": "čŽŠæ›´æ‡‰į”¨į¨‹åŧįš„ä¸ģ題色åŊŠã€‚éŠį”¨æ–ŧæ‰€æœ‰åˇ˛į™ģå…Ĩįš„å¸ŗæˆļ。" + }, "dark": { "message": "æˇąč‰˛", "description": "Dark color" @@ -667,15 +1085,42 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarized Dark ä¸ģ題", + "message": "Solarized æˇąč‰˛ä¸ģ題", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, + "exportFrom": { + "message": "Export from" + }, "exportVault": { "message": "匯å‡ē密įĸŧåēĢ" }, "fileFormat": { "message": "æĒ”æĄˆæ ŧåŧ" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "filePassword": { + "message": "æĒ”æĄˆå¯†įĸŧ" + }, + "exportPasswordDescription": { + "message": "此密įĸŧ將ᔍæ–ŧ匯å‡ē和匯å…Ĩæ­¤æĒ”æĄˆ" + }, + "accountRestrictedOptionDescription": { + "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "exportTypeHeading": { + "message": "匯å‡ēéĄžåž‹" + }, + "accountRestricted": { + "message": "Account restricted" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm file password“ do not match." + }, "warning": { "message": "č­Ļ告", "description": "WARNING (should stay in capitalized letters if the language permits)" @@ -698,11 +1143,8 @@ "shared": { "message": "åˇ˛å…ąį”¨" }, - "learnOrg": { - "message": "įž­č§Ŗįĩ„įš”" - }, - "learnOrgConfirmation": { - "message": "Bitwarden å…č¨ąæ‚¨äŊŋᔍįĩ„įš”čˆ‡äģ–äēē分äēĢæ‚¨įš„密įĸŧåēĢé …į›Žã€‚æ‚¨æƒŗé€ č¨Ē bitwarden.com įļ˛įĢ™äģĨæˇąå…Ĩäē†č§Ŗå…§åŽšå—ŽīŧŸ" + "bitwardenForBusinessPageDesc": { + "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." }, "moveToOrganization": { "message": "į§ģ動臺įĩ„įš” " @@ -762,6 +1204,9 @@ "file": { "message": "æĒ”æĄˆ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "選取æĒ”æĄˆ" }, @@ -772,7 +1217,7 @@ "message": "功čƒŊä¸å¯į”¨" }, "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "message": "需čρ過į§ģ加密金鑰。čĢ‹é€éŽįļ˛é į‰ˆå¯†įĸŧåēĢį™ģå…ĨäģĨæ›´æ–°æ‚¨įš„åŠ å¯†é‡‘é‘°ã€‚" }, "premiumMembership": { "message": "é€˛éšŽæœƒå“Ą" @@ -795,8 +1240,11 @@ "ppremiumSignUpStorage": { "message": "ᔍæ–ŧæĒ”æĄˆé™„äģļįš„ 1 GB åŠ å¯†å„˛å­˜įŠē間。" }, + "premiumSignUpEmergency": { + "message": "Emergency access." + }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "å°ˆæœ‰įš„å…Šæ­Ĩ驟į™ģå…Ĩ選項īŧŒäž‹åĻ‚ YubiKey 和 Duo。" }, "ppremiumSignUpReports": { "message": "密įĸŧåĨåēˇåēĻæĒĸæŸĨã€æäž›å¸ŗæˆļéĢ”æĒĸäģĨåŠčŗ‡æ–™å¤–æ´Šå ąå‘ŠīŧŒäģĨäŋéšœæ‚¨įš„密įĸŧåēĢ厉全。" @@ -816,12 +1264,18 @@ "premiumPurchaseAlert": { "message": "您可äģĨ在 bitwarden.com įļ˛é į‰ˆå¯†įĸŧåēĢčŗŧč˛ˇé€˛éšŽæœƒå“Ąčŗ‡æ ŧã€‚įžåœ¨čĻå‰åž€å—ŽīŧŸ" }, + "premiumPurchaseAlertV2": { + "message": "You can purchase Premium from your account settings on the Bitwarden web app." + }, "premiumCurrentMember": { "message": "æ‚¨į›Žå‰į‚ēé€˛éšŽæœƒå“Ąīŧ" }, "premiumCurrentMemberThanks": { "message": "感čŦæ‚¨æ”¯æŒ Bitwarden 。" }, + "premiumFeatures": { + "message": "Upgrade to Premium and receive:" + }, "premiumPrice": { "message": "每嚴åĒ需 $PRICE$īŧ", "placeholders": { @@ -831,6 +1285,15 @@ } } }, + "premiumPriceV2": { + "message": "All for just $PRICE$ per year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, "refreshComplete": { "message": "į‹€æ…‹æ›´æ–°åŽŒæˆ" }, @@ -838,7 +1301,7 @@ "message": "č‡Ē動複čŖŊ TOTP" }, "disableAutoTotpCopyDesc": { - "message": "č‹Ĩį™ģå…Ĩčŗ‡æ–™åˇ˛åŒ…åĢéŠ—č­‰å™¨é‡‘é‘°īŧŒåœ¨č‡Ē動åĄĢå…Ĩæ­¤į™ģå…Ĩčŗ‡æ–™æ™‚īŧŒTOTP 驗證įĸŧ將複čŖŊč‡ŗæ‚¨įš„å‰Ēč˛ŧį°ŋ。" + "message": "č‹Ĩį™ģå…Ĩčŗ‡č¨Šåˇ˛åŒ…åĢéŠ—č­‰å™¨é‡‘é‘°īŧŒåœ¨č‡Ē動åĄĢå…Ĩį™ģå…Ĩčŗ‡č¨Šæ™‚īŧŒä🿜ƒåŒæ­Ĩį‚ēæ‚¨č¤‡čŖŊ TOTP 驗證įĸŧ。" }, "enableAutoBiometricsPrompt": { "message": "啟動時čĻæą‚į”Ÿį‰Šį‰šåžĩ螨識" @@ -883,7 +1346,7 @@ "message": "å°‡æ‚¨įš„ YubiKey 插å…Ĩé›ģč…Ļįš„ USB 逪æŽĨ埠īŧŒį„ļåžŒæŒ‰ä¸€ä¸‹åŽƒįš„æŒ‰éˆ•ã€‚" }, "insertU2f": { - "message": "å°‡æ‚¨įš„åŽ‰å…¨é‡‘é‘°æ’å…Ĩé›ģč…Ļįš„ USB 逪æŽĨ埠īŧŒį„ļåžŒæŒ‰ä¸€ä¸‹åŽƒįš„æŒ‰éˆ•īŧˆåĻ‚æœ‰įš„čŠąīŧ‰ã€‚" + "message": "å°‡æ‚¨įš„åŽ‰å…¨é‘°åŒ™æ’å…Ĩé›ģč…Ļįš„ USB 逪æŽĨ埠īŧŒį„ļåžŒč§¸æ‘¸å…ļ按鈕īŧˆåĻ‚æœ‰įš„čŠąīŧ‰ã€‚" }, "webAuthnNewTab": { "message": "čρ開始 WebAuthn 2FA 驗證īŧŒčĢ‹éģžé¸ä¸‹éĸįš„æŒ‰éˆ•é–‹å•Ÿä¸€å€‹æ–°åˆ†é īŧŒä¸Ļäžį…§æ–°åˆ†é ä¸­æäž›įš„čĒĒæ˜Žæ“äŊœã€‚" @@ -915,35 +1378,35 @@ "authenticatorAppTitle": { "message": "éŠ—č­‰å™¨æ‡‰į”¨į¨‹åŧ" }, - "authenticatorAppDesc": { - "message": "äŊŋį”¨éŠ—č­‰å™¨æ‡‰į”¨į¨‹åŧ īŧˆåĻ‚ Authy 或 Google Authenticatorīŧ‰ į”ĸį”ŸåŸēæ–ŧæ™‚é–“įš„éŠ—č­‰įĸŧ。", - "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + "authenticatorAppDescV2": { + "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, - "yubiKeyTitle": { - "message": "YubiKey OTP 厉全金鑰" + "yubiKeyTitleV2": { + "message": "Yubico OTP Security Key" }, "yubiKeyDesc": { "message": "äŊŋᔍ YubiKey å­˜å–æ‚¨įš„å¸ŗæˆļ。支援 YubiKey 4、4 Nano、4C、äģĨ及 NEO čŖįŊŽã€‚" }, - "duoDesc": { - "message": "äŊŋᔍ Duo Security įš„ Duo Mobile ፋåŧã€SMS 、æ’Ĩ打é›ģčŠąæˆ– U2F åŽ‰å…¨é‡‘é‘°é€˛čĄŒéŠ—č­‰ã€‚", + "duoDescV2": { + "message": "Enter a code generated by Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "į‚ēæ‚¨įš„įĩ„įš”äŊŋᔍ Duo Security įš„ Duo Mobile ፋåŧã€SMS、æ’Ĩ打é›ģčŠąæˆ– U2F åŽ‰å…¨é‡‘é‘°é€˛čĄŒéŠ—č­‰ã€‚", + "message": "į‚ēæ‚¨įš„įĩ„įš”äŊŋᔍ Duo Security įš„ Duo Mobile ፋåŧã€SMS、æ’Ĩ打é›ģčŠąæˆ– U2F åŽ‰å…¨é‘°åŒ™é€˛čĄŒéŠ—č­‰ã€‚", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "äŊŋᔍäģģäŊ•å…ˇæœ‰ WebAuthn 功čƒŊįš„åŽ‰å…¨é‡‘é‘°äž†å­˜å–æ‚¨įš„å¸ŗæˆļ。" + "message": "äŊŋᔍäģģäŊ•å…ˇæœ‰ WebAuthn 功čƒŊįš„åŽ‰å…¨é‘°åŒ™äž†å­˜å–æ‚¨įš„å¸ŗæˆļ。" }, "emailTitle": { "message": "é›ģ子éƒĩäģļ" }, - "emailDesc": { - "message": "äŊŋᔍé›ģ子éƒĩäģļå‚ŗé€éŠ—č­‰įĸŧįĩĻæ‚¨ã€‚" + "emailDescV2": { + "message": "Enter a code sent to your email." }, "selfHostedEnvironment": { "message": "č‡Ēæˆ‘čŖčŧ‰į’°åĸƒ" @@ -951,6 +1414,15 @@ "selfHostedEnvironmentFooter": { "message": "指厚您內部部įŊ˛įš„ Bitwarden åŽ‰čŖäš‹åŸēį¤Ž URL。" }, + "selfHostedBaseUrlHint": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + }, + "selfHostedCustomEnvHeader": { + "message": "For advanced configuration, you can specify the base URL of each service independently." + }, + "selfHostedEnvFormInvalid": { + "message": "You must add either the base Server URL or at least one custom environment." + }, "customEnvironment": { "message": "č‡Ē荂ᒰåĸƒ" }, @@ -960,6 +1432,10 @@ "baseUrl": { "message": "äŧ翜å™¨ URL" }, + "selfHostBaseUrl": { + "message": "Self-host server URL", + "description": "Label for field requesting a self-hosted integration service URL" + }, "apiUrl": { "message": "API äŧ翜å™¨įļ˛å€" }, @@ -978,14 +1454,73 @@ "environmentSaved": { "message": "į’°åĸƒ URL åˇ˛å„˛å­˜" }, + "showAutoFillMenuOnFormFields": { + "message": "åœ¨čĄ¨å–ŽæŦ„äŊä¸ŠéĄ¯į¤ēč‡Ē動åĄĢå…Ĩ選喎", + "description": "Represents the message for allowing the user to enable the autofill overlay" + }, + "autofillSuggestionsSectionTitle": { + "message": "Autofill suggestions" + }, + "showInlineMenuLabel": { + "message": "Show autofill suggestions on form fields" + }, + "showInlineMenuIdentitiesLabel": { + "message": "Display identities as suggestions" + }, + "showInlineMenuCardsLabel": { + "message": "Display cards as suggestions" + }, + "showInlineMenuOnIconSelectionLabel": { + "message": "Display suggestions when icon is selected" + }, + "showInlineMenuOnFormFieldsDescAlt": { + "message": "Applies to all logged in accounts." + }, + "turnOffBrowserBuiltInPasswordManagerSettings": { + "message": "關閉äŊ įš„į€čĻŊ器內åģē密įĸŧįŽĄį†å™¨č¨­åŽšäģĨéŋå…čĄįĒã€‚" + }, + "turnOffBrowserBuiltInPasswordManagerSettingsLink": { + "message": "ᎍčŧ¯į€čĻŊå™¨č¨­åŽš" + }, + "autofillOverlayVisibilityOff": { + "message": "關閉", + "description": "Overlay setting select option for disabling autofill overlay" + }, + "autofillOverlayVisibilityOnFieldFocus": { + "message": "į•ļæŦ„äŊčĸĢ選取時īŧˆåœ¨į„Ļéģžä¸Šīŧ‰", + "description": "Overlay appearance select option for showing the field on focus of the input element" + }, + "autofillOverlayVisibilityOnButtonClick": { + "message": "į•ļ選取č‡Ē動åĄĢå…Ĩ圖į¤ē時", + "description": "Overlay appearance select option for showing the field on click of the overlay icon" + }, + "enableAutoFillOnPageLoadSectionTitle": { + "message": "Autofill on page load" + }, "enableAutoFillOnPageLoad": { "message": "頁éĸčŧ‰å…Ĩ時č‡Ē動åĄĢå…Ĩ" }, "enableAutoFillOnPageLoadDesc": { "message": "įļ˛é čŧ‰å…Ĩ時åĻ‚æžœåĩæ¸Ŧ到į™ģå…ĨčĄ¨å–ŽīŧŒå‰‡åŸˇčĄŒč‡Ē動åĄĢå…Ĩ。" }, + "autofillOnPageLoadWarning": { + "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "placeholders": { + "openTag": { + "content": "$1", + "example": "" + }, + "closeTag": { + "content": "$2", + "example": "" + } + } + }, "experimentalFeature": { - "message": "čĸĢå…Ĩäžĩ或不可äŋĄäģģįš„įļ˛įĢ™å¯äģĨåˆŠį”¨įļ˛é čŧ‰å…Ĩæ™‚įš„č‡Ē動åĄĢå…Ĩ功čƒŊ。" + "message": "čĸĢå…Ĩäžĩ或不čĸĢäŋĄäģģįš„įļ˛įĢ™īŧŒå¯čƒŊ會æŋĢᔍ頁éĸčŧ‰å…Ĩįš„č‡Ē動åĄĢå…Ĩ功čƒŊ。" + }, + "learnMoreAboutAutofillOnPageLoadLinkText": { + "message": "Learn more about risks" }, "learnMoreAboutAutofill": { "message": "進一æ­Ĩįž­č§Ŗã€Œč‡Ē動åĄĢå…Ĩ」功čƒŊ" @@ -997,7 +1532,7 @@ "message": "您可äģĨåžžé …į›Žįš„įˇ¨čŧ¯æĒĸčϖ䏭į‚ē喎個į™ģå…Ĩé …į›Žé—œé–‰é éĸčŧ‰å…Ĩ時č‡Ē動åĄĢå…Ĩ。" }, "itemAutoFillOnPageLoad": { - "message": "頁éĸčŧ‰å…Ĩ時č‡Ē動åĄĢå…ĨīŧˆåĻ‚æžœé¸é …ä¸­åˇ˛č¨­åŽšīŧ‰" + "message": "頁éĸčŧ‰å…Ĩ時č‡Ē動åĄĢå…ĨīŧˆåĻ‚æžœåˇ˛åœ¨é¸é …ä¸­č¨­åŽšīŧ‰" }, "autoFillOnPageLoadUseDefault": { "message": "äŊŋį”¨é č¨­č¨­åŽš" @@ -1014,8 +1549,14 @@ "commandOpenSidebar": { "message": "在側邊æŦ„中開啟密įĸŧåēĢ" }, - "commandAutofillDesc": { - "message": "č‡Ē動將上æŦĄäŊŋį”¨įš„į™ģå…Ĩčŗ‡æ–™åĄĢå…Ĩį›Žå‰įļ˛įĢ™" + "commandAutofillLoginDesc": { + "message": "Autofill the last used login for the current website" + }, + "commandAutofillCardDesc": { + "message": "Autofill the last used card for the current website" + }, + "commandAutofillIdentityDesc": { + "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { "message": "į”ĸį”Ÿä¸€įĩ„æ–°įš„éš¨æŠŸå¯†įĸŧä¸Ļå°‡åŽƒč¤‡čŖŊ到å‰Ēč˛ŧį°ŋ中。" @@ -1023,9 +1564,6 @@ "commandLockVaultDesc": { "message": "鎖厚密įĸŧåēĢ" }, - "privateModeWarning": { - "message": "į§å¯†æ¨Ąåŧįš„æ”¯æ´æ˜¯å¯Ļ銗性功čƒŊīŧŒéƒ¨åˆ†åŠŸčƒŊį„Ąæŗ•åŽŒå…¨į™ŧ揎äŊœį”¨ã€‚" - }, "customFields": { "message": "č‡Ē訂æŦ„äŊ" }, @@ -1050,6 +1588,9 @@ "cfTypeBoolean": { "message": "布林å€ŧ" }, + "cfTypeCheckbox": { + "message": "æ ¸å–æ–šåĄŠ" + }, "cfTypeLinked": { "message": "逪įĩåž‹", "description": "This describes a field that is 'linked' (tied) to another field." @@ -1070,6 +1611,9 @@ "faviconDesc": { "message": "在每個į™ģå…Ĩčŗ‡æ–™æ—éĄ¯į¤ēä¸€å€‹å¯čž¨č­˜įš„åœ–į‰‡ã€‚" }, + "faviconDescAlt": { + "message": "在每æŦĄį™ģå…Ĩæ™‚æ—é‚ŠéĄ¯į¤ēå¯č­˜åˆĨįš„åœ–į‰‡ã€‚éŠį”¨æ–ŧæ‰€æœ‰åˇ˛į™ģå…Ĩįš„å¸ŗč™Ÿã€‚" + }, "enableBadgeCounter": { "message": "éĄ¯į¤ē圖į¤ēč¨ˆæ•¸å™¨" }, @@ -1229,15 +1773,63 @@ "typeIdentity": { "message": "čēĢ分" }, + "typeSshKey": { + "message": "SSH key" + }, + "newItemHeader": { + "message": "新åĸž $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "editItemHeader": { + "message": "ᎍčŧ¯ $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, + "viewItemHeader": { + "message": "æĒĸčĻ– $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "Login" + } + } + }, "passwordHistory": { "message": "密įĸŧæ­ˇå˛č¨˜éŒ„" }, + "generatorHistory": { + "message": "Generator history" + }, + "clearGeneratorHistoryTitle": { + "message": "Clear generator history" + }, + "cleargGeneratorHistoryDescription": { + "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + }, "back": { "message": "čŋ”回" }, "collections": { "message": "集合" }, + "nCollections": { + "message": "$COUNT$ 個集合", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "favorites": { "message": "æˆ‘įš„æœ€æ„›" }, @@ -1282,6 +1874,10 @@ "message": "åŸēåē•įļ˛åŸŸ", "description": "Domain name. Ex. website.com" }, + "baseDomainOptionRecommended": { + "message": "åŸēį¤Žįļ˛åŸŸ (推č–Ļ)", + "description": "Domain name. Ex. website.com" + }, "domainName": { "message": "įļ˛åŸŸåį¨ą", "description": "Domain name. Ex. website.com" @@ -1302,11 +1898,11 @@ }, "matchDetection": { "message": "ä¸€č‡´æ€§åĩæ¸Ŧ", - "description": "URI match detection for auto-fill." + "description": "URI match detection for autofill." }, "defaultMatchDetection": { "message": "é č¨­ä¸€č‡´æ€§åĩæ¸Ŧ", - "description": "Default URI match detection for auto-fill." + "description": "Default URI match detection for autofill." }, "toggleOptions": { "message": "切換選項" @@ -1332,6 +1928,15 @@ "noPasswordsInList": { "message": "æ˛’æœ‰å¯åˆ—å‡ēįš„å¯†įĸŧ。" }, + "clearHistory": { + "message": "æ¸…é™¤æ­ˇå˛į´€éŒ„" + }, + "nothingToShow": { + "message": "Nothing to show" + }, + "nothingGeneratedRecently": { + "message": "You haven't generated anything recently" + }, "remove": { "message": "į§ģ除" }, @@ -1390,18 +1995,33 @@ "unlockWithPin": { "message": "äŊŋᔍ PIN įĸŧč§ŖéŽ–" }, + "setYourPinTitle": { + "message": "č¨­åŽš PIN įĸŧ" + }, + "setYourPinButton": { + "message": "č¨­åŽš PIN įĸŧ" + }, "setYourPinCode": { "message": "č¨­åŽšæ‚¨į”¨äž†č§ŖéŽ– Bitwarden įš„ PIN įĸŧã€‚æ‚¨įš„ PIN č¨­åŽšå°‡åœ¨æ‚¨åŽŒå…¨į™ģå‡ēæœŦæ‡‰į”¨į¨‹åŧæ™‚čĸĢé‡č¨­ã€‚" }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "åŋ…é ˆåĄĢå…Ĩ PIN įĸŧ。" }, "invalidPin": { "message": "į„Ąæ•ˆįš„ PIN įĸŧ。" }, + "tooManyInvalidPinEntryAttemptsLoggingOut": { + "message": "čŧ¸å…Ĩå¤Ēå¤šį„Ąæ•ˆ PIN įĸŧ。 į™ģå‡ē。" + }, "unlockWithBiometrics": { "message": "äŊŋį”¨į”Ÿį‰Šį‰šåžĩčž¨č­˜č§ŖéŽ–" }, + "unlockWithMasterPassword": { + "message": "Unlock with master password" + }, "awaitDesktop": { "message": "į­‰åž…äž†č‡ĒæĄŒéĸæ‡‰į”¨į¨‹åŧįš„įĸēčĒ" }, @@ -1411,24 +2031,53 @@ "lockWithMasterPassOnRestart": { "message": "į€čĻŊ器重啟垌äŊŋᔍä¸ģ密įĸŧ鎖厚" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "您åŋ…é ˆč‡ŗå°‘é¸æ“‡ä¸€å€‹é›†åˆã€‚" }, "cloneItem": { - "message": "複čŖŊé …į›Ž" + "message": "å…‹éš†é …į›Ž" }, "clone": { - "message": "複čŖŊ" + "message": "克隆" }, "passwordGeneratorPolicyInEffect": { "message": "一個或多個įĩ„įš”åŽŸå‰‡æ­ŖåŊąéŸŋ密įĸŧį”ĸį”Ÿå™¨č¨­åŽšã€‚" }, + "passwordGenerator": { + "message": "Password generator" + }, + "usernameGenerator": { + "message": "Username generator" + }, + "useThisPassword": { + "message": "Use this password" + }, + "useThisUsername": { + "message": "Use this username" + }, + "securePasswordGenerated": { + "message": "Secure password generated! Don't forget to also update your password on the website." + }, + "useGeneratorHelpTextPartOne": { + "message": "Use the generator", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, + "useGeneratorHelpTextPartTwo": { + "message": "to create a strong unique password", + "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" + }, "vaultTimeoutAction": { "message": "密įĸŧåēĢ逞時動äŊœ" }, + "vaultTimeoutAction1": { + "message": "逞時垌動äŊœ" + }, "lock": { "message": "鎖厚", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "垃圞æĄļ", @@ -1452,6 +2101,9 @@ "restoredItem": { "message": "é …į›Žåˇ˛é‚„åŽŸ" }, + "alreadyHaveAccount": { + "message": "Already have an account?" + }, "vaultTimeoutLogOutConfirmation": { "message": "選擇į™ģå‡ē將會在密įĸŧåēĢ逞時垌į§ģ除對密įĸŧåēĢįš„æ‰€æœ‰å­˜å–æŦŠé™īŧŒč‹ĨčĻé‡æ–°éŠ—č­‰å‰‡éœ€é€Ŗįˇšįļ˛čˇ¯ã€‚įĸē厚čρäŊŋį”¨æ­¤č¨­åŽšå—ŽīŧŸ" }, @@ -1461,23 +2113,26 @@ "autoFillAndSave": { "message": "č‡Ē動åĄĢå…Ĩä¸Ļå„˛å­˜" }, + "fillAndSave": { + "message": "Fill and save" + }, "autoFillSuccessAndSavedUri": { - "message": "é …į›Žåˇ˛č‡Ē動åĄĢå…Ĩä¸Ļ且 URL åˇ˛å„˛å­˜" + "message": "é …į›Žåˇ˛č‡Ē動åĄĢå…Ĩä¸Ļä¸”åˇ˛å„˛å­˜įĩąä¸€čŗ‡æēæ¨™č­˜įŦĻīŧˆURIīŧ‰" }, "autoFillSuccess": { - "message": "é …į›Žåˇ˛č‡Ē動åĄĢå…Ĩ" + "message": "é …į›Žåˇ˛č‡Ē動åĄĢå…Ĩ " }, "insecurePageWarning": { "message": "č­Ļ告īŧšé€™æ˜¯ä¸åŽ‰å…¨įš„ HTTP 頁éĸīŧŒäģģäŊ•您送å‡ēįš„čŗ‡č¨Šå‡å¯čƒŊčĸĢå…ļäģ–äēēįœ‹čĻ‹å’Œæ›´æ”šã€‚æ­¤į™ģå…Ĩčŗ‡č¨ŠåŽŸå…ˆæ˜¯åœ¨åŽ‰å…¨įš„ (HTTPS) 頁éĸå„˛å­˜įš„ã€‚" }, "insecurePageWarningFillPrompt": { - "message": "您䞝į„ļæƒŗčρåĄĢ充此į™ģå…Ĩčŗ‡č¨Šå—ŽīŧŸ" + "message": "您äģčρåĄĢå…Ĩæ­¤į™ģå…Ĩčŗ‡č¨Šå—ŽīŧŸ" }, "autofillIframeWarning": { - "message": "é€™å€‹čĄ¨å–Žå¯„æ”žåœ¨ä¸åŒįš„įļ˛åŸŸīŧŒč€Œéžæ‚¨å„˛å­˜į™ģå…Ĩčŗ‡č¨Šįš„ URI。選擇「įĸēčĒã€å‰‡äžį„ļč‡Ē動åĄĢå…ĨīŧŒã€Œå–æļˆã€å‰‡åœæ­ĸæœŦ動äŊœã€‚" + "message": "é€™å€‹čĄ¨å–Žå­˜æ”žåœ¨ä¸åŒįš„įļ˛åŸŸīŧŒč€Œéžå„˛å­˜æ‚¨į™ģå…Ĩčŗ‡č¨Šįš„įĩąä¸€čŗ‡æēæ¨™č­˜įŦĻīŧˆURIīŧ‰ã€‚選擇「įĸēčĒã€å‰‡äžį„ļč‡Ē動åĄĢå…ĨīŧŒã€Œå–æļˆã€å‰‡åœæ­ĸæœŦ動äŊœã€‚" }, "autofillIframeWarningTip": { - "message": "č‹ĨäģĨåžŒä¸æƒŗå†čˇŗå‡ē這個č­Ļ告īŧŒčĢ‹å„˛å­˜ URI「$HOSTNAME$」到您這個įļ˛įĢ™įš„ Bitwarden į™ģå…Ĩé …į›Žã€‚", + "message": "č‹ĨäģĨåžŒä¸æƒŗå†čˇŗå‡ē這個č­Ļ告īŧŒč̋將這個įļ˛įĢ™įš„įĩąä¸€čŗ‡æēæ¨™č­˜įŦĻīŧˆURIīŧ‰ã€Œ$HOSTNAME$ã€å„˛å­˜åˆ°æ‚¨įš„ Bitwarden į™ģå…Ĩé …į›Žã€‚", "placeholders": { "hostname": { "content": "$1", @@ -1539,8 +2194,23 @@ "masterPasswordPolicyRequirementsNotMet": { "message": "æ‚¨æ–°įš„ä¸ģ密įĸŧ不įŦĻ合原則čĻæą‚ã€‚" }, + "receiveMarketingEmailsV2": { + "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + }, + "unsubscribe": { + "message": "Unsubscribe" + }, + "atAnyTime": { + "message": "at any time." + }, + "byContinuingYouAgreeToThe": { + "message": "By continuing, you agree to the" + }, + "and": { + "message": "and" + }, "acceptPolicies": { - "message": "č‹Ĩé¸å–æ­¤æ–šåĄŠīŧŒäģŖčĄ¨æ‚¨åŒæ„ä¸‹åˆ—é …į›Žīŧš" + "message": "é¸ä¸­æ­¤é¸å–æĄ†īŧŒåŗčĄ¨į¤ē您同意下列æĸæŦžīŧš" }, "acceptPoliciesRequired": { "message": "尚æœĒæŽĨ受服務æĸæŦžčˆ‡éšąį§æŦŠæ”ŋį­–ã€‚" @@ -1557,6 +2227,12 @@ "ok": { "message": "įĸē厚" }, + "errorRefreshingAccessToken": { + "message": "Access Token Refresh Error" + }, + "errorRefreshingAccessTokenDesc": { + "message": "No refresh token or API keys found. Please try logging out and logging back in." + }, "desktopSyncVerificationTitle": { "message": "æĄŒéĸ同æ­Ĩ驗證" }, @@ -1593,6 +2269,12 @@ "nativeMessagingWrongUserTitle": { "message": "叺æˆļä¸į›¸įŦĻ" }, + "nativeMessagingWrongUserKeyTitle": { + "message": "Biometric key missmatch" + }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "į”Ÿį‰Šį‰šåžĩ螨識æœĒč¨­åŽš" }, @@ -1605,11 +2287,23 @@ "biometricsNotSupportedDesc": { "message": "æ­¤čŖįŊŽä¸æ”¯æ´į€čĻŊå™¨į”Ÿį‰Šį‰šåžĩčž¨č­˜ã€‚" }, + "biometricsNotUnlockedTitle": { + "message": "User locked or logged out" + }, + "biometricsNotUnlockedDesc": { + "message": "Please unlock this user in the desktop application and try again." + }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { - "message": "Biometrics failed" + "message": "į”Ÿį‰Šį‰šåžĩčž¨č­˜å¤ąæ•—" }, "biometricsFailedDesc": { - "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + "message": "į”Ÿį‰Šį‰šåžĩčž¨č­˜į„Ąæŗ•åŽŒæˆīŧŒčĢ‹č€ƒæ…ŽäŊŋᔍä¸ģ密įĸŧ或į™ģå‡ē。č‹Ĩäģį„Ąæŗ•č§ŖæąēīŧŒč̋聝įĩĄ Bitwarden åŽĸ服。" }, "nativeMessaginPermissionErrorTitle": { "message": "æœĒ提䞛æŦŠé™" @@ -1629,18 +2323,57 @@ "personalOwnershipPolicyInEffect": { "message": "įĩ„įš”åŽŸå‰‡æ­Ŗåœ¨åŊąéŸŋæ‚¨įš„æ“æœ‰æŦŠé¸é …。" }, + "personalOwnershipPolicyInEffectImports": { + "message": "某個įĩ„įš”åŽŸå‰‡åˇ˛įρæ­ĸæ‚¨å°‡é …į›ŽåŒ¯å…Ĩč‡ŗæ‚¨įš„å€‹äēē密įĸŧåēĢ。" + }, + "domainsTitle": { + "message": "Domains", + "description": "A category title describing the concept of web domains" + }, "excludedDomains": { "message": "排除įļ˛åŸŸ" }, "excludedDomainsDesc": { "message": "Bitwarden 不會čĻæą‚å„˛å­˜é€™äē›įļ˛åŸŸįš„čŠŗį´°į™ģå…Ĩčŗ‡č¨Šã€‚åŋ…é ˆé‡æ–°æ•´į†é éĸ才čƒŊäŊŋčŽŠæ›´į”Ÿæ•ˆã€‚" }, + "excludedDomainsDescAlt": { + "message": "對æ–ŧæ‰€æœ‰åˇ˛į™ģå…Ĩįš„å¸ŗæˆļīŧŒBitwarden 不會čŠĸ問是åĻå„˛å­˜é€™äē›įļ˛åŸŸįš„į™ģå…Ĩčŗ‡č¨Šã€‚æ‚¨åŋ…é ˆé‡æ–°æ•´į†é éĸčŽŠæ›´æ‰æœƒį”Ÿæ•ˆã€‚" + }, + "websiteItemLabel": { + "message": "Website $number$ (URI)", + "placeholders": { + "number": { + "content": "$1", + "example": "3" + } + } + }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆįš„įļ˛åŸŸ", "placeholders": { "domain": { "content": "$1", - "example": "googlecom" + "example": "duckduckgo.com" + } + } + }, + "excludedDomainsSavedSuccess": { + "message": "Excluded domain changes saved" + }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" } } }, @@ -1648,6 +2381,10 @@ "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "搜尋 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1659,6 +2396,9 @@ "sendTypeText": { "message": "文字" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "æĒ”æĄˆ" }, @@ -1666,6 +2406,9 @@ "message": "所有 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "åˇ˛é”æœ€å¤§å­˜å–æŦĄæ•¸", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -1679,6 +2422,9 @@ "passwordProtected": { "message": "密įĸŧäŋč­ˇ" }, + "copyLink": { + "message": "Copy link" + }, "copySendLink": { "message": "複čŖŊ Send 逪įĩ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1714,6 +2460,10 @@ "message": "您įĸē厚čρåˆĒ除此 Send 嗎īŧŸ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "ᎍčŧ¯ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1736,6 +2486,10 @@ "message": "æ­¤ Send å°‡åœ¨æŒ‡åŽšįš„æ—Ĩ期和時間垌čĸĢæ°¸äš…åˆĒ除。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "逞期æ—Ĩ期" }, @@ -1769,6 +2523,10 @@ "message": "é¸į”¨åŠŸčƒŊ。äŊŋį”¨č€…éœ€æäž›å¯†įĸŧ才čƒŊ存取此 Send。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "關æ–ŧæ­¤ Send įš„į§äēē備č¨ģ。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -1810,10 +2568,54 @@ "message": "Send 厞åģēįĢ‹", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "createdSendSuccessfully": { + "message": "Send created successfully!", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHoursSingle": { + "message": "The Send will be available to anyone with the link for the next 1 hour.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInHours": { + "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + } + } + }, + "sendExpiresInDaysSingle": { + "message": "The Send will be available to anyone with the link for the next 1 day.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendExpiresInDays": { + "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", + "placeholders": { + "days": { + "content": "$1", + "example": "5" + } + } + }, + "sendLinkCopied": { + "message": "Send link copied", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editedSend": { "message": "Send åˇ˛å„˛å­˜", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendFilePopoutDialogText": { + "message": "Pop out extension?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFilePopoutDialogDesc": { + "message": "To create a file Send, you need to pop out the extension to a new window.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendLinuxChromiumFileWarning": { "message": "čĻé¸æ“‡æĒ”æĄˆīŧŒčĢ‹åœ¨å´é‚ŠæŦ„中開啟擴充åĨ—äģļīŧˆč‹Ĩ可äģĨīŧ‰īŧŒæˆ–éģžé¸æ­¤æŠĢåš…åŊˆå‡ēč‡ŗæ–°čĻ–įĒ—ã€‚" }, @@ -1823,6 +2625,9 @@ "sendSafariFileWarning": { "message": "čρäŊŋᔍ Safari 䞆選擇æĒ”æĄˆīŧŒčĢ‹éģžé¸æ­¤æŠĢåš…åŊˆå‡ēč‡ŗæ–°čĻ–įĒ—ã€‚" }, + "popOut": { + "message": "Pop out" + }, "sendFileCalloutHeader": { "message": "在開始䚋前" }, @@ -1856,6 +2661,9 @@ "hideEmail": { "message": "對æ”ļäģļäēēéšąč—æˆ‘įš„é›ģ子éƒĩäģļ地址。" }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "一個或多個įĩ„įš”åŽŸå‰‡æ­ŖåŊąéŸŋæ‚¨įš„ Send 選項。" }, @@ -1871,6 +2679,9 @@ "emailVerificationRequired": { "message": "需čĻéŠ—č­‰é›ģ子éƒĩäģļ" }, + "emailVerifiedV2": { + "message": "Email verified" + }, "emailVerificationRequiredDesc": { "message": "您åŋ…é ˆéŠ—č­‰æ‚¨įš„é›ģ子éƒĩäģ￉čƒŊäŊŋį”¨æ­¤åŠŸčƒŊ。您可äģĨ在įļ˛é å¯†įĸŧåēĢčŖĄéŠ—č­‰æ‚¨įš„é›ģ子éƒĩäģļ。" }, @@ -1884,7 +2695,10 @@ "message": "æ‚¨įš„ä¸ģ密įĸŧ最čŋ‘čĸĢæ‚¨įš„įĩ„įš”įŽĄį†č€…čŽŠæ›´éŽã€‚č‹ĨčĻå­˜å–å¯†įĸŧåēĢīŧŒæ‚¨åŋ…é ˆįĢ‹åŗæ›´æ–°ä¸ģ密įĸŧ。įšŧį猿“äŊœæœƒį™ģå‡ēį›Žå‰įš„į™ģå…Ĩ階æŽĩīŧŒä¸ĻčĻæą‚æ‚¨é‡æ–°į™ģå…Ĩ。å…ļäģ–čŖįŊŽä¸Šįš„æ´ģ動į™ģå…Ĩ階æŽĩ最多會äŋæŒä¸€å€‹å°æ™‚。" }, "updateWeakMasterPasswordWarning": { - "message": "æ‚¨įš„ä¸ģ密įĸŧ不įŦĻåˆæ‚¨įš„įĩ„į𔿔ŋį­–äš‹ä¸€æˆ–å¤šå€‹čĻæą‚ã€‚æ‚¨åŋ…é ˆįĢ‹åŗæ›´æ–°æ‚¨įš„ä¸ģ密įĸŧäģĨ存取密įĸŧåēĢã€‚é€˛čĄŒæ­¤æ“äŊœå°‡į™ģå‡ēæ‚¨į›Žå‰įš„åˇĨäŊœéšŽæŽĩīŧŒéœ€čĻæ‚¨é‡æ–°į™ģå…Ĩ。å…ļäģ–čŖįŊŽä¸Šįš„åˇĨäŊœéšŽæŽĩ可čƒŊįšŧįēŒé•ˇé”一小時。" + "message": "æ‚¨įš„ä¸ģ密įĸŧ不įŦĻ合一個或多個įĩ„į𔿔ŋį­–čĻåŽšã€‚æ‚¨åŋ…é ˆįĢ‹åŗæ›´æ–°æ‚¨įš„ä¸ģ密įĸŧ才čƒŊ存取密įĸŧåēĢã€‚é€˛čĄŒæ­¤å‹•äŊœå°‡į™ģå‡ēæ‚¨į›Žå‰įš„åˇĨäŊœéšŽæŽĩīŧŒéœ€čĻæ‚¨é‡æ–°į™ģå…Ĩ。å…ļäģ–čŖįŊŽä¸Šįš„åˇĨäŊœéšŽæŽĩ可čƒŊ持įēŒé•ˇé”一小時。" + }, + "tdeDisabledMasterPasswordRequired": { + "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." }, "resetPasswordPolicyAutoEnroll": { "message": "č‡Ē動č¨ģ冊" @@ -1895,8 +2709,30 @@ "selectFolder": { "message": "é¸æ“‡čŗ‡æ–™å¤žâ‹¯" }, - "ssoCompleteRegistration": { - "message": "čĻåŽŒæˆ SSO į™ģå…Ĩč¨­åŽšīŧŒčĢ‹č¨­åŽšä¸€įĩ„ä¸ģ密įĸŧäģĨ存取和äŋč­ˇæ‚¨įš„密įĸŧåēĢ。" + "noFoldersFound": { + "message": "æœĒæ‰žåˆ°čŗ‡æ–™å¤ž", + "description": "Used as a message within the notification bar when no folders are found" + }, + "orgPermissionsUpdatedMustSetPassword": { + "message": "æ‚¨įš„įĩ„įš”æŦŠé™åˇ˛æ›´æ–°īŧŒéœ€čĻæ‚¨č¨­åŽšä¸ģ密įĸŧ。", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "orgRequiresYouToSetPassword": { + "message": "æ‚¨įš„įĩ„įš”čĻæą‚æ‚¨č¨­åŽšä¸ģ密įĸŧ。", + "description": "Used as a card title description on the set password page to explain why the user is there" + }, + "cardMetrics": { + "message": "out of $TOTAL$", + "placeholders": { + "total": { + "content": "$1", + "example": "5" + } + } + }, + "verificationRequired": { + "message": "需čĻéŠ—č­‰", + "description": "Default title for the user verification dialog." }, "hours": { "message": "小時" @@ -1904,8 +2740,37 @@ "minutes": { "message": "分鐘" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { - "message": "æ‚¨įš„įĩ„įš”åŽŸå‰‡æ­Ŗåœ¨åŊąéŸŋæ‚¨įš„å¯†įĸŧåēĢ逞時時間。密įĸŧåēĢ逞時時間最多可äģĨč¨­åŽšåˆ° $HOURS$ 小時 $MINUTES$ 分鐘。", + "message": "æ‚¨įš„įĩ„į𔿔ŋį­–åˇ˛é™åŽšæ‚¨å¯†įĸŧåēĢé€žæ™‚įš„æ™‚é–“é•ˇåēĻ。密įĸŧåēĢ逞時時間最éĢ˜å¯äģĨč¨­åŽšåˆ° $HOURS$ 小時 $MINUTES$ 分鐘。", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", "placeholders": { "hours": { "content": "$1", @@ -1918,7 +2783,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "æ‚¨įš„įĩ„įš”åŽŸå‰‡æ­Ŗåœ¨åŊąéŸŋæ‚¨įš„å¯†įĸŧåēĢ逞時時間。密įĸŧåēĢ逞時時間最多可äģĨč¨­åŽšåˆ° $HOURS$ 小時 $MINUTES$ 分鐘。您密įĸŧåēĢįš„é€žæ™‚å‹•äŊœæ˜¯č¨­į‚ē $ACTION$。", + "message": "æ‚¨įš„įĩ„įš”åŽŸå‰‡æ­Ŗåœ¨åŊąéŸŋæ‚¨įš„å¯†įĸŧåēĢ逞時時間。密įĸŧåēĢ逞時時間最多可äģĨč¨­åŽšåˆ° $HOURS$ 小時 $MINUTES$ 分鐘。您密įĸŧåēĢįš„é€žæ™‚å‹•äŊœčĸĢč¨­åŽšį‚ē $ACTION$。", "placeholders": { "hours": { "content": "$1", @@ -1935,7 +2800,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "æ‚¨įš„įĩ„įš”åŽŸå‰‡åˇ˛å°‡å¯†įĸŧåēĢ逞時動äŊœč¨­į‚ē $ACTION$。", + "message": "æ‚¨įš„įĩ„įš”åŽŸå‰‡åˇ˛å°‡å¯†įĸŧåēĢ逞時動äŊœč¨­åޚį‚ē $ACTION$。", "placeholders": { "action": { "content": "$1", @@ -1992,7 +2857,7 @@ "message": "æ­ŖåŒ¯å‡ē個äēē密įĸŧåēĢ" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "僅匯å‡ē與 $EMAIL$ é—œč¯įš„å€‹äēē密įĸŧåēĢé …į›Žã€‚įĩ„įš”å¯†įĸŧåēĢé …į›Žå°‡ä¸åŒ…æ‹Ŧ在內。僅匯å‡ē密įĸŧåēĢé …į›Žčŗ‡č¨ŠīŧŒä¸åŒ…æ‹Ŧé—œč¯įš„é™„äģļ。", "placeholders": { "email": { "content": "$1", @@ -2000,6 +2865,18 @@ } } }, + "exportingOrganizationVaultTitle": { + "message": "Exporting organization vault" + }, + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "placeholders": { + "organization": { + "content": "$1", + "example": "ACME Moving Co." + } + } + }, "error": { "message": "錯čǤ" }, @@ -2009,6 +2886,23 @@ "generateUsername": { "message": "į”ĸį”ŸäŊŋį”¨č€…åį¨ą" }, + "generateEmail": { + "message": "Generate email" + }, + "generatorBoundariesHint": { + "message": "Value must be between $MIN$ and $MAX$", + "description": "Explains spin box minimum and maximum values to the user", + "placeholders": { + "min": { + "content": "$1", + "example": "8" + }, + "max": { + "content": "$2", + "example": "128" + } + } + }, "usernameType": { "message": "äŊŋį”¨č€…åį¨ąéĄžåž‹" }, @@ -2049,6 +2943,116 @@ "forwardedEmailDesc": { "message": "äŊŋį”¨å¤–éƒ¨čŊ‰å¯„服務į”ĸį”Ÿä¸€å€‹é›ģ子éƒĩäģļåˆĨ名。" }, + "forwarderDomainName": { + "message": "Email domain", + "description": "Labels the domain name email forwarder service option" + }, + "forwarderDomainNameHint": { + "message": "Choose a domain that is supported by the selected service", + "description": "Guidance provided for email forwarding services that support multiple email domains." + }, + "forwarderError": { + "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "description": "Reports an error returned by a forwarding service to the user.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Invalid characters in domain name." + } + } + }, + "forwarderGeneratedBy": { + "message": "Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen." + }, + "forwarderGeneratedByWithWebsite": { + "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "description": "Displayed with the address on the forwarding service's configuration screen.", + "placeholders": { + "WEBSITE": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "forwaderInvalidToken": { + "message": "Invalid $SERVICENAME$ API token", + "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwaderInvalidTokenWithMessage": { + "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + }, + "errormessage": { + "content": "$2", + "example": "Please verify your email address to continue." + } + } + }, + "forwarderNoAccountId": { + "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "description": "Displayed when the forwarding service fails to return an account ID.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoDomain": { + "message": "Invalid $SERVICENAME$ domain.", + "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderNoUrl": { + "message": "Invalid $SERVICENAME$ url.", + "description": "Displayed when the url of the forwarding service wasn't supplied.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownError": { + "message": "Unknown $SERVICENAME$ error occurred.", + "description": "Displayed when the forwarding service failed due to an unknown error.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "SimpleLogin" + } + } + }, + "forwarderUnknownForwarder": { + "message": "Unknown forwarder: '$SERVICENAME$'.", + "description": "Displayed when the forwarding service is not supported.", + "placeholders": { + "servicename": { + "content": "$1", + "example": "JustTrust.us" + } + } + }, "hostname": { "message": "ä¸ģæŠŸåį¨ą", "description": "Part of a URL." @@ -2093,7 +3097,7 @@ "message": "äŧ翜å™¨į‰ˆæœŦ" }, "selfHostedServer": { - "message": "self-hosted" + "message": "č‡Ēæžļ" }, "thirdParty": { "message": "įŦŦ三斚" @@ -2141,7 +3145,7 @@ "message": "æŒ‡į´‹įŸ­čĒž" }, "fingerprintMatchInfo": { - "message": "čĢ‹įĸēäŋæ‚¨įš„密įĸŧåēĢåˇ˛č§ŖéŽ–īŧŒä¸Ļä¸”æŒ‡į´‹įŸ­čĒžčˆ‡å…ļäģ–čŖįŊŽįš„ä¸€č‡´ã€‚" + "message": "čĢ‹įĸēäŋæ‚¨įš„密įĸŧåēĢåˇ˛č§ŖéŽ–īŧŒä¸Ļä¸”æŒ‡į´‹įŸ­čĒžčˆ‡å…ļäģ–čŖįŊŽä¸€č‡´ã€‚" }, "resendNotification": { "message": "é‡æ–°å‚ŗé€é€šįŸĨ" @@ -2153,31 +3157,31 @@ "message": "åˇ˛å‚ŗé€é€šįŸĨč‡ŗæ‚¨įš„čŖįŊŽã€‚" }, "loginInitiated": { - "message": "į™ģå…Ĩ厞į™ŧčĩˇ" + "message": "į™ģå…Ĩåˇ˛å•Ÿå‹•" }, "exposedMasterPassword": { - "message": "åˇ˛æš´éœ˛įš„ä¸ģ密įĸŧ" + "message": "åˇ˛æ´Šéœ˛įš„ä¸ģ密įĸŧ" }, "exposedMasterPasswordDesc": { - "message": "åœ¨čŗ‡æ–™å¤–æ´Šäē‹äģļ中扞到äē†å¯†įĸŧ。我們åģēč­°æ‚¨äŊŋį”¨ä¸€å€‹į¨į‰šįš„å¯†įĸŧ來äŋč­ˇæ‚¨įš„叺æˆļīŧŒæ‚¨įĸē厚čρäŊŋį”¨åˇ˛æš´éœ˛įš„å¯†įĸŧ嗎īŧŸ" + "message": "čŠ˛å¯†įĸŧåˇ˛æ´Šéœ˛ã€‚åģēč­°æ‚¨äŊŋį”¨ä¸€å€‹į¨į‰šįš„å¯†įĸŧ來äŋč­ˇæ‚¨įš„叺æˆļīŧŒæ‚¨įĸē厚čρäŊŋį”¨åˇ˛æ´Šéœ˛įš„å¯†įĸŧ嗎īŧŸ" }, "weakAndExposedMasterPassword": { - "message": "åŧˇåēĻ不čļŗä¸”åˇ˛æš´éœ˛įš„ä¸ģ密įĸŧ" + "message": "åŧˇåēĻ不čļŗä¸”åˇ˛æ´Šéœ˛įš„ä¸ģ密įĸŧ" }, "weakAndBreachedMasterPasswordDesc": { - "message": "密įĸŧåŧˇåēĻ不čļŗīŧŒä¸”在å…ļäģ–čŗ‡æ–™åēĢ中扞到這個密įĸŧ。äŊŋᔍ䏀個åŧˇåēĻčļŗå¤ å’Œį¨į‰šįš„密įĸŧ來äŋč­ˇæ‚¨įš„å¸ŗč™Ÿã€‚čĢ‹å•æ‚¨įĸē厚čρᔍ這個坆įĸŧ嗎īŧŸ" + "message": "密įĸŧåŧˇåēĻ不čļŗīŧŒä¸”čО坆įĸŧåˇ˛æ´Šéœ˛ã€‚čĢ‹äŊŋᔍ䏀個åŧˇåēĻčļŗå¤ å’Œį¨į‰šįš„密įĸŧ來äŋč­ˇæ‚¨įš„叺æˆļ。您įĸē厚čρäŊŋᔍ這個坆įĸŧ嗎īŧŸ" }, "checkForBreaches": { - "message": "æĒĸæŸĨ外洊密įĸŧčŗ‡æ–™åēĢ中是åĻ有此密įĸŧ" + "message": "æĒĸæŸĨå¤–æ´Šįš„å¯†įĸŧčŗ‡æ–™åēĢ中是åĻ包åĢ此密įĸŧ" }, "important": { "message": "重čρīŧš" }, "masterPasswordHint": { - "message": "åĻ‚æžœæ‚¨åŋ˜č¨˜ä¸ģ密įĸŧīŧŒæ˛’æœ‰åžŠåŽŸįš„æ–šæŗ•īŧ" + "message": "č‹Ĩ您åŋ˜č¨˜ä¸ģ密įĸŧīŧŒå°‡æœƒį„Ąæŗ•扞回īŧ" }, "characterMinimum": { - "message": "$LENGTH$ 個字元äģĨ上", + "message": "最少 $LENGTH$ 個字元äģĨ上", "placeholders": { "length": { "content": "$1", @@ -2186,13 +3190,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "æ‚¨įš„įĩ„į𔿔ŋ᭖厞įļ“開啟äē†č‡Ē動åĄĢå…Ĩ功čƒŊ。" + "message": "æ‚¨įš„įĩ„į𔿔ŋį­–åˇ˛å•Ÿį”¨é éĸčŧ‰å…Ĩæ™‚įš„č‡Ē動åĄĢå…Ĩ功čƒŊ。" }, "howToAutofill": { - "message": "åĻ‚äŊ•č‡Ē動åĄĢå…Ĩ" + "message": "åĻ‚äŊ•äŊŋᔍč‡Ē動åĄĢå…Ĩ功čƒŊ" }, "autofillSelectInfoWithCommand": { - "message": "垞這個įļ˛é é¸æ“‡ä¸€å€‹é …į›ŽīŧŒæˆ–äŊŋᔍåŋĢ速éĩīŧš$COMMAND$", + "message": "åžžæœŦį•Ģéĸé¸æ“‡ä¸€å€‹é …į›ŽīŧŒį„ļ垌äŊŋᔍ $COMMAND$ åŋĢ速éĩīŧŒæˆ–æ˜¯įž­č§Ŗč¨­åޚį•ļä¸­įš„å…ļäģ–選項。", "placeholders": { "command": { "content": "$1", @@ -2201,7 +3205,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "垞這個įļ˛é é¸æ“‡ä¸€å€‹é …į›ŽīŧŒæˆ–åœ¨č¨­åŽšä¸­č¨­åŽšä¸€å€‹åŋĢ速éĩ。" + "message": "åžžæœŦį•Ģéĸé¸æ“‡ä¸€å€‹é …į›ŽīŧŒæˆ–æ˜¯įž­č§Ŗč¨­åޚį•ļä¸­įš„å…ļäģ–選項。" }, "gotIt": { "message": "我įŸĨ道äē†" @@ -2209,14 +3213,23 @@ "autofillSettings": { "message": "č‡Ē動åĄĢå…Ĩč¨­åŽš" }, + "autofillKeyboardShortcutSectionTitle": { + "message": "Autofill shortcut" + }, + "autofillKeyboardShortcutUpdateLabel": { + "message": "Change shortcut" + }, + "autofillKeyboardManagerShortcutsLabel": { + "message": "Manage shortcuts" + }, "autofillShortcut": { "message": "č‡Ē動åĄĢå…ĨéĩᛤåŋĢ速éĩ" }, - "autofillShortcutNotSet": { - "message": "č‡Ē動åĄĢå…ĨåŋĢ速éĩ尚æœĒč¨­åŽšã€‚čĢ‹åœ¨į€čĻŊå™¨įš„č¨­åŽšä¸­čŽŠæ›´ã€‚" + "autofillLoginShortcutNotSet": { + "message": "The autofill login shortcut is not set. Change this in the browser's settings." }, - "autofillShortcutText": { - "message": "č‡Ē動åĄĢå…ĨåŋĢ速éĩ是īŧš$COMMAND$。čĢ‹åœ¨į€čĻŊå™¨įš„č¨­åŽšä¸­čŽŠæ›´ã€‚", + "autofillLoginShortcutText": { + "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", "placeholders": { "command": { "content": "$1", @@ -2225,7 +3238,7 @@ } }, "autofillShortcutTextSafari": { - "message": "預設č‡Ē動åĄĢå…ĨåŋĢ速éĩīŧš$COMMAND$", + "message": "預設č‡Ē動åĄĢå…ĨåŋĢ速éĩīŧš$COMMAND$。", "placeholders": { "command": { "content": "$1", @@ -2233,43 +3246,55 @@ } } }, - "loggingInOn": { - "message": "æ­Ŗį™ģå…Ĩ到" - }, "opensInANewWindow": { "message": "在新čĻ–įĒ—é–‹å•Ÿ" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "čŖįŊŽéœ€čĻå–åž—æ ¸å‡†ã€‚čĢ‹åœ¨ä¸‹éĸ選擇一個核准選項īŧš" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "記äŊé€™å€‹čŖįŊŽ" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "č‹ĨäŊŋᔍå…Ŧį”¨čŖįŊŽīŧŒčĢ‹å‹ŋ勞選" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "äŊŋᔍå…ļäģ–čŖįŊŽæ ¸å‡†" }, "requestAdminApproval": { - "message": "Request admin approval" + "message": "čĻæą‚įŽĄį†å“Ąæ ¸å‡†" }, "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "äŊŋᔍä¸ģ密įĸŧ核准" }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "需čρįĩ„įš” SSO 識åˆĨįĸŧ。" + }, + "creatingAccountOn": { + "message": "Creating account on" + }, + "checkYourEmail": { + "message": "Check your email" + }, + "followTheLinkInTheEmailSentTo": { + "message": "Follow the link in the email sent to" + }, + "andContinueCreatingYourAccount": { + "message": "and continue creating your account." + }, + "noEmail": { + "message": "No email?" + }, + "goBack": { + "message": "Go back" + }, + "toEditYourEmailAddress": { + "message": "to edit your email address." }, "eu": { - "message": "EU", + "message": "æ­į›Ÿ", "description": "European Union" }, - "usDomain": { - "message": "bitwarden.com" - }, - "euDomain": { - "message": "bitwarden.eu" - }, "accessDenied": { "message": "拒įĩ•å­˜å–ã€‚æ‚¨æ˛’æœ‰æĒĸčĻ–æ­¤é éĸįš„æŦŠé™ã€‚" }, @@ -2280,34 +3305,42 @@ "message": "éĄ¯į¤ē" }, "accountSuccessfullyCreated": { - "message": "åˇ˛æˆåŠŸåģēį̋叺æˆļīŧ" + "message": "叺æˆļåˇ˛æˆåŠŸåģēįĢ‹īŧ" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "厞čĻæą‚įŽĄį†å“Ąæ ¸å‡†" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." + "message": "æ‚¨įš„čĻæą‚åˇ˛å‚ŗé€įĩĻæ‚¨įš„įŽĄį†å“Ąã€‚" }, "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "核准垌將通įŸĨ您。" }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "į™ģå…Ĩæ™‚é‡åˆ°å›°é›ŖīŧŸ" }, "loginApproved": { - "message": "Login approved" + "message": "į™ģå…Ĩåˇ˛æ ¸å‡†" }, "userEmailMissing": { - "message": "User email missing" + "message": "įŧē少äŊŋᔍ者é›ģ子éƒĩäģļ地址" }, "deviceTrusted": { - "message": "Device trusted" + "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." + }, + "sendsNoItemsMessage": { + "message": "Use Send to securely share encrypted information with anyone.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "åŋ…é ˆčŧ¸å…Ĩ內厚。" }, "required": { - "message": "required" + "message": "åŋ…åĄĢ" }, "search": { "message": "搜尋" @@ -2331,7 +3364,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "äģĨ下字元不čĸĢå…č¨ąīŧš$CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -2340,7 +3373,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "čŧ¸å…Ĩįš„å€ŧ不čƒŊäŊŽæ–ŧ $MIN$。", "placeholders": { "min": { "content": "$1", @@ -2349,7 +3382,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "čŧ¸å…Ĩå€ŧ不垗čļ…過 $MAX$。", "placeholders": { "max": { "content": "$1", @@ -2358,17 +3391,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "一個或多個é›ģ子éƒĩäģļį„Ąæ•ˆ" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "čŧ¸å…Ĩ不垗僅包åĢįŠēæ ŧ。", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Input is not an email address." + "message": "čŧ¸å…Ĩįš„ä¸æ˜¯é›ģ子éƒĩäģļ地址。" }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "æ‚¨éœ€æŗ¨æ„ä¸Šæ–šįš„ $COUNT$ 個æŦ„äŊã€‚", "placeholders": { "count": { "content": "$1", @@ -2376,23 +3409,35 @@ } } }, + "singleFieldNeedsAttention": { + "message": "1 field needs your attention." + }, + "multipleFieldsNeedAttention": { + "message": "$COUNT$ fields need your attention.", + "placeholders": { + "count": { + "content": "$1", + "example": "2" + } + } + }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- 選擇 --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- čŧ¸å…ĨäģĨé€˛čĄŒį¯Šé¸ --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "æ­Ŗåœ¨å–åž—é¸é …â€Ļ" }, "multiSelectNotFound": { - "message": "No items found" + "message": "扞不到äģģäŊ•é …į›Ž" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "全部清除" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "再加上 $QUANTITY$ 個", "placeholders": { "quantity": { "content": "$1", @@ -2401,10 +3446,1382 @@ } }, "submenu": { - "message": "Submenu" + "message": "子選喎" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "åˆ‡æ›č‡ŗæŠ˜į–Šį‹€æ…‹", "description": "Toggling an expand/collapse state." + }, + "filelessImport": { + "message": "匯å…ĨäŊ įš„čŗ‡æ–™č‡ŗ BitwardenīŧŸ", + "description": "Default notification title for triggering a fileless import." + }, + "lpFilelessImport": { + "message": "äŋč­ˇäŊ įš„ LastPass čŗ‡æ–™ä¸Ļ匯å…Ĩ臺 BitwardenīŧŸ", + "description": "LastPass specific notification title for triggering a fileless import." + }, + "lpCancelFilelessImport": { + "message": "å„˛å­˜į‚ēæœĒåŠ å¯†įš„æĒ”æĄˆ", + "description": "LastPass specific notification button text for cancelling a fileless import." + }, + "startFilelessImport": { + "message": "匯å…Ĩ臺 Bitwarden", + "description": "Notification button text for starting a fileless import." + }, + "importing": { + "message": "匯å…Ĩ中â€Ļâ€Ļ", + "description": "Notification message for when an import is in progress." + }, + "dataSuccessfullyImported": { + "message": "čŗ‡æ–™åŒ¯å…Ĩ成功īŧ", + "description": "Notification message for when an import has completed successfully." + }, + "dataImportFailed": { + "message": "匯å…Ĩ時į™ŧį”ŸéŒ¯čĒ¤ã€‚æĒĸæŸĨ控åˆļ台äģĨäē†č§ŖčŠŗį´°čŗ‡č¨Šã€‚", + "description": "Notification message for when an import has failed." + }, + "importNetworkError": { + "message": "匯å…Ĩ時遇到įļ˛čˇ¯éŒ¯čǤ", + "description": "Notification message for when an import has failed due to a network error." + }, + "aliasDomain": { + "message": "åˆĨ名įļ˛åŸŸ" + }, + "passwordRepromptDisabledAutofillOnPageLoad": { + "message": "äŊŋᔍä¸ģ密įĸŧ重新提į¤ēįš„é …į›Žį„Ąæŗ•åœ¨é éĸčŧ‰å…Ĩ時äŊŋᔍč‡Ē動åĄĢå…Ĩ功čƒŊã€‚åˇ˛é—œé–‰é éĸčŧ‰å…Ĩæ™‚įš„č‡Ē動åĄĢå…Ĩ功čƒŊ。", + "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." + }, + "autofillOnPageLoadSetToDefault": { + "message": "將頁éĸčŧ‰å…Ĩ時äŊŋᔍč‡Ē動åĄĢå…Ĩ功čƒŊč¨­åŽšį‚ēé č¨­ã€‚", + "description": "Toast message for informing the user that autofill on page load has been set to the default setting." + }, + "turnOffMasterPasswordPromptToEditField": { + "message": "關閉ä¸ģ密įĸŧ重新提į¤ēäģĨᎍčŧ¯æ­¤æŦ„äŊ", + "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." + }, + "toggleSideNavigation": { + "message": "Toggle side navigation" + }, + "skipToContent": { + "message": "čˇŗč‡ŗå…§åŽš" + }, + "bitwardenOverlayButton": { + "message": "Bitwarden č‡Ē動åĄĢå…Ĩ選喎按鈕", + "description": "Page title for the iframe containing the overlay button" + }, + "toggleBitwardenVaultOverlay": { + "message": "切換 Bitwarden č‡Ē動åĄĢå…Ĩ選喎", + "description": "Screen reader and tool tip label for the overlay button" + }, + "bitwardenVault": { + "message": "Bitwarden č‡Ē動åĄĢå…Ĩ選喎", + "description": "Page title in overlay" + }, + "unlockYourAccountToViewMatchingLogins": { + "message": "č§ŖéŽ–æ‚¨įš„å¸ŗæˆļäģĨæŸĨįœ‹įŦĻåˆįš„į™ģå…Ĩčŗ‡č¨Š", + "description": "Text to display in overlay when the account is locked." + }, + "unlockYourAccountToViewAutofillSuggestions": { + "message": "Unlock your account to view autofill suggestions", + "description": "Text to display in overlay when the account is locked." + }, + "unlockAccount": { + "message": "č§ŖéŽ–å¸ŗč™Ÿ", + "description": "Button text to display in overlay when the account is locked." + }, + "unlockAccountAria": { + "message": "Unlock your account, opens in a new window", + "description": "Screen reader text (aria-label) for unlock account button in overlay" + }, + "fillCredentialsFor": { + "message": "åĄĢå…Ĩį™ģå…Ĩčŗ‡č¨ŠįĩĻ", + "description": "Screen reader text for when overlay item is in focused" + }, + "partialUsername": { + "message": "部分äŊŋį”¨č€…åį¨ą", + "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" + }, + "noItemsToShow": { + "message": "į„Ąå¯éĄ¯į¤ēįš„é …į›Ž", + "description": "Text to show in overlay if there are no matching items" + }, + "newItem": { + "message": "新åĸžé …į›Ž", + "description": "Button text to display in overlay when there are no matching items" + }, + "addNewVaultItem": { + "message": "新åĸžå¯†įĸŧåēĢé …į›Ž", + "description": "Screen reader text (aria-label) for new item button in overlay" + }, + "newLogin": { + "message": "新åĸžį™ģå…Ĩčŗ‡č¨Š", + "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", + "description": "Screen reader text (aria-label) for new login button within inline menu" + }, + "newCard": { + "message": "New card", + "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", + "description": "Screen reader text (aria-label) for new card button within inline menu" + }, + "newIdentity": { + "message": "New identity", + "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", + "description": "Screen reader text (aria-label) for new identity button within inline menu" + }, + "bitwardenOverlayMenuAvailable": { + "message": "您可äģĨäŊŋᔍ Bitwarden č‡Ē動åĄĢå…Ĩ選喎。čĢ‹æŒ‰å‘ä¸‹éĩ䞆選擇。", + "description": "Screen reader text for announcing when the overlay opens on the page" + }, + "turnOn": { + "message": "開啟" + }, + "ignore": { + "message": "åŋŊį•Ĩ" + }, + "importData": { + "message": "匯å…Ĩčŗ‡æ–™", + "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" + }, + "importError": { + "message": "匯å…Ĩ時į™ŧį”ŸéŒ¯čǤ" + }, + "importErrorDesc": { + "message": "您嘗čŠĻ匯å…Ĩįš„čŗ‡æ–™æœ‰å•éĄŒīŧŒč̋觪æąē下列䞆æēæĒ”æĄˆä¸­įš„éŒ¯čǤį„ļ垌再čŠĻ一æŦĄã€‚" + }, + "resolveTheErrorsBelowAndTryAgain": { + "message": "č̋觪æąē下éĸįš„éŒ¯čǤį„ļ垌再čŠĻ一æŦĄã€‚" + }, + "description": { + "message": "描čŋ°" + }, + "importSuccess": { + "message": "čŗ‡æ–™åŒ¯å…Ĩ成功" + }, + "importSuccessNumberOfItems": { + "message": "ä¸€å…ąåŒ¯å…Ĩ $AMOUNT$ å€‹é …į›Žã€‚", + "placeholders": { + "amount": { + "content": "$1", + "example": "2" + } + } + }, + "tryAgain": { + "message": "再čŠĻ一æŦĄ" + }, + "verificationRequiredForActionSetPinToContinue": { + "message": "此操äŊœéœ€čĻéŠ—č­‰ã€‚č¨­åŽš PIN įĸŧäģĨįšŧįēŒã€‚" + }, + "setPin": { + "message": "č¨­åŽš PIN įĸŧ" + }, + "verifyWithBiometrics": { + "message": "į”Ÿį‰Ščž¨č­˜éŠ—č­‰" + }, + "awaitingConfirmation": { + "message": "æ­Ŗåœ¨į­‰åž…įĸēčĒ" + }, + "couldNotCompleteBiometrics": { + "message": "į„Ąæŗ•åŽŒæˆį”Ÿį‰Ščž¨č­˜ã€‚" + }, + "needADifferentMethod": { + "message": "需čĻä¸åŒįš„æ–šæŗ•å—ŽīŧŸ" + }, + "useMasterPassword": { + "message": "ᔍä¸ģ密įĸŧ" + }, + "usePin": { + "message": "äŊŋᔍ PIN įĸŧ" + }, + "useBiometrics": { + "message": "į”¨į”Ÿį‰Šč­˜åˆĨ" + }, + "enterVerificationCodeSentToEmail": { + "message": "čŧ¸å…Ĩå‚ŗé€åˆ°äŊ įš„é›ģ子éƒĩäģļįš„éŠ—č­‰įĸŧ。" + }, + "resendCode": { + "message": "é‡æ–°å‚ŗé€éŠ—č­‰įĸŧ" + }, + "total": { + "message": "į¸Ŋ計" + }, + "importWarning": { + "message": "åŗå°‡åŒ¯å…Ĩčŗ‡æ–™č‡ŗ $ORGANIZATION$ã€‚æ‚¨įš„čŗ‡æ–™å¯čƒŊæœƒčˆ‡čŠ˛įĩ„įš”ä¸­įš„æˆå“Ąå…ąį”¨īŧŒįĸē厚čρįšŧįēŒå—ŽīŧŸ", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "duoHealthCheckResultsInNullAuthUrlError": { + "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + }, + "launchDuoAndFollowStepsToFinishLoggingIn": { + "message": "啟動 Duo ä¸Ļäžį…§æ­Ĩ銟厌成į™ģå…Ĩ。" + }, + "duoRequiredForAccount": { + "message": "Duo two-step login is required for your account." + }, + "popoutTheExtensionToCompleteLogin": { + "message": "Popout the extension to complete login." + }, + "popoutExtension": { + "message": "Popout extension" + }, + "launchDuo": { + "message": "開啟Duo" + }, + "importFormatError": { + "message": "čŗ‡æ–™æ ŧåŧä¸æ­Ŗįĸē。čĢ‹æĒĸæŸĨ匯å…ĨæĒ”æĄˆåžŒå†čŠĻ一æŦĄã€‚" + }, + "importNothingError": { + "message": "æœĒ匯å…ĨäģģäŊ•內厚。" + }, + "importEncKeyError": { + "message": "č§Ŗå¯†åŒ¯å‡ēįš„æĒ”æĄˆæ™‚į™ŧį”ŸéŒ¯čǤīŧŒæ‚¨įš„åŠ å¯†é‡‘é‘°čˆ‡åŒ¯å‡ēčŗ‡æ–™æ™‚äŊŋį”¨įš„é‡‘é‘°ä¸åŒã€‚" + }, + "invalidFilePassword": { + "message": "æĒ”æĄˆå¯†įĸŧį„Ąæ•ˆīŧŒčĢ‹äŊŋį”¨æ‚¨į•ļ初匯å‡ēæĒ”æĄˆæ™‚čŧ¸å…Ĩįš„å¯†įĸŧ。" + }, + "destination": { + "message": "Destination" + }, + "learnAboutImportOptions": { + "message": "įž­č§Ŗæ›´å¤šåŒ¯å…Ĩ選項" + }, + "selectImportFolder": { + "message": "é¸æ“‡ä¸€å€‹čŗ‡æ–™å¤ž" + }, + "selectImportCollection": { + "message": "é¸æ“‡ä¸€å€‹åˆ†éĄž" + }, + "importTargetHint": { + "message": "åĻ‚æžœæ‚¨čĻå°‡åŒ¯å…ĨæĒ”æĄˆįš„å…§åŽšį§ģ動到 $DESTINATION$īŧŒčĢ‹é¸æ“‡æ­¤é¸é …", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "æĒ”æĄˆåŒ…åĢæœĒæŒ‡æ´žé …į›Žã€‚" + }, + "selectFormat": { + "message": "選擇匯å…ĨæĒ”æĄˆįš„æ ŧåŧ" + }, + "selectImportFile": { + "message": "選擇čρ匝å…Ĩįš„æĒ”æĄˆ" + }, + "chooseFile": { + "message": "選擇æĒ”æĄˆ" + }, + "noFileChosen": { + "message": "æœĒ選擇äģģäŊ•æĒ”æĄˆ" + }, + "orCopyPasteFileContents": { + "message": "æˆ–č¤‡čŖŊ/č˛ŧ上čρ匝å…Ĩįš„æĒ”æĄˆå…§åŽš" + }, + "instructionsFor": { + "message": "$NAME$ 教學", + "description": "The title for the import tool instructions.", + "placeholders": { + "name": { + "content": "$1", + "example": "LastPass (csv)" + } + } + }, + "confirmVaultImport": { + "message": "įĸēčĒåŒ¯å…Ĩ密įĸŧåēĢ" + }, + "confirmVaultImportDesc": { + "message": "æ­¤æĒ”æĄˆå—å¯†įĸŧäŋč­ˇīŧŒčĢ‹čŧ¸å…ĨæĒ”æĄˆå¯†įĸŧäģĨ匯å…Ĩčŗ‡æ–™ã€‚" + }, + "confirmFilePassword": { + "message": "įĸēčĒæĒ”æĄˆå¯†įĸŧ" + }, + "exportSuccess": { + "message": "Vault data exported" + }, + "typePasskey": { + "message": "密įĸŧ金鑰" + }, + "accessing": { + "message": "Accessing" + }, + "passkeyNotCopied": { + "message": "密įĸŧ金鑰不會čĸĢ複čŖŊ" + }, + "passkeyNotCopiedAlert": { + "message": "不會將密įĸŧ金鑰複čŖŊ到拓čŖŊįš„é …į›Žä¸­ã€‚æ‚¨æƒŗįšŧį猿‹“čŖŊčŠ˛é …į›Žå—ŽīŧŸ" + }, + "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { + "message": "į™ŧčĩˇįĢ™éģžéœ€čĻéŠ—č­‰ã€‚æ˛’æœ‰ä¸ģ密įĸŧįš„å¸ŗæˆļ尚æœĒ開通此功čƒŊ。" + }, + "logInWithPasskeyQuestion": { + "message": "Log in with passkey?" + }, + "passkeyAlreadyExists": { + "message": "ᔍæ–ŧé€™å€‹æ‡‰į”¨į¨‹åŧįš„密įĸŧ金鑰厞įļ“存在。" + }, + "noPasskeysFoundForThisApplication": { + "message": "æœĒį™ŧįžį”¨æ–ŧé€™å€‹æ‡‰į”¨į¨‹åŧįš„密įĸŧ金鑰。" + }, + "noMatchingPasskeyLogin": { + "message": "æ‚¨æ˛’æœ‰įŦĻåˆčŠ˛įļ˛įĢ™įš„į™ģå…Ĩčŗ‡č¨Šã€‚" + }, + "noMatchingLoginsForSite": { + "message": "No matching logins for this site" + }, + "searchSavePasskeyNewLogin": { + "message": "Search or save passkey as new login" + }, + "confirm": { + "message": "įĸēčĒ" + }, + "savePasskey": { + "message": "å„˛å­˜å¯†įĸŧ金鑰" + }, + "savePasskeyNewLogin": { + "message": "將密įĸŧé‡‘é‘°å„˛å­˜į‚ēæ–°įš„į™ģå…Ĩčŗ‡č¨Š" + }, + "chooseCipherForPasskeySave": { + "message": "Choose a login to save this passkey to" + }, + "chooseCipherForPasskeyAuth": { + "message": "Choose a passkey to log in with" + }, + "passkeyItem": { + "message": "密įĸŧé‡‘é‘°é …į›Ž" + }, + "overwritePasskey": { + "message": "čφå¯Ģ密įĸŧ金鑰嗎īŧŸ" + }, + "overwritePasskeyAlert": { + "message": "čŠ˛é …į›Žåˇ˛åŒ…åĢ密įĸŧ金鑰。您įĸē厚čρčφå¯Ģį›Žå‰įš„å¯†įĸŧ金鑰嗎īŧŸ" + }, + "featureNotSupported": { + "message": "尚æœĒ支援此功čƒŊ" + }, + "yourPasskeyIsLocked": { + "message": "äŊŋᔍ坆įĸŧ金鑰需čρčēĢåˆ†éŠ—č­‰ã€‚čĢ‹éŠ—č­‰æ‚¨įš„čēĢäģŊäģĨįšŧįēŒã€‚" + }, + "multifactorAuthenticationCancelled": { + "message": "å¤šå› į´ éŠ—č­‰åˇ˛å–æļˆ" + }, + "noLastPassDataFound": { + "message": "æœĒ扞到äģģäŊ• LastPass čŗ‡æ–™" + }, + "incorrectUsernameOrPassword": { + "message": "äŊŋį”¨č€…åį¨ąæˆ–å¯†įĸŧä¸æ­Ŗįĸē" + }, + "incorrectPassword": { + "message": "密įĸŧ錯čǤ" + }, + "incorrectCode": { + "message": "錯čĒ¤éŠ—č­‰įĸŧ" + }, + "incorrectPin": { + "message": "PIN įĸŧ錯čǤ" + }, + "multifactorAuthenticationFailed": { + "message": "å¤šå› į´ éŠ—č­‰å¤ąæ•—" + }, + "includeSharedFolders": { + "message": "包åĢå…ąį”¨įš„čŗ‡æ–™å¤ž" + }, + "lastPassEmail": { + "message": "LastPass é›ģ子éƒĩäģļ" + }, + "importingYourAccount": { + "message": "æ­Ŗåœ¨åŒ¯å…Ĩæ‚¨įš„å¸ŗæˆļ..." + }, + "lastPassMFARequired": { + "message": "需čĻé€˛čĄŒ LastPass å¤šå› į´ éŠ—č­‰" + }, + "lastPassMFADesc": { + "message": "čŧ¸å…Ĩ來č‡ĒéŠ—č­‰į¨‹åŧįš„å–ŽæŦĄäŊŋį”¨é€ščĄŒįĸŧ" + }, + "lastPassOOBDesc": { + "message": "åœ¨éŠ—č­‰į¨‹åŧä¸­æ ¸å‡†į™ģå…ĨčĢ‹æą‚æˆ–čŧ¸å…Ĩå–ŽæŦĄäŊŋį”¨é€ščĄŒįĸŧ。" + }, + "passcode": { + "message": "密įĸŧ" + }, + "lastPassMasterPassword": { + "message": "LastPass ä¸ģ密įĸŧ" + }, + "lastPassAuthRequired": { + "message": "需čρ LastPass 驗證" + }, + "awaitingSSO": { + "message": "į­‰åž… SSO 驗證" + }, + "awaitingSSODesc": { + "message": "čĢ‹äŊŋį”¨æ‚¨įš„å…Ŧå¸æ†‘č­‰įšŧįēŒį™ģå…Ĩ。" + }, + "seeDetailedInstructions": { + "message": "čĢ‹åƒé–ąæˆ‘å€‘čĒĒæ˜Žįļ˛įĢ™ä¸Šįš„čŠŗį´°čĒĒæ˜Žæ–ŧ", + "description": "This is followed a by a hyperlink to the help website." + }, + "importDirectlyFromLastPass": { + "message": "åžž LastPass į›´æŽĨ匯å…Ĩ" + }, + "importFromCSV": { + "message": "åžž CSV 匯å…Ĩ" + }, + "lastPassTryAgainCheckEmail": { + "message": "čĢ‹å†å˜—čŠĻ一æŦĄīŧŒæˆ–æĒĸæŸĨé›ģ子éƒĩäģļäŋĄįŽąä¸­äž†č‡Ē LastPass įš„éŠ—č­‰äŋĄã€‚" + }, + "collection": { + "message": "åˆ†éĄž" + }, + "lastPassYubikeyDesc": { + "message": "å°‡čˆ‡æ‚¨įš„ LastPass 叺æˆļ逪įĩįš„ YubiKey 插å…Ĩé›ģč…Ļįš„ USB 逪æŽĨ埠īŧŒį„ļ垌按下按鈕。" + }, + "switchAccount": { + "message": "åˆ‡æ›å¸ŗæˆļ" + }, + "switchAccounts": { + "message": "åˆ‡æ›å¸ŗč™Ÿ" + }, + "switchToAccount": { + "message": "åˆ‡æ›å¸ŗæˆļ" + }, + "activeAccount": { + "message": "į›Žå‰å¸ŗæˆļ" + }, + "availableAccounts": { + "message": "å¯į”¨å¸ŗæˆļ" + }, + "accountLimitReached": { + "message": "厞達叺æˆļ數量上限。į™ģå‡ē䏀個叺æˆļ垌再加å…Ĩå…ļäģ–įš„å¸ŗæˆļ。" + }, + "active": { + "message": "į”Ÿæ•ˆä¸­" + }, + "locked": { + "message": "åˇ˛éŽ–" + }, + "unlocked": { + "message": "åˇ˛č§ŖéŽ–" + }, + "server": { + "message": "äŧ翜å™¨" + }, + "hostedAt": { + "message": "hosted at" + }, + "useDeviceOrHardwareKey": { + "message": "Use your device or hardware key" + }, + "justOnce": { + "message": "僅此一æŦĄ" + }, + "alwaysForThisSite": { + "message": "Always for this site" + }, + "domainAddedToExcludedDomains": { + "message": "$DOMAIN$ added to excluded domains.", + "placeholders": { + "domain": { + "content": "$1", + "example": "duckduckgo.com" + } + } + }, + "commonImportFormats": { + "message": "Common formats", + "description": "Label indicating the most common import formats" + }, + "confirmContinueToBrowserSettingsTitle": { + "message": "Continue to browser settings?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" + }, + "confirmContinueToHelpCenter": { + "message": "Continue to Help Center?", + "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" + }, + "confirmContinueToHelpCenterPasswordManagementContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" + }, + "confirmContinueToHelpCenterKeyboardShortcutsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" + }, + "confirmContinueToBrowserPasswordManagementSettingsContent": { + "message": "Change your browser's autofill and password management settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" + }, + "confirmContinueToBrowserKeyboardShortcutSettingsContent": { + "message": "You can view and set extension shortcuts in your browser's settings.", + "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" + }, + "overrideDefaultBrowserAutofillTitle": { + "message": "Make Bitwarden your default password manager?", + "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutofillDescription": { + "message": "Ignoring this option may cause conflicts between Bitwarden autofill suggestions and your browser's.", + "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" + }, + "overrideDefaultBrowserAutoFillSettings": { + "message": "Make Bitwarden your default password manager", + "description": "Label for the setting that allows overriding the default browser autofill settings" + }, + "privacyPermissionAdditionNotGrantedTitle": { + "message": "Unable to set Bitwarden as the default password manager", + "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "privacyPermissionAdditionNotGrantedDescription": { + "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" + }, + "makeDefault": { + "message": "設į‚ē預設", + "description": "Button text for the setting that allows overriding the default browser autofill settings" + }, + "saveCipherAttemptSuccess": { + "message": "Credentials saved successfully!", + "description": "Notification message for when saving credentials has succeeded." + }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, + "updateCipherAttemptSuccess": { + "message": "Credentials updated successfully!", + "description": "Notification message for when updating credentials has succeeded." + }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, + "saveCipherAttemptFailed": { + "message": "Error saving credentials. Check console for details.", + "description": "Notification message for when saving credentials has failed." + }, + "success": { + "message": "Success" + }, + "removePasskey": { + "message": "Remove passkey" + }, + "passkeyRemoved": { + "message": "Passkey removed" + }, + "autofillSuggestions": { + "message": "Autofill suggestions" + }, + "autofillSuggestionsTip": { + "message": "Save a login item for this site to autofill" + }, + "yourVaultIsEmpty": { + "message": "Your vault is empty" + }, + "noItemsMatchSearch": { + "message": "No items match your search" + }, + "clearFiltersOrTryAnother": { + "message": "Clear filters or try another search term" + }, + "copyInfoTitle": { + "message": "複čŖŊčŗ‡č¨Š - $ITEMNAME$", + "description": "Title for a button that opens a menu with options to copy information from an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "copyNoteTitle": { + "message": "Copy Note - $ITEMNAME$", + "description": "Title for a button copies a note to the clipboard.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Note Item" + } + } + }, + "moreOptionsLabel": { + "message": "更多選項, $ITEMNAME$", + "description": "Aria label for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "moreOptionsTitle": { + "message": "更多選項 - $ITEMNAME$", + "description": "Title for a button that opens a menu with more options for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "viewItemTitle": { + "message": "View item - $ITEMNAME$", + "description": "Title for a link that opens a view for an item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "autofillTitle": { + "message": "Autofill - $ITEMNAME$", + "description": "Title for a button that autofills a login item.", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + } + } + }, + "noValuesToCopy": { + "message": "No values to copy" + }, + "assignToCollections": { + "message": "æŒ‡æ´žč‡ŗé›†åˆ" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyAddress": { + "message": "Copy address" + }, + "adminConsole": { + "message": "Admin Console" + }, + "accountSecurity": { + "message": "叺æˆļ厉全性" + }, + "notifications": { + "message": "通įŸĨ" + }, + "appearance": { + "message": "外觀" + }, + "errorAssigningTargetCollection": { + "message": "Error assigning target collection." + }, + "errorAssigningTargetFolder": { + "message": "Error assigning target folder." + }, + "viewItemsIn": { + "message": "View items in $NAME$", + "description": "Button to view the contents of a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "backTo": { + "message": "Back to $NAME$", + "description": "Navigate back to a previous folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "new": { + "message": "New" + }, + "removeItem": { + "message": "į§ģ除 $NAME$", + "description": "Remove a selected option, such as a folder or collection", + "placeholders": { + "name": { + "content": "$1", + "example": "Work" + } + } + }, + "itemsWithNoFolder": { + "message": "Items with no folder" + }, + "itemDetails": { + "message": "Item details" + }, + "itemName": { + "message": "Item name" + }, + "cannotRemoveViewOnlyCollections": { + "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "placeholders": { + "collections": { + "content": "$1", + "example": "Work, Personal" + } + } + }, + "organizationIsDeactivated": { + "message": "Organization is deactivated" + }, + "owner": { + "message": "Owner" + }, + "selfOwnershipLabel": { + "message": "You", + "description": "Used as a label to indicate that the user is the owner of an item." + }, + "contactYourOrgAdmin": { + "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + }, + "additionalInformation": { + "message": "Additional information" + }, + "itemHistory": { + "message": "Item history" + }, + "lastEdited": { + "message": "Last edited" + }, + "ownerYou": { + "message": "Owner: You" + }, + "linked": { + "message": "Linked" + }, + "copySuccessful": { + "message": "Copy Successful" + }, + "upload": { + "message": "Upload" + }, + "addAttachment": { + "message": "Add attachment" + }, + "maxFileSizeSansPunctuation": { + "message": "Maximum file size is 500 MB" + }, + "deleteAttachmentName": { + "message": "Delete attachment $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "downloadAttachmentName": { + "message": "Download $NAME$", + "placeholders": { + "name": { + "content": "$1", + "example": "Attachment Name" + } + } + }, + "permanentlyDeleteAttachmentConfirmation": { + "message": "Are you sure you want to permanently delete this attachment?" + }, + "premium": { + "message": "Premium" + }, + "freeOrgsCannotUseAttachments": { + "message": "Free organizations cannot use attachments" + }, + "filters": { + "message": "Filters" + }, + "personalDetails": { + "message": "Personal details" + }, + "identification": { + "message": "Identification" + }, + "contactInfo": { + "message": "Contact info" + }, + "downloadAttachment": { + "message": "Download - $ITEMNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Your File" + } + } + }, + "cardNumberEndsWith": { + "message": "card number ends with", + "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." + }, + "loginCredentials": { + "message": "Login credentials" + }, + "authenticatorKey": { + "message": "Authenticator key" + }, + "autofillOptions": { + "message": "č‡Ē動åĄĢå…Ĩ選項" + }, + "websiteUri": { + "message": "Website (URI)" + }, + "websiteUriCount": { + "message": "Website (URI) $COUNT$", + "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", + "placeholders": { + "count": { + "content": "$1", + "example": "3" + } + } + }, + "websiteAdded": { + "message": "Website added" + }, + "addWebsite": { + "message": "Add website" + }, + "deleteWebsite": { + "message": "Delete website" + }, + "defaultLabel": { + "message": "Default ($VALUE$)", + "description": "A label that indicates the default value for a field with the current default value in parentheses.", + "placeholders": { + "value": { + "content": "$1", + "example": "Base domain" + } + } + }, + "showMatchDetection": { + "message": "Show match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "hideMatchDetection": { + "message": "Hide match detection $WEBSITE$", + "placeholders": { + "website": { + "content": "$1", + "example": "https://example.com" + } + } + }, + "autoFillOnPageLoad": { + "message": "Autofill on page load?" + }, + "cardExpiredTitle": { + "message": "Expired card" + }, + "cardExpiredMessage": { + "message": "If you've renewed it, update the card's information" + }, + "cardDetails": { + "message": "Card details" + }, + "cardBrandDetails": { + "message": "$BRAND$ details", + "placeholders": { + "brand": { + "content": "$1", + "example": "Visa" + } + } + }, + "enableAnimations": { + "message": "å•Ÿį”¨å‹•į•Ģ" + }, + "showAnimations": { + "message": "éĄ¯į¤ē動į•Ģ" + }, + "addAccount": { + "message": "新åĸžå¸ŗæˆļ" + }, + "loading": { + "message": "Loading" + }, + "data": { + "message": "Data" + }, + "passkeys": { + "message": "Passkeys", + "description": "A section header for a list of passkeys." + }, + "passwords": { + "message": "Passwords", + "description": "A section header for a list of passwords." + }, + "logInWithPasskeyAriaLabel": { + "message": "Log in with passkey", + "description": "ARIA label for the inline menu button that logs in with a passkey." + }, + "assign": { + "message": "Assign" + }, + "bulkCollectionAssignmentDialogDescriptionSingular": { + "message": "Only organization members with access to these collections will be able to see the item." + }, + "bulkCollectionAssignmentDialogDescriptionPlural": { + "message": "Only organization members with access to these collections will be able to see the items." + }, + "bulkCollectionAssignmentWarning": { + "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "placeholders": { + "total_count": { + "content": "$1", + "example": "10" + }, + "readonly_count": { + "content": "$2" + } + } + }, + "addField": { + "message": "Add field" + }, + "add": { + "message": "Add" + }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, + "textHelpText": { + "message": "Use text fields for data like security questions" + }, + "hiddenHelpText": { + "message": "Use hidden fields for sensitive data like a password" + }, + "checkBoxHelpText": { + "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + }, + "linkedHelpText": { + "message": "Use a linked field when you are experiencing autofill issues for a specific website." + }, + "linkedLabelHelpText": { + "message": "Enter the the field's html id, name, aria-label, or placeholder." + }, + "editField": { + "message": "Edit field" + }, + "editFieldLabel": { + "message": "Edit $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "deleteCustomField": { + "message": "Delete $LABEL$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "fieldAdded": { + "message": "$LABEL$ added", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderToggleButton": { + "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + } + } + }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "selectCollectionsToAssign": { + "message": "選擇čĻæŒ‡æ´žįš„é›†åˆ" + }, + "personalItemTransferWarningSingular": { + "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + }, + "personalItemsTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + } + } + }, + "personalItemWithOrgTransferWarningSingular": { + "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "placeholders": { + "org": { + "content": "$1", + "example": "Organization name" + } + } + }, + "personalItemsWithOrgTransferWarningPlural": { + "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "placeholders": { + "personal_items_count": { + "content": "$1", + "example": "2" + }, + "org": { + "content": "$2", + "example": "Organization name" + } + } + }, + "successfullyAssignedCollections": { + "message": "指洞集合成功" + }, + "nothingSelected": { + "message": "You have not selected anything." + }, + "movedItemsToOrg": { + "message": "Selected items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemsMovedToOrg": { + "message": "Items moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "itemMovedToOrg": { + "message": "Item moved to $ORGNAME$", + "placeholders": { + "orgname": { + "content": "$1", + "example": "Company Name" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "itemLocation": { + "message": "Item Location" + }, + "fileSend": { + "message": "File Send" + }, + "fileSends": { + "message": "File Sends" + }, + "textSend": { + "message": "Text Send" + }, + "textSends": { + "message": "Text Sends" + }, + "bitwardenNewLook": { + "message": "Bitwarden has a new look!" + }, + "bitwardenNewLookDesc": { + "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + }, + "accountActions": { + "message": "Account actions" + }, + "showNumberOfAutofillSuggestions": { + "message": "Show number of login autofill suggestions on extension icon" + }, + "systemDefault": { + "message": "System default" + }, + "enterprisePolicyRequirementsApplied": { + "message": "Enterprise policy requirements have been applied to this setting" + }, + "sshPrivateKey": { + "message": "Private key" + }, + "sshPublicKey": { + "message": "Public key" + }, + "sshFingerprint": { + "message": "Fingerprint" + }, + "sshKeyAlgorithm": { + "message": "Key type" + }, + "sshKeyAlgorithmED25519": { + "message": "ED25519" + }, + "sshKeyAlgorithmRSA2048": { + "message": "RSA 2048-Bit" + }, + "sshKeyAlgorithmRSA3072": { + "message": "RSA 3072-Bit" + }, + "sshKeyAlgorithmRSA4096": { + "message": "RSA 4096-Bit" + }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, + "fileSavedToDevice": { + "message": "File saved to device. Manage from your device downloads." + }, + "showCharacterCount": { + "message": "Show character count" + }, + "hideCharacterCount": { + "message": "Hide character count" + }, + "itemsInTrash": { + "message": "Items in trash" + }, + "noItemsInTrash": { + "message": "No items in trash" + }, + "noItemsInTrashDesc": { + "message": "Items you delete will appear here and be permanently deleted after 30 days" + }, + "trashWarning": { + "message": "Items that have been in trash more than 30 days will automatically be deleted" + }, + "restore": { + "message": "Restore" + }, + "deleteForever": { + "message": "Delete forever" + }, + "noEditPermissions": { + "message": "You don't have permission to edit this item" + }, + "authenticating": { + "message": "Authenticating" + }, + "fillGeneratedPassword": { + "message": "Fill generated password", + "description": "Heading for the password generator within the inline menu" + }, + "passwordRegenerated": { + "message": "Password regenerated", + "description": "Notification message for when a password has been regenerated" + }, + "saveLoginToBitwarden": { + "message": "Save login to Bitwarden?", + "description": "Confirmation message for saving a login to Bitwarden" + }, + "spaceCharacterDescriptor": { + "message": "Space", + "description": "Represents the space key in screen reader content as a readable word" + }, + "tildeCharacterDescriptor": { + "message": "Tilde", + "description": "Represents the ~ key in screen reader content as a readable word" + }, + "backtickCharacterDescriptor": { + "message": "Backtick", + "description": "Represents the ` key in screen reader content as a readable word" + }, + "exclamationCharacterDescriptor": { + "message": "Exclamation mark", + "description": "Represents the ! key in screen reader content as a readable word" + }, + "atSignCharacterDescriptor": { + "message": "At sign", + "description": "Represents the @ key in screen reader content as a readable word" + }, + "hashSignCharacterDescriptor": { + "message": "Hash sign", + "description": "Represents the # key in screen reader content as a readable word" + }, + "dollarSignCharacterDescriptor": { + "message": "Dollar sign", + "description": "Represents the $ key in screen reader content as a readable word" + }, + "percentSignCharacterDescriptor": { + "message": "Percent sign", + "description": "Represents the % key in screen reader content as a readable word" + }, + "caretCharacterDescriptor": { + "message": "Caret", + "description": "Represents the ^ key in screen reader content as a readable word" + }, + "ampersandCharacterDescriptor": { + "message": "Ampersand", + "description": "Represents the & key in screen reader content as a readable word" + }, + "asteriskCharacterDescriptor": { + "message": "Asterisk", + "description": "Represents the * key in screen reader content as a readable word" + }, + "parenLeftCharacterDescriptor": { + "message": "Left parenthesis", + "description": "Represents the ( key in screen reader content as a readable word" + }, + "parenRightCharacterDescriptor": { + "message": "Right parenthesis", + "description": "Represents the ) key in screen reader content as a readable word" + }, + "hyphenCharacterDescriptor": { + "message": "Underscore", + "description": "Represents the _ key in screen reader content as a readable word" + }, + "underscoreCharacterDescriptor": { + "message": "Hyphen", + "description": "Represents the - key in screen reader content as a readable word" + }, + "plusCharacterDescriptor": { + "message": "Plus", + "description": "Represents the + key in screen reader content as a readable word" + }, + "equalsCharacterDescriptor": { + "message": "Equals", + "description": "Represents the = key in screen reader content as a readable word" + }, + "braceLeftCharacterDescriptor": { + "message": "Left brace", + "description": "Represents the { key in screen reader content as a readable word" + }, + "braceRightCharacterDescriptor": { + "message": "Right brace", + "description": "Represents the } key in screen reader content as a readable word" + }, + "bracketLeftCharacterDescriptor": { + "message": "Left bracket", + "description": "Represents the [ key in screen reader content as a readable word" + }, + "bracketRightCharacterDescriptor": { + "message": "Right bracket", + "description": "Represents the ] key in screen reader content as a readable word" + }, + "pipeCharacterDescriptor": { + "message": "Pipe", + "description": "Represents the | key in screen reader content as a readable word" + }, + "backSlashCharacterDescriptor": { + "message": "Back slash", + "description": "Represents the back slash key in screen reader content as a readable word" + }, + "colonCharacterDescriptor": { + "message": "Colon", + "description": "Represents the : key in screen reader content as a readable word" + }, + "semicolonCharacterDescriptor": { + "message": "Semicolon", + "description": "Represents the ; key in screen reader content as a readable word" + }, + "doubleQuoteCharacterDescriptor": { + "message": "Double quote", + "description": "Represents the double quote key in screen reader content as a readable word" + }, + "singleQuoteCharacterDescriptor": { + "message": "Single quote", + "description": "Represents the ' key in screen reader content as a readable word" + }, + "lessThanCharacterDescriptor": { + "message": "Less than", + "description": "Represents the < key in screen reader content as a readable word" + }, + "greaterThanCharacterDescriptor": { + "message": "Greater than", + "description": "Represents the > key in screen reader content as a readable word" + }, + "commaCharacterDescriptor": { + "message": "Comma", + "description": "Represents the , key in screen reader content as a readable word" + }, + "periodCharacterDescriptor": { + "message": "Period", + "description": "Represents the . key in screen reader content as a readable word" + }, + "questionCharacterDescriptor": { + "message": "Question mark", + "description": "Represents the ? key in screen reader content as a readable word" + }, + "forwardSlashCharacterDescriptor": { + "message": "Forward slash", + "description": "Represents the / key in screen reader content as a readable word" + }, + "lowercaseAriaLabel": { + "message": "Lowercase" + }, + "uppercaseAriaLabel": { + "message": "Uppercase" + }, + "generatedPassword": { + "message": "Generated password" } } diff --git a/apps/browser/src/admin-console/background/service-factories/organization-service.factory.ts b/apps/browser/src/admin-console/background/service-factories/organization-service.factory.ts deleted file mode 100644 index a050dc22ecc..00000000000 --- a/apps/browser/src/admin-console/background/service-factories/organization-service.factory.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { OrganizationService as AbstractOrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; -import { BrowserOrganizationService } from "../../services/browser-organization.service"; - -type OrganizationServiceFactoryOptions = FactoryOptions; - -export type OrganizationServiceInitOptions = OrganizationServiceFactoryOptions & - StateServiceInitOptions; - -export function organizationServiceFactory( - cache: { organizationService?: AbstractOrganizationService } & CachedServices, - opts: OrganizationServiceInitOptions -): Promise { - return factory( - cache, - "organizationService", - opts, - async () => new BrowserOrganizationService(await stateServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/admin-console/background/service-factories/policy-service.factory.ts b/apps/browser/src/admin-console/background/service-factories/policy-service.factory.ts deleted file mode 100644 index 89f4a667f8d..00000000000 --- a/apps/browser/src/admin-console/background/service-factories/policy-service.factory.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { PolicyService as AbstractPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory as stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; -import { BrowserPolicyService } from "../../services/browser-policy.service"; - -import { - organizationServiceFactory, - OrganizationServiceInitOptions, -} from "./organization-service.factory"; - -type PolicyServiceFactoryOptions = FactoryOptions; - -export type PolicyServiceInitOptions = PolicyServiceFactoryOptions & - StateServiceInitOptions & - OrganizationServiceInitOptions; - -export function policyServiceFactory( - cache: { policyService?: AbstractPolicyService } & CachedServices, - opts: PolicyServiceInitOptions -): Promise { - return factory( - cache, - "policyService", - opts, - async () => - new BrowserPolicyService( - await stateServiceFactory(cache, opts), - await organizationServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/admin-console/services/browser-organization.service.ts b/apps/browser/src/admin-console/services/browser-organization.service.ts deleted file mode 100644 index 6294756cdf7..00000000000 --- a/apps/browser/src/admin-console/services/browser-organization.service.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { BehaviorSubject } from "rxjs"; - -import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { OrganizationService } from "@bitwarden/common/admin-console/services/organization/organization.service"; - -import { browserSession, sessionSync } from "../../platform/decorators/session-sync-observable"; - -@browserSession -export class BrowserOrganizationService extends OrganizationService { - @sessionSync({ initializer: Organization.fromJSON, initializeAs: "array" }) - protected _organizations: BehaviorSubject; -} diff --git a/apps/browser/src/admin-console/services/browser-policy.service.ts b/apps/browser/src/admin-console/services/browser-policy.service.ts deleted file mode 100644 index 74aa0f546af..00000000000 --- a/apps/browser/src/admin-console/services/browser-policy.service.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { BehaviorSubject, filter, map, Observable, switchMap, tap } from "rxjs"; -import { Jsonify } from "type-fest"; - -import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { PolicyType } from "@bitwarden/common/admin-console/enums"; -import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; -import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; - -import { browserSession, sessionSync } from "../../platform/decorators/session-sync-observable"; - -@browserSession -export class BrowserPolicyService extends PolicyService { - @sessionSync({ - initializer: (obj: Jsonify) => Object.assign(new Policy(), obj), - initializeAs: "array", - }) - protected _policies: BehaviorSubject; - - constructor(stateService: StateService, organizationService: OrganizationService) { - super(stateService, organizationService); - this._policies.pipe(this.handleActivateAutofillPolicy.bind(this)).subscribe(); - } - - /** - * If the ActivateAutofill policy is enabled, save a flag indicating if we need to - * enable Autofill on page load. - */ - private handleActivateAutofillPolicy(policies$: Observable) { - return policies$.pipe( - map((policies) => policies.find((p) => p.type == PolicyType.ActivateAutofill && p.enabled)), - filter((p) => p != null), - switchMap(async (_) => [ - await this.stateService.getActivateAutoFillOnPageLoadFromPolicy(), - await this.stateService.getEnableAutoFillOnPageLoad(), - ]), - tap(([activated, autofillEnabled]) => { - if (activated === undefined) { - this.stateService.setActivateAutoFillOnPageLoadFromPolicy(!autofillEnabled); - } - }) - ); - } -} diff --git a/apps/browser/src/auth/background/service-factories/auth-request-crypto-service.factory.ts b/apps/browser/src/auth/background/service-factories/auth-request-crypto-service.factory.ts deleted file mode 100644 index e1757f98129..00000000000 --- a/apps/browser/src/auth/background/service-factories/auth-request-crypto-service.factory.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; -import { AuthRequestCryptoServiceImplementation } from "@bitwarden/common/auth/services/auth-request-crypto.service.implementation"; - -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - FactoryOptions, - factory, -} from "../../../platform/background/service-factories/factory-options"; - -type AuthRequestCryptoServiceFactoryOptions = FactoryOptions; - -export type AuthRequestCryptoServiceInitOptions = AuthRequestCryptoServiceFactoryOptions & - CryptoServiceInitOptions; - -export function authRequestCryptoServiceFactory( - cache: { authRequestCryptoService?: AuthRequestCryptoServiceAbstraction } & CachedServices, - opts: AuthRequestCryptoServiceInitOptions -): Promise { - return factory( - cache, - "authRequestCryptoService", - opts, - async () => new AuthRequestCryptoServiceImplementation(await cryptoServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/auth/background/service-factories/auth-service.factory.ts b/apps/browser/src/auth/background/service-factories/auth-service.factory.ts deleted file mode 100644 index 6aaeb476369..00000000000 --- a/apps/browser/src/auth/background/service-factories/auth-service.factory.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { AuthService as AbstractAuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { AuthService } from "@bitwarden/common/auth/services/auth.service"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../../admin-console/background/service-factories/policy-service.factory"; -import { - apiServiceFactory, - ApiServiceInitOptions, -} from "../../../platform/background/service-factories/api-service.factory"; -import { appIdServiceFactory } from "../../../platform/background/service-factories/app-id-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - environmentServiceFactory, - EnvironmentServiceInitOptions, -} from "../../../platform/background/service-factories/environment-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - messagingServiceFactory, - MessagingServiceInitOptions, -} from "../../../platform/background/service-factories/messaging-service.factory"; -import { - platformUtilsServiceFactory, - PlatformUtilsServiceInitOptions, -} from "../../../platform/background/service-factories/platform-utils-service.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; -import { - passwordStrengthServiceFactory, - PasswordStrengthServiceInitOptions, -} from "../../../tools/background/service_factories/password-strength-service.factory"; - -import { - authRequestCryptoServiceFactory, - AuthRequestCryptoServiceInitOptions, -} from "./auth-request-crypto-service.factory"; -import { - deviceTrustCryptoServiceFactory, - DeviceTrustCryptoServiceInitOptions, -} from "./device-trust-crypto-service.factory"; -import { - keyConnectorServiceFactory, - KeyConnectorServiceInitOptions, -} from "./key-connector-service.factory"; -import { tokenServiceFactory, TokenServiceInitOptions } from "./token-service.factory"; -import { twoFactorServiceFactory, TwoFactorServiceInitOptions } from "./two-factor-service.factory"; - -type AuthServiceFactoyOptions = FactoryOptions; - -export type AuthServiceInitOptions = AuthServiceFactoyOptions & - CryptoServiceInitOptions & - ApiServiceInitOptions & - TokenServiceInitOptions & - PlatformUtilsServiceInitOptions & - MessagingServiceInitOptions & - LogServiceInitOptions & - KeyConnectorServiceInitOptions & - EnvironmentServiceInitOptions & - StateServiceInitOptions & - TwoFactorServiceInitOptions & - I18nServiceInitOptions & - EncryptServiceInitOptions & - PolicyServiceInitOptions & - PasswordStrengthServiceInitOptions & - DeviceTrustCryptoServiceInitOptions & - AuthRequestCryptoServiceInitOptions; - -export function authServiceFactory( - cache: { authService?: AbstractAuthService } & CachedServices, - opts: AuthServiceInitOptions -): Promise { - return factory( - cache, - "authService", - opts, - async () => - new AuthService( - await cryptoServiceFactory(cache, opts), - await apiServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - await appIdServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await messagingServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await keyConnectorServiceFactory(cache, opts), - await environmentServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await twoFactorServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await passwordStrengthServiceFactory(cache, opts), - await policyServiceFactory(cache, opts), - await deviceTrustCryptoServiceFactory(cache, opts), - await authRequestCryptoServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/auth/background/service-factories/device-trust-crypto-service.factory.ts b/apps/browser/src/auth/background/service-factories/device-trust-crypto-service.factory.ts deleted file mode 100644 index 430d50fea75..00000000000 --- a/apps/browser/src/auth/background/service-factories/device-trust-crypto-service.factory.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; -import { DeviceTrustCryptoService } from "@bitwarden/common/auth/services/device-trust-crypto.service.implementation"; - -import { - DevicesApiServiceInitOptions, - devicesApiServiceFactory, -} from "../../../background/service-factories/devices-api-service.factory"; -import { - AppIdServiceInitOptions, - appIdServiceFactory, -} from "../../../platform/background/service-factories/app-id-service.factory"; -import { - CryptoFunctionServiceInitOptions, - cryptoFunctionServiceFactory, -} from "../../../platform/background/service-factories/crypto-function-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - CachedServices, - FactoryOptions, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - I18nServiceInitOptions, - i18nServiceFactory, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "../../../platform/background/service-factories/platform-utils-service.factory"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../../platform/background/service-factories/state-service.factory"; - -type DeviceTrustCryptoServiceFactoryOptions = FactoryOptions; - -export type DeviceTrustCryptoServiceInitOptions = DeviceTrustCryptoServiceFactoryOptions & - CryptoFunctionServiceInitOptions & - CryptoServiceInitOptions & - EncryptServiceInitOptions & - StateServiceInitOptions & - AppIdServiceInitOptions & - DevicesApiServiceInitOptions & - I18nServiceInitOptions & - PlatformUtilsServiceInitOptions; - -export function deviceTrustCryptoServiceFactory( - cache: { deviceTrustCryptoService?: DeviceTrustCryptoServiceAbstraction } & CachedServices, - opts: DeviceTrustCryptoServiceInitOptions -): Promise { - return factory( - cache, - "deviceTrustCryptoService", - opts, - async () => - new DeviceTrustCryptoService( - await cryptoFunctionServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await appIdServiceFactory(cache, opts), - await devicesApiServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/auth/background/service-factories/key-connector-service.factory.ts b/apps/browser/src/auth/background/service-factories/key-connector-service.factory.ts deleted file mode 100644 index 25eb85e5568..00000000000 --- a/apps/browser/src/auth/background/service-factories/key-connector-service.factory.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { KeyConnectorService as AbstractKeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; - -import { - OrganizationServiceInitOptions, - organizationServiceFactory, -} from "../../../admin-console/background/service-factories/organization-service.factory"; -import { - apiServiceFactory, - ApiServiceInitOptions, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - CryptoFunctionServiceInitOptions, - cryptoFunctionServiceFactory, -} from "../../../platform/background/service-factories/crypto-function-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../../platform/background/service-factories/log-service.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; - -import { TokenServiceInitOptions, tokenServiceFactory } from "./token-service.factory"; - -type KeyConnectorServiceFactoryOptions = FactoryOptions & { - keyConnectorServiceOptions: { - logoutCallback: (expired: boolean, userId?: string) => Promise; - }; -}; - -export type KeyConnectorServiceInitOptions = KeyConnectorServiceFactoryOptions & - StateServiceInitOptions & - CryptoServiceInitOptions & - ApiServiceInitOptions & - TokenServiceInitOptions & - LogServiceInitOptions & - OrganizationServiceInitOptions & - CryptoFunctionServiceInitOptions; - -export function keyConnectorServiceFactory( - cache: { keyConnectorService?: AbstractKeyConnectorService } & CachedServices, - opts: KeyConnectorServiceInitOptions -): Promise { - return factory( - cache, - "keyConnectorService", - opts, - async () => - new KeyConnectorService( - await stateServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await apiServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await organizationServiceFactory(cache, opts), - await cryptoFunctionServiceFactory(cache, opts), - opts.keyConnectorServiceOptions.logoutCallback - ) - ); -} diff --git a/apps/browser/src/auth/background/service-factories/token-service.factory.ts b/apps/browser/src/auth/background/service-factories/token-service.factory.ts deleted file mode 100644 index 389f8d1541a..00000000000 --- a/apps/browser/src/auth/background/service-factories/token-service.factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { TokenService as AbstractTokenService } from "@bitwarden/common/auth/abstractions/token.service"; -import { TokenService } from "@bitwarden/common/auth/services/token.service"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; - -type TokenServiceFactoryOptions = FactoryOptions; - -export type TokenServiceInitOptions = TokenServiceFactoryOptions & StateServiceInitOptions; - -export function tokenServiceFactory( - cache: { tokenService?: AbstractTokenService } & CachedServices, - opts: TokenServiceInitOptions -): Promise { - return factory( - cache, - "tokenService", - opts, - async () => new TokenService(await stateServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/auth/background/service-factories/totp-service.factory.ts b/apps/browser/src/auth/background/service-factories/totp-service.factory.ts deleted file mode 100644 index 48331576cd3..00000000000 --- a/apps/browser/src/auth/background/service-factories/totp-service.factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { TotpService as AbstractTotpService } from "@bitwarden/common/abstractions/totp.service"; -import { TotpService } from "@bitwarden/common/services/totp.service"; - -import { - CryptoFunctionServiceInitOptions, - cryptoFunctionServiceFactory, -} from "../../../platform/background/service-factories/crypto-function-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../../platform/background/service-factories/log-service.factory"; - -type TotpServiceOptions = FactoryOptions; - -export type TotpServiceInitOptions = TotpServiceOptions & - CryptoFunctionServiceInitOptions & - LogServiceInitOptions; - -export function totpServiceFactory( - cache: { totpService?: AbstractTotpService } & CachedServices, - opts: TotpServiceInitOptions -): Promise { - return factory( - cache, - "totpService", - opts, - async () => - new TotpService( - await cryptoFunctionServiceFactory(cache, opts), - await logServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/auth/background/service-factories/two-factor-service.factory.ts b/apps/browser/src/auth/background/service-factories/two-factor-service.factory.ts deleted file mode 100644 index 040a5edfb4a..00000000000 --- a/apps/browser/src/auth/background/service-factories/two-factor-service.factory.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { TwoFactorService as AbstractTwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; -import { TwoFactorService } from "@bitwarden/common/auth/services/two-factor.service"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - I18nServiceInitOptions, - i18nServiceFactory, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "../../../platform/background/service-factories/platform-utils-service.factory"; - -type TwoFactorServiceFactoryOptions = FactoryOptions; - -export type TwoFactorServiceInitOptions = TwoFactorServiceFactoryOptions & - I18nServiceInitOptions & - PlatformUtilsServiceInitOptions; - -export async function twoFactorServiceFactory( - cache: { twoFactorService?: AbstractTwoFactorService } & CachedServices, - opts: TwoFactorServiceInitOptions -): Promise { - const service = await factory( - cache, - "twoFactorService", - opts, - async () => - new TwoFactorService( - await i18nServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts) - ) - ); - service.init(); - return service; -} diff --git a/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts b/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts deleted file mode 100644 index 01bfb0f13cb..00000000000 --- a/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { UserVerificationApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification-api.service.abstraction"; -import { UserVerificationApiService } from "@bitwarden/common/auth/services/user-verification/user-verification-api.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; - -type UserVerificationApiServiceFactoryOptions = FactoryOptions; - -export type UserVerificationApiServiceInitOptions = UserVerificationApiServiceFactoryOptions & - ApiServiceInitOptions; - -export function userVerificationApiServiceFactory( - cache: { userVerificationApiService?: UserVerificationApiServiceAbstraction } & CachedServices, - opts: UserVerificationApiServiceInitOptions -): Promise { - return factory( - cache, - "userVerificationApiService", - opts, - async () => new UserVerificationApiService(await apiServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts b/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts deleted file mode 100644 index 79d327c9485..00000000000 --- a/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { UserVerificationService as AbstractUserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { UserVerificationService } from "@bitwarden/common/auth/services/user-verification/user-verification.service"; - -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; -import { - I18nServiceInitOptions, - i18nServiceFactory, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../../platform/background/service-factories/state-service.factory"; - -import { - UserVerificationApiServiceInitOptions, - userVerificationApiServiceFactory, -} from "./user-verification-api-service.factory"; - -type UserVerificationServiceFactoryOptions = FactoryOptions; - -export type UserVerificationServiceInitOptions = UserVerificationServiceFactoryOptions & - StateServiceInitOptions & - CryptoServiceInitOptions & - I18nServiceInitOptions & - UserVerificationApiServiceInitOptions; - -export function userVerificationServiceFactory( - cache: { userVerificationService?: AbstractUserVerificationService } & CachedServices, - opts: UserVerificationServiceInitOptions -): Promise { - return factory( - cache, - "userVerificationService", - opts, - async () => - new UserVerificationService( - await stateServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await userVerificationApiServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/auth/guards/fido2-auth.guard.ts b/apps/browser/src/auth/guards/fido2-auth.guard.ts new file mode 100644 index 00000000000..7d7f1f5c4e9 --- /dev/null +++ b/apps/browser/src/auth/guards/fido2-auth.guard.ts @@ -0,0 +1,38 @@ +import { inject } from "@angular/core"; +import { + ActivatedRouteSnapshot, + CanActivateFn, + Router, + RouterStateSnapshot, +} from "@angular/router"; + +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; + +import { BrowserRouterService } from "../../platform/popup/services/browser-router.service"; + +/** + * This guard verifies the user's authentication status. + * If "Locked", it saves the intended route in memory and redirects to the lock screen. Otherwise, the intended route is allowed. + */ +export const fido2AuthGuard: CanActivateFn = async ( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, +) => { + const routerService = inject(BrowserRouterService); + const authService = inject(AuthService); + const router = inject(Router); + + const authStatus = await authService.getAuthStatus(); + + if (authStatus === AuthenticationStatus.Locked) { + // Appending fromLock=true to the query params to indicate that the user is being redirected from the lock screen, this is used for user verification. + // TODO: Revert to use previousUrl once user verification for passkeys is approved for production. + // PM-4577 - https://github.com/bitwarden/clients/pull/8746 + // const previousUrl = `${state.url}&fromLock=true`; + routerService.setPreviousUrl(state.url); + return router.createUrlTree(["/lock"], { queryParams: route.queryParams }); + } + + return true; +}; diff --git a/apps/browser/src/auth/popup/account-switching/account-switcher.component.html b/apps/browser/src/auth/popup/account-switching/account-switcher.component.html new file mode 100644 index 00000000000..f0723d75ff8 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.html @@ -0,0 +1,182 @@ + + + + + + + + + + + + +
+ +
+ + + +

{{ "availableAccounts" | i18n }}

+
+ +
+ +
+
+
+ + +

+ {{ "accountLimitReached" | i18n }} +

+
+
+ +
+ + +

+ {{ "options" | i18n }} +

+
+ + + + + + + + + + +
+
+
+
+ + + +
+ +
+
{{ "switchAccounts" | i18n }}
+
+ +
+ +
+
+
+
+
    + +
  • + +
  • + +
    + {{ "availableAccounts" | i18n }} +
    +
  • + +
  • +
    +
    +
+ +

+ {{ "accountLimitReached" | i18n }} +

+
+ +
+
{{ "options" | i18n }}
+
+ + + +
+
+
+
+
diff --git a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts new file mode 100644 index 00000000000..fb636ecaf6d --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts @@ -0,0 +1,163 @@ +import { CommonModule, Location } from "@angular/common"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { Router } from "@angular/router"; +import { Subject, firstValueFrom, map, of, startWith, switchMap } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { LockService } from "@bitwarden/auth/common"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { UserId } from "@bitwarden/common/types/guid"; +import { + AvatarModule, + ButtonModule, + DialogService, + ItemModule, + SectionComponent, + SectionHeaderComponent, +} from "@bitwarden/components"; + +import { enableAccountSwitching } from "../../../platform/flags"; +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { HeaderComponent } from "../../../platform/popup/header.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; + +import { AccountComponent } from "./account.component"; +import { CurrentAccountComponent } from "./current-account.component"; +import { AccountSwitcherService } from "./services/account-switcher.service"; + +@Component({ + standalone: true, + templateUrl: "account-switcher.component.html", + imports: [ + CommonModule, + JslibModule, + ButtonModule, + ItemModule, + AvatarModule, + PopupPageComponent, + PopupHeaderComponent, + HeaderComponent, + PopOutComponent, + CurrentAccountComponent, + AccountComponent, + SectionComponent, + SectionHeaderComponent, + ], +}) +export class AccountSwitcherComponent implements OnInit, OnDestroy { + readonly lockedStatus = AuthenticationStatus.Locked; + private destroy$ = new Subject(); + + loading = false; + activeUserCanLock = false; + extensionRefreshFlag = false; + enableAccountSwitching = true; + + constructor( + private accountSwitcherService: AccountSwitcherService, + private accountService: AccountService, + private vaultTimeoutService: VaultTimeoutService, + private dialogService: DialogService, + private location: Location, + private router: Router, + private vaultTimeoutSettingsService: VaultTimeoutSettingsService, + private authService: AuthService, + private configService: ConfigService, + private lockService: LockService, + ) {} + + get accountLimit() { + return this.accountSwitcherService.ACCOUNT_LIMIT; + } + + get specialAddAccountId() { + return this.accountSwitcherService.SPECIAL_ADD_ACCOUNT_ID; + } + + readonly availableAccounts$ = this.accountSwitcherService.availableAccounts$; + readonly currentAccount$ = this.accountService.activeAccount$.pipe( + switchMap((a) => + a == null + ? of(null) + : this.authService.activeAccountStatus$.pipe(map((s) => ({ ...a, status: s }))), + ), + ); + + readonly showLockAll$ = this.availableAccounts$.pipe( + startWith([]), + map((accounts) => accounts.filter((a) => !a.isActive)), + switchMap((accounts) => { + // If account switching is disabled, don't show the lock all button + // as only one account should be shown. + if (!enableAccountSwitching()) { + return of(false); + } + + // When there are an inactive accounts provide the option to lock all accounts + // Note: "Add account" is counted as an inactive account, so check for more than one account + return of(accounts.length > 1); + }), + ); + + async ngOnInit() { + this.enableAccountSwitching = enableAccountSwitching(); + this.extensionRefreshFlag = await this.configService.getFeatureFlag( + FeatureFlag.ExtensionRefresh, + ); + + const availableVaultTimeoutActions = await firstValueFrom( + this.vaultTimeoutSettingsService.availableVaultTimeoutActions$(), + ); + this.activeUserCanLock = availableVaultTimeoutActions.includes(VaultTimeoutAction.Lock); + } + + back() { + this.location.back(); + } + + async lock(userId: string) { + this.loading = true; + await this.vaultTimeoutService.lock(userId); + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.router.navigate(["lock"]); + } + + async lockAll() { + this.loading = true; + await this.lockService.lockAll(); + await this.router.navigate(["lock"]); + } + + async logOut(userId: UserId) { + this.loading = true; + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "logOut" }, + content: { key: "logOutConfirmation" }, + type: "info", + }); + + if (confirmed) { + const result = await this.accountSwitcherService.logoutAccount(userId); + // unlocked logout responses need to be navigated out of the account switcher. + // other responses will be handled by background and app.component + if (result?.status === AuthenticationStatus.Unlocked) { + this.location.back(); + } + } + this.loading = false; + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/apps/browser/src/auth/popup/account-switching/account.component.html b/apps/browser/src/auth/popup/account-switching/account.component.html new file mode 100644 index 00000000000..d062c67a2e3 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/account.component.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + diff --git a/apps/browser/src/auth/popup/account-switching/account.component.ts b/apps/browser/src/auth/popup/account-switching/account.component.ts new file mode 100644 index 00000000000..d54d6fe0e29 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/account.component.ts @@ -0,0 +1,62 @@ +import { CommonModule, Location } from "@angular/common"; +import { Component, EventEmitter, Input, Output } from "@angular/core"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { AvatarModule, ItemModule } from "@bitwarden/components"; + +import { AccountSwitcherService, AvailableAccount } from "./services/account-switcher.service"; + +@Component({ + standalone: true, + selector: "auth-account", + templateUrl: "account.component.html", + imports: [CommonModule, JslibModule, AvatarModule, ItemModule], +}) +export class AccountComponent { + @Input() account: AvailableAccount; + @Input() extensionRefreshFlag: boolean = false; + @Output() loading = new EventEmitter(); + + constructor( + private accountSwitcherService: AccountSwitcherService, + private location: Location, + private i18nService: I18nService, + private logService: LogService, + ) {} + + get specialAccountAddId() { + return this.accountSwitcherService.SPECIAL_ADD_ACCOUNT_ID; + } + + async selectAccount(id: string) { + this.loading.emit(true); + let result; + try { + result = await this.accountSwitcherService.selectAccount(id); + } catch (e) { + this.logService.error("Error selecting account", e); + } + + // Navigate out of account switching for unlocked accounts + // locked or logged out account statuses are handled by background and app.component + if (result?.status === AuthenticationStatus.Unlocked) { + this.location.back(); + } + this.loading.emit(false); + } + + get status() { + if (this.account.isActive) { + return { text: this.i18nService.t("active"), icon: "bwi-check-circle" }; + } + + if (this.account.status === AuthenticationStatus.Unlocked) { + return { text: this.i18nService.t("unlocked"), icon: "bwi-unlock" }; + } + + return { text: this.i18nService.t("locked"), icon: "bwi-lock" }; + } +} diff --git a/apps/browser/src/auth/popup/account-switching/current-account.component.html b/apps/browser/src/auth/popup/account-switching/current-account.component.html new file mode 100644 index 00000000000..dacf4b34be5 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/current-account.component.html @@ -0,0 +1,35 @@ +
+ + + + +
diff --git a/apps/browser/src/auth/popup/account-switching/current-account.component.ts b/apps/browser/src/auth/popup/account-switching/current-account.component.ts new file mode 100644 index 00000000000..12210b2b452 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/current-account.component.ts @@ -0,0 +1,68 @@ +import { CommonModule, Location } from "@angular/common"; +import { Component } from "@angular/core"; +import { ActivatedRoute, Router, RouterModule } from "@angular/router"; +import { Observable, combineLatest, switchMap } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { UserId } from "@bitwarden/common/types/guid"; +import { AvatarModule } from "@bitwarden/components"; + +export type CurrentAccount = { + id: UserId; + name: string | undefined; + email: string; + status: AuthenticationStatus; + avatarColor: string; +}; + +@Component({ + selector: "app-current-account", + templateUrl: "current-account.component.html", + standalone: true, + imports: [CommonModule, JslibModule, AvatarModule, RouterModule], +}) +export class CurrentAccountComponent { + currentAccount$: Observable; + + constructor( + private accountService: AccountService, + private avatarService: AvatarService, + private router: Router, + private location: Location, + private route: ActivatedRoute, + private authService: AuthService, + ) { + this.currentAccount$ = combineLatest([ + this.accountService.activeAccount$, + this.avatarService.avatarColor$, + this.authService.activeAccountStatus$, + ]).pipe( + switchMap(async ([account, avatarColor, accountStatus]) => { + if (account == null) { + return null; + } + const currentAccount: CurrentAccount = { + id: account.id, + name: account.name || account.email, + email: account.email, + status: accountStatus, + avatarColor, + }; + + return currentAccount; + }), + ); + } + + async currentAccountClicked() { + if (this.route.snapshot.data?.state?.includes("account-switcher")) { + this.location.back(); + } else { + await this.router.navigate(["/account-switcher"]); + } + } +} diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts new file mode 100644 index 00000000000..3084c3e5407 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts @@ -0,0 +1,224 @@ +import { matches, mock } from "jest-mock-extended"; +import { BehaviorSubject, ReplaySubject, firstValueFrom, of, timeout } from "rxjs"; + +import { + Account, + AccountInfo, + AccountService, +} from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { AccountSwitcherService } from "./account-switcher.service"; + +describe("AccountSwitcherService", () => { + let accountsSubject: BehaviorSubject>; + let activeAccountSubject: BehaviorSubject; + let authStatusSubject: ReplaySubject>; + + const accountService = mock(); + const avatarService = mock(); + const messagingService = mock(); + const environmentService = mock(); + const logService = mock(); + const authService = mock(); + + let accountSwitcherService: AccountSwitcherService; + + beforeEach(() => { + jest.resetAllMocks(); + accountsSubject = new BehaviorSubject>(null); + activeAccountSubject = new BehaviorSubject(null); + authStatusSubject = new ReplaySubject>(1); + + // Use subject to allow for easy updates + accountService.accounts$ = accountsSubject; + accountService.activeAccount$ = activeAccountSubject; + authService.authStatuses$ = authStatusSubject; + + accountSwitcherService = new AccountSwitcherService( + accountService, + avatarService, + messagingService, + environmentService, + logService, + authService, + ); + }); + + afterEach(() => { + accountsSubject.complete(); + activeAccountSubject.complete(); + authStatusSubject.complete(); + }); + + describe("availableAccounts$", () => { + it("should return all logged in accounts and an add account option when accounts are less than 5", async () => { + const accountInfo: AccountInfo = { + name: "Test User 1", + email: "test1@email.com", + emailVerified: true, + }; + + avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc")); + accountsSubject.next({ ["1" as UserId]: accountInfo, ["2" as UserId]: accountInfo }); + authStatusSubject.next({ + ["1" as UserId]: AuthenticationStatus.Unlocked, + ["2" as UserId]: AuthenticationStatus.Locked, + }); + activeAccountSubject.next(Object.assign(accountInfo, { id: "1" as UserId })); + + const accounts = await firstValueFrom( + accountSwitcherService.availableAccounts$.pipe(timeout(20)), + ); + expect(accounts).toHaveLength(3); + expect(accounts[0].id).toBe("1"); + expect(accounts[0].isActive).toBeTruthy(); + expect(accounts[1].id).toBe("2"); + expect(accounts[1].isActive).toBeFalsy(); + + expect(accounts[2].id).toBe("addAccount"); + expect(accounts[2].isActive).toBeFalsy(); + }); + + it.each([5, 6])( + "should return only accounts if there are %i accounts", + async (numberOfAccounts) => { + const seedAccounts: Record = {}; + const seedStatuses: Record = {}; + for (let i = 0; i < numberOfAccounts; i++) { + seedAccounts[`${i}` as UserId] = { + email: `test${i}@email.com`, + emailVerified: true, + name: "Test User ${i}", + }; + seedStatuses[`${i}` as UserId] = AuthenticationStatus.Unlocked; + } + avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc")); + accountsSubject.next(seedAccounts); + authStatusSubject.next(seedStatuses); + activeAccountSubject.next( + Object.assign(seedAccounts["1" as UserId], { id: "1" as UserId }), + ); + + const accounts = await firstValueFrom(accountSwitcherService.availableAccounts$); + + expect(accounts).toHaveLength(numberOfAccounts); + accounts.forEach((account) => { + expect(account.id).not.toBe("addAccount"); + }); + }, + ); + + it("excludes logged out accounts", async () => { + const user1AccountInfo: AccountInfo = { + name: "Test User 1", + email: "", + emailVerified: true, + }; + accountsSubject.next({ ["1" as UserId]: user1AccountInfo }); + authStatusSubject.next({ ["1" as UserId]: AuthenticationStatus.LoggedOut }); + accountsSubject.next({ + "1": user1AccountInfo, + } as Record); + + const accounts = await firstValueFrom( + accountSwitcherService.availableAccounts$.pipe(timeout(20)), + ); + + // Add account only + expect(accounts).toHaveLength(1); + expect(accounts[0].id).toBe("addAccount"); + }); + }); + + describe("selectAccount", () => { + it("initiates an add account logic when add account is selected", async () => { + let listener: ( + message: { command: string; userId: string }, + sender: unknown, + sendResponse: unknown, + ) => void = null; + jest.spyOn(chrome.runtime.onMessage, "addListener").mockImplementation((addedListener) => { + listener = addedListener; + }); + + const removeListenerSpy = jest.spyOn(chrome.runtime.onMessage, "removeListener"); + + const selectAccountPromise = accountSwitcherService.selectAccount("addAccount"); + + expect(listener).not.toBeNull(); + listener({ command: "switchAccountFinish", userId: null }, undefined, undefined); + + await selectAccountPromise; + + expect(messagingService.send).toHaveBeenCalledWith("switchAccount", { userId: null }); + + expect(removeListenerSpy).toBeCalledTimes(1); + }); + + it("initiates an account switch with an account id", async () => { + let listener: ( + message: { command: string; userId: string }, + sender: unknown, + sendResponse: unknown, + ) => void; + jest.spyOn(chrome.runtime.onMessage, "addListener").mockImplementation((addedListener) => { + listener = addedListener; + }); + + const removeListenerSpy = jest.spyOn(chrome.runtime.onMessage, "removeListener"); + + const selectAccountPromise = accountSwitcherService.selectAccount("1"); + + listener({ command: "switchAccountFinish", userId: "1" }, undefined, undefined); + + await selectAccountPromise; + + expect(messagingService.send).toHaveBeenCalledWith("switchAccount", { userId: "1" }); + expect(messagingService.send).toBeCalledWith( + "switchAccount", + matches((payload) => { + return payload.userId === "1"; + }), + ); + expect(removeListenerSpy).toBeCalledTimes(1); + }); + }); + + describe("logout", () => { + const userId1 = "1" as UserId; + const userId2 = "2" as UserId; + it("initiates logout", async () => { + let listener: ( + message: { command: string; userId: UserId; status: AuthenticationStatus }, + sender: unknown, + sendResponse: unknown, + ) => void; + jest.spyOn(chrome.runtime.onMessage, "addListener").mockImplementation((addedListener) => { + listener = addedListener; + }); + + const removeListenerSpy = jest.spyOn(chrome.runtime.onMessage, "removeListener"); + + const logoutPromise = accountSwitcherService.logoutAccount(userId1); + + listener( + { command: "switchAccountFinish", userId: userId2, status: AuthenticationStatus.Unlocked }, + undefined, + undefined, + ); + + const result = await logoutPromise; + + expect(messagingService.send).toHaveBeenCalledWith("logout", { userId: userId1 }); + expect(result).toEqual({ newUserId: userId2, status: AuthenticationStatus.Unlocked }); + expect(removeListenerSpy).toBeCalledTimes(1); + }); + }); +}); diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts new file mode 100644 index 00000000000..7cc9f8a92f2 --- /dev/null +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts @@ -0,0 +1,190 @@ +import { Injectable } from "@angular/core"; +import { + Observable, + combineLatest, + filter, + firstValueFrom, + map, + switchMap, + throwError, + timeout, +} from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { fromChromeEvent } from "../../../../platform/browser/from-chrome-event"; + +export type AvailableAccount = { + name: string; + email?: string; + id: string; + isActive: boolean; + server?: string; + status?: AuthenticationStatus; + avatarColor?: string; +}; + +@Injectable({ + providedIn: "root", +}) +export class AccountSwitcherService { + static incompleteAccountSwitchError = "Account switch did not complete."; + + ACCOUNT_LIMIT = 5; + SPECIAL_ADD_ACCOUNT_ID = "addAccount"; + availableAccounts$: Observable; + + switchAccountFinished$: Observable<{ userId: UserId; status: AuthenticationStatus }>; + + constructor( + private accountService: AccountService, + private avatarService: AvatarService, + private messagingService: MessagingService, + private environmentService: EnvironmentService, + private logService: LogService, + authService: AuthService, + ) { + this.availableAccounts$ = combineLatest([ + accountService.accounts$, + authService.authStatuses$, + this.accountService.activeAccount$, + ]).pipe( + switchMap(async ([accounts, accountStatuses, activeAccount]) => { + const loggedInIds = Object.keys(accounts).filter( + (id: UserId) => accountStatuses[id] !== AuthenticationStatus.LoggedOut, + ); + // Accounts shouldn't ever be more than ACCOUNT_LIMIT but just in case do a greater than + const hasMaxAccounts = loggedInIds.length >= this.ACCOUNT_LIMIT; + const options: AvailableAccount[] = await Promise.all( + loggedInIds.map(async (id: UserId) => { + return { + name: accounts[id].name ?? accounts[id].email, + email: accounts[id].email, + id: id, + server: (await this.environmentService.getEnvironment(id))?.getHostname(), + status: accountStatuses[id], + isActive: id === activeAccount?.id, + avatarColor: await firstValueFrom( + this.avatarService.getUserAvatarColor$(id as UserId), + ), + }; + }), + ); + + if (!hasMaxAccounts) { + options.push({ + name: "addAccount", + id: this.SPECIAL_ADD_ACCOUNT_ID, + isActive: false, + }); + } + + return options.sort((a, b) => { + /** + * Make sure the compare function is "well-formed" to account for browser inconsistencies. + * + * For specifics, see the sections "Description" and "Sorting with a non-well-formed comparator" + * on this page: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort + */ + + // Active account (if one exists) is always first + if (a.isActive) { + return -1; + } + + // If account "b" is the 'Add account' button, keep original order of "a" and "b" + if (b.id === this.SPECIAL_ADD_ACCOUNT_ID) { + return 0; + } + + return 1; + }); + }), + ); + + // Create a reusable observable that listens to the switchAccountFinish message and returns the userId from the message + this.switchAccountFinished$ = fromChromeEvent< + [message: { command: string; userId: UserId; status: AuthenticationStatus }] + >(chrome.runtime.onMessage).pipe( + filter(([message]) => message.command === "switchAccountFinish"), + map(([message]) => ({ userId: message.userId, status: message.status })), + ); + } + + get specialAccountAddId() { + return this.SPECIAL_ADD_ACCOUNT_ID; + } + + async selectAccount(id: string) { + if (id === this.SPECIAL_ADD_ACCOUNT_ID) { + id = null; + } + const userId = id as UserId; + + // Creates a subscription to the switchAccountFinished observable but further + // filters it to only care about the current userId. + const switchAccountFinishedPromise = this.listenForSwitchAccountFinish(userId); + + // Initiate the actions required to make account switching happen + this.messagingService.send("switchAccount", { userId }); // This message should cause switchAccountFinish to be sent + + // Wait until we receive the switchAccountFinished message + return await switchAccountFinishedPromise; + } + + /** + * + * @param userId the user id to logout + * @returns the userId and status of the that has been switch to due to the logout. null on errors. + */ + async logoutAccount( + userId: UserId, + ): Promise<{ newUserId: UserId; status: AuthenticationStatus } | null> { + // logout creates an account switch to the next up user, which may be null + const switchPromise = this.listenForSwitchAccountFinish(null); + + await this.messagingService.send("logout", { userId }); + + // wait for account switch to happen, the result will be the new user id and status + const result = await switchPromise; + return { newUserId: result.userId, status: result.status }; + } + + // Listens for the switchAccountFinish message and returns the userId from the message + // Optionally filters switchAccountFinish to an expected userId + private listenForSwitchAccountFinish( + expectedUserId: UserId | null, + ): Promise<{ userId: UserId; status: AuthenticationStatus } | null> { + return firstValueFrom( + this.switchAccountFinished$.pipe( + filter(({ userId }) => (expectedUserId ? userId === expectedUserId : true)), + timeout({ + // Much longer than account switching is expected to take for normal accounts + // but the account switching process includes a possible full sync so we need to account + // for very large accounts and want to still have a timeout + // to avoid a promise that might never resolve/reject + first: 60_000, + with: () => + throwError(() => new Error(AccountSwitcherService.incompleteAccountSwitchError)), + }), + ), + ).catch((err) => { + if ( + err instanceof Error && + err.message === AccountSwitcherService.incompleteAccountSwitchError + ) { + this.logService.warning("message 'switchAccount' never responded."); + return null; + } + throw err; + }); + } +} diff --git a/apps/browser/src/auth/popup/accounts/foreground-lock.service.ts b/apps/browser/src/auth/popup/accounts/foreground-lock.service.ts new file mode 100644 index 00000000000..20a52a90d8b --- /dev/null +++ b/apps/browser/src/auth/popup/accounts/foreground-lock.service.ts @@ -0,0 +1,32 @@ +import { filter, firstValueFrom } from "rxjs"; + +import { LockService } from "@bitwarden/auth/common"; +import { + CommandDefinition, + MessageListener, + MessageSender, +} from "@bitwarden/common/platform/messaging"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; + +const LOCK_ALL_FINISHED = new CommandDefinition<{ requestId: string }>("lockAllFinished"); +const LOCK_ALL = new CommandDefinition<{ requestId: string }>("lockAll"); + +export class ForegroundLockService implements LockService { + constructor( + private readonly messageSender: MessageSender, + private readonly messageListener: MessageListener, + ) {} + + async lockAll(): Promise { + const requestId = Utils.newGuid(); + const finishMessage = firstValueFrom( + this.messageListener + .messages$(LOCK_ALL_FINISHED) + .pipe(filter((m) => m.requestId === requestId)), + ); + + this.messageSender.send(LOCK_ALL, { requestId }); + + await finishMessage; + } +} diff --git a/apps/browser/src/auth/popup/components/set-pin.component.html b/apps/browser/src/auth/popup/components/set-pin.component.html new file mode 100644 index 00000000000..80e1b63c7d7 --- /dev/null +++ b/apps/browser/src/auth/popup/components/set-pin.component.html @@ -0,0 +1,37 @@ +
+ +
+ {{ "setYourPinTitle" | i18n }} +
+
+

+ {{ "setYourPinCode1" | i18n }} +

+ + {{ "pin" | i18n }} + + + + +
+
+ + +
+
+
diff --git a/apps/browser/src/auth/popup/components/set-pin.component.ts b/apps/browser/src/auth/popup/components/set-pin.component.ts new file mode 100644 index 00000000000..d79f9eeca89 --- /dev/null +++ b/apps/browser/src/auth/popup/components/set-pin.component.ts @@ -0,0 +1,34 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { ReactiveFormsModule } from "@angular/forms"; + +import { SetPinComponent as BaseSetPinComponent } from "@bitwarden/angular/auth/components/set-pin.component"; +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { + AsyncActionsModule, + ButtonModule, + DialogModule, + DialogService, + FormFieldModule, + IconButtonModule, +} from "@bitwarden/components"; + +@Component({ + standalone: true, + templateUrl: "set-pin.component.html", + imports: [ + DialogModule, + CommonModule, + JslibModule, + ButtonModule, + IconButtonModule, + ReactiveFormsModule, + AsyncActionsModule, + FormFieldModule, + ], +}) +export class SetPinComponent extends BaseSetPinComponent { + static open(dialogService: DialogService) { + return dialogService.open(SetPinComponent); + } +} diff --git a/apps/browser/src/auth/popup/environment.component.ts b/apps/browser/src/auth/popup/environment.component.ts index c70b5f597c1..b84f03b5fd7 100644 --- a/apps/browser/src/auth/popup/environment.component.ts +++ b/apps/browser/src/auth/popup/environment.component.ts @@ -1,10 +1,11 @@ import { Component, OnInit } from "@angular/core"; import { Router } from "@angular/router"; -import { EnvironmentComponent as BaseEnvironmentComponent } from "@bitwarden/angular/components/environment.component"; +import { EnvironmentComponent as BaseEnvironmentComponent } from "@bitwarden/angular/auth/components/environment.component"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { ToastService } from "@bitwarden/components"; import { BrowserEnvironmentService } from "../../platform/services/browser-environment.service"; @@ -20,9 +21,10 @@ export class EnvironmentComponent extends BaseEnvironmentComponent implements On public environmentService: BrowserEnvironmentService, i18nService: I18nService, private router: Router, - modalService: ModalService + modalService: ModalService, + toastService: ToastService, ) { - super(platformUtilsService, environmentService, i18nService, modalService); + super(platformUtilsService, environmentService, i18nService, modalService, toastService); this.showCustom = true; } @@ -44,6 +46,8 @@ export class EnvironmentComponent extends BaseEnvironmentComponent implements On saved() { super.saved(); + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.router.navigate([""]); } } diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service.ts b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service.ts new file mode 100644 index 00000000000..1b844d4b2c7 --- /dev/null +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service.ts @@ -0,0 +1,23 @@ +import { Observable, Subject } from "rxjs"; + +import { + AnonLayoutWrapperDataService, + DefaultAnonLayoutWrapperDataService, +} from "@bitwarden/auth/angular"; + +import { ExtensionAnonLayoutWrapperData } from "./extension-anon-layout-wrapper.component"; + +export class ExtensionAnonLayoutWrapperDataService + extends DefaultAnonLayoutWrapperDataService + implements AnonLayoutWrapperDataService +{ + protected override anonLayoutWrapperDataSubject = new Subject(); + + override setAnonLayoutWrapperData(data: ExtensionAnonLayoutWrapperData): void { + this.anonLayoutWrapperDataSubject.next(data); + } + + override anonLayoutWrapperData$(): Observable { + return this.anonLayoutWrapperDataSubject.asObservable(); + } +} diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html new file mode 100644 index 00000000000..2589a08da19 --- /dev/null +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.ts b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.ts new file mode 100644 index 00000000000..0301a76431d --- /dev/null +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component.ts @@ -0,0 +1,201 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute, Data, NavigationEnd, Router, RouterModule } from "@angular/router"; +import { Subject, filter, switchMap, takeUntil, tap } from "rxjs"; + +import { + AnonLayoutComponent, + AnonLayoutWrapperData, + AnonLayoutWrapperDataService, +} from "@bitwarden/auth/angular"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { Icon, IconModule, Translation } from "@bitwarden/components"; + +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 { CurrentAccountComponent } from "../account-switching/current-account.component"; +import { AccountSwitcherService } from "../account-switching/services/account-switcher.service"; + +import { ExtensionBitwardenLogo } from "./extension-bitwarden-logo.icon"; + +export interface ExtensionAnonLayoutWrapperData extends AnonLayoutWrapperData { + showAcctSwitcher?: boolean; + showBackButton?: boolean; + showLogo?: boolean; +} + +@Component({ + standalone: true, + templateUrl: "extension-anon-layout-wrapper.component.html", + imports: [ + AnonLayoutComponent, + CommonModule, + CurrentAccountComponent, + IconModule, + PopOutComponent, + PopupPageComponent, + PopupHeaderComponent, + RouterModule, + ], +}) +export class ExtensionAnonLayoutWrapperComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + + protected showAcctSwitcher: boolean; + protected showBackButton: boolean; + protected showLogo: boolean = true; + + protected pageTitle: string; + protected pageSubtitle: string; + protected pageIcon: Icon; + protected showReadonlyHostname: boolean; + protected maxWidth: "md" | "3xl"; + protected hasLoggedInAccount: boolean = false; + + protected theme: string; + protected logo = ExtensionBitwardenLogo; + + constructor( + private router: Router, + private route: ActivatedRoute, + private i18nService: I18nService, + private extensionAnonLayoutWrapperDataService: AnonLayoutWrapperDataService, + private accountSwitcherService: AccountSwitcherService, + ) {} + + async ngOnInit(): Promise { + // Set the initial page data on load + this.setAnonLayoutWrapperDataFromRouteData(this.route.snapshot.firstChild?.data); + + // Listen for page changes and update the page data appropriately + this.listenForPageDataChanges(); + this.listenForServiceDataChanges(); + + this.accountSwitcherService.availableAccounts$ + .pipe(takeUntil(this.destroy$)) + .subscribe((accounts) => { + this.hasLoggedInAccount = accounts.some((account) => account.id !== "addAccount"); + }); + } + + private listenForPageDataChanges() { + this.router.events + .pipe( + filter((event) => event instanceof NavigationEnd), + // reset page data on page changes + tap(() => this.resetPageData()), + switchMap(() => this.route.firstChild?.data || null), + takeUntil(this.destroy$), + ) + .subscribe((firstChildRouteData: Data | null) => { + this.setAnonLayoutWrapperDataFromRouteData(firstChildRouteData); + }); + } + + private setAnonLayoutWrapperDataFromRouteData(firstChildRouteData: Data | null) { + if (!firstChildRouteData) { + return; + } + + if (firstChildRouteData["pageTitle"] !== undefined) { + this.pageTitle = this.handleStringOrTranslation(firstChildRouteData["pageTitle"]); + } + + if (firstChildRouteData["pageSubtitle"] !== undefined) { + this.pageSubtitle = this.handleStringOrTranslation(firstChildRouteData["pageSubtitle"]); + } + + if (firstChildRouteData["pageIcon"] !== undefined) { + this.pageIcon = firstChildRouteData["pageIcon"]; + } + + this.showReadonlyHostname = Boolean(firstChildRouteData["showReadonlyHostname"]); + this.maxWidth = firstChildRouteData["maxWidth"]; + + if (firstChildRouteData["showAcctSwitcher"] !== undefined) { + this.showAcctSwitcher = Boolean(firstChildRouteData["showAcctSwitcher"]); + } + + if (firstChildRouteData["showBackButton"] !== undefined) { + this.showBackButton = Boolean(firstChildRouteData["showBackButton"]); + } + + if (firstChildRouteData["showLogo"] !== undefined) { + this.showLogo = Boolean(firstChildRouteData["showLogo"]); + } + } + + private listenForServiceDataChanges() { + this.extensionAnonLayoutWrapperDataService + .anonLayoutWrapperData$() + .pipe(takeUntil(this.destroy$)) + .subscribe((data: ExtensionAnonLayoutWrapperData) => { + this.setAnonLayoutWrapperData(data); + }); + } + + private setAnonLayoutWrapperData(data: ExtensionAnonLayoutWrapperData) { + if (!data) { + return; + } + + // Null emissions are used to reset the page data as all fields are optional. + + if (data.pageTitle !== undefined) { + this.pageTitle = + data.pageTitle !== null ? this.handleStringOrTranslation(data.pageTitle) : null; + } + + if (data.pageSubtitle !== undefined) { + this.pageSubtitle = + data.pageSubtitle !== null ? this.handleStringOrTranslation(data.pageSubtitle) : null; + } + + if (data.pageIcon !== undefined) { + this.pageIcon = data.pageIcon !== null ? data.pageIcon : null; + } + + if (data.showReadonlyHostname !== undefined) { + this.showReadonlyHostname = data.showReadonlyHostname; + } + + if (data.showAcctSwitcher !== undefined) { + this.showAcctSwitcher = data.showAcctSwitcher; + } + + if (data.showBackButton !== undefined) { + this.showBackButton = data.showBackButton; + } + + if (data.showLogo !== undefined) { + this.showLogo = data.showLogo; + } + } + + private handleStringOrTranslation(value: string | Translation): string { + if (typeof value === "string") { + // If it's a string, return it as is + return value; + } + + // If it's a Translation object, translate it + return this.i18nService.t(value.key, ...(value.placeholders ?? [])); + } + + private resetPageData() { + this.pageTitle = null; + this.pageSubtitle = null; + this.pageIcon = null; + this.showReadonlyHostname = null; + this.showAcctSwitcher = null; + this.showBackButton = null; + this.showLogo = null; + this.maxWidth = null; + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } +} 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 new file mode 100644 index 00000000000..ad7e6f67361 --- /dev/null +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts @@ -0,0 +1,372 @@ +import { importProvidersFrom, Component } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; +import { + Meta, + StoryObj, + applicationConfig, + componentWrapperDecorator, + moduleMetadata, +} from "@storybook/angular"; +import { of } from "rxjs"; + +import { AnonLayoutWrapperDataService, LockIcon } from "@bitwarden/auth/angular"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { ClientType } from "@bitwarden/common/enums"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { + EnvironmentService, + Environment, +} from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { UserId } from "@bitwarden/common/types/guid"; +import { ButtonModule, I18nMockService } from "@bitwarden/components"; + +import { RegistrationCheckEmailIcon } from "../../../../../../libs/auth/src/angular/icons/registration-check-email.icon"; +import { PopupRouterCacheService } from "../../../platform/popup/view-cache/popup-router-cache.service"; +import { AccountSwitcherService } from "../account-switching/services/account-switcher.service"; + +import { ExtensionAnonLayoutWrapperDataService } from "./extension-anon-layout-wrapper-data.service"; +import { + ExtensionAnonLayoutWrapperComponent, + ExtensionAnonLayoutWrapperData, +} from "./extension-anon-layout-wrapper.component"; + +export default { + title: "Auth/Extension Anon Layout Wrapper", + component: ExtensionAnonLayoutWrapperComponent, +} as Meta; + +const decorators = (options: { + components: any[]; + routes: Routes; + applicationVersion?: string; + clientType?: ClientType; + hostName?: string; + accounts?: any[]; +}) => { + return [ + componentWrapperDecorator( + /** + * Applying a CSS transform makes a `position: fixed` element act like it is `position: relative` + * https://github.com/storybookjs/storybook/issues/8011#issue-490251969 + */ + (story) => { + return /* HTML */ `
${story}
`; + }, + ({ globals }) => { + /** + * avoid a bug with the way that we render the same component twice in the same iframe and how + * that interacts with the router-outlet + */ + const themeOverride = globals["theme"] === "both" ? "light" : globals["theme"]; + return { theme: themeOverride }; + }, + ), + moduleMetadata({ + declarations: options.components, + imports: [RouterModule, ButtonModule], + providers: [ + { + provide: AnonLayoutWrapperDataService, + useClass: ExtensionAnonLayoutWrapperDataService, + }, + { + provide: AccountService, + useValue: { + activeAccount$: of({ + id: "test-user-id" as UserId, + name: "Test User 1", + email: "test@email.com", + emailVerified: true, + }), + }, + }, + { + provide: AccountSwitcherService, + useValue: { + availableAccounts$: of(options.accounts || []), + SPECIAL_ADD_ACCOUNT_ID: "addAccount", + } as Partial, + }, + { + provide: AuthService, + useValue: { + activeAccountStatus$: of(AuthenticationStatus.Unlocked), + }, + }, + { + provide: AvatarService, + useValue: { + avatarColor$: of("#ab134a"), + } as Partial, + }, + { + provide: ConfigService, + useValue: { + getFeatureFlag: () => true, + }, + }, + { + provide: EnvironmentService, + useValue: { + environment$: of({ + getHostname: () => options.hostName || "storybook.bitwarden.com", + } as Partial), + } as Partial, + }, + { + provide: PlatformUtilsService, + useValue: { + getApplicationVersion: () => + Promise.resolve(options.applicationVersion || "FAKE_APP_VERSION"), + getClientType: () => options.clientType || ClientType.Web, + } as Partial, + }, + { + provide: I18nService, + useFactory: () => { + return new I18nMockService({ + setAStrongPassword: "Set a strong password", + finishCreatingYourAccountBySettingAPassword: + "Finish creating your account by setting a password", + enterpriseSingleSignOn: "Enterprise single sign-on", + checkYourEmail: "Check your email", + loading: "Loading", + popOutNewWindow: "Pop out to a new window", + switchAccounts: "Switch accounts", + back: "Back", + activeAccount: "Active account", + }); + }, + }, + ], + }), + applicationConfig({ + providers: [ + importProvidersFrom(RouterModule.forRoot(options.routes)), + { + provide: PopupRouterCacheService, + useValue: { + back() {}, + } as Partial, + }, + ], + }), + ]; +}; + +type Story = StoryObj; + +// Default Example + +@Component({ + selector: "bit-default-primary-outlet-example-component", + template: "

Primary Outlet Example:
your primary component goes here

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

Secondary Outlet Example:
your secondary component goes here

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

Env Selector Outlet Example:
your env selector component goes here

", +}) +class DefaultEnvSelectorOutletExampleComponent {} + +export const DefaultContentExample: Story = { + render: (args) => ({ + props: args, + template: "", + }), + decorators: decorators({ + components: [ + DefaultPrimaryOutletExampleComponent, + DefaultSecondaryOutletExampleComponent, + DefaultEnvSelectorOutletExampleComponent, + ], + routes: [ + { + path: "**", + redirectTo: "default-example", + pathMatch: "full", + }, + { + path: "", + component: ExtensionAnonLayoutWrapperComponent, + children: [ + { + path: "default-example", + data: {}, + children: [ + { + path: "", + component: DefaultPrimaryOutletExampleComponent, + }, + { + path: "", + component: DefaultSecondaryOutletExampleComponent, + outlet: "secondary", + }, + { + path: "", + component: DefaultEnvSelectorOutletExampleComponent, + outlet: "environment-selector", + }, + ], + }, + ], + }, + ], + }), +}; + +// Dynamic Content Example +const initialData: ExtensionAnonLayoutWrapperData = { + pageTitle: { + key: "setAStrongPassword", + }, + pageSubtitle: { + key: "finishCreatingYourAccountBySettingAPassword", + }, + pageIcon: LockIcon, + showAcctSwitcher: true, + showBackButton: true, + showLogo: true, +}; + +const changedData: ExtensionAnonLayoutWrapperData = { + pageTitle: { + key: "enterpriseSingleSignOn", + }, + pageSubtitle: { + key: "checkYourEmail", + }, + pageIcon: RegistrationCheckEmailIcon, + showAcctSwitcher: false, + showBackButton: false, + showLogo: false, +}; + +@Component({ + selector: "bit-dynamic-content-example-component", + template: ` + + `, +}) +export class DynamicContentExampleComponent { + initialData = true; + + constructor(private extensionAnonLayoutWrapperDataService: AnonLayoutWrapperDataService) {} + + toggleData() { + if (this.initialData) { + this.extensionAnonLayoutWrapperDataService.setAnonLayoutWrapperData(changedData); + } else { + this.extensionAnonLayoutWrapperDataService.setAnonLayoutWrapperData(initialData); + } + + this.initialData = !this.initialData; + } +} + +export const DynamicContentExample: Story = { + render: (args) => ({ + props: args, + template: "", + }), + decorators: decorators({ + components: [DynamicContentExampleComponent], + routes: [ + { + path: "**", + redirectTo: "dynamic-content-example", + pathMatch: "full", + }, + { + path: "", + component: ExtensionAnonLayoutWrapperComponent, + children: [ + { + path: "dynamic-content-example", + data: initialData, + children: [ + { + path: "", + component: DynamicContentExampleComponent, + }, + ], + }, + ], + }, + ], + }), +}; + +export const HasLoggedInAccountExample: Story = { + render: (args) => ({ + props: args, + template: "", + }), + decorators: decorators({ + components: [DefaultPrimaryOutletExampleComponent], + routes: [ + { + path: "**", + redirectTo: "has-logged-in-account", + pathMatch: "full", + }, + { + path: "", + component: ExtensionAnonLayoutWrapperComponent, + children: [ + { + path: "has-logged-in-account", + data: { + hasLoggedInAccount: true, + showAcctSwitcher: true, + }, + children: [ + { + path: "", + component: DefaultPrimaryOutletExampleComponent, + }, + { + path: "", + component: DefaultSecondaryOutletExampleComponent, + outlet: "secondary", + }, + { + path: "", + component: DefaultEnvSelectorOutletExampleComponent, + outlet: "environment-selector", + }, + ], + }, + ], + }, + ], + accounts: [ + { + name: "Test User", + email: "testuser@bitwarden.com", + id: "123e4567-e89b-12d3-a456-426614174000", + server: "bitwarden.com", + status: 2, + isActive: false, + }, + { + name: "addAccount", + id: "addAccount", + isActive: false, + }, + ], + }), +}; diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-bitwarden-logo.icon.ts b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-bitwarden-logo.icon.ts new file mode 100644 index 00000000000..51d748e1fbb --- /dev/null +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-bitwarden-logo.icon.ts @@ -0,0 +1,18 @@ +import { svgIcon } from "@bitwarden/components"; + +export const ExtensionBitwardenLogo = svgIcon` + + + +`; diff --git a/apps/browser/src/auth/popup/hint.component.ts b/apps/browser/src/auth/popup/hint.component.ts index a743dc7da24..e97236fe6a8 100644 --- a/apps/browser/src/auth/popup/hint.component.ts +++ b/apps/browser/src/auth/popup/hint.component.ts @@ -2,11 +2,12 @@ import { Component } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { HintComponent as BaseHintComponent } from "@bitwarden/angular/auth/components/hint.component"; +import { LoginEmailServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { ToastService } from "@bitwarden/components"; @Component({ selector: "app-hint", @@ -20,11 +21,22 @@ export class HintComponent extends BaseHintComponent { apiService: ApiService, logService: LogService, private route: ActivatedRoute, - loginService: LoginService + loginEmailService: LoginEmailServiceAbstraction, + toastService: ToastService, ) { - super(router, i18nService, apiService, platformUtilsService, logService, loginService); + super( + router, + i18nService, + apiService, + platformUtilsService, + logService, + loginEmailService, + toastService, + ); - super.onSuccessfulSubmit = async () => { + this.onSuccessfulSubmit = async () => { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.router.navigate([this.successRoute]); }; } diff --git a/apps/browser/src/auth/popup/home.component.html b/apps/browser/src/auth/popup/home.component.html index 6b42033c4bc..ed395797961 100644 --- a/apps/browser/src/auth/popup/home.component.html +++ b/apps/browser/src/auth/popup/home.component.html @@ -1,3 +1,4 @@ +
diff --git a/apps/browser/src/auth/popup/home.component.ts b/apps/browser/src/auth/popup/home.component.ts index 5dd3bdd641a..4d185fcbfc6 100644 --- a/apps/browser/src/auth/popup/home.component.ts +++ b/apps/browser/src/auth/popup/home.component.ts @@ -1,14 +1,17 @@ import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { FormBuilder, Validators } from "@angular/forms"; -import { Router } from "@angular/router"; -import { Subject, takeUntil } from "rxjs"; +import { ActivatedRoute, Router } from "@angular/router"; +import { Subject, firstValueFrom, switchMap, takeUntil, tap } from "rxjs"; import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components/environment-selector.component"; -import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { LoginEmailServiceAbstraction, RegisterRouteService } from "@bitwarden/auth/common"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { ToastService } from "@bitwarden/components"; + +import { AccountSwitcherService } from "./account-switching/services/account-switcher.service"; @Component({ selector: "app-home", @@ -25,41 +28,47 @@ export class HomeComponent implements OnInit, OnDestroy { rememberEmail: [false], }); + // TODO: remove when email verification flag is removed + registerRoute$ = this.registerRouteService.registerRoute$(); + constructor( protected platformUtilsService: PlatformUtilsService, - private stateService: StateService, private formBuilder: FormBuilder, private router: Router, private i18nService: I18nService, - private environmentService: EnvironmentService, - private loginService: LoginService + private loginEmailService: LoginEmailServiceAbstraction, + private accountSwitcherService: AccountSwitcherService, + private registerRouteService: RegisterRouteService, + private toastService: ToastService, + private configService: ConfigService, + private route: ActivatedRoute, ) {} async ngOnInit(): Promise { - let savedEmail = this.loginService.getEmail(); - const rememberEmail = this.loginService.getRememberEmail(); + this.listenForUnauthUiRefreshFlagChanges(); - if (savedEmail != null) { - this.formGroup.patchValue({ - email: savedEmail, - rememberEmail: rememberEmail, - }); + const email = await firstValueFrom(this.loginEmailService.loginEmail$); + const rememberEmail = this.loginEmailService.getRememberEmail(); + + if (email != null) { + this.formGroup.patchValue({ email, rememberEmail }); } else { - savedEmail = await this.stateService.getRememberedEmail(); - if (savedEmail != null) { - this.formGroup.patchValue({ - email: savedEmail, - rememberEmail: true, - }); + const storedEmail = await firstValueFrom(this.loginEmailService.storedEmail$); + + if (storedEmail != null) { + this.formGroup.patchValue({ email: storedEmail, rememberEmail: true }); } } this.environmentSelector.onOpenSelfHostedSettings - .pipe(takeUntil(this.destroyed$)) - .subscribe(() => { - this.setFormValues(); - this.router.navigate(["environment"]); - }); + .pipe( + switchMap(async () => { + await this.setLoginEmailValues(); + await this.router.navigate(["environment"]); + }), + takeUntil(this.destroyed$), + ) + .subscribe(); } ngOnDestroy(): void { @@ -67,28 +76,53 @@ export class HomeComponent implements OnInit, OnDestroy { this.destroyed$.complete(); } - submit() { + private listenForUnauthUiRefreshFlagChanges() { + this.configService + .getFeatureFlag$(FeatureFlag.UnauthenticatedExtensionUIRefresh) + .pipe( + tap(async (flag) => { + // If the flag is turned ON, we must force a reload to ensure the correct UI is shown + if (flag) { + const uniqueQueryParams = { + ...this.route.queryParams, + // adding a unique timestamp to the query params to force a reload + t: new Date().getTime().toString(), + }; + + await this.router.navigate(["/login"], { + queryParams: uniqueQueryParams, + }); + } + }), + takeUntil(this.destroyed$), + ) + .subscribe(); + } + + get availableAccounts$() { + return this.accountSwitcherService.availableAccounts$; + } + + async submit() { this.formGroup.markAllAsTouched(); + if (this.formGroup.invalid) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccured"), - this.i18nService.t("invalidEmail") - ); + this.toastService.showToast({ + variant: "error", + title: this.i18nService.t("errorOccured"), + message: this.i18nService.t("invalidEmail"), + }); return; } - this.loginService.setEmail(this.formGroup.value.email); - this.loginService.setRememberEmail(this.formGroup.value.rememberEmail); - this.router.navigate(["login"], { queryParams: { email: this.formGroup.value.email } }); + await this.setLoginEmailValues(); + await this.router.navigate(["login"], { queryParams: { email: this.formGroup.value.email } }); } - get selfHostedDomain() { - return this.environmentService.hasBaseUrl() ? this.environmentService.getWebVaultUrl() : null; - } - - setFormValues() { - this.loginService.setEmail(this.formGroup.value.email); - this.loginService.setRememberEmail(this.formGroup.value.rememberEmail); + async setLoginEmailValues() { + // Note: Browser saves email settings here instead of the login component + this.loginEmailService.setRememberEmail(this.formGroup.value.rememberEmail); + await this.loginEmailService.setLoginEmail(this.formGroup.value.email); + await this.loginEmailService.saveEmailSettings(); } } diff --git a/apps/browser/src/auth/popup/lock.component.html b/apps/browser/src/auth/popup/lock.component.html index e787e0106d1..fb1b09de49c 100644 --- a/apps/browser/src/auth/popup/lock.component.html +++ b/apps/browser/src/auth/popup/lock.component.html @@ -1,5 +1,5 @@
-
+

{{ "verifyIdentity" | i18n }} @@ -9,83 +9,92 @@ {{ "unlock" | i18n }} -

+
-
-
-
-
- - -
-
- - -
-
- + +
+
+
+
+ + +
+
+ + +
+
+ +
+
- -
- -
-

- -

- - {{ biometricError }} -

- {{ "awaitDesktop" | i18n }} -

+

+ +

+ {{ biometricError }} +

+ {{ "awaitDesktop" | i18n }} +

+ + +
diff --git a/apps/browser/src/auth/popup/lock.component.ts b/apps/browser/src/auth/popup/lock.component.ts index f5f8a29eb69..1d1ed619995 100644 --- a/apps/browser/src/auth/popup/lock.component.ts +++ b/apps/browser/src/auth/popup/lock.component.ts @@ -1,17 +1,20 @@ -import { Component, NgZone } from "@angular/core"; +import { Component, NgZone, OnInit } from "@angular/core"; import { Router } from "@angular/router"; +import { firstValueFrom } from "rxjs"; import { LockComponent as BaseLockComponent } from "@bitwarden/angular/auth/components/lock.component"; +import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -19,26 +22,37 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; -import { DialogService } from "@bitwarden/components"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { DialogService, ToastService } from "@bitwarden/components"; +import { + KdfConfigService, + KeyService, + BiometricsService, + BiometricStateService, +} from "@bitwarden/key-management"; import { BiometricErrors, BiometricErrorTypes } from "../../models/biometricErrors"; +import { BrowserRouterService } from "../../platform/popup/services/browser-router.service"; +import { fido2PopoutSessionData$ } from "../../vault/popup/utils/fido2-popout-session-data"; @Component({ selector: "app-lock", templateUrl: "lock.component.html", }) -export class LockComponent extends BaseLockComponent { +export class LockComponent extends BaseLockComponent implements OnInit { private isInitialLockScreen: boolean; biometricError: string; pendingBiometric = false; + fido2PopoutSessionData$ = fido2PopoutSessionData$(); constructor( + masterPasswordService: InternalMasterPasswordServiceAbstraction, router: Router, i18nService: I18nService, platformUtilsService: PlatformUtilsService, messagingService: MessagingService, - cryptoService: CryptoService, + keyService: KeyService, vaultTimeoutService: VaultTimeoutService, vaultTimeoutSettingsService: VaultTimeoutSettingsService, environmentService: EnvironmentService, @@ -49,17 +63,26 @@ export class LockComponent extends BaseLockComponent { policyApiService: PolicyApiServiceAbstraction, policyService: InternalPolicyService, passwordStrengthService: PasswordStrengthServiceAbstraction, - private authService: AuthService, + authService: AuthService, dialogService: DialogService, - deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction, - userVerificationService: UserVerificationService + deviceTrustService: DeviceTrustServiceAbstraction, + userVerificationService: UserVerificationService, + pinService: PinServiceAbstraction, + private routerService: BrowserRouterService, + biometricStateService: BiometricStateService, + biometricsService: BiometricsService, + accountService: AccountService, + kdfConfigService: KdfConfigService, + syncService: SyncService, + toastService: ToastService, ) { super( + masterPasswordService, router, i18nService, platformUtilsService, messagingService, - cryptoService, + keyService, vaultTimeoutService, vaultTimeoutSettingsService, environmentService, @@ -71,52 +94,89 @@ export class LockComponent extends BaseLockComponent { policyService, passwordStrengthService, dialogService, - deviceTrustCryptoService, - userVerificationService + deviceTrustService, + userVerificationService, + pinService, + biometricStateService, + biometricsService, + accountService, + authService, + kdfConfigService, + syncService, + toastService, ); this.successRoute = "/tabs/current"; this.isInitialLockScreen = (window as any).previousPopupUrl == null; + + this.onSuccessfulSubmit = async () => { + const previousUrl = this.routerService.getPreviousUrl(); + if (previousUrl) { + // 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.navigateByUrl(previousUrl); + } else { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.router.navigate([this.successRoute]); + } + }; } async ngOnInit() { await super.ngOnInit(); - const disableAutoBiometricsPrompt = - (await this.stateService.getDisableAutoBiometricsPrompt()) ?? true; + const autoBiometricsPrompt = await firstValueFrom( + this.biometricStateService.promptAutomatically$, + ); window.setTimeout(async () => { document.getElementById(this.pinEnabled ? "pin" : "masterPassword")?.focus(); if ( this.biometricLock && - !disableAutoBiometricsPrompt && + autoBiometricsPrompt && this.isInitialLockScreen && (await this.authService.getAuthStatus()) === AuthenticationStatus.Locked ) { - await this.unlockBiometric(); + await this.unlockBiometric(true); } }, 100); } - override async unlockBiometric(): Promise { + override async unlockBiometric(automaticPrompt: boolean = false): Promise { if (!this.biometricLock) { return; } - this.pendingBiometric = true; this.biometricError = null; let success; try { - success = await super.unlockBiometric(); + const available = await super.isBiometricUnlockAvailable(); + if (!available) { + if (!automaticPrompt) { + await this.dialogService.openSimpleDialog({ + type: "warning", + title: { key: "biometricsNotAvailableTitle" }, + content: { key: "biometricsNotAvailableDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + }); + } + } else { + this.pendingBiometric = true; + success = await super.unlockBiometric(); + } } catch (e) { - const error = BiometricErrors[e as BiometricErrorTypes]; + const error = BiometricErrors[e?.message as BiometricErrorTypes]; if (error == null) { this.logService.error("Unknown error: " + e); + return false; } this.biometricError = this.i18nService.t(error.description); + } finally { + this.pendingBiometric = false; } - this.pendingBiometric = false; return success; } diff --git a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html index 32e3ea0c598..e996f9a6ff4 100644 --- a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html +++ b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html @@ -1,10 +1,13 @@
-
-

+ +
+ +
+

{{ "loginInitiated" | i18n }}

-

- +
+ +
@@ -98,6 +100,7 @@
+

{{ "webAuthnNewTab" | i18n }}

@@ -106,23 +109,34 @@
- -
- + + +
+

+ {{ "duoRequiredForAccount" | i18n }} +

+ +

+ {{ "popoutTheExtensionToCompleteLogin" | i18n }} +

+ + +

{{ "launchDuoAndFollowStepsToFinishLoggingIn" | i18n }}

+ + +
-
-
-
- - + + +
+
+
+ + +
-
+
@@ -131,12 +145,47 @@

{{ "noTwoStepProviders" | i18n }}

{{ "noTwoStepProviders2" | i18n }}

+
-

- -

+ + + + + +

+

+
+ + `; + const usernameInput = document.getElementById( + usernameField.id, + ) as ElementWithOpId; + + const autofillFieldItem = await collectAutofillContentService["buildAutofillFieldItem"]( + usernameInput, + 0, + ); + + expect(autofillFieldItem).toBeNull(); + }); + it("returns an existing autofill field item if it exists", async () => { const index = 0; const usernameField = { @@ -760,27 +915,6 @@ describe("CollectAutofillContentService", () => { /> `; - document.body.innerHTML = ` -
- - -
- `; const existingFieldData: AutofillField = { elementNumber: index, htmlClass: usernameField.classes, @@ -794,25 +928,25 @@ describe("CollectAutofillContentService", () => { viewable: true, }; const usernameInput = document.getElementById( - usernameField.id + usernameField.id, ) as ElementWithOpId; usernameInput.opid = "__0"; collectAutofillContentService["autofillFieldElements"].set(usernameInput, existingFieldData); jest.spyOn(collectAutofillContentService as any, "getAutofillFieldMaxLength"); jest - .spyOn(collectAutofillContentService["domElementVisibilityService"], "isFormFieldViewable") + .spyOn(collectAutofillContentService["domElementVisibilityService"], "isElementViewable") .mockResolvedValue(true); jest.spyOn(collectAutofillContentService as any, "getPropertyOrAttribute"); jest.spyOn(collectAutofillContentService as any, "getElementValue"); const autofillFieldItem = await collectAutofillContentService["buildAutofillFieldItem"]( usernameInput, - 0 + 0, ); expect(collectAutofillContentService["getAutofillFieldMaxLength"]).not.toHaveBeenCalled(); expect( - collectAutofillContentService["domElementVisibilityService"].isFormFieldViewable + collectAutofillContentService["domElementVisibilityService"].isElementViewable, ).not.toHaveBeenCalled(); expect(collectAutofillContentService["getPropertyOrAttribute"]).not.toHaveBeenCalled(); expect(collectAutofillContentService["getElementValue"]).not.toHaveBeenCalled(); @@ -829,55 +963,55 @@ describe("CollectAutofillContentService", () => { Span Element `; const spanElement = document.getElementById( - spanElementId + spanElementId, ) as ElementWithOpId; jest.spyOn(collectAutofillContentService as any, "getAutofillFieldMaxLength"); jest - .spyOn(collectAutofillContentService["domElementVisibilityService"], "isFormFieldViewable") + .spyOn(collectAutofillContentService["domElementVisibilityService"], "isElementViewable") .mockResolvedValue(true); jest.spyOn(collectAutofillContentService as any, "getPropertyOrAttribute"); jest.spyOn(collectAutofillContentService as any, "getElementValue"); const autofillFieldItem = await collectAutofillContentService["buildAutofillFieldItem"]( spanElement, - index + index, ); expect(collectAutofillContentService["getAutofillFieldMaxLength"]).toHaveBeenCalledWith( - spanElement + spanElement, ); expect( - collectAutofillContentService["domElementVisibilityService"].isFormFieldViewable + collectAutofillContentService["domElementVisibilityService"].isElementViewable, ).toHaveBeenCalledWith(spanElement); expect(collectAutofillContentService["getPropertyOrAttribute"]).toHaveBeenNthCalledWith( 1, spanElement, - "id" + "id", ); expect(collectAutofillContentService["getPropertyOrAttribute"]).toHaveBeenNthCalledWith( 2, spanElement, - "name" + "name", ); expect(collectAutofillContentService["getPropertyOrAttribute"]).toHaveBeenNthCalledWith( 3, spanElement, - "class" + "class", ); expect(collectAutofillContentService["getPropertyOrAttribute"]).toHaveBeenNthCalledWith( 4, spanElement, - "tabindex" + "tabindex", ); expect(collectAutofillContentService["getPropertyOrAttribute"]).toHaveBeenNthCalledWith( 5, spanElement, - "title" + "title", ); expect(collectAutofillContentService["getPropertyOrAttribute"]).toHaveBeenNthCalledWith( 6, spanElement, - "tagName" + "tagName", ); expect(collectAutofillContentService["getElementValue"]).not.toHaveBeenCalled(); expect(autofillFieldItem).toEqual({ @@ -891,6 +1025,7 @@ describe("CollectAutofillContentService", () => { tagName: spanElement.tagName.toLowerCase(), title: spanElementTitle, viewable: true, + dataSetValues: "", }); }); @@ -937,18 +1072,18 @@ describe("CollectAutofillContentService", () => { const formElement = document.querySelector("form"); formElement.opid = "form-opid"; const usernameInput = document.getElementById( - usernameField.id + usernameField.id, ) as ElementWithOpId; jest.spyOn(collectAutofillContentService as any, "getAutofillFieldMaxLength"); jest - .spyOn(collectAutofillContentService["domElementVisibilityService"], "isFormFieldViewable") + .spyOn(collectAutofillContentService["domElementVisibilityService"], "isElementViewable") .mockResolvedValue(true); jest.spyOn(collectAutofillContentService as any, "getPropertyOrAttribute"); jest.spyOn(collectAutofillContentService as any, "getElementValue"); const autofillFieldItem = await collectAutofillContentService["buildAutofillFieldItem"]( usernameInput, - index + index, ); expect(autofillFieldItem).toEqual({ @@ -982,6 +1117,7 @@ describe("CollectAutofillContentService", () => { type: usernameField.type, value: usernameField.value, viewable: true, + dataSetValues: "label: username-data-label, stripe: data-stripe, ", }); }); @@ -1022,25 +1158,25 @@ describe("CollectAutofillContentService", () => { const formElement = document.querySelector("form"); formElement.opid = "form-opid"; const hiddenInput = document.getElementById( - hiddenField.id + hiddenField.id, ) as ElementWithOpId; jest.spyOn(collectAutofillContentService as any, "getAutofillFieldMaxLength"); jest - .spyOn(collectAutofillContentService["domElementVisibilityService"], "isFormFieldViewable") + .spyOn(collectAutofillContentService["domElementVisibilityService"], "isElementViewable") .mockResolvedValue(true); jest.spyOn(collectAutofillContentService as any, "getPropertyOrAttribute"); jest.spyOn(collectAutofillContentService as any, "getElementValue"); const autofillFieldItem = await collectAutofillContentService["buildAutofillFieldItem"]( hiddenInput, - index + index, ); expect(autofillFieldItem).toEqual({ "aria-disabled": false, "aria-haspopup": false, "aria-hidden": false, - autoCompleteType: null, + autoCompleteType: "off", checked: false, "data-stripe": hiddenField.dataStripe, disabled: false, @@ -1060,6 +1196,7 @@ describe("CollectAutofillContentService", () => { type: hiddenField.type, value: hiddenField.value, viewable: true, + dataSetValues: "stripe: data-stripe, ", }); }); }); @@ -1081,7 +1218,7 @@ describe("CollectAutofillContentService", () => { const labelTag = collectAutofillContentService["createAutofillFieldLabelTag"](element); expect(collectAutofillContentService["createLabelElementsTag"]).toHaveBeenCalledWith( - new Set(element.labels) + new Set(element.labels), ); expect(document.querySelectorAll).not.toHaveBeenCalled(); expect(labelTag).toEqual("Username"); @@ -1099,7 +1236,7 @@ describe("CollectAutofillContentService", () => { expect(document.querySelectorAll).toHaveBeenCalledWith(`label[for="${element.id}"]`); expect(collectAutofillContentService["createLabelElementsTag"]).toHaveBeenCalledWith( - new Set([elementLabel]) + new Set([elementLabel]), ); expect(labelTag).toEqual("Country"); }); @@ -1117,7 +1254,7 @@ describe("CollectAutofillContentService", () => { expect(document.querySelectorAll).not.toHaveBeenCalledWith(`label[for="${element.id}"]`); expect(document.querySelectorAll).toHaveBeenCalledWith(`label[for="${element.name}"]`); expect(collectAutofillContentService["createLabelElementsTag"]).toHaveBeenCalledWith( - new Set([elementLabel]) + new Set([elementLabel]), ); expect(labelTag).toEqual("Country"); }); @@ -1134,10 +1271,10 @@ describe("CollectAutofillContentService", () => { const labelTag = collectAutofillContentService["createAutofillFieldLabelTag"](element); expect(document.querySelectorAll).toHaveBeenCalledWith( - `label[for="${element.id}"], label[for="${element.name}"]` + `label[for="${element.id}"], label[for="${element.name}"]`, ); expect(collectAutofillContentService["createLabelElementsTag"]).toHaveBeenCalledWith( - new Set([elementLabel]) + new Set([elementLabel]), ); expect(labelTag).toEqual("Country"); }); @@ -1153,7 +1290,7 @@ describe("CollectAutofillContentService", () => { const labelTag = collectAutofillContentService["createAutofillFieldLabelTag"](element); expect(collectAutofillContentService["createLabelElementsTag"]).toHaveBeenCalledWith( - new Set([elementLabel]) + new Set([elementLabel]), ); expect(labelTag).toEqual("Username"); }); @@ -1173,7 +1310,7 @@ describe("CollectAutofillContentService", () => { const labelTag = collectAutofillContentService["createAutofillFieldLabelTag"](element); expect(collectAutofillContentService["createLabelElementsTag"]).toHaveBeenCalledWith( - new Set([elementLabel]) + new Set([elementLabel]), ); expect(labelTag).toEqual("Username"); }); @@ -1270,10 +1407,10 @@ describe("CollectAutofillContentService", () => { const labelTag = collectAutofillContentService["createLabelElementsTag"](new Set(labels)); expect( - collectAutofillContentService["trimAndRemoveNonPrintableText"] + collectAutofillContentService["trimAndRemoveNonPrintableText"], ).toHaveBeenNthCalledWith(1, firstLabelText); expect( - collectAutofillContentService["trimAndRemoveNonPrintableText"] + collectAutofillContentService["trimAndRemoveNonPrintableText"], ).toHaveBeenNthCalledWith(2, secondLabelText); expect(labelTag).toEqual(`${firstLabelText}${secondLabelText}`); }); @@ -1401,7 +1538,7 @@ describe("CollectAutofillContentService", () => { `; const targetTableCellInput = document.querySelector( - 'input[name="password"]' + 'input[name="password"]', ) as HTMLInputElement; const targetTableCellLabel = @@ -1428,7 +1565,7 @@ describe("CollectAutofillContentService", () => { `; const targetTableCellInput = document.querySelector( - 'input[name="auth-code"]' + 'input[name="auth-code"]', ) as HTMLInputElement; const targetTableCellLabel = @@ -1450,7 +1587,7 @@ describe("CollectAutofillContentService", () => { `; const targetTableCellInput = document.querySelector( - 'input[name="password"]' + 'input[name="password"]', ) as HTMLInputElement; const targetTableCellLabel = @@ -1477,7 +1614,7 @@ describe("CollectAutofillContentService", () => { `; const targetTableCellInput = document.querySelector( - 'input[name="password"]' + 'input[name="password"]', ) as HTMLInputElement; const targetTableCellLabel = @@ -1503,7 +1640,7 @@ describe("CollectAutofillContentService", () => { `; const targetTableCellInput = document.querySelector( - 'input[name="auth-code"]' + 'input[name="auth-code"]', ) as HTMLInputElement; const targetTableCellLabel = @@ -1568,7 +1705,7 @@ describe("CollectAutofillContentService", () => { const element = document.querySelector("#username-id"); const textNode = element.previousSibling; const parsedTextContent = collectAutofillContentService["trimAndRemoveNonPrintableText"]( - textNode.nodeValue + textNode.nodeValue, ); jest.spyOn(collectAutofillContentService as any, "trimAndRemoveNonPrintableText"); @@ -1576,7 +1713,7 @@ describe("CollectAutofillContentService", () => { expect(textNode.nodeType).toEqual(Node.TEXT_NODE); expect(collectAutofillContentService["trimAndRemoveNonPrintableText"]).toHaveBeenCalledWith( - textNode.nodeValue + textNode.nodeValue, ); expect(textContent).toEqual(parsedTextContent); }); @@ -1595,7 +1732,7 @@ describe("CollectAutofillContentService", () => { expect(element.nodeType).toEqual(Node.ELEMENT_NODE); expect(collectAutofillContentService["trimAndRemoveNonPrintableText"]).toHaveBeenCalledWith( - element.textContent + element.textContent, ); expect(textContent).toEqual(element.textContent); }); @@ -1730,20 +1867,20 @@ describe("CollectAutofillContentService", () => { const textInputValue = collectAutofillContentService["getPropertyOrAttribute"]( textInput, - "value" + "value", ); const textInputId = collectAutofillContentService["getPropertyOrAttribute"](textInput, "id"); const textInputBaseURI = collectAutofillContentService["getPropertyOrAttribute"]( textInput, - "baseURI" + "baseURI", ); const textInputAutofocus = collectAutofillContentService["getPropertyOrAttribute"]( textInput, - "autofocus" + "autofocus", ); const checkboxInputChecked = collectAutofillContentService["getPropertyOrAttribute"]( checkboxInput, - "checked" + "checked", ); expect(textInput.getAttribute).not.toHaveBeenCalled(); @@ -1762,7 +1899,7 @@ describe("CollectAutofillContentService", () => { const textInputUniqueAttribute = collectAutofillContentService["getPropertyOrAttribute"]( textInput, - "data-unique-attribute" + "data-unique-attribute", ); expect(textInputUniqueAttribute).toEqual("unique-value"); @@ -1775,7 +1912,7 @@ describe("CollectAutofillContentService", () => { const textInputNonExistentAttribute = collectAutofillContentService["getPropertyOrAttribute"]( textInput, - "non-existent-attribute" + "non-existent-attribute", ); expect(textInputNonExistentAttribute).toEqual(null); @@ -1836,14 +1973,14 @@ describe("CollectAutofillContentService", () => { `; const longValueHiddenInput = document.querySelector( - "#long-value-hidden-input" + "#long-value-hidden-input", ) as HTMLInputElement; const longHiddenValue = collectAutofillContentService["getElementValue"](longValueHiddenInput); expect(longHiddenValue).toEqual( - "’Twas brillig, and the slithy toves | Did gyre and gimble in the wabe: | All mimsy were the borogoves, | And the mome raths outgrabe. | “Beware the Jabberwock, my son! | The jaws that bite, the claws that catch! | Beware the Jubjub bird, and shun | The f...SNIPPED" + "’Twas brillig, and the slithy toves | Did gyre and gimble in the wabe: | All mimsy were the borogoves, | And the mome raths outgrabe. | “Beware the Jabberwock, my son! | The jaws that bite, the claws that catch! | Beware the Jubjub bird, and shun | The f...SNIPPED", ); }); }); @@ -1861,7 +1998,7 @@ describe("CollectAutofillContentService", () => { `; const selectWithOptions = document.querySelector("#select-with-options") as HTMLSelectElement; const selectWithoutOptions = document.querySelector( - "#select-without-options" + "#select-without-options", ) as HTMLSelectElement; const selectWithOptionsOptions = @@ -1881,73 +2018,6 @@ describe("CollectAutofillContentService", () => { }); }); - describe("getShadowRoot", () => { - it("returns null if the passed node is not an HTMLElement instance", () => { - const textNode = document.createTextNode("Hello, world!"); - const shadowRoot = collectAutofillContentService["getShadowRoot"](textNode); - - expect(shadowRoot).toEqual(null); - }); - - it("returns a value provided by Chrome's openOrClosedShadowRoot API", () => { - // eslint-disable-next-line - // @ts-ignore - globalThis.chrome.dom = { - openOrClosedShadowRoot: jest.fn(), - }; - const element = document.createElement("div"); - collectAutofillContentService["getShadowRoot"](element); - - // eslint-disable-next-line - // @ts-ignore - expect(chrome.dom.openOrClosedShadowRoot).toBeCalled(); - }); - }); - - describe("buildTreeWalkerNodesQueryResults", () => { - it("will recursively call itself if a shadowDOM element is found and will observe the element for mutations", () => { - collectAutofillContentService["mutationObserver"] = mock({ - observe: jest.fn(), - }); - jest.spyOn(collectAutofillContentService as any, "buildTreeWalkerNodesQueryResults"); - const shadowRoot = document.createElement("div"); - jest - .spyOn(collectAutofillContentService as any, "getShadowRoot") - .mockReturnValueOnce(shadowRoot); - const callbackFilter = jest.fn(); - - collectAutofillContentService["buildTreeWalkerNodesQueryResults"]( - document.body, - [], - callbackFilter, - true - ); - - expect(collectAutofillContentService["buildTreeWalkerNodesQueryResults"]).toBeCalledTimes(2); - expect(collectAutofillContentService["mutationObserver"].observe).toBeCalled(); - }); - - it("will not observe the shadowDOM element if required to skip", () => { - collectAutofillContentService["mutationObserver"] = mock({ - observe: jest.fn(), - }); - const shadowRoot = document.createElement("div"); - jest - .spyOn(collectAutofillContentService as any, "getShadowRoot") - .mockReturnValueOnce(shadowRoot); - const callbackFilter = jest.fn(); - - collectAutofillContentService["buildTreeWalkerNodesQueryResults"]( - document.body, - [], - callbackFilter, - false - ); - - expect(collectAutofillContentService["mutationObserver"].observe).not.toBeCalled(); - }); - }); - describe("setupMutationObserver", () => { it("sets up a mutation observer and observes the document element", () => { jest.spyOn(MutationObserver.prototype, "observe"); @@ -1960,7 +2030,13 @@ describe("CollectAutofillContentService", () => { }); describe("handleMutationObserverMutation", () => { - it("will set the domRecentlyMutated value to true and the noFieldsFound value to false if a form or field node has been added ", () => { + const waitForAllMutationsToComplete = async () => { + await waitForIdleCallback(); + await waitForIdleCallback(); + await waitForIdleCallback(); + }; + + it("will set the domRecentlyMutated value to true and the noFieldsFound value to false if a form or field node has been added ", async () => { const form = document.createElement("form"); document.body.appendChild(form); const addedNodes = document.querySelectorAll("form"); @@ -1983,19 +2059,57 @@ describe("CollectAutofillContentService", () => { jest.spyOn(collectAutofillContentService as any, "isAutofillElementNodeMutated"); collectAutofillContentService["handleMutationObserverMutation"]([mutationRecord]); + await waitForAllMutationsToComplete(); expect(collectAutofillContentService["domRecentlyMutated"]).toEqual(true); expect(collectAutofillContentService["noFieldsFound"]).toEqual(false); expect(collectAutofillContentService["isAutofillElementNodeMutated"]).toBeCalledWith( removedNodes, - true + true, ); expect(collectAutofillContentService["isAutofillElementNodeMutated"]).toBeCalledWith( - addedNodes + addedNodes, ); }); - it("will handle updating the autofill element if any attribute mutations are encountered", () => { + it("removes cached autofill elements that are nested within a removed node", async () => { + const form = document.createElement("form") as ElementWithOpId; + const usernameInput = document.createElement("input") as ElementWithOpId; + usernameInput.setAttribute("type", "text"); + usernameInput.setAttribute("name", "username"); + form.appendChild(usernameInput); + document.body.appendChild(form); + const removedNodes = document.querySelectorAll("form"); + const autofillForm: AutofillForm = createAutofillFormMock({}); + const autofillField: AutofillField = createAutofillFieldMock({}); + collectAutofillContentService["_autofillFormElements"] = new Map([[form, autofillForm]]); + collectAutofillContentService["autofillFieldElements"] = new Map([ + [usernameInput, autofillField], + ]); + collectAutofillContentService["domRecentlyMutated"] = false; + collectAutofillContentService["noFieldsFound"] = true; + collectAutofillContentService["currentLocationHref"] = window.location.href; + + collectAutofillContentService["handleMutationObserverMutation"]([ + { + type: "childList", + addedNodes: null, + attributeName: null, + attributeNamespace: null, + nextSibling: null, + oldValue: null, + previousSibling: null, + removedNodes: removedNodes, + target: document.body, + }, + ]); + await waitForAllMutationsToComplete(); + + expect(collectAutofillContentService["_autofillFormElements"].size).toEqual(0); + expect(collectAutofillContentService["autofillFieldElements"].size).toEqual(0); + }); + + it("will handle updating the autofill element if any attribute mutations are encountered", async () => { const mutationRecord: MutationRecord = { type: "attributes", addedNodes: null, @@ -2014,6 +2128,7 @@ describe("CollectAutofillContentService", () => { jest.spyOn(collectAutofillContentService as any, "handleAutofillElementAttributeMutation"); collectAutofillContentService["handleMutationObserverMutation"]([mutationRecord]); + await waitForAllMutationsToComplete(); expect(collectAutofillContentService["domRecentlyMutated"]).toEqual(false); expect(collectAutofillContentService["noFieldsFound"]).toEqual(true); @@ -2043,9 +2158,63 @@ describe("CollectAutofillContentService", () => { expect(collectAutofillContentService["handleWindowLocationMutation"]).toBeCalled(); expect(collectAutofillContentService["isAutofillElementNodeMutated"]).not.toBeCalled(); expect( - collectAutofillContentService["handleAutofillElementAttributeMutation"] + collectAutofillContentService["handleAutofillElementAttributeMutation"], ).not.toBeCalled(); }); + + it("will setup the overlay listeners on mutated elements", async () => { + jest.useFakeTimers(); + const form = document.createElement("form"); + document.body.appendChild(form); + const addedNodes = document.querySelectorAll("form"); + const removedNodes = document.querySelectorAll("li"); + const mutationRecord: MutationRecord = { + type: "childList", + addedNodes: addedNodes, + attributeName: null, + attributeNamespace: null, + nextSibling: null, + oldValue: null, + previousSibling: null, + removedNodes: removedNodes, + target: document.body, + }; + collectAutofillContentService["domRecentlyMutated"] = false; + collectAutofillContentService["noFieldsFound"] = true; + collectAutofillContentService["currentLocationHref"] = window.location.href; + jest.spyOn(collectAutofillContentService as any, "setupOverlayListenersOnMutatedElements"); + + collectAutofillContentService["handleMutationObserverMutation"]([mutationRecord]); + jest.runAllTimers(); + + expect(collectAutofillContentService["setupOverlayListenersOnMutatedElements"]).toBeCalled(); + }); + }); + + describe("setupOverlayListenersOnMutatedElements", () => { + it("skips building the autofill field item if the node is not a form field element", () => { + const divElement = document.createElement("div"); + const nodes = [divElement]; + jest.spyOn(collectAutofillContentService as any, "buildAutofillFieldItem"); + + collectAutofillContentService["setupOverlayListenersOnMutatedElements"](nodes); + + expect(collectAutofillContentService["buildAutofillFieldItem"]).not.toBeCalled(); + }); + + it("skips building the autofill field item if the node is already a field element", () => { + const inputElement = document.createElement("input") as ElementWithOpId; + inputElement.setAttribute("type", "password"); + const nodes = [inputElement]; + collectAutofillContentService["autofillFieldElements"].set(inputElement, { + opid: "1234", + } as AutofillField); + jest.spyOn(collectAutofillContentService as any, "buildAutofillFieldItem"); + + collectAutofillContentService["setupOverlayListenersOnMutatedElements"](nodes); + + expect(collectAutofillContentService["buildAutofillFieldItem"]).not.toBeCalled(); + }); }); describe("deleteCachedAutofillElement", () => { @@ -2058,13 +2227,13 @@ describe("CollectAutofillContentService", () => { htmlAction: "https://example.com", htmlMethod: "POST", }; - collectAutofillContentService["autofillFormElements"] = new Map([ + collectAutofillContentService["_autofillFormElements"] = new Map([ [formElement, autofillForm], ]); collectAutofillContentService["deleteCachedAutofillElement"](formElement); - expect(collectAutofillContentService["autofillFormElements"].size).toEqual(0); + expect(collectAutofillContentService["_autofillFormElements"].size).toEqual(0); }); it("removes the autofill field element form the map of elements", () => { @@ -2110,7 +2279,7 @@ describe("CollectAutofillContentService", () => { expect(collectAutofillContentService["domRecentlyMutated"]).toEqual(true); expect(collectAutofillContentService["noFieldsFound"]).toEqual(false); expect(collectAutofillContentService["updateAutofillElementsAfterMutation"]).toBeCalled(); - expect(collectAutofillContentService["autofillFormElements"].size).toEqual(0); + expect(collectAutofillContentService["_autofillFormElements"].size).toEqual(0); expect(collectAutofillContentService["autofillFieldElements"].size).toEqual(0); }); }); @@ -2157,7 +2326,9 @@ describe("CollectAutofillContentService", () => { removedNodes: null, target: targetNode, }; - collectAutofillContentService["autofillFormElements"] = new Map([[targetNode, autofillForm]]); + collectAutofillContentService["_autofillFormElements"] = new Map([ + [targetNode, autofillForm], + ]); jest.spyOn(collectAutofillContentService as any, "updateAutofillFormElementData"); collectAutofillContentService["handleAutofillElementAttributeMutation"](mutationRecord); @@ -2165,7 +2336,7 @@ describe("CollectAutofillContentService", () => { expect(collectAutofillContentService["updateAutofillFormElementData"]).toBeCalledWith( mutationRecord.attributeName, mutationRecord.target, - autofillForm + autofillForm, ); }); @@ -2212,7 +2383,7 @@ describe("CollectAutofillContentService", () => { expect(collectAutofillContentService["updateAutofillFieldElementData"]).toBeCalledWith( mutationRecord.attributeName, mutationRecord.target, - autofillField + autofillField, ); }); }); @@ -2228,33 +2399,39 @@ describe("CollectAutofillContentService", () => { }; const updatedAttributes = ["action", "name", "id", "method"]; + beforeEach(() => { + collectAutofillContentService["_autofillFormElements"] = new Map([ + [formElement, autofillForm], + ]); + }); + updatedAttributes.forEach((attribute) => { it(`will update the ${attribute} value for the form element`, () => { - jest.spyOn(collectAutofillContentService["autofillFormElements"], "set"); + jest.spyOn(collectAutofillContentService["_autofillFormElements"], "set"); collectAutofillContentService["updateAutofillFormElementData"]( attribute, formElement, - autofillForm + autofillForm, ); - expect(collectAutofillContentService["autofillFormElements"].set).toBeCalledWith( + expect(collectAutofillContentService["_autofillFormElements"].set).toBeCalledWith( formElement, - autofillForm + autofillForm, ); }); }); it("will not update an attribute value if it is not present in the updateActions object", () => { - jest.spyOn(collectAutofillContentService["autofillFormElements"], "set"); + jest.spyOn(collectAutofillContentService["_autofillFormElements"], "set"); collectAutofillContentService["updateAutofillFormElementData"]( "aria-label", formElement, - autofillForm + autofillForm, ); - expect(collectAutofillContentService["autofillFormElements"].set).not.toBeCalled(); + expect(collectAutofillContentService["_autofillFormElements"].set).not.toBeCalled(); }); }); @@ -2293,53 +2470,132 @@ describe("CollectAutofillContentService", () => { "data-stripe", ]; + beforeEach(() => { + collectAutofillContentService["autofillFieldElements"] = new Map([ + [fieldElement, autofillField], + ]); + }); + updatedAttributes.forEach((attribute) => { - it(`will update the ${attribute} value for the field element`, async () => { + it(`will update the ${attribute} value for the field element`, () => { jest.spyOn(collectAutofillContentService["autofillFieldElements"], "set"); - await collectAutofillContentService["updateAutofillFieldElementData"]( + collectAutofillContentService["updateAutofillFieldElementData"]( attribute, fieldElement, - autofillField + autofillField, ); expect(collectAutofillContentService["autofillFieldElements"].set).toBeCalledWith( fieldElement, - autofillField + autofillField, ); }); }); - it("will check the dom element's visibility if the `style` or `class` attribute has updated ", async () => { - jest.spyOn( - collectAutofillContentService["domElementVisibilityService"], - "isFormFieldViewable" - ); - const attributes = ["class", "style"]; - - for (const attribute of attributes) { - await collectAutofillContentService["updateAutofillFieldElementData"]( - attribute, - fieldElement, - autofillField - ); - - expect( - collectAutofillContentService["domElementVisibilityService"].isFormFieldViewable - ).toBeCalledWith(fieldElement); - } - }); - - it("will not update an attribute value if it is not present in the updateActions object", async () => { + it("will not update an attribute value if it is not present in the updateActions object", () => { jest.spyOn(collectAutofillContentService["autofillFieldElements"], "set"); - await collectAutofillContentService["updateAutofillFieldElementData"]( + collectAutofillContentService["updateAutofillFieldElementData"]( "random-attribute", fieldElement, - autofillField + autofillField, ); expect(collectAutofillContentService["autofillFieldElements"].set).not.toBeCalled(); }); }); + + describe("handleFormElementIntersection", () => { + let isElementViewableSpy: jest.SpyInstance; + let setupAutofillOverlayListenerOnFieldSpy: jest.SpyInstance; + + beforeEach(() => { + isElementViewableSpy = jest.spyOn( + collectAutofillContentService["domElementVisibilityService"], + "isElementViewable", + ); + setupAutofillOverlayListenerOnFieldSpy = jest.spyOn( + collectAutofillContentService["autofillOverlayContentService"], + "setupOverlayListeners", + ); + }); + + it("skips the initial intersection event for an observed element", async () => { + const formFieldElement = document.createElement("input") as ElementWithOpId; + collectAutofillContentService["elementInitializingIntersectionObserver"].add( + formFieldElement, + ); + const entries = [ + { target: formFieldElement, isIntersecting: true }, + ] as unknown as IntersectionObserverEntry[]; + + await collectAutofillContentService["handleFormElementIntersection"](entries); + + expect(isElementViewableSpy).not.toHaveBeenCalled(); + expect(setupAutofillOverlayListenerOnFieldSpy).not.toHaveBeenCalled(); + }); + + it("skips setting up the overlay listeners on a field that is not viewable", async () => { + const formFieldElement = document.createElement("input") as ElementWithOpId; + const autofillField = mock(); + const entries = [ + { target: formFieldElement, isIntersecting: true }, + ] as unknown as IntersectionObserverEntry[]; + collectAutofillContentService["autofillFieldElements"].set(formFieldElement, autofillField); + isElementViewableSpy.mockReturnValueOnce(false); + + await collectAutofillContentService["handleFormElementIntersection"](entries); + + expect(isElementViewableSpy).toHaveBeenCalledWith(formFieldElement); + expect(setupAutofillOverlayListenerOnFieldSpy).not.toHaveBeenCalled(); + }); + + it("skips setting up the inline menu listeners if the observed form field is not present in the cache", async () => { + const formFieldElement = document.createElement("input") as ElementWithOpId; + const entries = [ + { target: formFieldElement, isIntersecting: true }, + ] as unknown as IntersectionObserverEntry[]; + isElementViewableSpy.mockReturnValueOnce(true); + collectAutofillContentService["intersectionObserver"] = mockIntersectionObserver; + + await collectAutofillContentService["handleFormElementIntersection"](entries); + + expect(isElementViewableSpy).not.toHaveBeenCalled(); + expect(setupAutofillOverlayListenerOnFieldSpy).not.toHaveBeenCalled(); + }); + + it("sets up the inline menu listeners on a viewable field", async () => { + const formFieldElement = document.createElement("input") as ElementWithOpId; + const autofillField = mock(); + const entries = [ + { target: formFieldElement, isIntersecting: true }, + ] as unknown as IntersectionObserverEntry[]; + isElementViewableSpy.mockReturnValueOnce(true); + collectAutofillContentService["autofillFieldElements"].set(formFieldElement, autofillField); + collectAutofillContentService["intersectionObserver"] = mockIntersectionObserver; + + await collectAutofillContentService["handleFormElementIntersection"](entries); + + expect(isElementViewableSpy).toHaveBeenCalledWith(formFieldElement); + expect(setupAutofillOverlayListenerOnFieldSpy).toHaveBeenCalledWith( + formFieldElement, + autofillField, + expect.anything(), + ); + }); + }); + + describe("destroy", () => { + it("clears the updateAfterMutationIdleCallback", () => { + jest.spyOn(window, "clearTimeout"); + collectAutofillContentService["updateAfterMutationIdleCallback"] = setTimeout(jest.fn, 100); + + collectAutofillContentService.destroy(); + + expect(clearTimeout).toHaveBeenCalledWith( + collectAutofillContentService["updateAfterMutationIdleCallback"], + ); + }); + }); }); diff --git a/apps/browser/src/autofill/services/collect-autofill-content.service.ts b/apps/browser/src/autofill/services/collect-autofill-content.service.ts index 4780c294ab1..94d84997ee5 100644 --- a/apps/browser/src/autofill/services/collect-autofill-content.service.ts +++ b/apps/browser/src/autofill/services/collect-autofill-content.service.ts @@ -1,34 +1,78 @@ import AutofillField from "../models/autofill-field"; import AutofillForm from "../models/autofill-form"; import AutofillPageDetails from "../models/autofill-page-details"; +import { ElementWithOpId, FillableFormFieldElement, FormFieldElement } from "../types"; import { - ElementWithOpId, - FillableFormFieldElement, - FormFieldElement, - FormElementWithAttribute, -} from "../types"; + elementIsDescriptionDetailsElement, + elementIsDescriptionTermElement, + elementIsFillableFormField, + elementIsFormElement, + elementIsInputElement, + elementIsLabelElement, + elementIsSelectElement, + elementIsSpanElement, + nodeIsElement, + elementIsTextAreaElement, + nodeIsFormElement, + nodeIsInputElement, + sendExtensionMessage, + getAttributeBoolean, + getPropertyOrAttribute, + requestIdleCallbackPolyfill, + cancelIdleCallbackPolyfill, + debounce, +} from "../utils"; +import { AutofillOverlayContentService } from "./abstractions/autofill-overlay-content.service"; import { - UpdateAutofillDataAttributeParams, AutofillFieldElements, AutofillFormElements, CollectAutofillContentService as CollectAutofillContentServiceInterface, + UpdateAutofillDataAttributeParams, } from "./abstractions/collect-autofill-content.service"; -import DomElementVisibilityService from "./dom-element-visibility.service"; +import { DomElementVisibilityService } from "./abstractions/dom-element-visibility.service"; +import { DomQueryService } from "./abstractions/dom-query.service"; -class CollectAutofillContentService implements CollectAutofillContentServiceInterface { - private readonly domElementVisibilityService: DomElementVisibilityService; +export class CollectAutofillContentService implements CollectAutofillContentServiceInterface { + private readonly sendExtensionMessage = sendExtensionMessage; + private readonly getAttributeBoolean = getAttributeBoolean; + private readonly getPropertyOrAttribute = getPropertyOrAttribute; private noFieldsFound = false; private domRecentlyMutated = true; - private autofillFormElements: AutofillFormElements = new Map(); + private _autofillFormElements: AutofillFormElements = new Map(); private autofillFieldElements: AutofillFieldElements = new Map(); private currentLocationHref = ""; + private intersectionObserver: IntersectionObserver; + private elementInitializingIntersectionObserver: Set = new Set(); private mutationObserver: MutationObserver; - private updateAutofillElementsAfterMutationTimeout: NodeJS.Timeout; - private readonly updateAfterMutationTimeoutDelay = 1000; + private mutationsQueue: MutationRecord[][] = []; + private updateAfterMutationIdleCallback: NodeJS.Timeout | number; + private readonly updateAfterMutationTimeout = 1000; + private readonly formFieldQueryString; + private readonly nonInputFormFieldTags = new Set(["textarea", "select"]); + private readonly ignoredInputTypes = new Set([ + "hidden", + "submit", + "reset", + "button", + "image", + "file", + ]); - constructor(domElementVisibilityService: DomElementVisibilityService) { - this.domElementVisibilityService = domElementVisibilityService; + constructor( + private domElementVisibilityService: DomElementVisibilityService, + private domQueryService: DomQueryService, + private autofillOverlayContentService?: AutofillOverlayContentService, + ) { + let inputQuery = "input:not([data-bwignore])"; + for (const type of this.ignoredInputTypes) { + inputQuery += `:not([type="${type}"])`; + } + this.formFieldQueryString = `${inputQuery}, textarea:not([data-bwignore]), select:not([data-bwignore]), span[data-bwautofill]`; + } + + get autofillFormElements(): AutofillFormElements { + return this._autofillFormElements; } /** @@ -43,35 +87,40 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte this.setupMutationObserver(); } + if (!this.intersectionObserver) { + this.setupIntersectionObserver(); + } + if (!this.domRecentlyMutated && this.noFieldsFound) { return this.getFormattedPageDetails({}, []); } - if ( - !this.domRecentlyMutated && - this.autofillFormElements.size && - this.autofillFieldElements.size - ) { + if (!this.domRecentlyMutated && this.autofillFieldElements.size) { + this.updateCachedAutofillFieldVisibility(); + return this.getFormattedPageDetails( this.getFormattedAutofillFormsData(), - this.getFormattedAutofillFieldsData() + this.getFormattedAutofillFieldsData(), ); } const { formElements, formFieldElements } = this.queryAutofillFormAndFieldElements(); const autofillFormsData: Record = this.buildAutofillFormsData(formElements); - const autofillFieldsData: AutofillField[] = await this.buildAutofillFieldsData( - formFieldElements as FormFieldElement[] - ); + const autofillFieldsData: AutofillField[] = ( + await this.buildAutofillFieldsData(formFieldElements as FormFieldElement[]) + ).filter((field) => !!field); this.sortAutofillFieldElementsMap(); - if (!Object.values(autofillFormsData).length || !autofillFieldsData.length) { + if (!autofillFieldsData.length) { this.noFieldsFound = true; } this.domRecentlyMutated = false; - return this.getFormattedPageDetails(autofillFormsData, autofillFieldsData); + const pageDetails = this.getFormattedPageDetails(autofillFormsData, autofillFieldsData); + this.setupOverlayListeners(pageDetails); + + return pageDetails; } /** @@ -87,7 +136,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte ? cachedFormFieldElements : this.getAutofillFieldElements(); const fieldElementsWithOpid = formFieldElements.filter( - (fieldElement) => (fieldElement as ElementWithOpId).opid === opid + (fieldElement) => (fieldElement as ElementWithOpId).opid === opid, ) as ElementWithOpId[]; if (!fieldElementsWithOpid.length) { @@ -104,31 +153,6 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte return fieldElementsWithOpid[0]; } - /** - * Queries the DOM for all the nodes that match the given filter callback - * and returns a collection of nodes. - * @param {Node} rootNode - * @param {Function} filterCallback - * @param {boolean} isObservingShadowRoot - * @returns {Node[]} - */ - queryAllTreeWalkerNodes( - rootNode: Node, - filterCallback: CallableFunction, - isObservingShadowRoot = true - ): Node[] { - const treeWalkerQueryResults: Node[] = []; - - this.buildTreeWalkerNodesQueryResults( - rootNode, - treeWalkerQueryResults, - filterCallback, - isObservingShadowRoot - ); - - return treeWalkerQueryResults; - } - /** * Sorts the AutofillFieldElements map by the elementNumber property. * @private @@ -139,24 +163,23 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte } this.autofillFieldElements = new Map( - [...this.autofillFieldElements].sort((a, b) => a[1].elementNumber - b[1].elementNumber) + [...this.autofillFieldElements].sort((a, b) => a[1].elementNumber - b[1].elementNumber), ); } /** * Formats and returns the AutofillPageDetails object - * @param {Record} autofillFormsData - * @param {AutofillField[]} autofillFieldsData - * @returns {AutofillPageDetails} - * @private + * + * @param autofillFormsData - The data for all the forms found in the page + * @param autofillFieldsData - The data for all the fields found in the page */ private getFormattedPageDetails( autofillFormsData: Record, - autofillFieldsData: AutofillField[] + autofillFieldsData: AutofillField[], ): AutofillPageDetails { return { title: document.title, - url: (document.defaultView || window).location.href, + url: (document.defaultView || globalThis).location.href, documentUrl: document.location.href, forms: autofillFormsData, fields: autofillFieldsData, @@ -164,6 +187,23 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte }; } + /** + * Re-checks the visibility for all form fields and updates the + * cached data to reflect the most recent visibility state. + * + * @private + */ + private updateCachedAutofillFieldVisibility() { + this.autofillFieldElements.forEach(async (autofillField, element) => { + const previouslyViewable = autofillField.viewable; + autofillField.viewable = await this.domElementVisibilityService.isElementViewable(element); + + if (!previouslyViewable && autofillField.viewable) { + this.setupOverlayOnField(element, autofillField); + } + }); + } + /** * Queries the DOM for all the forms elements and * returns a collection of AutofillForm objects. @@ -175,14 +215,14 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte const formElement = formElements[index] as ElementWithOpId; formElement.opid = `__form__${index}`; - const existingAutofillForm = this.autofillFormElements.get(formElement); + const existingAutofillForm = this._autofillFormElements.get(formElement); if (existingAutofillForm) { existingAutofillForm.opid = formElement.opid; - this.autofillFormElements.set(formElement, existingAutofillForm); + this._autofillFormElements.set(formElement, existingAutofillForm); continue; } - this.autofillFormElements.set(formElement, { + this._autofillFormElements.set(formElement, { opid: formElement.opid, htmlAction: this.getFormActionAttribute(formElement), htmlName: this.getPropertyOrAttribute(formElement, "name"), @@ -202,7 +242,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @private */ private getFormActionAttribute(element: ElementWithOpId): string { - return new URL(this.getPropertyOrAttribute(element, "action"), window.location.href).href; + return new URL(this.getPropertyOrAttribute(element, "action"), globalThis.location.href).href; } /** @@ -213,7 +253,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte */ private getFormattedAutofillFormsData(): Record { const autofillForms: Record = {}; - const autofillFormElements = Array.from(this.autofillFormElements); + const autofillFormElements = Array.from(this._autofillFormElements); for (let index = 0; index < autofillFormElements.length; index++) { const [formElement, autofillForm] = autofillFormElements[index]; autofillForms[formElement.opid] = autofillForm; @@ -229,7 +269,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @private */ private async buildAutofillFieldsData( - formFieldElements: FormFieldElement[] + formFieldElements: FormFieldElement[], ): Promise { const autofillFieldElements = this.getAutofillFieldElements(100, formFieldElements); const autofillFieldDataPromises = autofillFieldElements.map(this.buildAutofillFieldItem); @@ -248,13 +288,17 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte */ private getAutofillFieldElements( fieldsLimit?: number, - previouslyFoundFormFieldElements?: FormFieldElement[] + previouslyFoundFormFieldElements?: FormFieldElement[], ): FormFieldElement[] { - const formFieldElements = - previouslyFoundFormFieldElements || - (this.queryAllTreeWalkerNodes(document.documentElement, (node: Node) => - this.isNodeFormFieldElement(node) - ) as FormFieldElement[]); + let formFieldElements = previouslyFoundFormFieldElements; + if (!formFieldElements) { + formFieldElements = this.domQueryService.query( + globalThis.document.documentElement, + this.formFieldQueryString, + (node: Node) => this.isNodeFormFieldElement(node), + this.mutationObserver, + ); + } if (!fieldsLimit || formFieldElements.length <= fieldsLimit) { return formFieldElements; @@ -289,19 +333,22 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * Builds an AutofillField object from the given form element. Will only return * shared field values if the element is a span element. Will not return any label * values if the element is a hidden input element. - * @param {ElementWithOpId} element - * @param {number} index - * @returns {Promise} - * @private + * + * @param element - The form field element to build the AutofillField object from + * @param index - The index of the form field element */ private buildAutofillFieldItem = async ( element: ElementWithOpId, - index: number - ): Promise => { + index: number, + ): Promise => { + if (element.closest("button[type='submit']")) { + return null; + } + element.opid = `__${index}`; const existingAutofillField = this.autofillFieldElements.get(element); - if (existingAutofillField) { + if (index >= 0 && existingAutofillField) { existingAutofillField.opid = element.opid; existingAutofillField.elementNumber = index; this.autofillFieldElements.set(element, existingAutofillField); @@ -313,17 +360,23 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte opid: element.opid, elementNumber: index, maxLength: this.getAutofillFieldMaxLength(element), - viewable: await this.domElementVisibilityService.isFormFieldViewable(element), + viewable: await this.domElementVisibilityService.isElementViewable(element), htmlID: this.getPropertyOrAttribute(element, "id"), htmlName: this.getPropertyOrAttribute(element, "name"), htmlClass: this.getPropertyOrAttribute(element, "class"), tabindex: this.getPropertyOrAttribute(element, "tabindex"), title: this.getPropertyOrAttribute(element, "title"), tagName: this.getAttributeLowerCase(element, "tagName"), + dataSetValues: this.getDataSetValues(element), }; - if (element instanceof HTMLSpanElement) { - this.autofillFieldElements.set(element, autofillFieldBase); + if (!autofillFieldBase.viewable) { + this.elementInitializingIntersectionObserver.add(element); + this.intersectionObserver?.observe(element); + } + + if (elementIsSpanElement(element)) { + this.cacheAutofillFieldElement(index, element, autofillFieldBase); return autofillFieldBase; } @@ -331,7 +384,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte const elementType = this.getAttributeLowerCase(element, "type"); if (elementType !== "hidden") { autofillFieldLabels = { - "label-tag": this.createAutofillFieldLabelTag(element), + "label-tag": this.createAutofillFieldLabelTag(element as FillableFormFieldElement), "label-data": this.getPropertyOrAttribute(element, "data-label"), "label-aria": this.getPropertyOrAttribute(element, "aria-label"), "label-top": this.createAutofillFieldTopLabel(element), @@ -341,6 +394,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte }; } + const fieldFormElement = (element as ElementWithOpId).form; const autofillField = { ...autofillFieldBase, ...autofillFieldLabels, @@ -351,19 +405,40 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte autoCompleteType: this.getAutoCompleteAttribute(element), disabled: this.getAttributeBoolean(element, "disabled"), readonly: this.getAttributeBoolean(element, "readonly"), - selectInfo: - element instanceof HTMLSelectElement ? this.getSelectElementOptions(element) : null, - form: element.form ? this.getPropertyOrAttribute(element.form, "opid") : null, + selectInfo: elementIsSelectElement(element) + ? this.getSelectElementOptions(element as HTMLSelectElement) + : null, + form: fieldFormElement ? this.getPropertyOrAttribute(fieldFormElement, "opid") : null, "aria-hidden": this.getAttributeBoolean(element, "aria-hidden", true), "aria-disabled": this.getAttributeBoolean(element, "aria-disabled", true), "aria-haspopup": this.getAttributeBoolean(element, "aria-haspopup", true), "data-stripe": this.getPropertyOrAttribute(element, "data-stripe"), }; - this.autofillFieldElements.set(element, autofillField); + this.cacheAutofillFieldElement(index, element, autofillField); return autofillField; }; + /** + * Caches the autofill field element and its data. + * Will not cache the element if the index is less than 0. + * + * @param index - The index of the autofill field element + * @param element - The autofill field element to cache + * @param autofillFieldData - The autofill field data to cache + */ + private cacheAutofillFieldElement( + index: number, + element: ElementWithOpId, + autofillFieldData: AutofillField, + ) { + if (index < 0) { + return; + } + + this.autofillFieldElements.set(element, autofillFieldData); + } + /** * Identifies the autocomplete attribute associated with an element and returns * the value of the attribute if it is not set to "off". @@ -372,31 +447,11 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @private */ private getAutoCompleteAttribute(element: ElementWithOpId): string { - const autoCompleteType = + return ( this.getPropertyOrAttribute(element, "x-autocompletetype") || this.getPropertyOrAttribute(element, "autocompletetype") || - this.getPropertyOrAttribute(element, "autocomplete"); - return autoCompleteType !== "off" ? autoCompleteType : null; - } - - /** - * Returns a boolean representing the attribute value of an element. - * @param {ElementWithOpId} element - * @param {string} attributeName - * @param {boolean} checkString - * @returns {boolean} - * @private - */ - private getAttributeBoolean( - element: ElementWithOpId, - attributeName: string, - checkString = false - ): boolean { - if (checkString) { - return this.getPropertyOrAttribute(element, attributeName) === "true"; - } - - return Boolean(this.getPropertyOrAttribute(element, attributeName)); + this.getPropertyOrAttribute(element, "autocomplete") + ); } /** @@ -408,7 +463,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte */ private getAttributeLowerCase( element: ElementWithOpId, - attributeName: string + attributeName: string, ): string { return this.getPropertyOrAttribute(element, attributeName)?.toLowerCase(); } @@ -445,19 +500,19 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte let currentElement: HTMLElement | null = element; while (currentElement && currentElement !== document.documentElement) { - if (currentElement instanceof HTMLLabelElement) { + if (elementIsLabelElement(currentElement)) { labelElementsSet.add(currentElement); } - currentElement = currentElement.parentElement.closest("label"); + currentElement = currentElement.parentElement?.closest("label"); } if ( !labelElementsSet.size && - element.parentElement?.tagName.toLowerCase() === "dd" && - element.parentElement.previousElementSibling?.tagName.toLowerCase() === "dt" + elementIsDescriptionDetailsElement(element.parentElement) && + elementIsDescriptionTermElement(element.parentElement.previousElementSibling) ) { - labelElementsSet.add(element.parentElement.previousElementSibling as HTMLElement); + labelElementsSet.add(element.parentElement.previousElementSibling); } return this.createLabelElementsTag(labelElementsSet); @@ -472,7 +527,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @private */ private queryElementLabels( - element: FillableFormFieldElement + element: FillableFormFieldElement, ): NodeListOf | null { let labelQuerySelectors = element.id ? `label[for="${element.id}"]` : ""; if (element.name) { @@ -487,7 +542,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte } return (element.getRootNode() as Document | ShadowRoot).querySelectorAll( - labelQuerySelectors.replace(/\n/g, "") + labelQuerySelectors.replace(/\n/g, ""), ); } @@ -521,7 +576,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte */ private getAutofillFieldMaxLength(element: FormFieldElement): number | null { const elementHasMaxLengthProperty = - element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement; + elementIsInputElement(element) || elementIsTextAreaElement(element); const elementMaxLength = elementHasMaxLengthProperty && element.maxLength > -1 ? element.maxLength : 999; @@ -584,6 +639,10 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte } const tableDataElementIndex = tableDataElement.cellIndex; + if (tableDataElementIndex < 0) { + return null; + } + const parentSiblingTableRowElement = tableDataElement.closest("tr") ?.previousElementSibling as HTMLTableRowElement; @@ -638,7 +697,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte } return this.trimAndRemoveNonPrintableText( - element.textContent || (element as HTMLElement).innerText + element.textContent || (element as HTMLElement).innerText, ); } @@ -686,11 +745,13 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte // Prioritize capturing text content from elements rather than nodes. currentElement = currentElement.parentElement || currentElement.parentNode; + if (!currentElement) { + return textContentItems; + } - let siblingElement = - currentElement instanceof HTMLElement - ? currentElement.previousElementSibling - : currentElement.previousSibling; + let siblingElement = nodeIsElement(currentElement) + ? currentElement.previousElementSibling + : currentElement.previousSibling; while (siblingElement?.lastChild && !this.isNewSectionElement(siblingElement)) { siblingElement = siblingElement.lastChild; } @@ -708,21 +769,6 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte return this.recursivelyGetTextFromPreviousSiblings(siblingElement); } - /** - * Get the value of a property or attribute from a FormFieldElement. - * @param {HTMLElement} element - * @param {string} attributeName - * @returns {string | null} - * @private - */ - private getPropertyOrAttribute(element: HTMLElement, attributeName: string): string | null { - if (attributeName in element) { - return (element as FormElementWithAttribute)[attributeName]; - } - - return element.getAttribute(attributeName); - } - /** * Gets the value of the element. If the element is a checkbox, returns a checkmark if the * checkbox is checked, or an empty string if it is not checked. If the element is a hidden @@ -733,7 +779,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @private */ private getElementValue(element: FormFieldElement): string { - if (element instanceof HTMLSpanElement) { + if (!elementIsFillableFormField(element)) { const spanTextContent = element.textContent || element.innerText; return spanTextContent || ""; } @@ -755,6 +801,21 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte return elementValue; } + /** + * Captures the `data-*` attribute metadata to help with validating the autofill data. + * + * @param element - The form field element to capture the `data-*` attribute metadata from + */ + private getDataSetValues(element: ElementWithOpId): string { + let datasetValues = ""; + const dataset = element.dataset; + for (const key in dataset) { + datasetValues += `${key}: ${dataset[key]}, `; + } + + return datasetValues; + } + /** * Get the options from a select element and return them as an array * of arrays indicating the select element option text and value. @@ -780,28 +841,48 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * Queries all potential form and field elements from the DOM and returns * a collection of form and field elements. Leverages the TreeWalker API * to deep query Shadow DOM elements. - * @returns {{formElements: Node[], formFieldElements: Node[]}} - * @private */ private queryAutofillFormAndFieldElements(): { - formElements: Node[]; - formFieldElements: Node[]; + formElements: HTMLFormElement[]; + formFieldElements: FormFieldElement[]; } { - const formElements: Node[] = []; - const formFieldElements: Node[] = []; - this.queryAllTreeWalkerNodes(document.documentElement, (node: Node) => { - if (node instanceof HTMLFormElement) { - formElements.push(node); - return true; + const formElements: HTMLFormElement[] = []; + const formFieldElements: FormFieldElement[] = []; + + const queriedElements = this.domQueryService.query( + globalThis.document.documentElement, + `form, ${this.formFieldQueryString}`, + (node: Node) => { + if (nodeIsFormElement(node)) { + formElements.push(node); + return true; + } + + if (this.isNodeFormFieldElement(node)) { + formFieldElements.push(node as FormFieldElement); + return true; + } + + return false; + }, + this.mutationObserver, + ); + + if (formElements.length || formFieldElements.length) { + return { formElements, formFieldElements }; + } + + for (let index = 0; index < queriedElements.length; index++) { + const element = queriedElements[index]; + if (elementIsFormElement(element)) { + formElements.push(element); + continue; } - if (this.isNodeFormFieldElement(node)) { - formFieldElements.push(node); - return true; + if (this.isNodeFormFieldElement(element)) { + formFieldElements.push(element); } - - return false; - }); + } return { formElements, formFieldElements }; } @@ -813,85 +894,26 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @private */ private isNodeFormFieldElement(node: Node): boolean { + if (!nodeIsElement(node)) { + return false; + } + + const nodeTagName = node.tagName.toLowerCase(); + const nodeIsSpanElementWithAutofillAttribute = - node instanceof HTMLSpanElement && node.hasAttribute("data-bwautofill"); + nodeTagName === "span" && node.hasAttribute("data-bwautofill"); + if (nodeIsSpanElementWithAutofillAttribute) { + return true; + } - const ignoredInputTypes = new Set(["hidden", "submit", "reset", "button", "image", "file"]); + const nodeHasBwIgnoreAttribute = node.hasAttribute("data-bwignore"); const nodeIsValidInputElement = - node instanceof HTMLInputElement && !ignoredInputTypes.has(node.type); - - const nodeIsTextAreaOrSelectElement = - node instanceof HTMLTextAreaElement || node instanceof HTMLSelectElement; - - const nodeIsNonIgnoredFillableControlElement = - (nodeIsTextAreaOrSelectElement || nodeIsValidInputElement) && - !node.hasAttribute("data-bwignore"); - - return nodeIsSpanElementWithAutofillAttribute || nodeIsNonIgnoredFillableControlElement; - } - - /** - * Attempts to get the ShadowRoot of the passed node. If support for the - * extension based openOrClosedShadowRoot API is available, it will be used. - * @param {Node} node - * @returns {ShadowRoot | null} - * @private - */ - private getShadowRoot(node: Node): ShadowRoot | null { - if (!(node instanceof HTMLElement)) { - return null; + nodeTagName === "input" && !this.ignoredInputTypes.has((node as HTMLInputElement).type); + if (nodeIsValidInputElement && !nodeHasBwIgnoreAttribute) { + return true; } - if ((chrome as any).dom?.openOrClosedShadowRoot) { - return (chrome as any).dom.openOrClosedShadowRoot(node); - } - - return (node as any).openOrClosedShadowRoot || node.shadowRoot; - } - - /** - * Recursively builds a collection of nodes that match the given filter callback. - * If a node has a ShadowRoot, it will be observed for mutations. - * @param {Node} rootNode - * @param {Node[]} treeWalkerQueryResults - * @param {Function} filterCallback - * @param {boolean} isObservingShadowRoot - * @private - */ - private buildTreeWalkerNodesQueryResults( - rootNode: Node, - treeWalkerQueryResults: Node[], - filterCallback: CallableFunction, - isObservingShadowRoot: boolean - ) { - const treeWalker = document?.createTreeWalker(rootNode, NodeFilter.SHOW_ELEMENT); - let currentNode = treeWalker?.currentNode; - - while (currentNode) { - if (filterCallback(currentNode)) { - treeWalkerQueryResults.push(currentNode); - } - - const nodeShadowRoot = this.getShadowRoot(currentNode); - if (nodeShadowRoot) { - if (isObservingShadowRoot) { - this.mutationObserver.observe(nodeShadowRoot, { - attributes: true, - childList: true, - subtree: true, - }); - } - - this.buildTreeWalkerNodesQueryResults( - nodeShadowRoot, - treeWalkerQueryResults, - filterCallback, - isObservingShadowRoot - ); - } - - currentNode = treeWalker?.nextNode(); - } + return this.nonInputFormFieldTags.has(nodeTagName) && !nodeHasBwIgnoreAttribute; } /** @@ -922,26 +944,10 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte return; } - for (let mutationsIndex = 0; mutationsIndex < mutations.length; mutationsIndex++) { - const mutation = mutations[mutationsIndex]; - if ( - mutation.type === "childList" && - (this.isAutofillElementNodeMutated(mutation.removedNodes, true) || - this.isAutofillElementNodeMutated(mutation.addedNodes)) - ) { - this.domRecentlyMutated = true; - this.noFieldsFound = false; - continue; - } - - if (mutation.type === "attributes") { - this.handleAutofillElementAttributeMutation(mutation); - } - } - - if (this.domRecentlyMutated) { - this.updateAutofillElementsAfterMutation(); + if (!this.mutationsQueue.length) { + requestIdleCallbackPolyfill(debounce(this.processMutations, 100), { timeout: 500 }); } + this.mutationsQueue.push(mutations); }; /** @@ -953,63 +959,184 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte this.currentLocationHref = globalThis.location.href; this.domRecentlyMutated = true; + if (this.autofillOverlayContentService) { + this.autofillOverlayContentService.pageDetailsUpdateRequired = true; + this.autofillOverlayContentService.clearUserFilledFields(); + void this.sendExtensionMessage("closeAutofillInlineMenu", { forceCloseInlineMenu: true }); + } this.noFieldsFound = false; - this.autofillFormElements.clear(); + this._autofillFormElements.clear(); this.autofillFieldElements.clear(); this.updateAutofillElementsAfterMutation(); } /** - * Checks if the passed nodes either contain or are autofill elements. - * @param {NodeList} nodes - * @param {boolean} isRemovingNodes - * @returns {boolean} + * Handles the processing of all mutations in the mutations queue. Will trigger + * within an idle callback to help with performance and prevent excessive updates. + */ + private processMutations = () => { + const queueLength = this.mutationsQueue.length; + + if (!this.domQueryService.pageContainsShadowDomElements()) { + this.checkPageContainsShadowDom(); + } + + for (let queueIndex = 0; queueIndex < queueLength; queueIndex++) { + const mutations = this.mutationsQueue[queueIndex]; + const processMutationRecords = () => { + this.processMutationRecords(mutations); + + if (queueIndex === queueLength - 1 && this.domRecentlyMutated) { + this.updateAutofillElementsAfterMutation(); + } + }; + + requestIdleCallbackPolyfill(processMutationRecords, { timeout: 500 }); + } + + this.mutationsQueue = []; + }; + + /** + * Handles checking if the current page contains a ShadowDOM element and + * flags that a re-collection of page details is required if it does. + */ + private checkPageContainsShadowDom() { + this.domQueryService.checkPageContainsShadowDom(); + if (this.domQueryService.pageContainsShadowDomElements()) { + this.flagPageDetailsUpdateIsRequired(); + } + } + + /** + * Triggers several flags that indicate that a collection of page details should + * occur again on a subsequent call after a mutation has been observed in the DOM. + */ + private flagPageDetailsUpdateIsRequired() { + this.domRecentlyMutated = true; + if (this.autofillOverlayContentService) { + this.autofillOverlayContentService.pageDetailsUpdateRequired = true; + } + this.noFieldsFound = false; + } + + /** + * Processes all mutation records encountered by the mutation observer. + * + * @param mutations - The mutation record to process + */ + private processMutationRecords(mutations: MutationRecord[]) { + for (let mutationIndex = 0; mutationIndex < mutations.length; mutationIndex++) { + const mutation: MutationRecord = mutations[mutationIndex]; + const processMutationRecord = () => this.processMutationRecord(mutation); + requestIdleCallbackPolyfill(processMutationRecord, { timeout: 500 }); + } + } + + /** + * Processes a single mutation record and updates the autofill elements if necessary. + * @param mutation * @private */ + private processMutationRecord(mutation: MutationRecord) { + if ( + mutation.type === "childList" && + (this.isAutofillElementNodeMutated(mutation.removedNodes, true) || + this.isAutofillElementNodeMutated(mutation.addedNodes)) + ) { + this.flagPageDetailsUpdateIsRequired(); + return; + } + + if (mutation.type === "attributes") { + this.handleAutofillElementAttributeMutation(mutation); + } + } + + /** + * Checks if the passed nodes either contain or are autofill elements. + * + * @param nodes - The nodes to check + * @param isRemovingNodes - Whether the nodes are being removed + */ private isAutofillElementNodeMutated(nodes: NodeList, isRemovingNodes = false): boolean { if (!nodes.length) { return false; } let isElementMutated = false; - const mutatedElements = []; + let mutatedElements: HTMLElement[] = []; for (let index = 0; index < nodes.length; index++) { const node = nodes[index]; - if (!(node instanceof HTMLElement)) { + if (!nodeIsElement(node)) { continue; } - if (node instanceof HTMLFormElement || this.isNodeFormFieldElement(node)) { - isElementMutated = true; - mutatedElements.push(node); - continue; + if (nodeIsFormElement(node) || this.isNodeFormFieldElement(node)) { + mutatedElements.push(node as HTMLElement); } - const childNodes = this.queryAllTreeWalkerNodes( + const autofillElements = this.domQueryService.query( node, - (node: Node) => node instanceof HTMLFormElement || this.isNodeFormFieldElement(node) - ) as HTMLElement[]; - if (childNodes.length) { + `form, ${this.formFieldQueryString}`, + (walkerNode: Node) => + nodeIsFormElement(walkerNode) || this.isNodeFormFieldElement(walkerNode), + this.mutationObserver, + true, + ); + + if (autofillElements.length) { + mutatedElements = mutatedElements.concat(autofillElements); + } + + if (mutatedElements.length) { isElementMutated = true; - mutatedElements.push(...childNodes); } } if (isRemovingNodes) { for (let elementIndex = 0; elementIndex < mutatedElements.length; elementIndex++) { + const element = mutatedElements[elementIndex]; this.deleteCachedAutofillElement( - mutatedElements[elementIndex] as - | ElementWithOpId - | ElementWithOpId + element as ElementWithOpId | ElementWithOpId, ); } + } else if (this.autofillOverlayContentService) { + this.setupOverlayListenersOnMutatedElements(mutatedElements); } return isElementMutated; } + /** + * Sets up the overlay listeners on the passed mutated elements. This ensures + * that the overlay can appear on elements that are injected into the DOM after + * the initial page load. + * + * @param mutatedElements - HTML elements that have been mutated + */ + private setupOverlayListenersOnMutatedElements(mutatedElements: Node[]) { + for (let elementIndex = 0; elementIndex < mutatedElements.length; elementIndex++) { + const node = mutatedElements[elementIndex]; + const buildAutofillFieldItem = () => { + if ( + !this.isNodeFormFieldElement(node) || + this.autofillFieldElements.get(node as ElementWithOpId) + ) { + return; + } + + // We are setting this item to a -1 index because we do not know its position in the DOM. + // This value should be updated with the next call to collect page details. + void this.buildAutofillFieldItem(node as ElementWithOpId, -1); + }; + + requestIdleCallbackPolyfill(buildAutofillFieldItem, { timeout: 1000 }); + } + } + /** * Deletes any cached autofill elements that have been * removed from the DOM. @@ -1017,10 +1144,10 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @private */ private deleteCachedAutofillElement( - element: ElementWithOpId | ElementWithOpId + element: ElementWithOpId | ElementWithOpId, ) { - if (element instanceof HTMLFormElement && this.autofillFormElements.has(element)) { - this.autofillFormElements.delete(element); + if (elementIsFormElement(element) && this._autofillFormElements.has(element)) { + this._autofillFormElements.delete(element); return; } @@ -1035,13 +1162,13 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte * @private */ private updateAutofillElementsAfterMutation() { - if (this.updateAutofillElementsAfterMutationTimeout) { - clearTimeout(this.updateAutofillElementsAfterMutationTimeout); + if (this.updateAfterMutationIdleCallback) { + cancelIdleCallbackPolyfill(this.updateAfterMutationIdleCallback); } - this.updateAutofillElementsAfterMutationTimeout = setTimeout( + this.updateAfterMutationIdleCallback = requestIdleCallbackPolyfill( this.getPageDetails.bind(this), - this.updateAfterMutationTimeoutDelay + { timeout: this.updateAfterMutationTimeout }, ); } @@ -1052,27 +1179,27 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte */ private handleAutofillElementAttributeMutation(mutation: MutationRecord) { const targetElement = mutation.target; - if (!(targetElement instanceof HTMLElement)) { + if (!nodeIsElement(targetElement)) { return; } const attributeName = mutation.attributeName?.toLowerCase(); - const autofillForm = this.autofillFormElements.get( - targetElement as ElementWithOpId + const autofillForm = this._autofillFormElements.get( + targetElement as ElementWithOpId, ); if (autofillForm) { this.updateAutofillFormElementData( attributeName, targetElement as ElementWithOpId, - autofillForm + autofillForm, ); return; } const autofillField = this.autofillFieldElements.get( - targetElement as ElementWithOpId + targetElement as ElementWithOpId, ); if (!autofillField) { return; @@ -1081,7 +1208,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte this.updateAutofillFieldElementData( attributeName, targetElement as ElementWithOpId, - autofillField + autofillField, ); } @@ -1095,7 +1222,7 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte private updateAutofillFormElementData( attributeName: string, element: ElementWithOpId, - dataTarget: AutofillForm + dataTarget: AutofillForm, ) { const updateAttribute = (dataTargetKey: string) => { this.updateAutofillDataAttribute({ element, attributeName, dataTarget, dataTargetKey }); @@ -1112,21 +1239,22 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte } updateActions[attributeName](); - this.autofillFormElements.set(element, dataTarget); + if (this._autofillFormElements.has(element)) { + this._autofillFormElements.set(element, dataTarget); + } } /** * Updates the autofill field element data based on the passed attribute name. + * * @param {string} attributeName * @param {ElementWithOpId} element * @param {AutofillField} dataTarget - * @returns {Promise} - * @private */ - private async updateAutofillFieldElementData( + private updateAutofillFieldElementData( attributeName: string, element: ElementWithOpId, - dataTarget: AutofillField + dataTarget: AutofillField, ) { const updateAttribute = (dataTargetKey: string) => { this.updateAutofillDataAttribute({ element, attributeName, dataTarget, dataTargetKey }); @@ -1163,15 +1291,9 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte updateActions[attributeName](); - const visibilityAttributesSet = new Set(["class", "style"]); - if ( - visibilityAttributesSet.has(attributeName) && - !dataTarget.htmlClass?.includes("com-bitwarden-browser-animated-fill") - ) { - dataTarget.viewable = await this.domElementVisibilityService.isFormFieldViewable(element); + if (this.autofillFieldElements.has(element)) { + this.autofillFieldElements.set(element, dataTarget); } - - this.autofillFieldElements.set(element, dataTarget); } /** @@ -1194,6 +1316,116 @@ class CollectAutofillContentService implements CollectAutofillContentServiceInte return attributeValue; } -} -export default CollectAutofillContentService; + /** + * Sets up an IntersectionObserver to observe found form + * field elements that are not viewable in the viewport. + */ + private setupIntersectionObserver() { + this.intersectionObserver = new IntersectionObserver(this.handleFormElementIntersection, { + root: null, + rootMargin: "0px", + threshold: 1.0, + }); + } + + /** + * Handles observed form field elements that are not viewable in the viewport. + * Will re-evaluate the visibility of the element and set up the autofill + * overlay listeners on the field if it is viewable. + * + * @param entries - The entries observed by the IntersectionObserver + */ + private handleFormElementIntersection = async (entries: IntersectionObserverEntry[]) => { + for (let entryIndex = 0; entryIndex < entries.length; entryIndex++) { + const entry = entries[entryIndex]; + const formFieldElement = entry.target as ElementWithOpId; + if (this.elementInitializingIntersectionObserver.has(formFieldElement)) { + this.elementInitializingIntersectionObserver.delete(formFieldElement); + continue; + } + + const cachedAutofillFieldElement = this.autofillFieldElements.get(formFieldElement); + if (!cachedAutofillFieldElement) { + this.intersectionObserver.unobserve(entry.target); + continue; + } + + const isViewable = await this.domElementVisibilityService.isElementViewable(formFieldElement); + if (!isViewable) { + continue; + } + + cachedAutofillFieldElement.viewable = true; + this.setupOverlayOnField(formFieldElement, cachedAutofillFieldElement); + + this.intersectionObserver?.unobserve(entry.target); + } + }; + + /** + * Iterates over all cached field elements and sets up the inline menu listeners on each field. + * + * @param pageDetails - The page details to use for the inline menu listeners + */ + private setupOverlayListeners(pageDetails: AutofillPageDetails) { + if (this.autofillOverlayContentService) { + this.autofillFieldElements.forEach((autofillField, formFieldElement) => { + this.setupOverlayOnField(formFieldElement, autofillField, pageDetails); + }); + } + } + + /** + * Sets up the inline menu listener on the passed field element. + * + * @param formFieldElement - The form field element to set up the inline menu listener on + * @param autofillField - The metadata for the form field + * @param pageDetails - The page details to use for the inline menu listeners + */ + private setupOverlayOnField( + formFieldElement: ElementWithOpId, + autofillField: AutofillField, + pageDetails?: AutofillPageDetails, + ) { + if (this.autofillOverlayContentService) { + const autofillPageDetails = + pageDetails || + this.getFormattedPageDetails( + this.getFormattedAutofillFormsData(), + this.getFormattedAutofillFieldsData(), + ); + + void this.autofillOverlayContentService.setupOverlayListeners( + formFieldElement, + autofillField, + autofillPageDetails, + ); + } + } + + /** + * Validates whether a password field is within the document. + */ + isPasswordFieldWithinDocument(): boolean { + return ( + this.domQueryService.query( + globalThis.document.documentElement, + `input[type="password"]`, + (node: Node) => nodeIsInputElement(node) && node.type === "password", + )?.length > 0 + ); + } + + /** + * Destroys the CollectAutofillContentService. Clears all + * timeouts and disconnects the mutation observer. + */ + destroy() { + if (this.updateAfterMutationIdleCallback) { + cancelIdleCallbackPolyfill(this.updateAfterMutationIdleCallback); + } + this.mutationObserver?.disconnect(); + this.intersectionObserver?.disconnect(); + } +} diff --git a/apps/browser/src/autofill/services/dom-element-visibility.service.spec.ts b/apps/browser/src/autofill/services/dom-element-visibility.service.spec.ts index e17783b7a65..2c6b1d5399f 100644 --- a/apps/browser/src/autofill/services/dom-element-visibility.service.spec.ts +++ b/apps/browser/src/autofill/services/dom-element-visibility.service.spec.ts @@ -37,7 +37,7 @@ describe("DomElementVisibilityService", () => { document.body.innerHTML = ""; }); - describe("isFormFieldViewable", () => { + describe("isElementViewable", () => { it("returns false if the element is outside viewport bounds", async () => { const usernameElement = document.querySelector("input[name='username']") as FormFieldElement; jest.spyOn(usernameElement, "getBoundingClientRect"); @@ -47,19 +47,18 @@ describe("DomElementVisibilityService", () => { jest.spyOn(domElementVisibilityService, "isElementHiddenByCss"); jest.spyOn(domElementVisibilityService as any, "formFieldIsNotHiddenBehindAnotherElement"); - const isFormFieldViewable = await domElementVisibilityService.isFormFieldViewable( - usernameElement - ); + const isElementViewable = + await domElementVisibilityService.isElementViewable(usernameElement); - expect(isFormFieldViewable).toEqual(false); + expect(isElementViewable).toEqual(false); expect(usernameElement.getBoundingClientRect).toHaveBeenCalled(); expect(domElementVisibilityService["isElementOutsideViewportBounds"]).toHaveBeenCalledWith( usernameElement, - usernameElement.getBoundingClientRect() + usernameElement.getBoundingClientRect(), ); expect(domElementVisibilityService["isElementHiddenByCss"]).not.toHaveBeenCalled(); expect( - domElementVisibilityService["formFieldIsNotHiddenBehindAnotherElement"] + domElementVisibilityService["formFieldIsNotHiddenBehindAnotherElement"], ).not.toHaveBeenCalled(); }); @@ -72,21 +71,20 @@ describe("DomElementVisibilityService", () => { jest.spyOn(domElementVisibilityService, "isElementHiddenByCss").mockReturnValueOnce(true); jest.spyOn(domElementVisibilityService as any, "formFieldIsNotHiddenBehindAnotherElement"); - const isFormFieldViewable = await domElementVisibilityService.isFormFieldViewable( - usernameElement - ); + const isElementViewable = + await domElementVisibilityService.isElementViewable(usernameElement); - expect(isFormFieldViewable).toEqual(false); + expect(isElementViewable).toEqual(false); expect(usernameElement.getBoundingClientRect).toHaveBeenCalled(); expect(domElementVisibilityService["isElementOutsideViewportBounds"]).toHaveBeenCalledWith( usernameElement, - usernameElement.getBoundingClientRect() + usernameElement.getBoundingClientRect(), ); expect(domElementVisibilityService["isElementHiddenByCss"]).toHaveBeenCalledWith( - usernameElement + usernameElement, ); expect( - domElementVisibilityService["formFieldIsNotHiddenBehindAnotherElement"] + domElementVisibilityService["formFieldIsNotHiddenBehindAnotherElement"], ).not.toHaveBeenCalled(); }); @@ -101,21 +99,20 @@ describe("DomElementVisibilityService", () => { .spyOn(domElementVisibilityService as any, "formFieldIsNotHiddenBehindAnotherElement") .mockReturnValueOnce(false); - const isFormFieldViewable = await domElementVisibilityService.isFormFieldViewable( - usernameElement - ); + const isElementViewable = + await domElementVisibilityService.isElementViewable(usernameElement); - expect(isFormFieldViewable).toEqual(false); + expect(isElementViewable).toEqual(false); expect(usernameElement.getBoundingClientRect).toHaveBeenCalled(); expect(domElementVisibilityService["isElementOutsideViewportBounds"]).toHaveBeenCalledWith( usernameElement, - usernameElement.getBoundingClientRect() + usernameElement.getBoundingClientRect(), ); expect(domElementVisibilityService["isElementHiddenByCss"]).toHaveBeenCalledWith( - usernameElement + usernameElement, ); expect( - domElementVisibilityService["formFieldIsNotHiddenBehindAnotherElement"] + domElementVisibilityService["formFieldIsNotHiddenBehindAnotherElement"], ).toHaveBeenCalledWith(usernameElement, usernameElement.getBoundingClientRect()); }); @@ -130,21 +127,20 @@ describe("DomElementVisibilityService", () => { .spyOn(domElementVisibilityService as any, "formFieldIsNotHiddenBehindAnotherElement") .mockReturnValueOnce(true); - const isFormFieldViewable = await domElementVisibilityService.isFormFieldViewable( - usernameElement - ); + const isElementViewable = + await domElementVisibilityService.isElementViewable(usernameElement); - expect(isFormFieldViewable).toEqual(true); + expect(isElementViewable).toEqual(true); expect(usernameElement.getBoundingClientRect).toHaveBeenCalled(); expect(domElementVisibilityService["isElementOutsideViewportBounds"]).toHaveBeenCalledWith( usernameElement, - usernameElement.getBoundingClientRect() + usernameElement.getBoundingClientRect(), ); expect(domElementVisibilityService["isElementHiddenByCss"]).toHaveBeenCalledWith( - usernameElement + usernameElement, ); expect( - domElementVisibilityService["formFieldIsNotHiddenBehindAnotherElement"] + domElementVisibilityService["formFieldIsNotHiddenBehindAnotherElement"], ).toHaveBeenCalledWith(usernameElement, usernameElement.getBoundingClientRect()); }); }); @@ -186,12 +182,12 @@ describe("DomElementVisibilityService", () => { expect(isUsernameElementHidden).toEqual(true); expect(usernameElement.style.getPropertyValue).toHaveBeenCalled(); expect(usernameElement.ownerDocument.defaultView.getComputedStyle).toHaveBeenCalledWith( - usernameElement + usernameElement, ); expect(isPasswordElementHidden).toEqual(true); expect(passwordElement.style.getPropertyValue).toHaveBeenCalled(); expect(passwordElement.ownerDocument.defaultView.getComputedStyle).toHaveBeenCalledWith( - passwordElement + passwordElement, ); }); @@ -391,7 +387,7 @@ describe("DomElementVisibilityService", () => { expect(formFieldIsNotHiddenBehindAnotherElement).toEqual(true); expect(document.elementFromPoint).toHaveBeenCalledWith( mockBoundingRect.left + mockBoundingRect.width / 2, - mockBoundingRect.top + mockBoundingRect.height / 2 + mockBoundingRect.top + mockBoundingRect.height / 2, ); expect(usernameElement.getBoundingClientRect).not.toHaveBeenCalled(); }); diff --git a/apps/browser/src/autofill/services/dom-element-visibility.service.ts b/apps/browser/src/autofill/services/dom-element-visibility.service.ts index 2797ee0eb3d..9dad496847b 100644 --- a/apps/browser/src/autofill/services/dom-element-visibility.service.ts +++ b/apps/browser/src/autofill/services/dom-element-visibility.service.ts @@ -1,17 +1,19 @@ +import { AutofillInlineMenuContentService } from "../overlay/inline-menu/abstractions/autofill-inline-menu-content.service"; import { FillableFormFieldElement, FormFieldElement } from "../types"; -import { DomElementVisibilityService as domElementVisibilityServiceInterface } from "./abstractions/dom-element-visibility.service"; +import { DomElementVisibilityService as DomElementVisibilityServiceInterface } from "./abstractions/dom-element-visibility.service"; -class DomElementVisibilityService implements domElementVisibilityServiceInterface { +class DomElementVisibilityService implements DomElementVisibilityServiceInterface { private cachedComputedStyle: CSSStyleDeclaration | null = null; + constructor(private inlineMenuContentService?: AutofillInlineMenuContentService) {} + /** - * Checks if a form field is viewable. This is done by checking if the element is within the + * Checks if an element is viewable. This is done by checking if the element is within the * viewport bounds, not hidden by CSS, and not hidden behind another element. - * @param {FormFieldElement} element - * @returns {Promise} + * @param element */ - async isFormFieldViewable(element: FormFieldElement): Promise { + async isElementViewable(element: HTMLElement): Promise { const elementBoundingClientRect = element.getBoundingClientRect(); if ( this.isElementOutsideViewportBounds(element, elementBoundingClientRect) || @@ -66,8 +68,8 @@ class DomElementVisibilityService implements domElementVisibilityServiceInterfac */ private getElementStyle(element: HTMLElement, styleProperty: string): string { if (!this.cachedComputedStyle) { - this.cachedComputedStyle = (element.ownerDocument.defaultView || window).getComputedStyle( - element + this.cachedComputedStyle = (element.ownerDocument.defaultView || globalThis).getComputedStyle( + element, ); } @@ -132,7 +134,7 @@ class DomElementVisibilityService implements domElementVisibilityServiceInterfac */ private isElementOutsideViewportBounds( targetElement: HTMLElement, - targetElementBoundingClientRect: DOMRectReadOnly | null = null + targetElementBoundingClientRect: DOMRectReadOnly | null = null, ): boolean { const documentElement = targetElement.ownerDocument.documentElement; const documentElementWidth = documentElement.scrollWidth; @@ -171,7 +173,7 @@ class DomElementVisibilityService implements domElementVisibilityServiceInterfac */ private formFieldIsNotHiddenBehindAnotherElement( targetElement: FormFieldElement, - targetElementBoundingClientRect: DOMRectReadOnly | null = null + targetElementBoundingClientRect: DOMRectReadOnly | null = null, ): boolean { const elementBoundingClientRect = targetElementBoundingClientRect || targetElement.getBoundingClientRect(); @@ -180,13 +182,17 @@ class DomElementVisibilityService implements domElementVisibilityServiceInterfac elementRootNode instanceof ShadowRoot ? elementRootNode : targetElement.ownerDocument; const elementAtCenterPoint = rootElement.elementFromPoint( elementBoundingClientRect.left + elementBoundingClientRect.width / 2, - elementBoundingClientRect.top + elementBoundingClientRect.height / 2 + elementBoundingClientRect.top + elementBoundingClientRect.height / 2, ); if (elementAtCenterPoint === targetElement) { return true; } + if (this.inlineMenuContentService?.isElementInlineMenu(elementAtCenterPoint as HTMLElement)) { + return true; + } + const targetElementLabelsSet = new Set((targetElement as FillableFormFieldElement).labels); if (targetElementLabelsSet.has(elementAtCenterPoint as HTMLLabelElement)) { return true; diff --git a/apps/browser/src/autofill/services/dom-query.service.spec.ts b/apps/browser/src/autofill/services/dom-query.service.spec.ts new file mode 100644 index 00000000000..8071a464f44 --- /dev/null +++ b/apps/browser/src/autofill/services/dom-query.service.spec.ts @@ -0,0 +1,156 @@ +import { flushPromises, mockQuerySelectorAllDefinedCall } from "../spec/testing-utils"; + +import { DomQueryService } from "./dom-query.service"; + +jest.mock("../utils", () => { + const actualUtils = jest.requireActual("../utils"); + return { + ...actualUtils, + sendExtensionMessage: jest.fn((command, options) => { + if (command === "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag") { + return Promise.resolve({ result: false }); + } + + return chrome.runtime.sendMessage(Object.assign({ command }, options)); + }), + }; +}); + +describe("DomQueryService", () => { + const originalDocumentReadyState = document.readyState; + let domQueryService: DomQueryService; + let mutationObserver: MutationObserver; + const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); + + beforeEach(async () => { + mutationObserver = new MutationObserver(() => {}); + domQueryService = new DomQueryService(); + await flushPromises(); + }); + + afterEach(() => { + Object.defineProperty(document, "readyState", { + value: originalDocumentReadyState, + writable: true, + }); + }); + + afterAll(() => { + mockQuerySelectorAll.mockRestore(); + }); + + it("checks the page content for shadow DOM elements after the page has completed loading", async () => { + Object.defineProperty(document, "readyState", { + value: "loading", + writable: true, + }); + jest.spyOn(globalThis, "addEventListener"); + + const domQueryService = new DomQueryService(); + await flushPromises(); + + expect(globalThis.addEventListener).toHaveBeenCalledWith( + "load", + domQueryService["checkPageContainsShadowDom"], + ); + }); + + describe("deepQueryElements", () => { + it("queries form field elements that are nested within a ShadowDOM", () => { + const root = document.createElement("div"); + const shadowRoot = root.attachShadow({ mode: "open" }); + const form = document.createElement("form"); + const input = document.createElement("input"); + input.type = "text"; + form.appendChild(input); + shadowRoot.appendChild(form); + + const formFieldElements = domQueryService.query( + shadowRoot, + "input", + (element: Element) => element.tagName === "INPUT", + mutationObserver, + ); + + expect(formFieldElements).toStrictEqual([input]); + }); + + it("queries form field elements that are nested within multiple ShadowDOM elements", () => { + domQueryService["pageContainsShadowDom"] = true; + const root = document.createElement("div"); + const shadowRoot1 = root.attachShadow({ mode: "open" }); + const root2 = document.createElement("div"); + const shadowRoot2 = root2.attachShadow({ mode: "open" }); + const form = document.createElement("form"); + const input = document.createElement("input"); + input.type = "text"; + form.appendChild(input); + shadowRoot2.appendChild(form); + shadowRoot1.appendChild(root2); + + const formFieldElements = domQueryService.query( + shadowRoot1, + "input", + (element: Element) => element.tagName === "INPUT", + mutationObserver, + ); + + expect(formFieldElements).toStrictEqual([input]); + }); + + it("will fallback to using the TreeWalker API if a depth larger than 4 ShadowDOM elements is encountered", () => { + domQueryService["pageContainsShadowDom"] = true; + const root = document.createElement("div"); + const shadowRoot1 = root.attachShadow({ mode: "open" }); + const root2 = document.createElement("div"); + const shadowRoot2 = root2.attachShadow({ mode: "open" }); + const root3 = document.createElement("div"); + const shadowRoot3 = root3.attachShadow({ mode: "open" }); + const root4 = document.createElement("div"); + const shadowRoot4 = root4.attachShadow({ mode: "open" }); + const root5 = document.createElement("div"); + const shadowRoot5 = root5.attachShadow({ mode: "open" }); + const form = document.createElement("form"); + const input = document.createElement("input"); + input.type = "text"; + form.appendChild(input); + shadowRoot5.appendChild(form); + shadowRoot4.appendChild(root5); + shadowRoot3.appendChild(root4); + shadowRoot2.appendChild(root3); + shadowRoot1.appendChild(root2); + const treeWalkerCallback = jest + .fn() + .mockImplementation(() => (element: Element) => element.tagName === "INPUT"); + + domQueryService.query(shadowRoot1, "input", treeWalkerCallback, mutationObserver); + + expect(treeWalkerCallback).toHaveBeenCalled(); + }); + }); + + describe("queryAllTreeWalkerNodes", () => { + it("queries form field elements that are nested within multiple ShadowDOM elements", () => { + domQueryService["pageContainsShadowDom"] = true; + const root = document.createElement("div"); + const shadowRoot1 = root.attachShadow({ mode: "open" }); + const root2 = document.createElement("div"); + const shadowRoot2 = root2.attachShadow({ mode: "open" }); + const form = document.createElement("form"); + const input = document.createElement("input"); + input.type = "text"; + form.appendChild(input); + shadowRoot2.appendChild(form); + shadowRoot1.appendChild(root2); + + const formFieldElements = domQueryService.query( + shadowRoot1, + "input", + (element: Element) => element.tagName === "INPUT", + mutationObserver, + ); + + expect(formFieldElements).toStrictEqual([input]); + }); + }); +}); diff --git a/apps/browser/src/autofill/services/dom-query.service.ts b/apps/browser/src/autofill/services/dom-query.service.ts new file mode 100644 index 00000000000..0131b16da91 --- /dev/null +++ b/apps/browser/src/autofill/services/dom-query.service.ts @@ -0,0 +1,322 @@ +import { EVENTS, MAX_DEEP_QUERY_RECURSION_DEPTH } from "@bitwarden/common/autofill/constants"; + +import { nodeIsElement, sendExtensionMessage } from "../utils"; + +import { DomQueryService as DomQueryServiceInterface } from "./abstractions/dom-query.service"; + +export class DomQueryService implements DomQueryServiceInterface { + private pageContainsShadowDom: boolean; + private useTreeWalkerStrategyFlagSet = true; + private ignoredTreeWalkerNodes = new Set([ + "svg", + "script", + "noscript", + "head", + "style", + "link", + "meta", + "title", + "base", + "img", + "picture", + "video", + "audio", + "object", + "source", + "track", + "param", + "map", + "area", + ]); + + constructor() { + void this.init(); + } + + /** + * Sets up a query that will trigger a deepQuery of the DOM, querying all elements that match the given query string. + * If the deepQuery fails or reaches a max recursion depth, it will fall back to a treeWalker query. + * + * @param root - The root element to start the query from + * @param queryString - The query string to match elements against + * @param treeWalkerFilter - The filter callback to use for the treeWalker query + * @param mutationObserver - The MutationObserver to use for observing shadow roots + * @param forceDeepQueryAttempt - Whether to force a deep query attempt + * @param ignoredTreeWalkerNodesOverride - An optional set of node names to ignore when using the treeWalker strategy + */ + query( + root: Document | ShadowRoot | Element, + queryString: string, + treeWalkerFilter: CallableFunction, + mutationObserver?: MutationObserver, + forceDeepQueryAttempt?: boolean, + ignoredTreeWalkerNodesOverride?: Set, + ): T[] { + const ignoredTreeWalkerNodes = ignoredTreeWalkerNodesOverride || this.ignoredTreeWalkerNodes; + + if (!forceDeepQueryAttempt && this.pageContainsShadowDomElements()) { + return this.queryAllTreeWalkerNodes( + root, + treeWalkerFilter, + ignoredTreeWalkerNodes, + mutationObserver, + ); + } + + try { + return this.deepQueryElements(root, queryString, mutationObserver); + } catch { + return this.queryAllTreeWalkerNodes( + root, + treeWalkerFilter, + ignoredTreeWalkerNodes, + mutationObserver, + ); + } + } + + /** + * Checks if the page contains any shadow DOM elements. + */ + checkPageContainsShadowDom = (): void => { + this.pageContainsShadowDom = this.queryShadowRoots(globalThis.document.body, true).length > 0; + }; + + /** + * Determines whether to use the treeWalker strategy for querying the DOM. + */ + pageContainsShadowDomElements(): boolean { + return this.useTreeWalkerStrategyFlagSet || this.pageContainsShadowDom; + } + + /** + * Initializes the DomQueryService, checking for the presence of shadow DOM elements on the page. + */ + private async init() { + const useTreeWalkerStrategyFlag = await sendExtensionMessage( + "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag", + ); + if (useTreeWalkerStrategyFlag && typeof useTreeWalkerStrategyFlag.result === "boolean") { + this.useTreeWalkerStrategyFlagSet = useTreeWalkerStrategyFlag.result; + } + + if (globalThis.document.readyState === "complete") { + this.checkPageContainsShadowDom(); + return; + } + globalThis.addEventListener(EVENTS.LOAD, this.checkPageContainsShadowDom); + } + + /** + * Queries all elements in the DOM that match the given query string. + * Also, recursively queries all shadow roots for the element. + * + * @param root - The root element to start the query from + * @param queryString - The query string to match elements against + * @param mutationObserver - The MutationObserver to use for observing shadow roots + */ + private deepQueryElements( + root: Document | ShadowRoot | Element, + queryString: string, + mutationObserver?: MutationObserver, + ): T[] { + let elements = this.queryElements(root, queryString); + + const shadowRoots = this.recursivelyQueryShadowRoots(root); + for (let index = 0; index < shadowRoots.length; index++) { + const shadowRoot = shadowRoots[index]; + elements = elements.concat(this.queryElements(shadowRoot, queryString)); + + if (mutationObserver) { + mutationObserver.observe(shadowRoot, { + attributes: true, + childList: true, + subtree: true, + }); + } + } + + return elements; + } + + /** + * Queries the DOM for elements based on the given query string. + * + * @param root - The root element to start the query from + * @param queryString - The query string to match elements against + */ + private queryElements(root: Document | ShadowRoot | Element, queryString: string): T[] { + if (!root.querySelector(queryString)) { + return []; + } + + return Array.from(root.querySelectorAll(queryString)) as T[]; + } + + /** + * Recursively queries all shadow roots found within the given root element. + * Will also set up a mutation observer on the shadow root if the + * `isObservingShadowRoot` parameter is set to true. + * + * @param root - The root element to start the query from + * @param depth - The depth of the recursion + */ + private recursivelyQueryShadowRoots( + root: Document | ShadowRoot | Element, + depth: number = 0, + ): ShadowRoot[] { + if (!this.pageContainsShadowDom) { + return []; + } + + if (depth >= MAX_DEEP_QUERY_RECURSION_DEPTH) { + throw new Error("Max recursion depth reached"); + } + + let shadowRoots = this.queryShadowRoots(root); + for (let index = 0; index < shadowRoots.length; index++) { + const shadowRoot = shadowRoots[index]; + shadowRoots = shadowRoots.concat(this.recursivelyQueryShadowRoots(shadowRoot, depth + 1)); + } + + return shadowRoots; + } + + /** + * Queries any immediate shadow roots found within the given root element. + * + * @param root - The root element to start the query from + * @param returnSingleShadowRoot - Whether to return a single shadow root or an array of shadow roots + */ + private queryShadowRoots( + root: Document | ShadowRoot | Element, + returnSingleShadowRoot = false, + ): ShadowRoot[] { + if (!root) { + return []; + } + + const shadowRoots: ShadowRoot[] = []; + const potentialShadowRoots = root.querySelectorAll(":defined"); + for (let index = 0; index < potentialShadowRoots.length; index++) { + const shadowRoot = this.getShadowRoot(potentialShadowRoots[index]); + if (!shadowRoot) { + continue; + } + + shadowRoots.push(shadowRoot); + if (returnSingleShadowRoot) { + break; + } + } + + return shadowRoots; + } + + /** + * Attempts to get the ShadowRoot of the passed node. If support for the + * extension based openOrClosedShadowRoot API is available, it will be used. + * Will return null if the node is not an HTMLElement or if the node has + * child nodes. + * + * @param {Node} node + */ + private getShadowRoot(node: Node): ShadowRoot | null { + if (!nodeIsElement(node)) { + return null; + } + + if (node.shadowRoot) { + return node.shadowRoot; + } + + if ((chrome as any).dom?.openOrClosedShadowRoot) { + try { + return (chrome as any).dom.openOrClosedShadowRoot(node); + } catch (error) { + return null; + } + } + + return (node as any).openOrClosedShadowRoot; + } + + /** + * Queries the DOM for all the nodes that match the given filter callback + * and returns a collection of nodes. + * @param rootNode + * @param filterCallback + * @param ignoredTreeWalkerNodes + * @param mutationObserver + */ + private queryAllTreeWalkerNodes( + rootNode: Node, + filterCallback: CallableFunction, + ignoredTreeWalkerNodes: Set, + mutationObserver?: MutationObserver, + ): T[] { + const treeWalkerQueryResults: T[] = []; + + this.buildTreeWalkerNodesQueryResults( + rootNode, + treeWalkerQueryResults, + filterCallback, + ignoredTreeWalkerNodes, + mutationObserver, + ); + + return treeWalkerQueryResults; + } + + /** + * Recursively builds a collection of nodes that match the given filter callback. + * If a node has a ShadowRoot, it will be observed for mutations. + * + * @param rootNode + * @param treeWalkerQueryResults + * @param filterCallback + * @param ignoredTreeWalkerNodes + * @param mutationObserver + */ + private buildTreeWalkerNodesQueryResults( + rootNode: Node, + treeWalkerQueryResults: T[], + filterCallback: CallableFunction, + ignoredTreeWalkerNodes: Set, + mutationObserver?: MutationObserver, + ) { + const treeWalker = document?.createTreeWalker(rootNode, NodeFilter.SHOW_ELEMENT, (node) => + ignoredTreeWalkerNodes.has(node.nodeName?.toLowerCase()) + ? NodeFilter.FILTER_REJECT + : NodeFilter.FILTER_ACCEPT, + ); + let currentNode = treeWalker?.currentNode; + + while (currentNode) { + if (filterCallback(currentNode)) { + treeWalkerQueryResults.push(currentNode as T); + } + + const nodeShadowRoot = this.getShadowRoot(currentNode); + if (nodeShadowRoot) { + if (mutationObserver) { + mutationObserver.observe(nodeShadowRoot, { + attributes: true, + childList: true, + subtree: true, + }); + } + + this.buildTreeWalkerNodesQueryResults( + nodeShadowRoot, + treeWalkerQueryResults, + filterCallback, + ignoredTreeWalkerNodes, + mutationObserver, + ); + } + + currentNode = treeWalker?.nextNode(); + } + } +} diff --git a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts new file mode 100644 index 00000000000..0f7c966de3e --- /dev/null +++ b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts @@ -0,0 +1,964 @@ +import { mock, MockProxy } from "jest-mock-extended"; + +import AutofillField from "../models/autofill-field"; +import AutofillForm from "../models/autofill-form"; +import AutofillPageDetails from "../models/autofill-page-details"; + +import { AutoFillConstants } from "./autofill-constants"; +import { InlineMenuFieldQualificationService } from "./inline-menu-field-qualification.service"; + +describe("InlineMenuFieldQualificationService", () => { + let pageDetails: MockProxy; + let inlineMenuFieldQualificationService: InlineMenuFieldQualificationService; + + beforeEach(() => { + pageDetails = mock({ + forms: {}, + fields: [], + }); + inlineMenuFieldQualificationService = new InlineMenuFieldQualificationService(); + inlineMenuFieldQualificationService["inlineMenuFieldQualificationFlagSet"] = true; + }); + + describe("isFieldForLoginForm", () => { + it("disqualifies totp fields", () => { + const field = mock({ + type: "text", + autoCompleteType: "one-time-code", + htmlName: "totp", + htmlID: "totp", + placeholder: "totp", + }); + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + false, + ); + }); + + describe("qualifying a password field for a login form", () => { + describe("an invalid password field", () => { + it("has a `new-password` autoCompleteType", () => { + const field = mock({ + type: "password", + autoCompleteType: "new-password", + htmlName: "input-password", + htmlID: "input-password", + placeholder: "input-password", + }); + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + false, + ); + }); + + it("has a keyword value that indicates the field is for a create account form", () => { + const field = mock({ + type: "password", + placeholder: "create account password", + autoCompleteType: "", + htmlName: "input-password", + htmlID: "input-password", + }); + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + false, + ); + }); + + it("has a type that is an excluded type", () => { + AutoFillConstants.ExcludedAutofillLoginTypes.forEach((excludedType) => { + const field = mock({ + type: excludedType, + autoCompleteType: "", + }); + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + }); + + it("has an attribute present on the FieldIgnoreList, indicating that the field is a captcha", () => { + AutoFillConstants.FieldIgnoreList.forEach((attribute, index) => { + const field = mock({ + type: "password", + htmlID: index === 0 ? attribute : "", + htmlName: index === 1 ? attribute : "", + placeholder: index > 1 ? attribute : "", + autoCompleteType: "", + }); + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + }); + + it("has a type other than `password` or `text`", () => { + const field = mock({ + type: "number", + htmlID: "not-password", + htmlName: "not-password", + placeholder: "not-password", + autoCompleteType: "", + }); + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + false, + ); + }); + + it("has a type of `text` without an attribute that indicates the field is a password field", () => { + const field = mock({ + type: "text", + htmlID: "something-else", + htmlName: "something-else", + placeholder: "something-else", + autoCompleteType: "", + }); + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + false, + ); + }); + + it("has a type of `text` and contains attributes that indicates the field is a search field", () => { + const field = mock({ + type: "text", + htmlID: "search", + htmlName: "something-else", + placeholder: "something-else", + autoCompleteType: "", + }); + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + false, + ); + }); + + describe("does not have a parent form element", () => { + beforeEach(() => { + pageDetails.forms = {}; + }); + + it("on a page that has more than one password field", () => { + const field = mock({ + type: "password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "", + autoCompleteType: "", + }); + const secondField = mock({ + type: "password", + htmlID: "some-other-password", + htmlName: "some-other-password", + placeholder: "some-other-password", + autoCompleteType: "", + }); + pageDetails.fields = [field, secondField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + + it("on a page that has more than one visible username field", () => { + const field = mock({ + type: "password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "", + autoCompleteType: "", + }); + const usernameField = mock({ + type: "text", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + autoCompleteType: "", + }); + const secondUsernameField = mock({ + type: "text", + htmlID: "some-other-user-username", + htmlName: "some-other-user-username", + placeholder: "some-other-user-username", + autoCompleteType: "", + }); + pageDetails.fields = [field, usernameField, secondUsernameField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + + it("has a disabled `autocompleteType` value", () => { + const field = mock({ + type: "password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "", + autoCompleteType: "off", + }); + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + }); + + describe("has a parent form element", () => { + let form: MockProxy; + + beforeEach(() => { + form = mock({ opid: "validFormId" }); + pageDetails.forms = { + validFormId: form, + }; + }); + + it("is structured with other password fields in the same form", () => { + const field = mock({ + type: "password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + autoCompleteType: "", + }); + const secondField = mock({ + type: "password", + htmlID: "some-other-password", + htmlName: "some-other-password", + placeholder: "some-other-password", + form: "validFormId", + autoCompleteType: "", + }); + pageDetails.fields = [field, secondField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + }); + }); + + describe("a valid password field", () => { + it("has an autoCompleteType of `current-password`", () => { + const field = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + }); + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + true, + ); + }); + + it("is structured on a page with a single set of username and password fields", () => { + const field = mock({ + type: "password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + autoCompleteType: "", + }); + const usernameField = mock({ + type: "text", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + autoCompleteType: "", + }); + pageDetails.fields = [field, usernameField]; + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + true, + ); + }); + + it("has a type of `text` with an attribute that indicates the field is a password field", () => { + const field = mock({ + type: "text", + htmlID: null, + htmlName: "user-password", + placeholder: "user-password", + autoCompleteType: "", + }); + + expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( + true, + ); + }); + + describe("does not have a parent form element", () => { + it("is the only password field on the page, has one username field on the page, and has a non-disabled `autocompleteType` value", () => { + pageDetails.forms = {}; + const field = mock({ + type: "password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "", + autoCompleteType: "current-password", + }); + const usernameField = mock({ + type: "text", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + autoCompleteType: "", + }); + pageDetails.fields = [field, usernameField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + }); + + describe("has a parent form element", () => { + let form: MockProxy; + + beforeEach(() => { + form = mock({ opid: "validFormId" }); + pageDetails.forms = { + validFormId: form, + }; + }); + + it("is the only password field within the form and has a visible username field", () => { + const field = mock({ + type: "password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + autoCompleteType: "", + }); + const secondPasswordField = mock({ + type: "password", + htmlID: "some-other-password", + htmlName: "some-other-password", + placeholder: "some-other-password", + form: "anotherFormId", + autoCompleteType: "", + }); + const usernameField = mock({ + type: "text", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + autoCompleteType: "", + }); + pageDetails.fields = [field, secondPasswordField, usernameField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + + it("is the only password field within the form and has a non-disabled `autocompleteType` value", () => { + const field = mock({ + type: "password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + autoCompleteType: "", + }); + const secondPasswordField = mock({ + type: "password", + htmlID: "some-other-password", + htmlName: "some-other-password", + placeholder: "some-other-password", + form: "anotherFormId", + autoCompleteType: "", + }); + pageDetails.fields = [field, secondPasswordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + }); + }); + }); + + describe("qualifying a username field for a login form", () => { + describe("an invalid username field", () => { + ["username", "email"].forEach((autoCompleteType) => { + it(`has a ${autoCompleteType} 'autoCompleteType' value when structured on a page with new password fields`, () => { + const field = mock({ + type: "text", + autoCompleteType, + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "new-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "new password", + }); + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + }); + + ["new", "change", "neue", "ändern", "register", "create", "registration"].forEach( + (keyword) => { + it(`has a keyword of ${keyword} that indicates a 'new or changed' username is being filled`, () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: `${keyword} username`, + }); + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + }, + ); + + describe("does not have a parent form element", () => { + beforeEach(() => { + pageDetails.forms = {}; + }); + + it("is structured on a page with multiple password fields", () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + }); + const secondPasswordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "some-other-password", + htmlName: "some-other-password", + placeholder: "some-other-password", + }); + pageDetails.fields = [field, passwordField, secondPasswordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + }); + + describe("has a parent form element", () => { + let form: MockProxy; + + beforeEach(() => { + form = mock({ opid: "validFormId" }); + pageDetails.forms = { + validFormId: form, + }; + }); + + it("is structured on a page with no password fields and has a disabled `autoCompleteType` value", () => { + const field = mock({ + type: "text", + autoCompleteType: "off", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + pageDetails.fields = [field]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + + it("is structured on a page with no password fields but has other types of fields in the form", () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + const otherField = mock({ + type: "number", + autoCompleteType: "", + htmlID: "some-other-field", + htmlName: "some-other-field", + placeholder: "some-other-field", + form: "validFormId", + }); + pageDetails.fields = [field, otherField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + + it("is structured on a page with multiple viewable password fields", () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + }); + const secondPasswordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "some-other-password", + htmlName: "some-other-password", + placeholder: "some-other-password", + form: "validFormId", + }); + pageDetails.fields = [field, passwordField, secondPasswordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + + it("contains a disabled autocomplete type when multiple password fields are on the page", () => { + const field = mock({ + type: "text", + autoCompleteType: "off", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + viewable: false, + }); + const secondPasswordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "second-password", + htmlName: "second-password", + placeholder: "second-password", + form: "validFormId", + viewable: false, + }); + pageDetails.fields = [field, passwordField, secondPasswordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(false); + }); + }); + }); + + describe("a valid username field", () => { + ["username", "email"].forEach((autoCompleteType) => { + it(`has a ${autoCompleteType} 'autoCompleteType' value`, () => { + const field = mock({ + type: "text", + autoCompleteType, + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + }); + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + }); + + describe("does not have a parent form element", () => { + beforeEach(() => { + pageDetails.forms = {}; + }); + + it("is structured on a page with a single visible password field", () => { + const field = mock({ + type: "text", + autoCompleteType: "off", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + }); + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + + it("is structured on a page with a single non-visible password field", () => { + const field = mock({ + type: "text", + autoCompleteType: "off", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + viewable: false, + }); + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + + it("has a non-disabled autoCompleteType and is structured on a page with no other password fields", () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + }); + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + }); + + describe("has a parent form element", () => { + let form: MockProxy; + + beforeEach(() => { + form = mock({ opid: "validFormId" }); + pageDetails.forms = { + validFormId: form, + }; + }); + + it("is structured on a page with a single password field", () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + }); + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + + it("is structured on a page with a with no visible password fields and a non-disabled autocomplete type", () => { + const field = mock({ + type: "text", + autoCompleteType: "", + htmlID: "user-username", + htmlName: "user-username", + placeholder: "user-username", + form: "validFormId", + }); + const passwordField = mock({ + type: "password", + autoCompleteType: "current-password", + htmlID: "user-password", + htmlName: "user-password", + placeholder: "user-password", + form: "validFormId", + viewable: false, + }); + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails), + ).toBe(true); + }); + }); + }); + }); + }); + + describe("isFieldForCreditCardForm", () => { + describe("an invalid credit card field", () => { + it("has reference to a `new field` keyword", () => { + const field = mock({ + placeholder: "new credit card", + }); + + expect( + inlineMenuFieldQualificationService.isFieldForCreditCardForm(field, pageDetails), + ).toBe(false); + }); + + describe("does not have a parent form", () => { + it("has no credit card number fields in the page details", () => { + const field = mock({ + placeholder: "name", + }); + const secondField = mock({ + placeholder: "card cvv", + autoCompleteType: "cc-csc", + }); + pageDetails.forms = {}; + pageDetails.fields = [field, secondField]; + + expect( + inlineMenuFieldQualificationService.isFieldForCreditCardForm(field, pageDetails), + ).toBe(false); + }); + + it("has no credit card cvv fields in the page details", () => { + const field = mock({ + placeholder: "name", + }); + const secondField = mock({ + placeholder: "card number", + autoCompleteType: "cc-number", + }); + pageDetails.forms = {}; + pageDetails.fields = [field, secondField]; + + expect( + inlineMenuFieldQualificationService.isFieldForCreditCardForm(field, pageDetails), + ).toBe(false); + }); + }); + + describe("has a parent form", () => { + let form: MockProxy; + + beforeEach(() => { + form = mock({ opid: "validFormId" }); + pageDetails.forms = { + validFormId: form, + }; + }); + + it("does not have a credit card number field within the same form", () => { + const field = mock({ + placeholder: "name", + form: "validFormId", + }); + const cardCvvField = mock({ + placeholder: "card cvv", + autoCompleteType: "cc-csc", + form: "validFormId", + }); + pageDetails.fields = [field, cardCvvField]; + + expect( + inlineMenuFieldQualificationService.isFieldForCreditCardForm(field, pageDetails), + ).toBe(false); + }); + + it("does not contain a cvv field within the same form", () => { + const field = mock({ + placeholder: "name", + form: "validFormId", + }); + const cardNumberField = mock({ + placeholder: "card number", + autoCompleteType: "cc-number", + form: "validFormId", + }); + + pageDetails.fields = [field, cardNumberField]; + + expect( + inlineMenuFieldQualificationService.isFieldForCreditCardForm(field, pageDetails), + ).toBe(false); + }); + }); + }); + + describe("a valid credit card field", () => { + describe("does not have a parent form", () => { + it("is structured on a page with a single credit card number field and a single cvv field", () => { + const field = mock({ + placeholder: "name", + }); + const cardNumberField = mock({ + placeholder: "card number", + autoCompleteType: "cc-number", + }); + const cardCvvField = mock({ + placeholder: "card cvv", + autoCompleteType: "cc-csc", + }); + pageDetails.forms = {}; + pageDetails.fields = [field, cardNumberField, cardCvvField]; + + expect( + inlineMenuFieldQualificationService.isFieldForCreditCardForm(field, pageDetails), + ).toBe(true); + }); + }); + + describe("has a parent form", () => { + let form: MockProxy; + + beforeEach(() => { + form = mock({ opid: "validFormId" }); + pageDetails.forms = { + validFormId: form, + }; + }); + + it("has a credit card number field and cvv field structured within the same form", () => { + const field = mock({ + placeholder: "name", + form: "validFormId", + }); + const cardNumberField = mock({ + placeholder: "card number", + autoCompleteType: "cc-number", + form: "validFormId", + }); + const cardCvvField = mock({ + placeholder: "card cvv", + autoCompleteType: "cc-csc", + form: "validFormId", + }); + pageDetails.fields = [field, cardNumberField, cardCvvField]; + + expect( + inlineMenuFieldQualificationService.isFieldForCreditCardForm(field, pageDetails), + ).toBe(true); + }); + }); + }); + }); + + describe("isFieldForAccountCreationForm", () => { + it("validates a field for an account creation if the field is formless but at least one new password field exists in the page details", () => { + const field = mock({ + placeholder: "username", + autoCompleteType: "username", + type: "text", + htmlName: "username", + htmlID: "username", + }); + const passwordField = mock({ + placeholder: "new password", + autoCompleteType: "new-password", + type: "password", + htmlName: "new-password", + htmlID: "new-password", + }); + pageDetails.forms = {}; + pageDetails.fields = [field, passwordField]; + + expect( + inlineMenuFieldQualificationService.isFieldForAccountCreationForm(field, pageDetails), + ).toBe(true); + }); + + it("validates a field for an account creation if the field is formless and contains an account creation keyword", () => { + const field = mock({ + placeholder: "register username", + autoCompleteType: "username", + type: "text", + htmlName: "username", + htmlID: "username", + }); + pageDetails.forms = {}; + pageDetails.fields = [field]; + + expect( + inlineMenuFieldQualificationService.isFieldForAccountCreationForm(field, pageDetails), + ).toBe(true); + }); + }); + + describe("isFieldForIdentityUsername", () => { + it("returns true if the field contains a keyword indicating that it is for a username field", () => { + const field = mock({ + placeholder: "user-name", + autoCompleteType: "", + type: "text", + htmlName: "user-name", + htmlID: "user-name", + }); + + expect(inlineMenuFieldQualificationService.isFieldForIdentityUsername(field)).toBe(true); + }); + }); + + describe("isEmailField", () => { + it("returns true if the field type is of `email`", () => { + const field = mock({ + placeholder: "email", + autoCompleteType: "", + type: "email", + htmlName: "email", + htmlID: "email", + }); + + expect(inlineMenuFieldQualificationService.isEmailField(field)).toBe(true); + }); + }); +}); diff --git a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts new file mode 100644 index 00000000000..fe5410da730 --- /dev/null +++ b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts @@ -0,0 +1,1225 @@ +import AutofillField from "../models/autofill-field"; +import AutofillPageDetails from "../models/autofill-page-details"; +import { getSubmitButtonKeywordsSet, sendExtensionMessage } from "../utils"; + +import { + AutofillKeywordsMap, + InlineMenuFieldQualificationService as InlineMenuFieldQualificationServiceInterface, + SubmitButtonKeywordsMap, +} from "./abstractions/inline-menu-field-qualifications.service"; +import { + AutoFillConstants, + CreditCardAutoFillConstants, + IdentityAutoFillConstants, + SubmitChangePasswordButtonNames, + SubmitLoginButtonNames, +} from "./autofill-constants"; + +export class InlineMenuFieldQualificationService + implements InlineMenuFieldQualificationServiceInterface +{ + private searchFieldNamesSet = new Set(AutoFillConstants.SearchFieldNames); + private excludedAutofillFieldTypesSet = new Set(AutoFillConstants.ExcludedAutofillLoginTypes); + private usernameFieldTypes = new Set(["text", "email", "number", "tel"]); + private usernameAutocompleteValue = "username"; + private emailAutocompleteValue = "email"; + private webAuthnAutocompleteValue = "webauthn"; + private loginUsernameAutocompleteValues = new Set([ + this.usernameAutocompleteValue, + this.emailAutocompleteValue, + this.webAuthnAutocompleteValue, + ]); + private fieldIgnoreListString = AutoFillConstants.FieldIgnoreList.join(","); + private currentPasswordAutocompleteValue = "current-password"; + private newPasswordAutoCompleteValue = "new-password"; + private autofillFieldKeywordsMap: AutofillKeywordsMap = new WeakMap(); + private submitButtonKeywordsMap: SubmitButtonKeywordsMap = new WeakMap(); + private autocompleteDisabledValues = new Set(["off", "false"]); + private accountCreationFieldKeywords = [ + "register", + "registration", + "create password", + "create a password", + "create an account", + "create account password", + "create user password", + "confirm password", + "confirm account password", + "confirm user password", + "new user", + "new email", + "new e-mail", + "new password", + "new-password", + "neuer benutzer", + "neues passwort", + "neue e-mail", + ]; + private updatePasswordFieldKeywords = [ + "update password", + "change password", + "current password", + "kennwort ändern", + ]; + private creditCardFieldKeywords = [ + ...new Set([ + ...CreditCardAutoFillConstants.CardHolderFieldNames, + ...CreditCardAutoFillConstants.CardNumberFieldNames, + ...CreditCardAutoFillConstants.CardExpiryFieldNames, + ...CreditCardAutoFillConstants.ExpiryMonthFieldNames, + ...CreditCardAutoFillConstants.ExpiryYearFieldNames, + ...CreditCardAutoFillConstants.CVVFieldNames, + ...CreditCardAutoFillConstants.CardBrandFieldNames, + ]), + ]; + private creditCardNameAutocompleteValues = new Set([ + "cc-name", + "cc-given-name,", + "cc-additional-name", + "cc-family-name", + ]); + private creditCardExpirationDateAutocompleteValue = "cc-exp"; + private creditCardExpirationMonthAutocompleteValue = "cc-exp-month"; + private creditCardExpirationYearAutocompleteValue = "cc-exp-year"; + private creditCardCvvAutocompleteValue = "cc-csc"; + private creditCardNumberAutocompleteValue = "cc-number"; + private creditCardTypeAutocompleteValue = "cc-type"; + private creditCardAutocompleteValues = new Set([ + ...this.creditCardNameAutocompleteValues, + this.creditCardExpirationDateAutocompleteValue, + this.creditCardExpirationMonthAutocompleteValue, + this.creditCardExpirationYearAutocompleteValue, + this.creditCardNumberAutocompleteValue, + this.creditCardCvvAutocompleteValue, + this.creditCardTypeAutocompleteValue, + ]); + private identityHonorificPrefixAutocompleteValue = "honorific-prefix"; + private identityFullNameAutocompleteValue = "name"; + private identityFirstNameAutocompleteValue = "given-name"; + private identityMiddleNameAutocompleteValue = "additional-name"; + private identityLastNameAutocompleteValue = "family-name"; + private identityNameAutocompleteValues = new Set([ + this.identityFullNameAutocompleteValue, + this.identityHonorificPrefixAutocompleteValue, + this.identityFirstNameAutocompleteValue, + this.identityMiddleNameAutocompleteValue, + this.identityLastNameAutocompleteValue, + "honorific-suffix", + "nickname", + ]); + private identityCompanyAutocompleteValue = "organization"; + private identityStreetAddressAutocompleteValue = "street-address"; + private identityAddressLine1AutocompleteValue = "address-line1"; + private identityAddressLine2AutocompleteValue = "address-line2"; + private identityAddressLine3AutocompleteValue = "address-line3"; + private identityAddressCityAutocompleteValue = "address-level2"; + private identityAddressStateAutocompleteValue = "address-level1"; + private identityAddressAutoCompleteValues = new Set([ + this.identityStreetAddressAutocompleteValue, + this.identityAddressLine1AutocompleteValue, + this.identityAddressLine2AutocompleteValue, + this.identityAddressLine3AutocompleteValue, + this.identityAddressCityAutocompleteValue, + this.identityAddressStateAutocompleteValue, + "shipping", + "billing", + "address-level4", + "address-level3", + ]); + private identityCountryAutocompleteValues = new Set(["country", "country-name"]); + private identityPostalCodeAutocompleteValue = "postal-code"; + private identityPhoneAutocompleteValue = "tel"; + private identityPhoneNumberAutocompleteValues = new Set([ + this.identityPhoneAutocompleteValue, + "tel-country-code", + "tel-area-code", + "tel-local", + "tel-extension", + ]); + private identityAutocompleteValues = new Set([ + ...this.identityNameAutocompleteValues, + ...this.loginUsernameAutocompleteValues, + ...this.identityCompanyAutocompleteValue, + ...this.identityAddressAutoCompleteValues, + ...this.identityCountryAutocompleteValues, + ...this.identityPhoneNumberAutocompleteValues, + this.identityCompanyAutocompleteValue, + this.identityPostalCodeAutocompleteValue, + ]); + private totpFieldAutocompleteValue = "one-time-code"; + private inlineMenuFieldQualificationFlagSet = false; + + constructor() { + void sendExtensionMessage("getInlineMenuFieldQualificationFeatureFlag").then( + (getInlineMenuFieldQualificationFlag) => + (this.inlineMenuFieldQualificationFlagSet = !!getInlineMenuFieldQualificationFlag?.result), + ); + } + + /** + * Validates the provided field as a field for a login form. + * + * @param field - The field to validate, should be a username or password field. + * @param pageDetails - The details of the page that the field is on. + */ + isFieldForLoginForm(field: AutofillField, pageDetails: AutofillPageDetails): boolean { + if (!this.inlineMenuFieldQualificationFlagSet) { + return this.isFieldForLoginFormFallback(field); + } + + if (this.isTotpField(field)) { + return false; + } + + const isCurrentPasswordField = this.isCurrentPasswordField(field); + if (isCurrentPasswordField) { + return this.isPasswordFieldForLoginForm(field, pageDetails); + } + + const isUsernameField = this.isUsernameField(field); + if (!isUsernameField) { + return false; + } + + return this.isUsernameFieldForLoginForm(field, pageDetails); + } + + /** + * Validates the provided field as a field for a credit card form. + * + * @param field - The field to validate + * @param pageDetails - The details of the page that the field is on. + */ + isFieldForCreditCardForm(field: AutofillField, pageDetails: AutofillPageDetails): boolean { + // If the field contains any of the standardized autocomplete attribute values + // for credit card fields, we should assume that the field is part of a credit card form. + if (this.fieldContainsAutocompleteValues(field, this.creditCardAutocompleteValues)) { + return true; + } + + const parentForm = pageDetails.forms[field.form]; + + // If the field does not have a parent form + if (!parentForm) { + // If a credit card number field is not present on the page or there are multiple credit + // card number fields, this field is not part of a credit card form. + const numberFieldsInPageDetails = pageDetails.fields.filter(this.isFieldForCardNumber); + if (numberFieldsInPageDetails.length !== 1) { + return false; + } + + // If a credit card CVV field is not present on the page or there are multiple credit card + // CVV fields, this field is not part of a credit card form. + const cvvFieldsInPageDetails = pageDetails.fields.filter(this.isFieldForCardCvv); + if (cvvFieldsInPageDetails.length !== 1) { + return false; + } + + return this.keywordsFoundInFieldData(field, this.creditCardFieldKeywords); + } + + // If the field has a parent form, check the fields from that form exclusively + const fieldsFromSameForm = pageDetails.fields.filter((f) => f.form === field.form); + + // If a credit card number field is not present on the page or there are multiple credit + // card number fields, this field is not part of a credit card form. + const numberFieldsInPageDetails = fieldsFromSameForm.filter(this.isFieldForCardNumber); + if (numberFieldsInPageDetails.length !== 1) { + return false; + } + + // If a credit card CVV field is not present on the page or there are multiple credit card + // CVV fields, this field is not part of a credit card form. + const cvvFieldsInPageDetails = fieldsFromSameForm.filter(this.isFieldForCardCvv); + if (cvvFieldsInPageDetails.length !== 1) { + return false; + } + + return this.keywordsFoundInFieldData(field, [...this.creditCardFieldKeywords]); + } + + /** Validates the provided field as a field for an account creation form. + * + * @param field - The field to validate + * @param pageDetails - The details of the page that the field is on. + */ + isFieldForAccountCreationForm(field: AutofillField, pageDetails: AutofillPageDetails): boolean { + if ( + this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet) || + this.isTotpField(field) + ) { + return false; + } + + if (!this.isUsernameField(field) && !this.isPasswordField(field)) { + return false; + } + + const parentForm = pageDetails.forms[field.form]; + + if (!parentForm) { + // If the field does not have a parent form, but we can identify that the page contains at least + // one new password field, we should assume that the field is part of an account creation form. + const newPasswordFields = pageDetails.fields.filter(this.isNewPasswordField); + if (newPasswordFields.length >= 1) { + return true; + } + + // If no password fields are found on the page, check for keywords that indicate the field is + // part of an account creation form. + return this.keywordsFoundInFieldData(field, this.accountCreationFieldKeywords); + } + + // If the field has a parent form, check the fields from that form exclusively + const fieldsFromSameForm = pageDetails.fields.filter((f) => f.form === field.form); + const newPasswordFields = fieldsFromSameForm.filter(this.isNewPasswordField); + if (newPasswordFields.length >= 1) { + return true; + } + + return this.keywordsFoundInFieldData(field, this.accountCreationFieldKeywords); + } + + /** + * Validates the provided field as a field for an identity form. + * + * @param field - The field to validate + * @param _pageDetails - Currently unused, will likely be required in the future + */ + isFieldForIdentityForm(field: AutofillField, _pageDetails: AutofillPageDetails): boolean { + if (this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet)) { + return false; + } + + return this.fieldContainsAutocompleteValues(field, this.identityAutocompleteValues); + } + + /** + * Validates the provided field as a password field for a login form. + * + * @param field - The field to validate + * @param pageDetails - The details of the page that the field is on. + */ + private isPasswordFieldForLoginForm( + field: AutofillField, + pageDetails: AutofillPageDetails, + ): boolean { + const parentForm = pageDetails.forms[field.form]; + + // If the provided field is set with an autocomplete value of "current-password", we should assume that + // the page developer intends for this field to be interpreted as a password field for a login form. + if (this.fieldContainsAutocompleteValues(field, this.currentPasswordAutocompleteValue)) { + if (!parentForm) { + return ( + pageDetails.fields.filter(this.isNewPasswordField).filter((f) => f.viewable).length === 0 + ); + } + + return ( + pageDetails.fields + .filter(this.isNewPasswordField) + .filter((f) => f.viewable && f.form === field.form).length === 0 + ); + } + + const usernameFieldsInPageDetails = pageDetails.fields.filter(this.isUsernameField); + const passwordFieldsInPageDetails = pageDetails.fields.filter(this.isCurrentPasswordField); + + // If a single username and a single password field exists on the page, we + // should assume that this field is part of a login form. + if (usernameFieldsInPageDetails.length === 1 && passwordFieldsInPageDetails.length === 1) { + return true; + } + + // If the field is not structured within a form, we need to identify if the field is present on + // a page with multiple password fields. If that isn't the case, we can assume this is a login form field. + if (!parentForm) { + // If no parent form is found, and multiple password fields are present, we should assume that + // the passed field belongs to a user account creation form. + if (passwordFieldsInPageDetails.length > 1) { + return false; + } + + // If multiple username fields exist on the page, we should assume that + // the provided field is part of an account creation form. + const visibleUsernameFields = usernameFieldsInPageDetails.filter((f) => f.viewable); + if (visibleUsernameFields.length > 1) { + return false; + } + + // If a single username field or less is present on the page, then we can assume that the + // provided field is for a login form. This will only be the case if the field does not + // explicitly have its autocomplete attribute set to "off" or "false". + + return !this.fieldContainsAutocompleteValues(field, this.autocompleteDisabledValues); + } + + // If the field has a form parent and there are multiple visible password fields + // in the form, this is not a login form field + const visiblePasswordFieldsInPageDetails = passwordFieldsInPageDetails.filter( + (f) => f.form === field.form && f.viewable, + ); + if (visiblePasswordFieldsInPageDetails.length > 1) { + return false; + } + + // If the form has any visible username fields, we should treat the field as part of a login form + const visibleUsernameFields = usernameFieldsInPageDetails.filter( + (f) => f.form === field.form && f.viewable, + ); + if (visibleUsernameFields.length > 0) { + return true; + } + + // If the field has a form parent and no username field exists and the field has an + // autocomplete attribute set to "off" or "false", this is not a password field + return !this.fieldContainsAutocompleteValues(field, this.autocompleteDisabledValues); + } + + /** + * Validates the provided field as a username field for a login form. + * + * @param field - The field to validate + * @param pageDetails - The details of the page that the field is on. + */ + private isUsernameFieldForLoginForm( + field: AutofillField, + pageDetails: AutofillPageDetails, + ): boolean { + // If the provided field is set with an autocomplete of "username", we should assume that + // the page developer intends for this field to be interpreted as a username field. + if (this.fieldContainsAutocompleteValues(field, this.loginUsernameAutocompleteValues)) { + const newPasswordFieldsInPageDetails = pageDetails.fields.filter( + (field) => field.viewable && this.isNewPasswordField(field), + ); + return newPasswordFieldsInPageDetails.length === 0; + } + + // If any keywords in the field's data indicates that this is a field for a "new" or "changed" + // username, we should assume that this field is not for a login form. + if (this.keywordsFoundInFieldData(field, this.accountCreationFieldKeywords)) { + return false; + } + + // If the field is not explicitly set as a username field, we need to qualify + // the field based on the other fields that are present on the page. + const parentForm = pageDetails.forms[field.form]; + const passwordFieldsInPageDetails = pageDetails.fields.filter(this.isCurrentPasswordField); + + // If the field is not structured within a form, we need to identify if the field is used in conjunction + // with a password field. If that's the case, then we should assume that it is a form field element. + if (!parentForm) { + // If a formless field is present in a webpage with a single password field, we + // should assume that it is part of a login workflow. + const visiblePasswordFieldsInPageDetails = passwordFieldsInPageDetails.filter( + (passwordField) => passwordField.viewable, + ); + if (visiblePasswordFieldsInPageDetails.length === 1) { + return true; + } + + // If more than a single password field exists on the page, we should assume that the field + // is part of an account creation form. + if (visiblePasswordFieldsInPageDetails.length > 1) { + return false; + } + + // If no visible fields are found on the page, but we have a single password + // field we should assume that the field is part of a login form. + if (passwordFieldsInPageDetails.length === 1) { + return true; + } + + // If the page does not contain any password fields, it might be part of a multistep login form. + // That will only be the case if the field does not explicitly have its autocomplete attribute + // set to "off" or "false". + return !this.fieldContainsAutocompleteValues(field, this.autocompleteDisabledValues); + } + + // If the field is structured within a form, but no password fields are present in the form, + // we need to consider whether the field is part of a multistep login form. + if (passwordFieldsInPageDetails.length === 0) { + // If the field's autocomplete is set to a disabled value, we should assume that the field is + // not part of a login form. + if (this.fieldContainsAutocompleteValues(field, this.autocompleteDisabledValues)) { + return false; + } + + // If the form that contains a single field, we should assume that it is part + // of a multistep login form. + const fieldsWithinForm = pageDetails.fields.filter( + (pageDetailsField) => pageDetailsField.form === field.form, + ); + if (fieldsWithinForm.length === 1) { + return true; + } + + // If multiple fields exist within the form, we should check if a single visible field exists. + // If so, we should assume that the field is part of a login form. + return fieldsWithinForm.filter((field) => field.viewable).length === 1; + } + + // If a single password field exists within the page details, and that password field is part of + // the same form as the provided field, we should assume that the field is part of a login form. + const visiblePasswordFieldsInPageDetails = passwordFieldsInPageDetails.filter( + (passwordField) => passwordField.form === field.form && passwordField.viewable, + ); + if (visiblePasswordFieldsInPageDetails.length === 1) { + return true; + } + + // If multiple visible password fields exist within the page details, we need to assume that the + // provided field is part of an account creation form. + if (visiblePasswordFieldsInPageDetails.length > 1) { + return false; + } + + // If we have a single password field we should assume that the field is part of a login form. + if (passwordFieldsInPageDetails.length === 1) { + return true; + } + + // If no visible password fields are found, this field might be part of a multipart form. + // Check for an invalid autocompleteType to determine if the field is part of a login form. + return !this.fieldContainsAutocompleteValues(field, this.autocompleteDisabledValues); + } + + /** + * Validates the provided field as a credit card name field. + * + * @param field - The field to validate + */ + isFieldForCardholderName = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.creditCardNameAutocompleteValues)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + CreditCardAutoFillConstants.CardHolderFieldNames, + false, + ); + }; + + /** + * Validates the provided field as a credit card number field. + * + * @param field - The field to validate + */ + isFieldForCardNumber = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.creditCardNumberAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + CreditCardAutoFillConstants.CardNumberFieldNames, + false, + ); + }; + + /** + * Validates the provided field as a credit card expiration date field. + * + * @param field - The field to validate + */ + isFieldForCardExpirationDate = (field: AutofillField): boolean => { + if ( + this.fieldContainsAutocompleteValues(field, this.creditCardExpirationDateAutocompleteValue) + ) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + CreditCardAutoFillConstants.CardExpiryFieldNames, + false, + ); + }; + + /** + * Validates the provided field as a credit card expiration month field. + * + * @param field - The field to validate + */ + isFieldForCardExpirationMonth = (field: AutofillField): boolean => { + if ( + this.fieldContainsAutocompleteValues(field, this.creditCardExpirationMonthAutocompleteValue) + ) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + CreditCardAutoFillConstants.ExpiryMonthFieldNames, + false, + ); + }; + + /** + * Validates the provided field as a credit card expiration year field. + * + * @param field - The field to validate + */ + isFieldForCardExpirationYear = (field: AutofillField): boolean => { + if ( + this.fieldContainsAutocompleteValues(field, this.creditCardExpirationYearAutocompleteValue) + ) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + CreditCardAutoFillConstants.ExpiryYearFieldNames, + false, + ); + }; + + /** + * Validates the provided field as a credit card CVV field. + * + * @param field - The field to validate + */ + isFieldForCardCvv = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.creditCardCvvAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData(field, CreditCardAutoFillConstants.CVVFieldNames, false); + }; + + /** + * Validates the provided field as an identity title type field. + * + * @param field - The field to validate + */ + isFieldForIdentityTitle = (field: AutofillField): boolean => { + if ( + this.fieldContainsAutocompleteValues(field, this.identityHonorificPrefixAutocompleteValue) + ) { + return true; + } + + return this.keywordsFoundInFieldData(field, IdentityAutoFillConstants.TitleFieldNames, false); + }; + + /** + * Validates the provided field as an identity full name field. + * + * @param field + */ + isFieldForIdentityFirstName = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityFirstNameAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + IdentityAutoFillConstants.FirstnameFieldNames, + false, + ); + }; + + /** + * Validates the provided field as an identity middle name field. + * + * @param field - The field to validate + */ + isFieldForIdentityMiddleName = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityMiddleNameAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + IdentityAutoFillConstants.MiddlenameFieldNames, + false, + ); + }; + + /** + * Validates the provided field as an identity last name field. + * + * @param field - The field to validate + */ + isFieldForIdentityLastName = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityLastNameAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + IdentityAutoFillConstants.LastnameFieldNames, + false, + ); + }; + + /** + * Validates the provided field as an identity full name field. + * + * @param field - The field to validate + */ + isFieldForIdentityFullName = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityFullNameAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + IdentityAutoFillConstants.FullNameFieldNames, + false, + ); + }; + + /** + * Validates the provided field as an identity address field. + * + * @param field - The field to validate + */ + isFieldForIdentityAddress1 = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityAddressLine1AutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + [ + ...IdentityAutoFillConstants.AddressFieldNames, + ...IdentityAutoFillConstants.Address1FieldNames, + ], + false, + ); + }; + + /** + * Validates the provided field as an identity address field. + * + * @param field - The field to validate + */ + isFieldForIdentityAddress2 = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityAddressLine2AutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + IdentityAutoFillConstants.Address2FieldNames, + false, + ); + }; + + /** + * Validates the provided field as an identity address field. + * + * @param field - The field to validate + */ + isFieldForIdentityAddress3 = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityAddressLine3AutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + IdentityAutoFillConstants.Address3FieldNames, + false, + ); + }; + + /** + * Validates the provided field as an identity city field. + * + * @param field - The field to validate + */ + isFieldForIdentityCity = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityAddressCityAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData(field, IdentityAutoFillConstants.CityFieldNames, false); + }; + + /** + * Validates the provided field as an identity state field. + * + * @param field - The field to validate + */ + isFieldForIdentityState = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityAddressStateAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData(field, IdentityAutoFillConstants.StateFieldNames, false); + }; + + /** + * Validates the provided field as an identity postal code field. + * + * @param field - The field to validate + */ + isFieldForIdentityPostalCode = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityPostalCodeAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + IdentityAutoFillConstants.PostalCodeFieldNames, + false, + ); + }; + + /** + * Validates the provided field as an identity country field. + * + * @param field - The field to validate + */ + isFieldForIdentityCountry = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityCountryAutocompleteValues)) { + return true; + } + + return this.keywordsFoundInFieldData(field, IdentityAutoFillConstants.CountryFieldNames, false); + }; + + /** + * Validates the provided field as an identity company field. + * + * @param field - The field to validate + */ + isFieldForIdentityCompany = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityCompanyAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData(field, IdentityAutoFillConstants.CompanyFieldNames, false); + }; + + /** + * Validates the provided field as an identity phone field. + * + * @param field - The field to validate + */ + isFieldForIdentityPhone = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.identityPhoneAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData(field, IdentityAutoFillConstants.PhoneFieldNames, false); + }; + + /** + * Validates the provided field as an identity email field. + * + * @param field - The field to validate + */ + isFieldForIdentityEmail = (field: AutofillField): boolean => { + if ( + this.fieldContainsAutocompleteValues(field, this.emailAutocompleteValue) || + field.type === "email" + ) { + return true; + } + + return this.keywordsFoundInFieldData(field, IdentityAutoFillConstants.EmailFieldNames, false); + }; + + /** + * Validates the provided field as an identity username field. + * + * @param field - The field to validate + */ + isFieldForIdentityUsername = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.usernameAutocompleteValue)) { + return true; + } + + return this.keywordsFoundInFieldData( + field, + IdentityAutoFillConstants.UserNameFieldNames, + false, + ); + }; + + /** + * Validates the provided field as a username field. + * + * @param field - The field to validate + */ + isUsernameField = (field: AutofillField): boolean => { + if ( + !this.usernameFieldTypes.has(field.type) || + this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet) || + this.fieldHasDisqualifyingAttributeValue(field) + ) { + return false; + } + + return this.keywordsFoundInFieldData(field, AutoFillConstants.UsernameFieldNames); + }; + + /** + * Validates the provided field as an email field. + * + * @param field - The field to validate + */ + isEmailField = (field: AutofillField): boolean => { + if (field.type === "email") { + return true; + } + + return ( + !this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet) && + this.keywordsFoundInFieldData(field, AutoFillConstants.EmailFieldNames) + ); + }; + + /** + * Validates the provided field as a current password field. + * + * @param field - The field to validate + */ + isCurrentPasswordField = (field: AutofillField): boolean => { + if ( + this.fieldContainsAutocompleteValues(field, this.newPasswordAutoCompleteValue) || + this.keywordsFoundInFieldData(field, this.accountCreationFieldKeywords) + ) { + return false; + } + + return this.isPasswordField(field); + }; + + /** + * Validates the provided field as a current password field for an update password form. + * + * @param field - The field to validate + */ + isUpdateCurrentPasswordField = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.newPasswordAutoCompleteValue)) { + return false; + } + + return ( + this.isPasswordField(field) && + this.keywordsFoundInFieldData(field, this.updatePasswordFieldKeywords) + ); + }; + + /** + * Validates the provided field as a new password field. + * + * @param field - The field to validate + */ + isNewPasswordField = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.currentPasswordAutocompleteValue)) { + return false; + } + + return ( + this.isPasswordField(field) && + this.keywordsFoundInFieldData(field, this.accountCreationFieldKeywords) + ); + }; + + /** + * Validates the provided field as a password field. + * + * @param field - The field to validate + */ + private isPasswordField = (field: AutofillField): boolean => { + const isInputPasswordType = field.type === "password"; + if ( + (!isInputPasswordType && + this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet)) || + this.fieldHasDisqualifyingAttributeValue(field) || + this.isTotpField(field) + ) { + return false; + } + + return isInputPasswordType || this.isLikePasswordField(field); + }; + + /** + * Validates the provided field as a field to indicate if the + * field potentially acts as a password field. + * + * @param field - The field to validate + */ + private isLikePasswordField(field: AutofillField): boolean { + if (field.type !== "text") { + return false; + } + + const testedValues = [field.htmlID, field.htmlName, field.placeholder]; + for (let i = 0; i < testedValues.length; i++) { + if (this.valueIsLikePassword(testedValues[i])) { + return true; + } + } + + return false; + } + + /** + * Validates the provided value to indicate if the value is like a password. + * + * @param value - The value to validate + */ + private valueIsLikePassword(value: string): boolean { + if (value == null) { + return false; + } + // Removes all whitespace, _ and - characters + const cleanedValue = value.toLowerCase().replace(/[\s_-]/g, ""); + + if (cleanedValue.indexOf("password") < 0) { + return false; + } + + return !AutoFillConstants.PasswordFieldExcludeList.some((i) => cleanedValue.indexOf(i) > -1); + } + + /** + * Validates whether the provided field is a TOTP field. + * + * @param field - The field to validate + */ + private isTotpField = (field: AutofillField): boolean => { + if (this.fieldContainsAutocompleteValues(field, this.totpFieldAutocompleteValue)) { + return true; + } + + return ( + !this.isExcludedFieldType(field, this.excludedAutofillFieldTypesSet) && + this.keywordsFoundInFieldData(field, AutoFillConstants.TotpFieldNames) + ); + }; + + /** + * Validates the provided field to indicate if the field has a + * disqualifying attribute that would impede autofill entirely. + * + * @param field - The field to validate + */ + private fieldHasDisqualifyingAttributeValue(field: AutofillField): boolean { + const checkedAttributeValues = [field.htmlID, field.htmlName, field.placeholder]; + + for (let i = 0; i < checkedAttributeValues.length; i++) { + const checkedAttributeValue = checkedAttributeValues[i]; + const cleanedValue = checkedAttributeValue?.toLowerCase().replace(/[\s_-]/g, ""); + + if (cleanedValue && this.fieldIgnoreListString.indexOf(cleanedValue) > -1) { + return true; + } + } + + return false; + } + + /** + * Validates the provided field to indicate if the field is excluded from autofill. + * + * @param field - The field to validate + * @param excludedTypes - The set of excluded types + */ + private isExcludedFieldType(field: AutofillField, excludedTypes: Set): boolean { + if (excludedTypes.has(field.type)) { + return true; + } + + return this.isSearchField(field); + } + + /** + * Validates the provided field to indicate if the field is a search field. + * + * @param field - The field to validate + */ + private isSearchField(field: AutofillField): boolean { + const matchFieldAttributeValues = [field.type, field.htmlName, field.htmlID, field.placeholder]; + for (let attrIndex = 0; attrIndex < matchFieldAttributeValues.length; attrIndex++) { + if (!matchFieldAttributeValues[attrIndex]) { + continue; + } + + // Separate camel case words and case them to lower case values + const camelCaseSeparatedFieldAttribute = matchFieldAttributeValues[attrIndex] + .replace(/([a-z])([A-Z])/g, "$1 $2") + .toLowerCase(); + // Split the attribute by non-alphabetical characters to get the keywords + const attributeKeywords = camelCaseSeparatedFieldAttribute.split(/[^a-z]/gi); + + for (let keywordIndex = 0; keywordIndex < attributeKeywords.length; keywordIndex++) { + if (this.searchFieldNamesSet.has(attributeKeywords[keywordIndex])) { + return true; + } + } + } + + return false; + } + + /** + * Validates the provided field to indicate if the field is a submit button for a login form. + * + * @param element - The element to validate + */ + isElementLoginSubmitButton = (element: HTMLElement): boolean => { + const keywordValues = this.getSubmitButtonKeywords(element); + return SubmitLoginButtonNames.some((keyword) => keywordValues.indexOf(keyword) > -1); + }; + + /** + * Validates the provided field to indicate if the field is a submit button for a change password form. + * + * @param element - The element to validate + */ + isElementChangePasswordSubmitButton = (element: HTMLElement): boolean => { + const keywordValues = this.getSubmitButtonKeywords(element); + return SubmitChangePasswordButtonNames.some((keyword) => keywordValues.indexOf(keyword) > -1); + }; + + /** + * Gather the keywords from the provided element to validate the submit button. + * + * @param element - The element to validate + */ + private getSubmitButtonKeywords(element: HTMLElement): string { + if (!this.submitButtonKeywordsMap.has(element)) { + const keywordsSet = getSubmitButtonKeywordsSet(element); + this.submitButtonKeywordsMap.set(element, Array.from(keywordsSet).join(",")); + } + + return this.submitButtonKeywordsMap.get(element); + } + + /** + * Validates the provided field to indicate if the field has any of the provided keywords. + * + * @param autofillFieldData - The field data to search for keywords + * @param keywords - The keywords to search for + * @param fuzzyMatchKeywords - Indicates if the keywords should be matched in a fuzzy manner + */ + private keywordsFoundInFieldData( + autofillFieldData: AutofillField, + keywords: string[], + fuzzyMatchKeywords = true, + ) { + const searchedValues = this.getAutofillFieldDataKeywords(autofillFieldData, fuzzyMatchKeywords); + const parsedKeywords = keywords.map((keyword) => keyword.replace(/-/g, "")); + + if (typeof searchedValues === "string") { + return parsedKeywords.some((keyword) => searchedValues.indexOf(keyword) > -1); + } + + return parsedKeywords.some((keyword) => searchedValues.has(keyword)); + } + + /** + * Retrieves the keywords from the provided autofill field data. + * + * @param autofillFieldData - The field data to search for keywords + * @param returnStringValue - Indicates if the method should return a string value + */ + private getAutofillFieldDataKeywords( + autofillFieldData: AutofillField, + returnStringValue: boolean, + ) { + if (!this.autofillFieldKeywordsMap.has(autofillFieldData)) { + const keywords = [ + autofillFieldData.htmlID, + autofillFieldData.htmlName, + autofillFieldData.htmlClass, + autofillFieldData.type, + autofillFieldData.title, + autofillFieldData.placeholder, + autofillFieldData.autoCompleteType, + autofillFieldData.dataSetValues, + autofillFieldData["label-data"], + autofillFieldData["label-aria"], + autofillFieldData["label-left"], + autofillFieldData["label-right"], + autofillFieldData["label-tag"], + autofillFieldData["label-top"], + ]; + const keywordsSet = new Set(); + for (let i = 0; i < keywords.length; i++) { + if (keywords[i] && typeof keywords[i] === "string") { + let keywordEl = keywords[i].toLowerCase(); + keywordsSet.add(keywordEl); + + // Remove hyphens from all potential keywords, we want to treat these as a single word. + keywordEl = keywordEl.replace(/-/g, ""); + + // Split the keyword by non-alphanumeric characters to get the keywords without treating a space as a separator. + keywordEl.split(/[^\p{L}\d]+/gu).forEach((keyword: string) => { + if (keyword) { + keywordsSet.add(keyword); + } + }); + + // Collapse all spaces and split by non-alphanumeric characters to get the keywords + keywordEl + .replace(/\s/g, "") + .split(/[^\p{L}\d]+/gu) + .forEach((keyword: string) => { + if (keyword) { + keywordsSet.add(keyword); + } + }); + } + } + + const stringValue = Array.from(keywordsSet).join(","); + this.autofillFieldKeywordsMap.set(autofillFieldData, { keywordsSet, stringValue }); + } + + const mapValues = this.autofillFieldKeywordsMap.get(autofillFieldData); + return returnStringValue ? mapValues.stringValue : mapValues.keywordsSet; + } + + /** + * Separates the provided field data into space-separated values and checks if any + * of the values are present in the provided set of autocomplete values. + * + * @param autofillFieldData - The field autocomplete value to validate + * @param compareValues - The set of autocomplete values to check against + */ + private fieldContainsAutocompleteValues( + autofillFieldData: AutofillField, + compareValues: string | Set, + ) { + const fieldAutocompleteValue = autofillFieldData.autoCompleteType; + if (!fieldAutocompleteValue || typeof fieldAutocompleteValue !== "string") { + return false; + } + + const autocompleteValueParts = fieldAutocompleteValue.split(" "); + if (typeof compareValues === "string") { + return autocompleteValueParts.indexOf(compareValues) > -1; + } + + for (let index = 0; index < autocompleteValueParts.length; index++) { + if (compareValues.has(autocompleteValueParts[index])) { + return true; + } + } + + return false; + } + + /** + * This method represents the previous rudimentary approach to qualifying fields for login forms. + * + * @param field - The field to validate + * @deprecated - This method will only be used when the fallback flag is set to true. + */ + private isFieldForLoginFormFallback(field: AutofillField): boolean { + if (field.type === "password") { + return true; + } + + return this.isUsernameField(field); + } +} diff --git a/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts b/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts index 0ab74875fbf..e36d6811ecb 100644 --- a/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts +++ b/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts @@ -1,9 +1,16 @@ -import { EVENTS } from "../constants"; +import { mock } from "jest-mock-extended"; + +import { EVENTS } from "@bitwarden/common/autofill/constants"; + import AutofillScript, { FillScript, FillScriptActions } from "../models/autofill-script"; +import { mockQuerySelectorAllDefinedCall } from "../spec/testing-utils"; import { FillableFormFieldElement, FormElementWithAttribute, FormFieldElement } from "../types"; -import CollectAutofillContentService from "./collect-autofill-content.service"; +import { InlineMenuFieldQualificationService } from "./abstractions/inline-menu-field-qualifications.service"; +import { AutofillOverlayContentService } from "./autofill-overlay-content.service"; +import { CollectAutofillContentService } from "./collect-autofill-content.service"; import DomElementVisibilityService from "./dom-element-visibility.service"; +import { DomQueryService } from "./dom-query.service"; import InsertAutofillContentService from "./insert-autofill-content.service"; const mockLoginForm = ` @@ -40,12 +47,12 @@ const initEventCount = Object.freeze( ...eventCounts, [eventName]: 0, }), - {} - ) + {}, + ), ); let confirmSpy: jest.SpyInstance; -let windowSpy: jest.SpyInstance; +let windowLocationSpy: jest.SpyInstance; let savedURLs: string[] | null = ["https://bitwarden.com"]; function setMockWindowLocation({ protocol, @@ -54,29 +61,37 @@ function setMockWindowLocation({ protocol: "http:" | "https:"; hostname: string; }) { - windowSpy.mockImplementation(() => ({ - location: { - protocol, - hostname, - }, + windowLocationSpy.mockImplementation(() => ({ + protocol, + hostname, })); } describe("InsertAutofillContentService", () => { + const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); + const inlineMenuFieldQualificationService = mock(); + const domQueryService = new DomQueryService(); const domElementVisibilityService = new DomElementVisibilityService(); + const autofillOverlayContentService = new AutofillOverlayContentService( + domQueryService, + domElementVisibilityService, + inlineMenuFieldQualificationService, + ); const collectAutofillContentService = new CollectAutofillContentService( - domElementVisibilityService + domElementVisibilityService, + domQueryService, + autofillOverlayContentService, ); let insertAutofillContentService: InsertAutofillContentService; let fillScript: AutofillScript; beforeEach(() => { document.body.innerHTML = mockLoginForm; - confirmSpy = jest.spyOn(window, "confirm"); - windowSpy = jest.spyOn(window, "window", "get"); + confirmSpy = jest.spyOn(globalThis, "confirm"); + windowLocationSpy = jest.spyOn(globalThis, "location", "get"); insertAutofillContentService = new InsertAutofillContentService( domElementVisibilityService, - collectAutofillContentService + collectAutofillContentService, ); fillScript = { script: [ @@ -96,201 +111,134 @@ describe("InsertAutofillContentService", () => { }); afterEach(() => { - jest.resetAllMocks(); - windowSpy.mockRestore(); + jest.restoreAllMocks(); + jest.clearAllTimers(); + windowLocationSpy.mockRestore(); confirmSpy.mockRestore(); document.body.innerHTML = ""; }); - describe("fillForm", () => { - it("returns early if the passed fill script does not have a script property", () => { - fillScript.script = []; - jest.spyOn(insertAutofillContentService as any, "fillingWithinSandboxedIframe"); - jest.spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill"); - jest.spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill"); - jest.spyOn(insertAutofillContentService as any, "tabURLChanged"); - jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); - - insertAutofillContentService.fillForm(fillScript); - - expect(insertAutofillContentService["fillingWithinSandboxedIframe"]).not.toHaveBeenCalled(); - expect( - insertAutofillContentService["userCancelledInsecureUrlAutofill"] - ).not.toHaveBeenCalled(); - expect( - insertAutofillContentService["userCancelledUntrustedIframeAutofill"] - ).not.toHaveBeenCalled(); - expect(insertAutofillContentService["tabURLChanged"]).not.toHaveBeenCalled(); - expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); - }); - - it("returns early if the script is filling within a sand boxed iframe", () => { - jest - .spyOn(insertAutofillContentService as any, "fillingWithinSandboxedIframe") - .mockReturnValue(true); - jest.spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill"); - jest.spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill"); - jest.spyOn(insertAutofillContentService as any, "tabURLChanged"); - jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); - - insertAutofillContentService.fillForm(fillScript); - - expect(insertAutofillContentService["fillingWithinSandboxedIframe"]).toHaveBeenCalled(); - expect( - insertAutofillContentService["userCancelledInsecureUrlAutofill"] - ).not.toHaveBeenCalled(); - expect( - insertAutofillContentService["userCancelledUntrustedIframeAutofill"] - ).not.toHaveBeenCalled(); - expect(insertAutofillContentService["tabURLChanged"]).not.toHaveBeenCalled(); - expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); - }); - - it("returns early if the autofill is occurring on an insecure url and the user cancels the autofill", () => { - jest - .spyOn(insertAutofillContentService as any, "fillingWithinSandboxedIframe") - .mockReturnValue(false); - jest - .spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill") - .mockReturnValue(true); - jest.spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill"); - jest.spyOn(insertAutofillContentService as any, "tabURLChanged"); - jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); - - insertAutofillContentService.fillForm(fillScript); - - expect(insertAutofillContentService["fillingWithinSandboxedIframe"]).toHaveBeenCalled(); - expect(insertAutofillContentService["userCancelledInsecureUrlAutofill"]).toHaveBeenCalled(); - expect( - insertAutofillContentService["userCancelledUntrustedIframeAutofill"] - ).not.toHaveBeenCalled(); - expect(insertAutofillContentService["tabURLChanged"]).not.toHaveBeenCalled(); - expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); - }); - - it("returns early if the iframe is untrusted and the user cancelled the autofill", () => { - jest - .spyOn(insertAutofillContentService as any, "fillingWithinSandboxedIframe") - .mockReturnValue(false); - jest - .spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill") - .mockReturnValue(false); - jest - .spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill") - .mockReturnValue(true); - jest.spyOn(insertAutofillContentService as any, "tabURLChanged").mockReturnValue(false); - jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); - - insertAutofillContentService.fillForm(fillScript); - - expect(insertAutofillContentService["fillingWithinSandboxedIframe"]).toHaveBeenCalled(); - expect(insertAutofillContentService["userCancelledInsecureUrlAutofill"]).toHaveBeenCalled(); - expect( - insertAutofillContentService["userCancelledUntrustedIframeAutofill"] - ).toHaveBeenCalled(); - expect(insertAutofillContentService["tabURLChanged"]).not.toHaveBeenCalled(); - expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); - }); - - it("returns early if the page location origin does not match against any of the cipher saved URLs", () => { - jest - .spyOn(insertAutofillContentService as any, "fillingWithinSandboxedIframe") - .mockReturnValue(false); - jest - .spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill") - .mockReturnValue(false); - jest - .spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill") - .mockReturnValue(false); - jest.spyOn(insertAutofillContentService as any, "tabURLChanged").mockReturnValue(true); - jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); - - insertAutofillContentService.fillForm(fillScript); - - expect(insertAutofillContentService["fillingWithinSandboxedIframe"]).toHaveBeenCalled(); - expect(insertAutofillContentService["userCancelledInsecureUrlAutofill"]).toHaveBeenCalled(); - expect( - insertAutofillContentService["userCancelledUntrustedIframeAutofill"] - ).toHaveBeenCalled(); - expect(insertAutofillContentService["tabURLChanged"]).toHaveBeenCalled(); - expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); - }); - - it("runs the fill script action for all scripts found within the fill script", () => { - jest - .spyOn(insertAutofillContentService as any, "fillingWithinSandboxedIframe") - .mockReturnValue(false); - jest - .spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill") - .mockReturnValue(false); - jest - .spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill") - .mockReturnValue(false); - jest.spyOn(insertAutofillContentService as any, "tabURLChanged").mockReturnValue(false); - jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); - - insertAutofillContentService.fillForm(fillScript); - - expect(insertAutofillContentService["fillingWithinSandboxedIframe"]).toHaveBeenCalled(); - expect(insertAutofillContentService["userCancelledInsecureUrlAutofill"]).toHaveBeenCalled(); - expect( - insertAutofillContentService["userCancelledUntrustedIframeAutofill"] - ).toHaveBeenCalled(); - expect(insertAutofillContentService["tabURLChanged"]).toHaveBeenCalled(); - expect(insertAutofillContentService["runFillScriptAction"]).toHaveBeenCalledTimes(3); - expect(insertAutofillContentService["runFillScriptAction"]).toHaveBeenNthCalledWith( - 1, - fillScript.script[0], - 0, - fillScript.script - ); - expect(insertAutofillContentService["runFillScriptAction"]).toHaveBeenNthCalledWith( - 2, - fillScript.script[1], - 1, - fillScript.script - ); - expect(insertAutofillContentService["runFillScriptAction"]).toHaveBeenNthCalledWith( - 3, - fillScript.script[2], - 2, - fillScript.script - ); - }); + afterAll(() => { + mockQuerySelectorAll.mockRestore(); }); - describe("fillingWithinSandboxedIframe", () => { + describe("fillForm", () => { afterEach(() => { Object.defineProperty(globalThis, "window", { value: { frameElement: null }, writable: true, }); - }); - - it("returns false if the `self.origin` value is not null", () => { - const result = insertAutofillContentService["fillingWithinSandboxedIframe"](); - - expect(result).toBe(false); - expect(self.origin).not.toBeNull(); - }); - - it("returns true if the frameElement has a sandbox attribute", () => { - Object.defineProperty(globalThis, "window", { - value: { frameElement: { hasAttribute: jest.fn(() => true) } }, + Object.defineProperty(globalThis, "frameElement", { + value: { hasAttribute: jest.fn(() => false) }, writable: true, }); - - const result = insertAutofillContentService["fillingWithinSandboxedIframe"](); - - expect(result).toBe(true); }); - it("returns true if the window location hostname is empty", () => { - setMockWindowLocation({ protocol: "http:", hostname: "" }); + it("returns early if the passed fill script does not have a script property", async () => { + fillScript.script = []; + jest.spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill"); + jest.spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill"); + jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); - const result = insertAutofillContentService["fillingWithinSandboxedIframe"](); + await insertAutofillContentService.fillForm(fillScript); - expect(result).toBe(true); + expect( + insertAutofillContentService["userCancelledInsecureUrlAutofill"], + ).not.toHaveBeenCalled(); + expect( + insertAutofillContentService["userCancelledUntrustedIframeAutofill"], + ).not.toHaveBeenCalled(); + expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); + }); + + it("returns early if the script is filling within a sand boxed iframe", async () => { + Object.defineProperty(globalThis, "frameElement", { + value: { hasAttribute: jest.fn(() => true) }, + writable: true, + }); + jest.spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill"); + jest.spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill"); + jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); + + await insertAutofillContentService.fillForm(fillScript); + + expect( + insertAutofillContentService["userCancelledInsecureUrlAutofill"], + ).not.toHaveBeenCalled(); + expect( + insertAutofillContentService["userCancelledUntrustedIframeAutofill"], + ).not.toHaveBeenCalled(); + expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); + }); + + it("returns early if the autofill is occurring on an insecure url and the user cancels the autofill", async () => { + jest + .spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill") + .mockReturnValue(true); + jest.spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill"); + jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); + + await insertAutofillContentService.fillForm(fillScript); + + expect(insertAutofillContentService["userCancelledInsecureUrlAutofill"]).toHaveBeenCalled(); + expect( + insertAutofillContentService["userCancelledUntrustedIframeAutofill"], + ).not.toHaveBeenCalled(); + expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); + }); + + it("returns early if the iframe is untrusted and the user cancelled the autofill", async () => { + jest + .spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill") + .mockReturnValue(false); + jest + .spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill") + .mockReturnValue(true); + jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); + + await insertAutofillContentService.fillForm(fillScript); + + expect(insertAutofillContentService["userCancelledInsecureUrlAutofill"]).toHaveBeenCalled(); + expect( + insertAutofillContentService["userCancelledUntrustedIframeAutofill"], + ).toHaveBeenCalled(); + expect(insertAutofillContentService["runFillScriptAction"]).not.toHaveBeenCalled(); + }); + + it("runs the fill script action for all scripts found within the fill script", async () => { + jest + .spyOn(insertAutofillContentService as any, "userCancelledInsecureUrlAutofill") + .mockReturnValue(false); + jest + .spyOn(insertAutofillContentService as any, "userCancelledUntrustedIframeAutofill") + .mockReturnValue(false); + jest.spyOn(insertAutofillContentService as any, "runFillScriptAction"); + + await insertAutofillContentService.fillForm(fillScript); + + expect(insertAutofillContentService["userCancelledInsecureUrlAutofill"]).toHaveBeenCalled(); + expect( + insertAutofillContentService["userCancelledUntrustedIframeAutofill"], + ).toHaveBeenCalled(); + expect(insertAutofillContentService["runFillScriptAction"]).toHaveBeenCalledTimes(3); + expect(insertAutofillContentService["runFillScriptAction"]).toHaveBeenNthCalledWith( + 1, + fillScript.script[0], + 0, + fillScript.script, + ); + expect(insertAutofillContentService["runFillScriptAction"]).toHaveBeenNthCalledWith( + 2, + fillScript.script[1], + 1, + fillScript.script, + ); + expect(insertAutofillContentService["runFillScriptAction"]).toHaveBeenNthCalledWith( + 3, + fillScript.script[2], + 2, + fillScript.script, + ); }); }); @@ -433,14 +381,14 @@ describe("InsertAutofillContentService", () => { jest.useFakeTimers(); }); - it("returns early if no opid is provided", () => { + it("returns early if no opid is provided", async () => { const action = "fill_by_opid"; const opid = ""; const value = "value"; const scriptAction: FillScript = [action, opid, value]; jest.spyOn(insertAutofillContentService["autofillInsertActions"], action); - insertAutofillContentService["runFillScriptAction"](scriptAction, 0); + await insertAutofillContentService["runFillScriptAction"](scriptAction, 0); jest.advanceTimersByTime(20); expect(insertAutofillContentService["autofillInsertActions"][action]).not.toHaveBeenCalled(); @@ -459,11 +407,13 @@ describe("InsertAutofillContentService", () => { const scriptAction: FillScript = [action, opid, value]; jest.spyOn(insertAutofillContentService["autofillInsertActions"], action); + // 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 insertAutofillContentService["runFillScriptAction"](scriptAction, 0); jest.advanceTimersByTime(20); expect( - insertAutofillContentService["autofillInsertActions"][action] + insertAutofillContentService["autofillInsertActions"][action], ).toHaveBeenCalledWith({ opid, value, @@ -482,18 +432,18 @@ describe("InsertAutofillContentService", () => { textInput.value = value; jest.spyOn( insertAutofillContentService["collectAutofillContentService"], - "getAutofillFieldElementByOpid" + "getAutofillFieldElementByOpid", ); jest.spyOn(insertAutofillContentService as any, "insertValueIntoField"); insertAutofillContentService["handleFillFieldByOpidAction"](opid, value); expect( - insertAutofillContentService["collectAutofillContentService"].getAutofillFieldElementByOpid + insertAutofillContentService["collectAutofillContentService"].getAutofillFieldElementByOpid, ).toHaveBeenCalledWith(opid); expect(insertAutofillContentService["insertValueIntoField"]).toHaveBeenCalledWith( textInput, - value + value, ); }); }); @@ -514,17 +464,17 @@ describe("InsertAutofillContentService", () => { textInput.addEventListener("click", clickEventHandler); jest.spyOn( insertAutofillContentService["collectAutofillContentService"], - "getAutofillFieldElementByOpid" + "getAutofillFieldElementByOpid", ); jest.spyOn(insertAutofillContentService as any, "triggerClickOnElement"); insertAutofillContentService["handleClickOnFieldByOpidAction"]("__1"); expect( - insertAutofillContentService["collectAutofillContentService"].getAutofillFieldElementByOpid + insertAutofillContentService["collectAutofillContentService"].getAutofillFieldElementByOpid, ).toBeCalledWith("__1"); expect((insertAutofillContentService as any)["triggerClickOnElement"]).toHaveBeenCalledWith( - textInput + textInput, ); expect(clickEventCount).toBe(expectedClickEventCount); @@ -575,23 +525,36 @@ describe("InsertAutofillContentService", () => { }); jest.spyOn( insertAutofillContentService["collectAutofillContentService"], - "getAutofillFieldElementByOpid" + "getAutofillFieldElementByOpid", ); jest.spyOn( insertAutofillContentService as any, - "simulateUserMouseClickAndFocusEventInteractions" + "simulateUserMouseClickAndFocusEventInteractions", ); + jest.spyOn(targetInput, "blur"); insertAutofillContentService["handleFocusOnFieldByOpidAction"]("__0"); expect( - insertAutofillContentService["collectAutofillContentService"].getAutofillFieldElementByOpid + insertAutofillContentService["collectAutofillContentService"].getAutofillFieldElementByOpid, ).toBeCalledWith("__0"); + expect(targetInput.blur).not.toHaveBeenCalled(); expect( - insertAutofillContentService["simulateUserMouseClickAndFocusEventInteractions"] + insertAutofillContentService["simulateUserMouseClickAndFocusEventInteractions"], ).toHaveBeenCalledWith(targetInput, true); expect(elementEventCount).toEqual(expectedElementEventCount); }); + + it("blurs the element if it is currently the active element before simulating click and focus events", () => { + const targetInput = document.querySelector('input[type="text"]') as FormElementWithAttribute; + targetInput.opid = "__0"; + targetInput.focus(); + jest.spyOn(targetInput, "blur"); + + insertAutofillContentService["handleFocusOnFieldByOpidAction"]("__0"); + + expect(targetInput.blur).toHaveBeenCalled(); + }); }); describe("insertValueIntoField", () => { @@ -603,7 +566,7 @@ describe("InsertAutofillContentService", () => { insertAutofillContentService["insertValueIntoField"](element, value); expect( - insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"] + insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"], ).not.toHaveBeenCalled(); }); @@ -615,7 +578,7 @@ describe("InsertAutofillContentService", () => { insertAutofillContentService["insertValueIntoField"](element, value); expect( - insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"] + insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"], ).not.toHaveBeenCalled(); }); @@ -629,7 +592,7 @@ describe("InsertAutofillContentService", () => { expect(element.innerText).toBe(value); expect( - insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"] + insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"], ).toHaveBeenCalledWith(element, expect.any(Function)); }); @@ -647,10 +610,10 @@ describe("InsertAutofillContentService", () => { expect(checkboxElement.checked).toBe(true); expect(radioElement.checked).toBe(true); expect( - insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"] + insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"], ).toHaveBeenCalledWith(checkboxElement, expect.any(Function)); expect( - insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"] + insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"], ).toHaveBeenCalledWith(radioElement, expect.any(Function)); checkboxElement.checked = false; @@ -672,14 +635,14 @@ describe("InsertAutofillContentService", () => { expect(textInputElement.value).toBe(value1); expect( - insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"] + insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"], ).toHaveBeenCalledWith(textInputElement, expect.any(Function)); insertAutofillContentService["insertValueIntoField"](textareaElement, value2); expect(textareaElement.value).toBe(value2); expect( - insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"] + insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"], ).toHaveBeenCalledWith(textareaElement, expect.any(Function)); }); }); @@ -692,23 +655,23 @@ describe("InsertAutofillContentService", () => { jest.spyOn(insertAutofillContentService as any, "triggerPostInsertEventsOnElement"); jest.spyOn(insertAutofillContentService as any, "triggerFillAnimationOnElement"); const valueChangeCallback = jest.fn( - () => ((element as FillableFormFieldElement).value = value) + () => ((element as FillableFormFieldElement).value = value), ); insertAutofillContentService["handleInsertValueAndTriggerSimulatedEvents"]( element, - valueChangeCallback + valueChangeCallback, ); expect(insertAutofillContentService["triggerPreInsertEventsOnElement"]).toHaveBeenCalledWith( - element + element, ); expect(valueChangeCallback).toHaveBeenCalled(); expect(insertAutofillContentService["triggerPostInsertEventsOnElement"]).toHaveBeenCalledWith( - element + element, ); expect(insertAutofillContentService["triggerFillAnimationOnElement"]).toHaveBeenCalledWith( - element + element, ); expect((element as FillableFormFieldElement).value).toBe(value); }); @@ -721,24 +684,24 @@ describe("InsertAutofillContentService", () => { const element = document.getElementById("username") as FillableFormFieldElement; jest.spyOn( insertAutofillContentService as any, - "simulateUserMouseClickAndFocusEventInteractions" + "simulateUserMouseClickAndFocusEventInteractions", ); jest.spyOn(insertAutofillContentService as any, "simulateUserKeyboardEventInteractions"); insertAutofillContentService["triggerPreInsertEventsOnElement"](element); expect( - insertAutofillContentService["simulateUserMouseClickAndFocusEventInteractions"] + insertAutofillContentService["simulateUserMouseClickAndFocusEventInteractions"], ).toHaveBeenCalledWith(element); expect( - insertAutofillContentService["simulateUserKeyboardEventInteractions"] + insertAutofillContentService["simulateUserKeyboardEventInteractions"], ).toHaveBeenCalledWith(element); expect(element.value).toBe(initialElementValue); }); }); describe("triggerPostInsertEventsOnElement", () => { - it("triggers simulated event interactions and blurs the element after", () => { + it("triggers simulated event interactions", () => { const elementValue = "test"; document.body.innerHTML = ``; const element = document.getElementById("username") as FillableFormFieldElement; @@ -749,12 +712,11 @@ describe("InsertAutofillContentService", () => { insertAutofillContentService["triggerPostInsertEventsOnElement"](element); expect( - insertAutofillContentService["simulateUserKeyboardEventInteractions"] + insertAutofillContentService["simulateUserKeyboardEventInteractions"], ).toHaveBeenCalledWith(element); expect(insertAutofillContentService["simulateInputElementChangedEvent"]).toHaveBeenCalledWith( - element + element, ); - expect(element.blur).toHaveBeenCalled(); expect(element.value).toBe(elementValue); }); }); @@ -769,7 +731,7 @@ describe("InsertAutofillContentService", () => { it("the element is a non-hidden hidden input type", async () => { document.body.innerHTML = mockLoginForm + ''; const testElement = document.querySelector( - 'input[type="hidden"]' + 'input[type="hidden"]', ) as FillableFormFieldElement; jest.spyOn(testElement.classList, "add"); jest.spyOn(testElement.classList, "remove"); @@ -809,7 +771,7 @@ describe("InsertAutofillContentService", () => { it("the element has a `visibility: hidden;` CSS rule applied to it", () => { const testElement = document.querySelector( - 'input[type="password"]' + 'input[type="password"]', ) as FillableFormFieldElement; testElement.style.visibility = "hidden"; jest.spyOn(testElement.classList, "add"); @@ -824,7 +786,7 @@ describe("InsertAutofillContentService", () => { it("the element has a `display: none;` CSS rule applied to it", () => { const testElement = document.querySelector( - 'input[type="password"]' + 'input[type="password"]', ) as FillableFormFieldElement; testElement.style.display = "none"; jest.spyOn(testElement.classList, "add"); @@ -841,7 +803,7 @@ describe("InsertAutofillContentService", () => { document.body.innerHTML = mockLoginForm + '
'; const testElement = document.querySelector( - 'input[type="email"]' + 'input[type="email"]', ) as FillableFormFieldElement; jest.spyOn(testElement.classList, "add"); jest.spyOn(testElement.classList, "remove"); @@ -857,11 +819,11 @@ describe("InsertAutofillContentService", () => { describe("will trigger the animation when...", () => { it("the element is a non-hidden password field", () => { const testElement = document.querySelector( - 'input[type="password"]' + 'input[type="password"]', ) as FillableFormFieldElement; jest.spyOn( insertAutofillContentService["domElementVisibilityService"], - "isElementHiddenByCss" + "isElementHiddenByCss", ); jest.spyOn(testElement.classList, "add"); jest.spyOn(testElement.classList, "remove"); @@ -870,20 +832,20 @@ describe("InsertAutofillContentService", () => { jest.advanceTimersByTime(200); expect( - insertAutofillContentService["domElementVisibilityService"].isElementHiddenByCss + insertAutofillContentService["domElementVisibilityService"].isElementHiddenByCss, ).toHaveBeenCalledWith(testElement); expect(testElement.classList.add).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); expect(testElement.classList.remove).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); }); it("the element is a non-hidden email input", () => { document.body.innerHTML = mockLoginForm + ''; const testElement = document.querySelector( - 'input[type="email"]' + 'input[type="email"]', ) as FillableFormFieldElement; jest.spyOn(testElement.classList, "add"); jest.spyOn(testElement.classList, "remove"); @@ -892,17 +854,17 @@ describe("InsertAutofillContentService", () => { jest.advanceTimersByTime(200); expect(testElement.classList.add).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); expect(testElement.classList.remove).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); }); it("the element is a non-hidden text input", () => { document.body.innerHTML = mockLoginForm + ''; const testElement = document.querySelector( - 'input[type="text"]' + 'input[type="text"]', ) as FillableFormFieldElement; jest.spyOn(testElement.classList, "add"); jest.spyOn(testElement.classList, "remove"); @@ -911,17 +873,17 @@ describe("InsertAutofillContentService", () => { jest.advanceTimersByTime(200); expect(testElement.classList.add).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); expect(testElement.classList.remove).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); }); it("the element is a non-hidden number input", () => { document.body.innerHTML = mockLoginForm + ''; const testElement = document.querySelector( - 'input[type="number"]' + 'input[type="number"]', ) as FillableFormFieldElement; jest.spyOn(testElement.classList, "add"); jest.spyOn(testElement.classList, "remove"); @@ -930,10 +892,10 @@ describe("InsertAutofillContentService", () => { jest.advanceTimersByTime(200); expect(testElement.classList.add).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); expect(testElement.classList.remove).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); }); @@ -947,10 +909,10 @@ describe("InsertAutofillContentService", () => { jest.advanceTimersByTime(200); expect(testElement.classList.add).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); expect(testElement.classList.remove).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); }); @@ -964,10 +926,10 @@ describe("InsertAutofillContentService", () => { jest.advanceTimersByTime(200); expect(testElement.classList.add).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); expect(testElement.classList.remove).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); }); @@ -981,10 +943,10 @@ describe("InsertAutofillContentService", () => { jest.advanceTimersByTime(200); expect(testElement.classList.add).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); expect(testElement.classList.remove).toHaveBeenCalledWith( - "com-bitwarden-browser-animated-fill" + "com-bitwarden-browser-animated-fill", ); }); }); @@ -1007,11 +969,11 @@ describe("InsertAutofillContentService", () => { const inputElement = document.querySelector('input[type="text"]') as HTMLInputElement; inputElement.value = "test"; jest.spyOn(inputElement, "focus"); - jest.spyOn(window, "String"); + jest.spyOn(globalThis, "String"); insertAutofillContentService["triggerFocusOnElement"](inputElement, true); - expect(window.String).toHaveBeenCalledWith(value); + expect(globalThis.String).toHaveBeenCalledWith(value); expect(inputElement.focus).toHaveBeenCalled(); expect(inputElement.value).toEqual(value); }); @@ -1021,11 +983,11 @@ describe("InsertAutofillContentService", () => { const inputElement = document.querySelector('input[type="text"]') as HTMLInputElement; inputElement.value = "test"; jest.spyOn(inputElement, "focus"); - jest.spyOn(window, "String"); + jest.spyOn(globalThis, "String"); insertAutofillContentService["triggerFocusOnElement"](inputElement, false); - expect(window.String).not.toHaveBeenCalledWith(); + expect(globalThis.String).not.toHaveBeenCalledWith(); expect(inputElement.focus).toHaveBeenCalled(); expect(inputElement.value).toEqual(value); }); @@ -1040,11 +1002,11 @@ describe("InsertAutofillContentService", () => { insertAutofillContentService["simulateUserMouseClickAndFocusEventInteractions"](inputElement); expect(insertAutofillContentService["triggerClickOnElement"]).toHaveBeenCalledWith( - inputElement + inputElement, ); expect(insertAutofillContentService["triggerFocusOnElement"]).toHaveBeenCalledWith( inputElement, - false + false, ); }); }); @@ -1058,7 +1020,7 @@ describe("InsertAutofillContentService", () => { [EVENTS.KEYDOWN, EVENTS.KEYPRESS, EVENTS.KEYUP].forEach((eventName) => { expect(inputElement.dispatchEvent).toHaveBeenCalledWith( - new KeyboardEvent(eventName, { bubbles: true }) + new KeyboardEvent(eventName, { bubbles: true }), ); }); }); @@ -1073,7 +1035,7 @@ describe("InsertAutofillContentService", () => { [EVENTS.INPUT, EVENTS.CHANGE].forEach((eventName) => { expect(inputElement.dispatchEvent).toHaveBeenCalledWith( - new Event(eventName, { bubbles: true }) + new Event(eventName, { bubbles: true }), ); }); }); diff --git a/apps/browser/src/autofill/services/insert-autofill-content.service.ts b/apps/browser/src/autofill/services/insert-autofill-content.service.ts index ad40b76fbcd..813baa5922f 100644 --- a/apps/browser/src/autofill/services/insert-autofill-content.service.ts +++ b/apps/browser/src/autofill/services/insert-autofill-content.service.ts @@ -1,14 +1,20 @@ -import { EVENTS, TYPE_CHECK } from "../constants"; +import { EVENTS, TYPE_CHECK } from "@bitwarden/common/autofill/constants"; + import AutofillScript, { AutofillInsertActions, FillScript } from "../models/autofill-script"; import { FormFieldElement } from "../types"; +import { + currentlyInSandboxedIframe, + elementIsFillableFormField, + elementIsInputElement, + elementIsSelectElement, + elementIsTextAreaElement, +} from "../utils"; +import { DomElementVisibilityService } from "./abstractions/dom-element-visibility.service"; import { InsertAutofillContentService as InsertAutofillContentServiceInterface } from "./abstractions/insert-autofill-content.service"; -import CollectAutofillContentService from "./collect-autofill-content.service"; -import DomElementVisibilityService from "./dom-element-visibility.service"; +import { CollectAutofillContentService } from "./collect-autofill-content.service"; class InsertAutofillContentService implements InsertAutofillContentServiceInterface { - private readonly domElementVisibilityService: DomElementVisibilityService; - private readonly collectAutofillContentService: CollectAutofillContentService; private readonly autofillInsertActions: AutofillInsertActions = { fill_by_opid: ({ opid, value }) => this.handleFillFieldByOpidAction(opid, value), click_on_opid: ({ opid }) => this.handleClickOnFieldByOpidAction(opid), @@ -20,55 +26,29 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf * DomElementVisibilityService and CollectAutofillContentService classes. */ constructor( - domElementVisibilityService: DomElementVisibilityService, - collectAutofillContentService: CollectAutofillContentService - ) { - this.domElementVisibilityService = domElementVisibilityService; - this.collectAutofillContentService = collectAutofillContentService; - } + private domElementVisibilityService: DomElementVisibilityService, + private collectAutofillContentService: CollectAutofillContentService, + ) {} /** * Handles autofill of the forms on the current page based on the * data within the passed fill script object. * @param {AutofillScript} fillScript + * @returns {Promise} * @public */ - fillForm(fillScript: AutofillScript) { + async fillForm(fillScript: AutofillScript) { if ( !fillScript.script?.length || - this.fillingWithinSandboxedIframe() || + currentlyInSandboxedIframe() || this.userCancelledInsecureUrlAutofill(fillScript.savedUrls) || - this.userCancelledUntrustedIframeAutofill(fillScript) || - this.tabURLChanged(fillScript.savedUrls) + this.userCancelledUntrustedIframeAutofill(fillScript) ) { return; } - fillScript.script.forEach(this.runFillScriptAction); - } - - /** - * Determines if the page URL no longer matches one of the cipher's savedURL domains - * @param {string[] | null} savedUrls - * @returns {boolean} - * @private - */ - private tabURLChanged(savedUrls?: AutofillScript["savedUrls"]): boolean { - return savedUrls && !savedUrls.some((url) => url.startsWith(window.location.origin)); - } - - /** - * Identifies if the execution of this script is happening - * within a sandboxed iframe. - * @returns {boolean} - * @private - */ - private fillingWithinSandboxedIframe() { - return ( - String(self.origin).toLowerCase() === "null" || - window.frameElement?.hasAttribute("sandbox") || - window.location.hostname === "" - ); + const fillActionPromises = fillScript.script.map(this.runFillScriptAction); + await Promise.all(fillActionPromises); } /** @@ -80,8 +60,8 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf */ private userCancelledInsecureUrlAutofill(savedUrls?: string[] | null): boolean { if ( - !savedUrls?.some((url) => url.startsWith(`https://${window.location.hostname}`)) || - window.location.protocol !== "http:" || + !savedUrls?.some((url) => url.startsWith(`https://${globalThis.location.hostname}`)) || + globalThis.location.protocol !== "http:" || !this.isPasswordFieldWithinDocument() ) { return false; @@ -89,10 +69,10 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf const confirmationWarning = [ chrome.i18n.getMessage("insecurePageWarning"), - chrome.i18n.getMessage("insecurePageWarningFillPrompt", [window.location.hostname]), + chrome.i18n.getMessage("insecurePageWarningFillPrompt", [globalThis.location.hostname]), ].join("\n\n"); - return !confirm(confirmationWarning); + return !globalThis.confirm(confirmationWarning); } /** @@ -102,13 +82,7 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf * @private */ private isPasswordFieldWithinDocument(): boolean { - return Boolean( - this.collectAutofillContentService.queryAllTreeWalkerNodes( - document.documentElement, - (node: Node) => node instanceof HTMLInputElement && node.type === "password", - false - )?.length - ); + return this.collectAutofillContentService.isPasswordFieldWithinDocument(); } /** @@ -130,29 +104,36 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf const confirmationWarning = [ chrome.i18n.getMessage("autofillIframeWarning"), - chrome.i18n.getMessage("autofillIframeWarningTip", [window.location.hostname]), + chrome.i18n.getMessage("autofillIframeWarningTip", [globalThis.location.hostname]), ].join("\n\n"); - return !confirm(confirmationWarning); + return !globalThis.confirm(confirmationWarning); } /** * Runs the autofill action based on the action type and the opid. * Each action is subsequently delayed by 20 milliseconds. - * @param {FillScriptActions} action + * @param {"click_on_opid" | "focus_by_opid" | "fill_by_opid"} action * @param {string} opid * @param {string} value * @param {number} actionIndex + * @returns {Promise} + * @private */ - private runFillScriptAction = ([action, opid, value]: FillScript, actionIndex: number): void => { + private runFillScriptAction = ( + [action, opid, value]: FillScript, + actionIndex: number, + ): Promise => { if (!opid || !this.autofillInsertActions[action]) { return; } const delayActionsInMilliseconds = 20; - setTimeout( - () => this.autofillInsertActions[action]({ opid, value }), - delayActionsInMilliseconds * actionIndex + return new Promise((resolve) => + setTimeout(() => { + this.autofillInsertActions[action]({ opid, value }); + resolve(); + }, delayActionsInMilliseconds * actionIndex), ); }; @@ -179,11 +160,18 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf /** * Handles finding an element by opid and triggering click and focus events on the element. - * @param {string} opid - * @private + * To ensure that we trigger a blur event correctly on a filled field, we first check if the + * element is already focused. If it is, we blur the element before focusing on it again. + * + * @param {string} opid - The opid of the element to focus on. */ private handleFocusOnFieldByOpidAction(opid: string) { const element = this.collectAutofillContentService.getAutofillFieldElementByOpid(opid); + + if (document.activeElement === element) { + element.blur(); + } + this.simulateUserMouseClickAndFocusEventInteractions(element, true); } @@ -197,8 +185,8 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf */ private insertValueIntoField(element: FormFieldElement | null, value: string) { const elementCanBeReadonly = - element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement; - const elementCanBeFilled = elementCanBeReadonly || element instanceof HTMLSelectElement; + elementIsInputElement(element) || elementIsTextAreaElement(element); + const elementCanBeFilled = elementCanBeReadonly || elementIsSelectElement(element); if ( !element || @@ -209,13 +197,13 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf return; } - if (element instanceof HTMLSpanElement) { + if (!elementIsFillableFormField(element)) { this.handleInsertValueAndTriggerSimulatedEvents(element, () => (element.innerText = value)); return; } const isFillableCheckboxOrRadioElement = - element instanceof HTMLInputElement && + elementIsInputElement(element) && new Set(["checkbox", "radio"]).has(element.type) && new Set(["true", "y", "1", "yes", "✓"]).has(String(value).toLowerCase()); if (isFillableCheckboxOrRadioElement) { @@ -235,7 +223,7 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf */ private handleInsertValueAndTriggerSimulatedEvents( element: FormFieldElement, - valueChangeCallback: CallableFunction + valueChangeCallback: CallableFunction, ): void { this.triggerPreInsertEventsOnElement(element); valueChangeCallback(); @@ -276,7 +264,6 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf } this.simulateInputElementChangedEvent(element); - element.blur(); } /** @@ -287,7 +274,7 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf */ private triggerFillAnimationOnElement(element: FormFieldElement): void { const skipAnimatingElement = - !(element instanceof HTMLSpanElement) && + elementIsFillableFormField(element) && !new Set(["email", "text", "password", "number", "tel", "url"]).has(element?.type); if (this.domElementVisibilityService.isElementHiddenByCss(element) || skipAnimatingElement) { @@ -343,7 +330,7 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf */ private simulateUserMouseClickAndFocusEventInteractions( element: FormFieldElement, - shouldResetValue = false + shouldResetValue = false, ): void { this.triggerClickOnElement(element); this.triggerFocusOnElement(element, shouldResetValue); @@ -355,9 +342,10 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf * @private */ private simulateUserKeyboardEventInteractions(element: FormFieldElement): void { - [EVENTS.KEYDOWN, EVENTS.KEYPRESS, EVENTS.KEYUP].forEach((eventType) => - element.dispatchEvent(new KeyboardEvent(eventType, { bubbles: true })) - ); + const simulatedKeyboardEvents = [EVENTS.KEYDOWN, EVENTS.KEYPRESS, EVENTS.KEYUP]; + for (let index = 0; index < simulatedKeyboardEvents.length; index++) { + element.dispatchEvent(new KeyboardEvent(simulatedKeyboardEvents[index], { bubbles: true })); + } } /** @@ -367,9 +355,10 @@ class InsertAutofillContentService implements InsertAutofillContentServiceInterf * @private */ private simulateInputElementChangedEvent(element: FormFieldElement): void { - [EVENTS.INPUT, EVENTS.CHANGE].forEach((eventType) => - element.dispatchEvent(new Event(eventType, { bubbles: true })) - ); + const simulatedInputEvents = [EVENTS.INPUT, EVENTS.CHANGE]; + for (let index = 0; index < simulatedInputEvents.length; index++) { + element.dispatchEvent(new Event(simulatedInputEvents[index], { bubbles: true })); + } } } diff --git a/apps/browser/src/autofill/shared/styles/variables.scss b/apps/browser/src/autofill/shared/styles/variables.scss new file mode 100644 index 00000000000..ad3924e37a9 --- /dev/null +++ b/apps/browser/src/autofill/shared/styles/variables.scss @@ -0,0 +1,132 @@ +īģŋ@import "~nord/src/sass/nord.scss"; + +$dark-icon-themes: "theme_dark", "theme_solarizedDark", "theme_nord"; + +$font-family-sans-serif: "DM Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; +$font-family-source-code-pro: "Source Code Pro", monospace; +$font-size-base: 14px; +$text-color: #212529; +$muted-text-color: #6c747c; +$border-color: #ced4dc; +$border-color-dark: #ddd; +$border-radius: 3px; +$focus-outline-color: #1252a3; +$muted-blue: #5a6d91; +$password-special-color: #b80017; +$password-number-color: #1452c1; + +$brand-primary: #175ddc; + +$background-color: #ffffff; +$background-offset-color: #f0f0f0; + +$solarizedDarkBase0: #839496; +$solarizedDarkBase03: #002b36; +$solarizedDarkBase02: #073642; +$solarizedDarkBase01: #586e75; +$solarizedDarkBase2: #eee8d5; +$solarizedDarkCyan: #2aa198; +$solarizedDarkGreen: #859900; + +$success-color-light: #017e45; +$success-color-dark: #8db89b; + +$error-color-light: #c83522; +$error-color-dark: #ee9792; + +$themes: ( + light: ( + textColor: $text-color, + mutedTextColor: $muted-text-color, + backgroundColor: $background-color, + backgroundOffsetColor: $background-offset-color, + primaryColor: $brand-primary, + buttonPrimaryColor: $brand-primary, + textContrast: $background-color, + inputBorderColor: darken($border-color-dark, 2.75%), + inputBackgroundColor: #ffffff, + borderColor: $border-color, + focusOutlineColor: $focus-outline-color, + successColor: $success-color-light, + errorColor: $error-color-light, + passkeysAuthenticating: $muted-blue, + passwordSpecialColor: $password-special-color, + passwordNumberColor: $password-number-color, + ), + dark: ( + textColor: #ffffff, + mutedTextColor: #bac0ce, + backgroundColor: #2f343d, + backgroundOffsetColor: darken(#2f343d, 2.75%), + buttonPrimaryColor: #6f9df1, + primaryColor: #6f9df1, + textContrast: #2f343d, + inputBorderColor: #4c525f, + inputBackgroundColor: #2f343d, + borderColor: #4c525f, + focusOutlineColor: lighten($focus-outline-color, 25%), + successColor: $success-color-dark, + errorColor: $error-color-dark, + passkeysAuthenticating: #bac0ce, + passwordSpecialColor: #ff8d85, + passwordNumberColor: #6f9df1, + ), + nord: ( + textColor: $nord5, + mutedTextColor: $nord4, + backgroundColor: $nord1, + backgroundOffsetColor: darken($nord1, 2.75%), + buttonPrimaryColor: $nord8, + primaryColor: $nord9, + textContrast: $nord2, + inputBorderColor: $nord0, + inputBackgroundColor: $nord2, + borderColor: $nord0, + focusOutlineColor: lighten($focus-outline-color, 25%), + successColor: $success-color-dark, + passkeysAuthenticating: $nord4, + passwordSpecialColor: $nord12, + passwordNumberColor: $nord8, + ), + solarizedDark: ( + textColor: $solarizedDarkBase2, + // Muted uses main text color to avoid contrast issues + mutedTextColor: $solarizedDarkBase2, + backgroundColor: $solarizedDarkBase03, + backgroundOffsetColor: darken($solarizedDarkBase03, 2.75%), + buttonPrimaryColor: $solarizedDarkCyan, + primaryColor: $solarizedDarkGreen, + textContrast: $solarizedDarkBase02, + inputBorderColor: rgba($solarizedDarkBase2, 0.2), + inputBackgroundColor: $solarizedDarkBase01, + borderColor: $solarizedDarkBase2, + focusOutlineColor: lighten($focus-outline-color, 15%), + successColor: $success-color-dark, + passkeysAuthenticating: $solarizedDarkBase2, + passwordSpecialColor: #b58900, + passwordNumberColor: $solarizedDarkCyan, + ), +); + +@mixin themify($themes: $themes) { + @each $theme, $map in $themes { + .theme_#{$theme} & { + $theme-map: () !global; + @each $key, $submap in $map { + $value: map-get(map-get($themes, $theme), "#{$key}"); + $theme-map: map-merge( + $theme-map, + ( + $key: $value, + ) + ) !global; + } + @content; + $theme-map: null !global; + } + } +} + +@function themed($key) { + @return map-get($theme-map, $key); +} diff --git a/apps/browser/src/autofill/shared/styles/webfonts.scss b/apps/browser/src/autofill/shared/styles/webfonts.scss new file mode 100644 index 00000000000..6433060c534 --- /dev/null +++ b/apps/browser/src/autofill/shared/styles/webfonts.scss @@ -0,0 +1,491 @@ +/* cyrillic-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAAAQMAA8AAAAAB5AAAAO0AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbgTYcOgZgP1NUQVReAFQREAqBbIFxCxAAATYCJAMcBCAFhHgHSBt+Bgi+DJhjiLKs+yJRTbogxxKbIXMfd0QzZTgfG/4m7I5QyXmefr9nv/a59hCX5N7MGqWZZbHGdNHMEC2qJIYS8P99yO7zzZ5RaY5w9DELzTJiB9bp4s6oXDRxnS6deHj+Xj33Z04PxhOKT4tHx2qL3YItLpKSLbFqXmPkfLHLUtNxxzgbJx/MRlr0azc4z1cfBD8efNCGcbETQdU21zRR+5+znr1PfyonGzyahyn2vFeyiuxhYyywKVbCNWjTv2LPa90gBbZlO7OT9i1J2kwmY7kBAS9eFOMBDBRBT0QrGkVUgr6WWRQ1HZ1eBt3sc3TQg8M00CMLOqDXAc8EFQn/IyBKKonMG40fDMmIIChmitYajOiL2GYWsUGiqCU719aJQ/REjZ6YLRsxPn1k/mDUAyEaQSvZ7sjxHubruXbtihOgAYXtdf58zivQjPOfwHVrL1q1MbsIausg8Ee2rubGyCuY9Bd75t/0LsIp8gn1MuoBJosU0VNhuAjMJ9yHPZkQDh9kj0BOXkAnOQQzZYtWKUpMAASVKFHnMuULQYmxwoBCiSsgjbQO9NdT1Bhg8mAm/3tvm/uSSLr38OdsEAAQlZ6+BugSKYgODESNNeAQGAz6A4CSELqthKHPR/XuXd+THz58ybGv3/ud+vb5yNF5j+LHrznxJZ7x7tNxcvfj/gTcS4urlvVk/0if9Lmjb1E4+nrv1pu9vZJ5I780fPWurJu7tlD99J9nP7aPv7pHSsrnl5vUNSnlybh7//d9RU3ErNeO0Vouc/ih2csm5J1HUnmC7MstrQN1VZfE79fZhWP9UaiHImMV6LSXC6lIIGn4E/WpiqDyrPfXrfJSuv8l9MDnj49/AN8OfMmlrdF1oFVA+Iim7hbEyVQfBLGqyz/3GqD0dbqdOERS/kaswTpTCNaIPEFWBAM9kJN8H9yLPA8xNBJRDPQfKku8RW2qa2iMdRqtyXR5oEXaFaG/+Yi+pqI20H8YK9FIajzX97wTxGMXzhBgmuAJ0ClCZnEOQ4BujSLMI1vDKCQyT1+nx9KpTh1XiENh8bhquRS6WpxDUmfOqGlzLIxpSYDJVWMRI/HpAhyrGAeHOBPVpFa9ek3so0MTte28nS5j5swZ01Xc6fYqax3CWfZx+leoRvV6eGqZjKFXnj7PwamYEA81wOeRcQ4XVf5IjzsjEiUZ8gVRCeGMkJTjJDpGxJk8rjq82uNypoJA6Pw/jKztSJZKZUFEpql34auEocUY31QaRpuHbXB4BA==) + format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* hebrew */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* math */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0330, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, + U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2034-2037, U+2057, U+20D0-20DC, U+20E1, + U+20E5-20EF, U+2102, U+210A-210E, U+2110-2112, U+2115, U+2119-211D, U+2124, U+2128, U+212C-212D, + U+212F-2131, U+2133-2138, U+213C-2140, U+2145-2149, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, + U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, + U+2336-237A, U+237C, U+2395, U+239B-23B6, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, + U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, + U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, + U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, + U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, + U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, + U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, + U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, + U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, + U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, + U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, + U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, + U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, + U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, + U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, + U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, + U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8B1, + U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, + U+1FA80-1FA88, U+1FA90-1FABD, U+1FABF-1FAC5, U+1FACE-1FADB, U+1FAE0-1FAE8, U+1FAF0-1FAF8, + U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, + U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, + U+FFFD; +} + +/* cyrillic-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAAAPwAA8AAAAAB6wAAAOWAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbgTYcOgZgP1NUQVRaAFQREAqBbIFwCxAAATYCJAMcBCAFhRYHSBuXBhAeibGthq3ESc/J4sXi4T89+O6bTPBpLoiK6kR2sKs9Wwn5ce339j/qyYa55zPdzRDPWgmVrBlPhEoDBNntJzniBYIHBWIJZ8SpnGzwaF5zoQCFLCKjc+jeVA11gZZwDepFQ8XppZIWzJd5plal33KmajsVEx1Tkfeerz29kAwGoKsQaIRQCaUkFAIdzbchcfXapS3A65D5gIcZHuBtqAzwUUQIWAK0rYSQnstDwfWkBFmsEAiXHytJpTukI8JWK5CVMoQs0olVu1SERsjg4HhFkMGslE8rXyxEaaUSaVNe8XHvYPrUVeWALQT7nC+LX5WUs/KbuAb9CaQz8xJQLAcBf2Jdr86iV4b95vz/7qL5P51L3Ah5ffmC4RKE0CjQWxyTxY4/UNgIcfzYAoE47BjFR8ViRiqSpJCkGAIQCEEMil8RSDGQDpAwhQLfmWA50FkjyehieG0p+6ptOb5itL+133/z1DfjIQAQCo2OuqjbVjeEGnRFxlJgH6A70BkApLaVenbr1PPki08++KDjOR999Fmc+fn3nc799tMTzvj0w1T/+PM4+7OzLR98cnI8frxLJ7iP8Yt31Iv/4/JB33TGdXc91vGMd9fsyX7v3qn3XS/9e8Td9/1/xJ0vb9/n7m8v3W7qMz99NenpK7ddN/b/yP7p57wbb379vH3SQ9fPp/9y05vnHADGvq8G7NZ1e9e1b/RZsNxacJdvexyTGp2o9y5c0zXlgen9v3tij36jjvmTx0mIvYBa9f/d7dUZov25HlW+2VGg8OI2+989tE+3od+aTg349I3n/oBvT/787mvbagZQSSD4iL76RuHk8QxIc6zOb3oWUm8oViudcCHfFrvOVxshZqmEW86SQHffCpE74L4Y3SEMj4ykq99RmO19Mk9QGugelaEu0dVsO+guz5TYQ4b5iZCYyQgdjcRAGfpODpoTg5mOxJBz2R4RUITmCQqfQ7OCYIL+srscOsG2y+Cw2IRlBp1DCqyKGELYpjrEyaOFyIBWrTgN44gIXAvO4WtBMJZWq2Ysab0y3bzY2mFgqhAx93dq0aYNJ1T5oFmrVs0Ooyc2FrNIPgXzmcbcOomIHGIxWliHNlgc22IzYO2hNQzhMmia1DgZNkTcclhduAivKYtD8pIqtzREMHJKEBafwUSEBK4VeSHCpVQvptFsrzPTyZpIUSjMjBxl/j/8WGxy+2R5tNO+tms1JqemAQAA) + format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* hebrew */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* math */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0330, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, + U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2034-2037, U+2057, U+20D0-20DC, U+20E1, + U+20E5-20EF, U+2102, U+210A-210E, U+2110-2112, U+2115, U+2119-211D, U+2124, U+2128, U+212C-212D, + U+212F-2131, U+2133-2138, U+213C-2140, U+2145-2149, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, + U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, + U+2336-237A, U+237C, U+2395, U+239B-23B6, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, + U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, + U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, + U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, + U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, + U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, + U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, + U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, + U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, + U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, + U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, + U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, + U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, + U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, + U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, + U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, + U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8B1, + U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, + U+1FA80-1FA88, U+1FA90-1FABD, U+1FABF-1FAC5, U+1FACE-1FADB, U+1FAE0-1FAE8, U+1FAF0-1FAF8, + U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, + U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, + U+FFFD; +} + +/* cyrillic-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAAC9sAA8AAAAAX/wAAC8QAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk4bingcOgZgP1NUQVRaAHQREAqBjyDzIQuDOAABNgIkA4ZkBCAFhGAHkCEbPU9VRoaNAyAwtx0wEiFsHCDijWkUJYwzNfj/WwInQyy4h6q6vUghoSJIRpJqqg2AzEoKZiR0ISBRarEteArXg6lpU8ucrCuv4l9kYSfS2lcjeWbueQyMXiyJB/fhIquIR7+WT/8/vPcx3Rba5fEjtPQRL5T82L8/STbJeQUCV6NbScISKGJVIyp0jagtS1Rlx/+rSwb/XjkPye3BOYA5aI+okDqFtgK+rlunVkp7d3jI2z+zMUTKKMc1Y1jDsDHu7baZjZmNGXNstmGYa9w5ylXIGUlIkXRpdf8c3d//X8fv+PV16f9+/fq/4/6+IWNrhJoJDdapYlXU/09QGZhnCG2xyz6JsA1kiJ1nx/unSfmsfwE4VcvaH/3L5Dr1/253pRwU9BvXmqMQVPhR59uTZDu29J7d8trDCWiYb73JcfgDsPyW+Lol1+2gSBBoQACC6mqzrKgyuapcMCC4H1ky4sYYPIQkWKoIJv9PZ9mObO+dHLZDB+QLcdEdvT5FnxZL6c/ImtHIJNkbyVoveI/sQx+hpd1D3wUIK8SFEFHH3HGVok9FfcFcpejaXBX4L5dKT/sk29GmVcrCsEv72jShjAgKYQdD4Nro7sCyEIP4X8QhCG8wGAyG1LT93mwH1BynQR6d0H6uyV59ezLOWpQQGROQFULo278dexlOZ0xuWsSqWIDQybgYKII5KKwCARF7gJbITe6A07NBFBHooQKGCdWiNDSUytAoWnMzuRzEWZSzXoYsYoGVHq7VCE4ntX27S6ezBR27dTqX2a5vp0vS/j2rgf7iQREuYpB9LyAuq3pwMw8nABl2PgYdc1HNbp4UHORigvBXOIDDHyvMMQb5/6MkE36V54PVVHjDjaJlDSBpwW7gFzRWH/5rccBi5UmpDEkkVKzYoilCQfKXl9yFlJ2sZC5jzpklfsWXeBcv4lHciWtxIU7FkdgXujgckzEWQ9EXndEajVETZVEYuZEVq42lxaXiEAQ3onD2lAiLwPCNTeEWTmETCHvaZrw84IzyNP/uPxhJuvonf9PSM3/gt/yKn/MTURr9gu9h3hMzPu37fcQHvcfbvdnrvcpLvcCzXeapnuh85zjDSR7iBPdxT0e5g5Jr7N7u4Ot9DRUpyB/7Zh/slT2xe3bDLtkZO6bmbrXzdtKO2pSN27DttC7bZlttc3Ctwootz5SWYRITWmzUGNtoFoEefS4VPVaeOq8YG9fpJw8GrYalVnbReQIHLKzTi9CwAFaft9bzh23HD/nn6nQGVC+N1hPV+hB216mgd1qL9dpvBZVqlb5+o5XlPFa3loBu4DmVoMVhEvww2ep0WAKTO33c5Vqe6xNUjRKjYjRzZ6PCOCmVcvkazurcqRV+Z+o+rfdz8dwVTo+qK5ejtt15hP6AXnrtojmLJruNFMLXMSht5d3G0ssAxaHtir0Bo5SqjwaqReIuNAuobJbzMXIBK+UEO91JaiXZrLUsRBmBWcfjKciPyT5V8stpHlM0DhoQm0F6rPW3sjuAj+mVr3ehUj2agIdqDlZvmw/5rnmtb2MkXmTG7aT6p3KzCz1sVGeZadhKhGZB7/zMIuZuZaK1lTQtRro8KMSXVQA22MGktlq8bJ127bHl+O869P5/kWp4ll4cXqwPL78l0DMNGAoB9SUYu85TOOhnEYBM1SLgsU0d+0zxTg427ASX+sjRuhVkGKT7aJutBsPi04AtHh0qwPFiz8nLMGPgG6yzPQRk0Kn+JqIH3Dhr6k+Av1LxchE7IAjFCgMwUFASANCnGQ0yke5zD3PiSwYLuZqAE9uBok3JHHP0u/ZXIlib1ajtOpQWysG3wVTVaas6dfTCRWP9sPj/+wP+Pv/e/14xJOxmpbe5w01uMXZgxPZK9A94CeMfMwbdr80L4P4SBDYFdCmQZ7fRhB0l/Njl0GPu1VUOQJjfPAgZs5YUAdUlHyQNDzcBG507QhlUthfDJSLKJZYnlMQKn1DT8D5QAlVg9izDHeKSLMGlpmlSyVWJh4uBDtmbkRgoJJ5QNRIYU29nht44h93QHAI4Rt6m5mgdx29DtV054vBmyThjjjs2eIXXaTfaf0uDkayXB5pRALXmaP/c49cInJjVE4IxLjEhSQXliMdaghdiMQ5ByjfanaPlXCkh1tMv/RSMKbokKbXOrfES7fAabcfjmvPZRxfkDsOAkCGAMYwM+ILfr6vFYVVhOonleFw5l5Dg3FofrVVRDovIZFfK+6W89kK4FLkBIRBKs2kuWzAazzecnbQ2m6RxR9Z1vB5CSYAyMt8ocH0vfj7WVE//UfN4XRilk8bZ8RJBwCStOeimxE2i6UQ/HF2UKjEviExskiQpYzC+PhgDT7OkEwwqhQtdmUlnw9Fu+6mdtow0u4UVWZ3oszHjFx4XBjGQGpQYzEGNT62ONkCoMzbIOlzME3XDJBq6IzDhJJkJnKkqpXxiOKvzsKfarpj0NEfs3Utrg/JB4tjo0nz875yFGoh37m5Xi7BOYRF5I4QyOt6PlFwtdogUa90mdw/3QTKJgWJJNb6oqQRCwbAzX5+ixYW2jWj9WZOlLkeiWmYVyU02R94ypBiGPCC7XIy/n3eIi41Se6W0jSbbbnXPglH7gOCHSFSd54teLjl1Fnh1gsa9kkkaW8YJtcaQaZtA+5/Aj4rD1Kspw+RMLUidJvR5CeRkrdnay0Y3C0c46zXkUrOi7wDOPTql8V2UrmaPtXsvo8vCYrCaepcMQ3LGfUjk7pBcWa6abVr1psJUUvufL6SZqrKEfCiiTlkzY+PTiE1ODNcLTwn3mMwyAehJXw4T5HQKTD6qQt1bTcAyS035SOa9lAlIKmMTuWCkcITf3xBL08hRUCViJfLlkhPQemh0aiGJpMcbxcPC4VVSkzUrHY40Fl5bOL1j+mv/QrDjzVW5tatjRRwuFXoAZnQBiqnnFOB1ZAQBAUJRdfbrO1QYYS6kxmrJm2Kx8Xxj2sF6bKPrdppJCBLJsM0va21xOlktsSQkYNnS+PUgQoAzBC2DxR7toKuryPk2py6ckey+b1mL5cc8pYsfMF2ZDei/8oFmL+a0vah3BLOCmaSpMlL4B/NTCob2JC3R8qvJihx0n0KQAhMr4SPCYokMvGrrcv800oLq6vI85hMtL7trGvNj1VxxeG7zi+L1fTi3pxCeIS9HHaM5coT/xg+b0pbYAApYhh3gHNO4rCucVsGkcjfynhm/LxUmzD3WPrBW0TEHE7IdEMrnKzwHAn2j/vP+W00UCm3Gv8EZDGj4hZSBrlKRTXL7rwQoYLw91Z1FYyli1jAle4jS90Ct0d69TjM0EI6P4YkSxygbjeqyS+dk7VIZyxxxfKVrBDFb3XqB+vYXQKgdZvw6UnTu0L3bj1ckfxFNF/4xI7tSDXZWRCwqj0I+McjBk+53MviBE/VESnYsrLKzW5h/UTwWvbAhCqvIrqG0QMD7UwbGAEvb7PqUxIt/nNV3D3FZoT/mXijOB6+Mb8so3qPSFcl7fQWSS0k+pD4yKZBtdBA4N9Ex3yYDuLYrsVASVZ1wBCLml3PnVpc7dQcH9aCmgLJizp2sRIQn/juqB6GYHKayhnyxPx743DupDBT6Ofc/TPXhbfqs/dr3cN9p35WKlqZp/nPjfAsVydY71gv5TTcByHSoXAUKmyRmN7dAdNd89rtzlLFxR3mphnPj7+kzJ1UKxhBp5+SWI5MTbysFjvkbkveYj9mHT9U0rct7mS8o6l1CAUnqUfrjzQsgfTAMtDBgzBVVWa6ZT/gMWXqsfJxchQHY1o7HRDxOxpkV8mdgAwB6aJTeR7T0ZpM3F9IHC3P26HAphPHMkZ3vgA4IEcDXFsZ1ChCSqMZWqw0EOFhFxl94ZQBKhlds7xbCDStUvlvYz9oeBkgMeGyYHFS6VFetevzbYTKwxFdA11y1dDzAKtMPG2dWB8YizWS0xJ7ODdKHAEK7DxYRUGkwQH3ylUx4lpeWt/UBqmhS6oe2cigiZ9IqdEOgt1zyjeyOqZRuKfLADQWNDs2n5+b/fATovexedrrTBJ6pJeg+anxklicqEyaGDCuH3g5wxDNArTEZjg67z/M0Me6DifH1KLUizqeMAkc4ZdEnmNX1TkbknYwRYWp8XFEf4JtcijkW+Tfl5CfJcFSVWXU1uWOhDb2N6nrglJl3jLP86eTr6LWwUaJHDgM6SwUTOME8qpRKadygtWUjswrP0omsUS7+LpYqvlJsg7x0FIx3cV1Oi/WStdzWZF+DN1I02fs/oJZTJLOKLY9TIDVMEcYiVUa+uFC/0ZvMwUCLo0XuaZWBG05XTLOnthSMmHGaj1eUAUxHl8tsaLwxGa1kjjb/AOmZdZLeiI+2M1NjIFXyVh9udkaT/pbazniq4sDmC6H3BRgVPh/TCBAZZ33OUjOcn5rnmrzA6Qc9cf5oSedlTqnmWx4QBM4oDdX7VhUrYwNbdrky77T/mh+xfufrKVGO5C2eRKVvztzqiVpSjVW4pdmPBr2sQ4LHHRZaHpYxE434b5nNeLnrrlGrCZP9DvMVzpJfn+p9YwJydZvEdUzuSe1eY/wj5Y3qF/ioBW6seZgnm6I+TDd/FGTiF/VYbOzc+AIyEurVMLRuQnK3Gs5oqKiaRwYKlqGDJzi4qoPhcRzY2MICkPX18GyAKS/xRTpxod1RF31RpbhiEL+kgXiKBDiOT3nsNSN0JUMG9DAOc0Z11FhO/28al+yAUfneBP+CJxeGtEXeQ2zJ9JC5PVRA8eavIxFt0Y2su98T39sBwn692qySF4+V2zZ5odRQ6l0hCrErkg+9m3u+Pe0VVM3r5k2jwGVWlagc3nI9J6iocA4PRsx2Ch+yHVy3djtdHT/KZPoUHOdiEQRhUckRqIlQMjjyWb+AwuFdtzVohqtcPzqqqtf4cLgYWaJnCR7gYSoGlH0xUEwb0UgOpoFfVMDDSvE1C0LcDt18kKngu3gzIId73p6k2cbNEqoit9lpjB6uBHNAY/q+j46IOguLRGxwNTseQKwT/fmViPQcZSTo21LKTegfc2EivXk0WXV7H9kVwtltLtURO9A5S3u3UF//b9KBfqrmDsneGClUN0YO9wu74oz/otDJ45XN45U/t/1xNzgcvhvoHXeJi+twUjrl9vUhSx1Vsqw44Mu/KtpKEdd6n9AMsO/vKagRHUVnoaCp6DPIoifI0y3cx+Mii4NX/8/Jcu4T0r3Tv/Hc9hIBrQFgetQqIvLN6hstAuwCTCcAQQeSgocTcYjJyzDlsWMw5eTlOMvJp11c/Kk3r31PdfFIh5/1sx+MFm+uHy2OetD//IDhxXFjxewHAP1O7CPiOMRVEv29HeK2cIHbWNHjN/NXXtwO6oV/S2fVuiSnD7JEg9qjX/Z/gc8KOGESL5Y3gI1GZiwKvR7gN+QW6e/QL5ByabwgUlqjRgUyLcZflGr/u7TYDPmoHS3cv+m16CXdrhwVxlVE+XXnqwM6FDR2yg5fKhZGxfS5AeJ+5i+UnePfbhe4WoyQ+bdxinkFSeYLROmvoHbTRSWqBGP9tlLWBel2Hk2f2pqZf3BsrGAvcLulGVgu1j4e7VqC1rR31qqOYJIxr2LdZ1xr90PKO/+bXaiH/j12911RYT5cOwXIXgpxKAiwQoTGGXd7mRPT6CXOVO0xfvpM+z1cW2mCVixW8DFjJWY4IEqgajOuNerOtq4rrKriBVZ7F+dO6+k6vXcNE7veNjTr+XBP53p3Z7JieRksr+5ctVdnJjNWm70XSDg3Cnc9NIp0MYhHJP/3UyHdvutvT03TzqPRKn+W8d63lE8uEUn40ERLK+BaVEnnhgcR48Lp5LhIYhA3spNE54aHEPnhdDI/khjCjQQFXKAQv+xOCnb/oOtZ9Ys0WzXT+nFwqWWcahCL0LT9Wlz6eLTr5jh0yjyFEQtxH1P1SXs21Sd6U4NpJUmDnoWpe1jSQW2Jqu/X6N2w8zA+VRgZze32iEKmXU3wuocvzJ+MIEZGRkyFH87O02/Wz5Zyaeyg8PB0P2I6HflGVpYP104D8iZFfCiQG6Zujt8EIR+dLb9yYjJE6bykEdtLDAU1Jyf1H4H2OVwJFJm65a2kH7u3fqGcmLGaOfOVtqMp7FrdU+RyaXT1kE8Z3AquHvYSVJY+Bf6bD9/cr6hxmMK60oscpZV38VTH92zkbx5NznpHe8q7ysqsjJUbFfUZqrrqh8TGwhfYeNfkB0z7QR95Xi6OQGogbAPhBuuBYMw2bqGTu2u2bDJAttmit7sabF3avWpWMg6/73d/AmZQ0PVx0c8luJDQUk1WGYLMATY//zoXfnd+wXnhYUW8PHeOxv7z2YrzCr7m2SBqLHXH0rFhK4PL7neOd9a0LKzLvTYO3JNdof8NeY5a0eam1XLFfyl3mt6WT1/YxOaHsBqE9QUXI+LxjT9F+UzSr7tV7X2RXDECTCboNsz5QyqhpfoiBwNPf4EGwHTE+UD9OoNyWKIZ3DMjtQjwV3R2fOOQlqYrN5VThEozifH6QnN/ShwWF73WccyGYV5aZ0eyo2hNSm1o9lHn/ssEvMOAgK/B3Mbm/LRy6aQYD1VKlUWCAygFajsBHi4aLuM6NL/ySu09hzdE0X+8pl2JeRz6UWKfTiaQtlzI8Mf/zANk19W0CwFJbtIvSu9/Cc17vmdMzyZuOPa4h0s8/b7qCjILDS1EXUKnSdq9MsSBzfristVSSLxffXJyjTfowZcMbJij0iYIAXYBEwTaHHVgQ3Cbg6OdY5sDCCvUaJfCajfLM7XFGdbGNPMCIjkzLrlo8G3K+cShtXUOsO8Ux2t4TVzjBk6gD5YS1GqXXXwzr28vjkxQ4MtizqFinUW3UlFPvIB/oeQ0EiozVBjGOTiRzdUS9PkAw3qjInsnF7NcCbBZkPQzaYwIYQ+a7fgUJ8GdZbjqwosO/Xz0+DAYVnGHdxz4na7qVGen776TcGjXjTZRfgQ7Uk6UN/ke+U2Ck4A97sq9jnTUa6bzGFZIk/mF5MESx6+PG5QryzIZda6l8b9E2J3yVe14kbn1429XK2H/VAMyIdxYId3zs+jw8auC+GF4zjp4XgpDKVTHGCvAcsKWXQmltZT2WYrhER8WzY330V1iYszxOW0dXVa6hmGxxaRFj0OG9WOCqN6JFv4a04huQQJmaJXkFLs6calu0cMjMnoHvT+kdwN1Ihpk8yXw+dqZ/Vnl18xdItnNlLaNpBu7zMhZmw2U6DDfHX6GxyMoCcYeKfDNbiwsx63oxUaB7X29DD/4fn9nlplnCzygIMbAx99YB4ACL8AF/AXtc21L+U/w/Kortfec3gQX/qdo25OYx+HwOu1lXOCCR1+Vr8iv34F8GtmXnb77bsJhSy1khV4NdmEvwW+P4zmAJj6I3z2Gh1BrFy6UEDzvN0ToHURD/r3jgx/4/UXPCRne6d+EbseJgthGTEZ8WIURNwMig8UFbJcqWoMSpRfQ+SioDH0RCWpxEQNP5I231o0+XMRJcNMP10+2LdyPbVSd8f0e/0tWvSuTnOSHS4cxxp+OGySFqGU4qmgMy3R+zUCNOYLshrPID2exvxRnlKwrkf1U7I28ffb8KX+HOHQGKnESJSIiRYNIESrNPg74Z0jsuySuvXs54/Bxbs9eV/tCyYlD8N2oNCRfjIozRcXkoBPc00HycdEh8xJ57k0xfqC77L1PUrK8s2hq8fhni6yPXCNdh18v3nsNNfuj3yJcAp/u0B08dQg+5JbhHB/FeZVb7RqPTgXieF1L1a0Eq3pp+rBbce9CYFmNFdMvlRxoku+Xj6EF+KZuiCqrCehdsBNSG+JTlWGR64pvtQTyIF+/BYKqBYkSlTuTFE0vsuVpRJBkN0jY7MosfD4dyNBkN/1CkU0sozglesYpW3ntJ9mRR6DqotrxexaAl/S1cMi1ZNGR98W7jgnisA2vMPyWsxSKAAUI0nho2Rf7bv/8P3kvyD+ihBD+8f5tobeLYIOTxruTx51PnqjZceFYl5XBSYurxztTebt3a16GD2SkWXxFuj2OZRdDM6G+LK7ljRW/VAQGW68/pB9XO8GPaxel8Xfc5v8A/QE6nZqffIWFz5q2/BSL17GL1xrxk2Pir9suLeWq/FMS5UV0EHA8w/v0+74FQxtPXvD6HLvuhpzM/GKJtTHJXEWMyIxLVg5+SLmRkGB119Y/ykMUlQhlQXFRHMu5FRcJwgObo9+gH1s9wKI1JWfF9/4Ydzix0L7JI21dnPoKF7rR0QhmKLnJduFnhWxAkiRlVuq0a3riF81AYsKEScmfpiXCicFEQ7/fcvpiE3euy3m0cfTwCVxyrqfr9N837t/1trFZ/7SVC+Y/RLKorp0ROcmPIIOz54zYAbJkv4iBjJw8M/UcPIqQLsaBRqhZdLBbnNiqHhrrCNMR11u0fbdMWSfSUE0Z5nTLqCsThh7VgmMVyekkyca2t4HRgHxLZh2/hvOquWSdfeXgFguyWYDNgiT8x/xwp+pIKM+2VF2WgJIzNueFgmZpDycYiMHLn5VHjnxWDlxmWE4+3cx1PvXqpcOpOl4YeNYf+qCzuHpzR3Hwg/6dQQ86imtrdhSHPqAM/1EvhRPxYVc1fbgyiBn4onf979qOWRroP1dFNJg/a70uko4JwNMx9ipftYYtjAr6sY/23/YLD8u6EfAo4lyFkOrgjaU6CFOty5gfPPPV5+o+bEO7MlE+OAaKKrEuqwmaraoOnq+oBjwkbo/6xVJb54Y6ehCBSAtqaNrwS0vRiz3vPtsvO05TkDgsFXm+DXG7rfQvwgjPcTM5kWJ6JT/8imm0M32itIJ1iOfo1kwMrHCLdeAcBl4buLhkP1Wcn9QMS8xDFXk1oDhmc67qXieFR6yTh9fIpG2p4Ie2jQjca6IdnkOkR8eJGHokgaotYt3tN3cRP9ZnPBlnGmw/tSRt4h4KnVb96pZJCAlND6IVuU4XjXCfD5eV+sS6RbcSWklCZ4J2dxnn+YiRrkdQWlBYSCbBTfXr+UOhMU1L0u2nmAbjk0yH/lsvi0Y0R+nsKFbUNB0E9uCi+UImIPGUrRECfcH5SmsL3O9Bdv4copFTkBpV7FVvechF3TcVz8nTa3RS5zuw/5GlmsFPyCpnyQ0tlDvdi2WQ34a0i2txzsW3Glm2rsKE/RN8p7JwrghNxLDdPfRMfKH9YR2ObBnNv0M9kbBf6Ma221L6a2QdTtxxX1sGWTyh/e/P0n15e/mhkrD0kRiAb7he9IKg8s74JnI7TRRl9FHktf4nNAOC+7qCdsYEgmG2ir/b/4YyXVtwIuD5lvEUizNX1+cA9xmNWOfBc034g2XXhArnK6Jw3fnZIR1qJktQaMl5j3tQCD8bVd9MW2xdbv7/b1dAtDSuYhwPdhhlltmMXhbZ7qWV2Y0eC6xhHguyGaWWOYxeFNmO0irsRkH8/FGoMEMhT8vOhsVzhSwHv9BI2yT2zd/+Tf5rWVaXniVPV6k6xchZjiURdkq/Y8ZDhCyfKsx28N2uzOdytpMcJz1d8G4rgRpg8SzW3lX+N6E6Za8MCZcRyP1HKGQGdlR1Rip1vJ+DL/Alaf7/6Ymcj+NTyEzsiOqIL9/iBzeGcct9tsUMORoZ8UR40IJNnkFGSy346B+MGCb3yUF8Di7fn0TFMrNHzoS8H/FiKEevS6V6aErMtAOH02m3SYMuxAZI+Rbn0UyjFvubDAu+23ljZsvBG24ar8J0ELtu8swE4jwZ1mO4PQDhtgLTN8yFQbbBWqIw8OFPcY4c8yu5XT0FE/J0RF11LoC5p2NrO/q8H6wGXkLGeRb6tM8wa1wuRIBjV2M61F5WSjHrN8wxN5JLeErhMkYKS1/acTms6Hoxq5jBsirnTCedm1abejfGecc0ZaEdaApbWdZe0s7emVqm52BEek82H6EevDS47IQi/oqtMfq6SPBTBjmholddMHo63SiwAU4Agn7TVv/tmbNlJnnDrOy+nIxtRATNK7skq6oN+KQieBp3XsQtc55Riv8RHBBrfPZsN38QzyrZFHPuT1e7IfZzMjO5bFeRqrmnz1Czg5sc6Vmnl+Gc7d6dGh0PN6+p2rWvTLF5r4k4YCxzL6DCdKtpso7VDj6B37TalAGCn0k+g3vsl+wR3EjTy6Yl0O3tIzYaMyYAQe9bTeuWbzak5T4lzw4UQ2eXJrzvG5mLVeW2WdI2mt+u2siMUgewZG7NcVtV0/N8EIqQfAb/mg1z6fpU07N67lLjt+WSxogqqwhbw5Mldn6ZLR37m9r3TZpD0jQ4CSj+oHt5jvd36Axmcv+aybWaImuDI4+QGeet72hfH5xbI6oOcS77b/oMZvLkumcrNceHccFkHiRcR0fTFUIAToJzPODAPb3BXfY1D7w516hqRMM8UllOtwbiHMDofxzcPpgkX+QeUxPZnyNAryWvMlY3oXBssOjD9gRfDs5RoDBOOjV4eXAPSLbUcTbukxQR/AwNUj45BPWSUxseUans0ey1GSu1ju9nAIp0chJfQq6RWg/FT2FmQNTjjg6/xUn0Ot3kNK7aMg+cpMuXQ2gzfCYYpil0r2RocQGvCPCouh0c43YoUXGPfHIgb6b8arSyegYpNyBGhjnnBv5QI6d/IwUZY9IHxc/8O2NDu4DeJXmMy0e0va7ZvmiBLejKYr6yPzvq99Wt2bBGi9OWaHESIL4x3syYT6uRZd6z9SSbWP8b8I0EtRXs9qH7hNevi9zzKWv/rGDN3rdbhXYnH5LabTnRbzz563yFFRROneuZkrHUW5PyHPg/ae7hW9wPpBQS9mVmb/cTyY8J1VcQ0wwrOdzd7tBva/n+POs6z/Qas9B0dB1wy9D4lmyoIT09wTZHl6TMTGiIrWnhYSa+3D/QlXI1s29HTI6wm57UX7FVeigS827O2v7ExpsnY0x9mG3Yfb9nr48eetFWrXeoMvRm1dBCwswH+zYihuyuQL8KUMa4eeSBlxOThJk2CBfSNomZAeRbkpXcnevz1nfgtOoV8Oyl3ytblIR76JMYNTqyZgQ1Kj7yiWPrLwHMx5OTk3Huce7sZ/9enBcEmfqbcq7dCv7VdQaE63V0HP+r6mVVYlmQHJl4N/1+eqIK+TwJkgekS5OTDTNqSDCk96jNDMEBxFjeaXzWrq4IVtBdPdo/tN7mHdcxthdmcnVeBFFQSbWtrjZ1blwDC5LAia49PtKyCKmiNOCyTyNb42J2FIjx0CyJUq3HaAijFzuRrES2L8Gd9RWgTd9W3kNGIEiLMdEkNqj8d3+83cjT2w+qSUtfPPVfRxeF63YCKDm++BU325zyNx1jWCY5dDi5Lv+p/xmWt1Ui3kzw4EHA8BHU+oXw0bFmbbCtvOmvRATLyaU+wGNds/LBwZ2vuN16nFpMqiCwEsZdGR49AghQzdBKcfnj0a4/oDXdnY25JzCpmFd895Ou9drrIf3l4nPG1bLOTZw07iZLoffi73s3uJ70X2fVs+3K7xnb7krK8+HaeUDGKaShFr41sbE32btNBj1GJmz/mWwyWXvAzBfQA7186+myrIvGTcZUauvHsyU5dyCTYLUW8HiMpReowHQRRwxMDdPvB55vKflwNpD7yL1UOd7cFMw2SUPi0HbOyEame6qpMUggX5UXLBjygsZ/AMcn9mIjZHlEY3yG1TrIbDOrIEpOWESDUsXobGMpQ4RrM/NxEtzLfX/lPvvScC+/9i8Qt2TMOXJMeGYCPyMzSbZ9aP/Y6fpatnW18GhfcrlHlMmX1b4gR3eKRw0iv9Ze5/rR3WX9rgHAaF/GtKtdtrbjtNaID0SR6G5DehqBv9b7vdDGxj4Um+d+2RlndrcOEGTqAKzl4c1r3/bvz+jr0XE0bBTXbb00/hX6bgCosSChH655sVywnV288bVBUom9f1ppg/7OoVSYAwKpuW7IzAAtURKjSEI8CQ4DyFrMzCdM2GgEsvFIoB0Wec8fXicXK2i5kYdBDawZonXZbwkEfdxyTGJg9V4yPmXMTxnnGTSkBtoCLbQ12tClBYUXljvUyK3t9q482AAs0sAijr9iMSqAG5Jg/WJ7O8lhyw82H4argZ//9ZpnAdOsv9cc20W9i+08Zq46dUlieWBahDg8py+b+Ooz25zyioExLEs5dDgZNn9fsTs6pcdQ9VxJ6xmJAaRu3aVDA5+MPi9fqKm/aqG5Xf3ELRVtmOn9p4+0uj0gOC0iNCZhxntn+T15kjXAX5fk0qldxyxut4lv17TWLZvW/lKxjJagDaReT30kFa3MoBIKi6o9SB8svtdVxXkBqFQdkEEOzgzDgyiSlZsgeN4S0H/Dh2dqd5vuaYO8mI6twwk6DjV8kOdX04oju2vogOr8yifTzPqfFwwkssKJSWb3QuOzj3wE18po+3emg5B1d0RXmkyWsacKxjF0z/Ioi5Y1VWE0ehW7S5H2Om2rwg503HfH8TjvVKjj91aWsHNJIr8iPed+BidznN7cq62+As9fLMfhgaAP/pfVxM3stOfwOHnDiYDcraNDImMi4kUcWV4b7uZN/XP3suZZVdMHmZW7llTy6+1S0r7mqlu0Tg3Om5FU50oTx9K8EmLRBG5mWCgoc0P0smKoQgFLlvcFG66I6NVKp7Cq+BJbUYjasCC0Gkl4b4qyc3zqdjK6EBPPXDRWmtV7yy71yaUHx8bS9maVSB5E3GDxFHCCXZ+zzKvYqe47PtPgaFBoulvAa011XUNBkRzwVt43eufuFB4lluaFjmdj0RwRsd1JMXlvsqE7MERC5CgT8rN6IyN3Lm5tjzjqCoIXNEXXwio2y29OPCOWSVZQQFKkK4FpH2T2HV8qncQqFQdRFQxKLpNOFVV5xO+8uaO1D0cmZOAL2EdRHGfRrWTUfS8QQr2+6wWv1s6xDlnqDrQP+8ztMon15KQQB5wKdPd0HXsCIyVETkFCee7eyPydiyd7Ik66gtD3127dV0o0uYs99x40fzKp2VE1dnOod+RGLaCbscL16BxSwkQgXwR5W2j9laM9uC00tMq8zaLLotuyFVE1AlsnGND2aJlccsLwT1JMRTKlJxt8TWVtyqDhbR2RxaDGxzNmo91v5242LXGKp0ArtdkimxYDEJLp7mnfPxgxJB4H6NtgeG+JdAKrkE9+LZC7VYLuRZwE+MXhz5T3kaH98/9ln/4j6sDhmA/Pp2MYJ/4Y+zdY6qX8QnL+IaKn+Wid4FHb9oQHZyt6N29PD+jRYxaB7jni5CL8rZq9jyUHThrVbl89fWEHbEPDxeKHPjxU0gvFSW9hRVNCwIBse5lup6w0zD8NjwIV3TpIWwCLRY0XsobR5uq5Wy23OKVTbeFtkFpnvt99+ZE+gVUqpjCVyZRuFUS9AjwbrldecNwdHoVrfBaPvxhRUN/AZYWw+bObpsveNv26mqKQj6dOCI5Yjni+tkhy/X+ZXbXIbVuo6bx2/ISFQdranaKEjjTllpEPyYDr/MpbliqQ0Je9ZfnlH8kqENKJ5nzHe/lNtxMWwrsYZaq/w8kN/fGJf3Q2NfJYFCGrVJDZWKPBRZl+Pop/6eRyGVx56WOgryKHADlarwESodkPqej4PjdfD301dmjn4yLtk5GuJf2ajjuFYU/xpqvktnluCpCwyuQQhqgwH4StPBbyDgT6yPpxsgAj7vS5+DEHhMBe55wclBOh0NmO2CbzkkVRMV8tUz0rhisu3QTGliDBUsfkC6Pp0US8bdDvOAvryvOCWP3WCL4SWF/UkTdpJI2nFZxvs7bAvQ6yvfXzSBACr657yjTvAD96QGAI8Tor3zuQTXDTAjfg24jASs3i/PxUybgTO495efKcFJ59TmrzeTNOvUuxtzq5umAgwhMoS/BeJpLgyWjcSB8TuoGQXjoLlMlac5kK9Lhu1QHhDgVwsBlXbBGKM8kZ5m4ME0iTIlsLJ9nwsB6RVpssnJxzPDNDncpkPNXsIOO9K/wf12kEucXBvRjgkk3PW3lci55oLOdbs58SH11NuHO2NYXYBeORne0Vtg+SzQaSFIpiy8eMtCsBZ2zR1uK8QqyMmsgOIvvuojUoQeuuOOLSXLd9UR0cdlJknqKZO/8zxnl0hbaNPHu/efSw0G3XWaKwDyY2u9j+5tC5YQPF11cidlzlnTI5WMZlvDh42NrER+ApKZAf9n/ThfXrGAjAZUBVp45Zc6lotR4AubK1ANDlCkE8l5aE0oAB9IAmggbU8XyMOpd0J89SxzIXjpWALfmopRgPcZyCJXU06bW6EJxM2QdByPe07sU+6l8V+IM5IaIs3qkpIb84nFPQLh2RutWVRQNoSUnJCS2FdkyovVRpGBtYbi2mTEHTVoltDlXZTWEc0DCADCvvtxW0XFhOkb8l8OggTeVLgXRxM5bI8xlpeB0VXplGEhQVjH1MElZHIphLaiMUEKvk125wuJzJAaSfXQ4AlpmuSbKClcBk3uGmDk6fQugpRkiz+v8DyzJkyOPcCxbnF+dRvygDVoxcWKyP6n0OgeO/nBr+ae0c8j/c3mAivH955Oe14dOdU/m3qwV2M0YbBCIoABjw1a1yLFGi9T143AfFtzrPYaRd2gdzwvp9KFE5J308VRLvtFeBrqPIHnGaQ9TpkiQxrPdgbcy9c9e8egi0giCiiJUzsQ1BD+XDqaPM6haQMpLqYVdyQORNenQ4ioz6DvgPk5xHy3DKaxFN1kRpCFMPE9cI0JkGyFqAnseukjGcd0AGAYYddnUAw6XGQ9+RRo+PjINpls3HUQrIAC0gOZhnIYZiJ5fNiMUlYbIOQ0y1OGaG9CSD0jNlHuFOR8uY+gUxPd6fNZ+TpWQ4bfHWC7gg+mKai9IG4zV6KGppnBEM6Cn6cTnYGh7FpjKV4+9tG6uPOXafLcwCtUfRW7GmxDJPLgER236KCqAkwxHXBuowlUaIkQxv2GaQhZJYxjZ9YrH4Mkpz8meG5U3rD9d21Wx13QNyVxRQY6gP1CFVEigRxZrBJV/EWJAvsNlDi95HY4ojSuwsiJHOhtaIdtE2yKucljZpqCaWS4emSkq1LHJUNGocY2tAC6i2UjNPQMtAe0AbQet524pUUZVi3IQ223ot1ofdZYsxGAvKk1O2ul9LpzqrF9LuDQ7W9RFjDuKTUXAGBfMuB4ymnOwhtJJRkhzEZY5HLiOnN8L6nlMLLnkd2ErsqIK55g+YhtgIJl3/yzPsNHwqgB7AR3oDRyWwpyJ3N1uVbI+BcFuAJ2bgWoXAjferUBjwbhWGJM6uwuHP8CoCfGkUxKrslZ2QRuA6CLAC8asQ2CF0LjFNiviyVZ7MX6rsWEC7+OAEanKQkguTQqRkoyAdTsgL5pLPEiaWwbAsJ5KJAjkvPJZaJI8gvG0N6Tmm8FmhF/JCw7ItRGNybo0x0GATMyyTXOLSlmrAQkI92RkIYl4QzNSH7YTfL5hPl/ALTTjNOziVs+1g6AkWYxY0OJliNxWbkduoPLQU6BzmhC8+x7YT/ABlNi3J5lIwMWXM04OdSIqKBAUAXsK9YDHN3JGjYNpFpAlPrwN4mbpjcnEykRUDCprzRp06ppk1egDBwUYuHKTQ4kdglDAwhPNxlm3i/7ALgQINOgxYxCJmG7PRuMPgQ5OabpiW7bie8mmG5XhBlGRF1XTAwNDI2MTUzNzC0sraxtbO3kF1PJouDNMC2/Hpy7cfv/78i0RCRkFFQ8fAFIWFLRpHDC6eWHH44gkkEBJJlEQsmUSKVFJp0mXIJCOXRUFJJVuOXGp58hXQKFSkWIlSWmXKVahUpVoNEASGQGFwBBKFxmBxeAKRRKZQaXQGk8XmcHl8gVAklkhlcoVSpdZodXqD0WS2WG129g6OTs4urm7uHp5e3j6+fv4Bms2GkEufewrDzNUostW5+s/pDItG4TPa6m+F2NkDMFQRLsQYAP7plf4FiuxsRXra/7GgbcZ6oOnCMC2wHRclcVRBBgAAAAAAAABMe4Gm246LkjgqTxeGaYHtuCiJo/I+mi4M0wLbcVESdxTTIiIiIiIiYqVuKaWUUkoppZRSloiIiIiIiIiImJmZmZmZmZmVUkoppZRSSikVNc+n2ZouDNMC23FREndomva0+HixfbPUatWPvDvWPf+eCrlvj7/G1+d5M+4UdeEPpFvpiuc5yrTENgA=) + format("woff2"); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAAAPgAA8AAAAAB3gAAAOFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGiYbgTYcOgZgP1NUQVRaAFQREAqBcIFwCxAAATYCJAMcBCAFhGAHSBthBlFUTDYjfHFgG7MOeULKalqtE4ejm8yPYamkLBqeP4dyFA//7fev+8ydC0EEFdZA7ONYEjmQUeG2rn/5Ajli2bwjO5uNVKXPxKiSEnqpPnFu8UIY3ookxASCDj+gfmJdHcC+/WA+0k8HXQU1J8BR7P/UetT/cy5eC0z3ccMBjWwifVXWIZBiR3iUVMX3PIoqRQ6QDp52fhmYSL2ki5t0UZLMfxz/wQvJQEBnIdAIoRJKSSgE2ptrk+zK1ffvgPMvQsAVVgB4LF0AXk3FgDK0WhJCWheB+gt8HGrMIBCbHa1S6Sq0R1jnEbNcRcgiba1maYfQCBmNMFZvYaAWz7+XLy1IWUgl0oy89Y52gpgrrBPGEUTvnJ+nV0rKGbkNt2hK4E7Pm8BbCgL+xJp+OrMHDPnNlf9H8zFVEfchry1fYqgshEaBngpMlM7tVi4Lzq2rGHHgtBaygZLheqsUkhSDQCAEUaVXCKTobzdAwmQN/jJbCnTUSDI6GVoPjasWymOM1t1/P//9WAEAQqHRXid1iy4INeiMjMXYBnRFRwCQWqQ2hYilZOWfHNxgKu+OzsAF5/fYqtvT9PzDQ7qOj6PprFXn4CALPHUchgcNFxFl8OgomY6bI+6C8pv7p4H8TVNE4uVAgDa4AY+cmoLEkQP0wftqr2jh5Zm/UO3Tjz80OC+6UguLUcd+0fA0hFwr6k4VrggEmKdsGm+E6MDQHcYYd4x8iZoPqSgJV1u8WuE7h7lSTDvwXyxfHiPHG9Sqj3+qzaD1a/20bGsvUPjs27LeP24jLvyvwTbgi8+Xf+CHS+f1+1azhEoCwUdkBuGcXEXI2tW5zXtIPRGrtvrV6XwvutZWGyZZLA/NlwQ6e6EQuR2eRVVB6O5fSBq/QmGqV5AN9ABK/V1GKuIw09lMc1lBRxMhtDccKo1fob+OeiMDifbLHaQ9NiERTexK0YQ8hkdEiGhCXzwmxfXF4nG4FB5BSWxNMcUpBsGTUKSZUzyhmWMEx9x6J/eeJCyxN5qYNLUcCZk+WQTJQ2JohsmmmmrGgBMDhUbtay2wxpMnZzurzkoThXsk8U/czaPppsI71BYBsSpuW3wDgfgsBgUt801xEUFCY5+zy+Dfx1O833SX34VE0ryEOEIWG4kp0tyxDXbp40NJJtq6Y7qONZGiUJgeOcr8R3i71IpN+TNHvaV5Y6TncAQAAAA=) + format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* hebrew */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* math */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0330, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, + U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2034-2037, U+2057, U+20D0-20DC, U+20E1, + U+20E5-20EF, U+2102, U+210A-210E, U+2110-2112, U+2115, U+2119-211D, U+2124, U+2128, U+212C-212D, + U+212F-2131, U+2133-2138, U+213C-2140, U+2145-2149, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, + U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, + U+2336-237A, U+237C, U+2395, U+239B-23B6, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, + U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, + U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,d09GMgABAAAAABiMAA8AAAAALcQAABgwAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhyCagZgP1NUQVRaAIEEERAKwzS2TguBagABNgIkA4M+BCAFhGAHhRIbaSUzo8LGAYCQtk5EhWZu2f8hgRsytDfQl2jMA4SiKIqM3IHArkMYrLjOWj5z0dKPPuYXJfGBq5+Xu1JC3fFtsmlMy/kRkszua+tN9nhIluylAHFTpM+b5RAspPyswMxLt5vwIXN33RXVVfQDbLN/oCDm3MRsFJFQtDdMlCobVMJCVLAwGl20uuibLtoac5vL/NvfPNcu62qRPF8N7tn7ezShaklVAjMEYwShJC0pIjd4DnhRTXbB578AAGS6Ce8xDmHwE+AGQZGQb29shkdwuWbJnCshKHIkA1NFrmyvv1a+stkU1ENT//GyRnQDG5iK///mSjuze9O3KfNxAYUjdLV1FaZyZn5yyU+aTRcOc1tgSoEVu0pCVXVAuSK66qr6vmoCLSo9sCuRbEuF0AK/GwWaajFrVpvsKeIZGsRCkGdPcSs3x7QQspCylasCt7W8iCwOCgAIxqh9abaSIIBPDMnPR3BDMYjkI0sEGDAF2+D/36BVpNIshJruddZr1UPzq1ZZ1vymLNQ2vxdUa3REGH1Jk/WDg2dUPCrKIfWfG/jB7HtJUQFEPWrKtUB5FgUQ8oqsAGHAcEAcBNvMUcuktCACMHAWxmnV+ZpoSMwyJ3kuAiLYgigI4MGpWtEKhJBAJSgbUPCTicRMXCoRS6ZAAMJB4F30761UHJmvBPAOlsoupXutt6HRBNTNniVqGWz9UjpYHyohU3IIFs9UCBTAzBm4y5rm1AQUQBiWKwDuAEPT4ZRabhzNkeGsLD+BvScuHbEJrHsni37bQfKrFgC1EQCYtDaClrERzroAtYXfVsi6S3UxAgEwfS2u9pZ6B1GJCDdI8OEADSbEKwj3LPdlDReNnOgnA2iEixpODii1EKyBKVTmL2R7oJjbYfDiK1i0bA02HaL/xeDSuZkkCQo+W4jf/3kiDXY52ZnBn8IfgYKxpUxQxPij5besCS7+ReRsKG2H3BUF/t7+t5hoAKqYtoOgg5LXhGlPnrbQkHruKQzAQIt1w3uv/x97uestXLWOL5fc8h2WVq/x8UrvhutIbDXFlRYJV5Op+GhhzT1bjAt8Kd2Z1PxmSnG5XeCWL+SFyaKdJVpiqExVs3F+xS8qLXDztyxa6LbQclyy2ZUiY9MV8WJHRCvccldxbvl2a43Q8sqSMVALuzhroLjZsmtb9pmB07aJ0jpWP9zOOq1G92jzSEfyppRl5A8txtM61vuSC61jnrSwtoxCuSkueCZvUsoap2y1pE79ukO4iazxI+LjkeSxmpiBF2ZB2fjRXItADiRxVBIhiY4aGL8E1BQ4JRxZUkVzkUF8KmrHZYzWomJ6jUNl7Vqvsr0JRt0+vCLtIGZfdEIY3prXPvArJrkQreKCKsyIpdv8XE8ajctfWI6ZW7vocv1nFIyQsfGbxuWRQX13oF52aJzEp/YHw1G81dZP3S1rb8e1SHh2qnOPdeIuKtQSvpTGw5AWOrFuJtBozfUtMoJM7KJSa7C+xpHpJXn2iyFvPxYSHud7RyyNruItSRmcZiDtmTbjxBus/Z/wta749ocBCYXOkLDxIVvh2fbIheDhIxDGyJ9xtdYgW+BZmqe4l5WQeF2ew7uFhGfO7hOlMETG44zQKfk5iRu/tAUi5AAjP/h5cGBcvk0we2wCIZJYxDeJI6hPn+xdcHaCTo6mPflebdFxfRpgIdGad5ulDyW0+KKdN0aDwbOS0EkpBVVNEvne9Is/jXlSB0XGMkNzPHu7MH7vWolK3sE73NaP3CYa2s8nd0MqPNTinjxIkkXSoEfDAfeH3BMaP2MobAqrFRWM6P0yxGAD3/OjHNk8t7hLHLOfgimPikY0Zl02nslsNReaY4Yy6fthCFm81tqF2FkcmO5DXJnYjQsjSEuo2ztMA57FRviivAJzsiZcPOLg9rAgbEBeez4KxmtqoIhiVE36Go6zV2YR4BMjx603FuudETP9DNnTbTPd8sngsXFeQWsptrH30BrG/VF4VauDBfJAC0L2wxTCyw4vxnxaVCShtDuWBtqczdk4naac5D76VSDUqjFgfr4p+yyTU3y8TyczTcIWTrgmUV1lyU6ktq6TM3cbiug7pE9BGtaXmH0wHWieFXUD7xbRJJ/IszZrqKyaCz2CgiRKincj64DbJs9ObdgYM2u+dctu3cYskFeOQcVd4aKFV+uJcMHVuGuFQ/jMt/JCVP4FLTCQyQWJ1yVCNmHOJ15Wc+B5pe2DdA/xTLVzT2IiKLFWqH1/g7i9s3nwEB8QK3LvhGyXZ+pQu5vXp84TTM/pPP5BkoecStbEgnq4yr/O7p5ySU2TKkPPi1PNH/lWbGUs1jcK2rUJNJGd9zY8ULUvAwfEP4JvgQiDgmfwpudY49ih4oagaudgaPu9TrfTEgRUpNaWub6pLHubUiZA2aOHvxQs1ec9NSoj1+jKkJSHnhthhxsrAd+Oxl5djs8bnNgN4/pzcmPG/xk58ydWSvTh2NFG71SVoiRfrzVbTfrDVhTV6k5d4YyprPnnhx6MvuKAdnOlU6fd6GiBb4tvbJRLo+GrN+QbpAJ6sp11Msx6S0TCAzxgNAvsGcV0sECWmuCLHnBNdlR+vb0Dy+t1SbV+LQ4Flenk7+HJa/LrnK1jhb5AXg1i9d9j959k9k+l97+/ar+f78d1b9aKu33zs+wVUx18vP74xenQ/7yAR2NxFdVFXt+Fjg9wj+vXRs2NeFN7D8d3DviqLsJVQHLH3eEI+/oTp5QLhx6NlPHevCvkTY8e3vd4pJx38d02vwcZFRx2psb/wfZt/tOZlWxORqXfNHCoHF+EykTtujtx9vlt3X0H/6z9BbxfUxqtpqp7VVxzWka+hC/eyJbQt519tlB2KKZz6dWiipEqveyc8VRb7eEhm2ZIqK5QCnsX52Xao/fZG3ctbWu6YKK7or8WkBNolke8Qsra2qUtjo8XrsLPq3hX1bOQQsmM5sgyKlO1PjmkgMU3xfHP+Zsem+0H+kziEDGUWDmFsxtyXzn04IsvUmYiM2XYYHBBrIOWfRAg39p9TVl3ZtmGjqdI/QndxQBmoCUz8GaENLeZRFPxypZU9Uc32M9vSIh46Yy2cPFw4FoDXd3i9ynnzpbtv/ONeC0643N9tgXBeFbHu4zusR4SMfUhgrbDauWVvg36Jw/qV1eeYC1bz/8442lOVWNXWWGDIlkVF5lLDnOVR/IFZHjiIxq5bup80qfvX/DbcqHlJrt1XW1mcmdNIcOPjVugzlxW0NA+8qxg1eCzvLq9DQpGb2spy5+GKy2abcio7lg7yUF3JXMrVRW6qkJ+FE1YkOi254eUTs2y8Q1iydl0ConBi/w8yaWSmVS6gg3JA6ktfp9tJ7KedWjJF32WReiBDq+guq3+x2EVL20eVyuu9m6sfzytX5WQ5S3+sn2aPYrSgkZFijIuanxkSY49/jQ5XikTjV7KCYSsRLjMq9RLs2qVT71nmapYCJYG4zk//MBVYbhBLqZbWaTZ1KSlztcZ2o98VGz1tZPrxnqKREJRQ5phILb54sLyspwIIr+SIAeK6ELW3OTcduIB3VrWnT+0bVkjgcV+pvmBh31qHvscWsB7tDXLbs+F39et5Xci5ET5d37AlmjIELz6PMFQbv2xAVDGS8/5mw/OTvh7s/TauHzulnHDk3t/AZIBKCPjFzbhw68Peiy8IgPKmPrLXv/x50cIDaMmf9L6fw5Zf4e4az33v+dDXNGBT9WPyDmBqs+J3rsI0p6zjeoHK5ew721r6knMtqol24MkH6h1SXURgDJGxCfFU2F8LWg8eOyJu/b7gvyUZhUUIcaRq8oAlX16ycyJ6ufXikEMkN9S1JFngSpj/etY8esFHzN/dmP9jXwAXwfTRnMnzKDZQeZ2+5MVt9oPStEO/0q3Lg/pPZZiOmq22cncsU8PuUthfuBpgblJMmoBaj4yZUjwvnoCx+hmiCSUwdSASBxzBKn2/g4hduc5VOnoKHG+bqH9zid9POrBD+8pB/v4iUNPV7PuDdR2dOEhGfdWP99ldqZzsJZ1D3D7ja4mf0/mR+/t6LnN2WTA2FrNyZ+LRlQZrYSUAra6rlju22yAZbPxTEOkbO4iS7qZBVr5zQb4G88hZc0n+hTM/sYiuteepsxc0hayid+W3p/SBYo1XSpF8eIMSKha0dF87GPRbtZSu66ACa8iwnS6hpUbGJRCiExntyXxAgLrksvkyYsVnXUHHxSu0l4NryTLPypwG0OEMXy/oMSQ8LjUhoQcfEX4Bq14DbyNGFuE5CEXgfiZcWRl199Wiy77EAP/3Utt3d+7bJmqJSV2WVUzCKlGT3ujwBNljJ4ZplJ61nt15+R4GDzqVTOFKmg8Y3RMMRac+c3tsuxLbaV4vG0etsQuJ+P0z3xHsZFsOeqhw8qxaltFeMoMxaxiu6xGa2GYP/0Ol87KtiuxVYQXOC12W7TPcsADxPlQKMQJcaynf505JYmxDrfmXLwJgf/kkrI4HsLm6HCih7CHB1W0C/gb73aCy3n8qff/g4DBmkcfTp1/NRmzEvNdzmz3zZOvY2at04983f4VcwJFzszhC/hrCWwfxZXM0HtUR02NSa+JtoCXyo9JLOzWlYG7A7Z0DroxwQqfvDJfP/HK3+1YGfJER1vjogyjPaXhFaCxln28vITgToTCe0C2u1Wq2TM4WLEFlHZbX9Xrf569Mh/5ST9QvT3kfdYbuluj32xeCSOsv6oicllJKkvWS0khoFLwqwIAYXf4tZ+b57uA4zw9PjP9nYXMtilRRQE09nXMUusrEkYd3vnvZlUfst97QL57rrIqJ9rf3YCburXTtfpHA33XTduWLm8vG8bn4d8KcGP+7duRjct/njjdZfquY+OtrOoqjH43JIWW5MYDaUCP0ZP123u38QVL8jcM0fRZy9yus6eD+TOptBhWXCoGnr95/Wlzr7K5R+/2JCU7jJYuSsFl+Ku2aRtKd17O6vXkmyWbj3Sv3RtS7Sgkjn07P534tKDOwYHFsIk6On58/erTqVN+Z8vX4YSM8GAotGNviMr0DaPh59TTzZ/wJNySHKVAIRQJFcocQQm4O2DjhRb9obbRhfQ67xT9qEg+tvQ2eVF9hj43t0SEH6yzIQMaC+5YqZQsXbU/uWC2RFxAS07Jp4kl+bMh5U14hU36x3QaJmi2OFm5kzylYm/fIzcNLFO2TRGURm51fI55s9T0DU1MjxJmHn76Z31+wumO4lzp5vXFw5MhF6s7evLk1G3Konq+XqJX7v6DTF7E8y1Lp8aI80U4Wx5E+gq3eKazit7oTWvcySUIXcliIxvIY7rR268ImYc5eQuVR0aFno/oUnqHN6R3kBcyphb3nWe21J5mLu3jTC081In4x7Bj/d+G+QgS75CG2K9kCvgKZmi/piJ0uTJdoFdvAdJT3ZGX/m5Hy5EnOlv4OhyfdtO2zkyIO0UGNONL8FKbe2JmfcjMf3zw4dW4/ny2ODWLHbKifFC5BcL+ejsZjBZlWgcnr5A1HnnpF773e7yztXGVlJiMcVmMBDQDcVZUmIDvQsj9B+S7u8tL/NduW9lWIJvqHE/7Org/VWBjNe4ZiRQ1N5osfRFyeAamUNoSBTEnWNrSdTd4G2q2uot8fmTjroVzs1jheLe3yig1oRjfnUVrkK39uO5i8USQnJBzV+C7nMBKSvL1dw1SUAoCpQELRMwmqH1Akdq9f4Ja6iZRbKBlb1rqurx9mzLjzan30c+iXWlps4HhJ5W+xi22jSqjt3un1g+LCkdDo7lYL82jwTcEO10GpXOmmhyxjSSMn0Nd4J9Ncw6/rBAp7i70nOu3zsOgMde4G/zWe87XZXWk2T2Vktren3JcPKsrFeNmJbNV2Qhmz3PkdTiqHZpndqEwZDuDy/Ibhvd4rJ8UumKKfLJvye/Is8t8mmJyXre8ackGKef/1evvmyf4osXYvJ9Xq+nufe+CdfPWjLDLwpkWW/5O/uxLy6HGZ9s7wE7dGOr4i1eJZz/vtQD8E1HP9uk7l5K5//Pz/4zDSXCchpW0qD/o5V2bWxviQ0oKKrhpxXn54LjiRvNAU2kqT57pZqWwz9fR9fvmH2J1etN8jiUEdpLTGcnU8KDkhILKjbnFsUlBATPDiEL/HsXCByviwa/7RPn7o64IiQnb49i0NTtO3RLyBgre6Jjz22fzuVQEe76uir2gncblJ8szF4DryQcnH2kdb+aLSvln1T+r899AIMrfNq96v6p1dVvC2/DmssFgZJ7XWpLSteUo4D6dOKiY0Z3Y59t9YGHPsqMbjanznJyPexpwEZy8WPocyRy+c7JFjzrYbxzMB0TC0dGD61bQ/gQnyWT7aGUlS5A/nORXViDSHV65pmJ1AqeGHYXn0mP6xWkKluaAVmP381STB2F1dOxBQtD3DpMG/BX3YJJYOBPvvh6c7Obs2PvvrdsDH8Z2D3+4fWvrv2NXKYSm1hZCI4Uc0tjSEtIM3ugbbgyzmiPZTGeNfjal3CQV0yeLY9YvWNaVxZ3fy1EVb8jJHDXk48dKloyLMPdwrcddfJ2TWcHUhFRaVCQNHCU3StZf1+/OD77K4oOixW7pZoaJkljninpZNP4xlnd1D+8eGA5PTEmIjEqIwbUed/ZzSs6F1M33DYo7qVzUdUzZdCLWfjiSB8rQo2IuvPsm/l5dnfn1R0myDDYMX5jjSR9Ml0EZIW2qPB9xmUQgMk3TE1m1f8zgGZ9XRUdYVEEKHF6yOi0BnN6HBNfxcYhI8JASkWkxjubYIPq42XI/oDuT1HRwIB/o/JRP8sg1U6dbkNsNPMur39ugYPa2lLL9abiyO/5zOtfe5DQ9WGiU1FnbZKE6Y421j9nKEAov4h6B8lZWajSVzJeHsvY/41JJDwUSbKbi4cEhkJr0oIBpiZHyG1gf49I8qmR6ugxc5wgUbgAvZhoARAAwA6KJM5R6p/RKNQOFgDM8CpocoBpoTuaUP/hnN6OzFJbKGIzJuIzF2IxHOMp/nxidpbBUxmBMxmUsxg7wHONqzi+Y8wGbQLR4ekId8yXpdZ3ENoD0XW+eHu1ygU4b5YiMR7c9x66PG0crq+RPQ0eElzQMY7wv0VicsjMI6813n1I8nfQPKmpN9yW5xai0PoDIeNT0HFsxZewLrJI/9REivKRhGON9icbilJ1BKGrdfUrxZDK+/z1++p+1+X08UAAQwJnC+88OyXzcF2OJAQCA3y+f/AzAn413d/zu/XFiOychAA1IAABQAC9GGpuV0BoQYSNxR8NccQLiGjsrNsQjJNec9GIQ1TMO9aUKmmZHshtJbAMI8423s7p+azyNQMWWXApNz2hthQmr1zyJGMZsF0CZ7Sh9aqMZSXugFJNms6BpBXs7DMQTIJQA8wtbPDmTJG1rU9zlon5uDhUxnAXFAI1KxPiq0ksTV3M+bThC27vciqfBf7lFWxibWRnf8vWIcslrsghEt2GziUU8MXgh8vgnBBggEokVzxZEQmF2yrRoZWwRDwmgQTSsS/wkC+p5tXebtaptctXo2G3D8KXjM6U8vpyjl0xxcGu+Ktel+VM55pzCBVR0GCQXUewEEAnjl0eAhwCACSwmkMi0Za2gXOBg7zpiah6bPLVBpyNgln/TkYCBt+kmQDKRbgpuNqWjwEU3RTN1mg2Ei+oKAUAQko4AC/Cx0aoloIvOHNANzALdgx/APhXKFdBIV80LqpWQ4wiojbKMGREVMhZPqIxYBLN6JkJypRhE1D1HrYyVgS8NQulQzVIBFmkdc6Vi4c5S0hCaWlCHIFFFnKEgoYREYIWY7yXsG5I6J0zc8cpreK0vMCMWHdcifdpEA1rfSx0mhbmV9LTHJmSXgjTjE4oOVOnpRj6PNmKpZMkRboIaYsRfQ5WDI8nW5VhUysr8GoXWlFMPHKzosMgUKKkIABKROKnmbF02KQgSxiP9fx2Kf7cJoJAIEzABNFiDHSx7Dhw5cebClRs//gIEwgkSDC8EQSgiEjKKMOGoIkSKEi1GrDjxkqVIRZcmHQMTCxsHFw+fgJCImESGTFmy5cg1LY+pphvpSZGYlu24np/jOaEEgBCMoBhOkBTNsBwviJKsqJpumJbtuF59YhYLmSQwq9GUkEgzEqszp7CwQHQbCmnYY302ZCPWYoMFxsYvU6GI3bKS/FKbfzNrva3nx1RolKOnum7rWLzmSb7N3wq11m9JrcjQldR741f3vJKre0NTojlm6j+1Cp3llzI4mH6qbdbHZqkqZYF+rfRrp/5Eu1tvPAJWAWgwALoAFOguMAAA6AI=) + format("woff2"); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, + U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, + U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, + U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, + U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, + U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, + U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, + U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, + U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, + U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, + U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, + U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, + U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, + U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, + U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8B1, + U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, + U+1FA80-1FA88, U+1FA90-1FABD, U+1FABF-1FAC5, U+1FACE-1FADB, U+1FAE0-1FAE8, U+1FAF0-1FAF8, + U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, + U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, + U+FFFD; +} + +/* cyrillic-ext */ +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, + U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) + format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, + U+FFFD; +} diff --git a/apps/browser/src/autofill/spec/autofill-mocks.ts b/apps/browser/src/autofill/spec/autofill-mocks.ts new file mode 100644 index 00000000000..a4b6d700090 --- /dev/null +++ b/apps/browser/src/autofill/spec/autofill-mocks.ts @@ -0,0 +1,304 @@ +import { mock } from "jest-mock-extended"; + +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service"; +import { ThemeTypes } from "@bitwarden/common/platform/enums"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; + +import { + FocusedFieldData, + InlineMenuCipherData, +} from "../background/abstractions/overlay.background"; +import AutofillField from "../models/autofill-field"; +import AutofillForm from "../models/autofill-form"; +import AutofillPageDetails from "../models/autofill-page-details"; +import AutofillScript, { FillScript } from "../models/autofill-script"; +import { InitAutofillInlineMenuButtonMessage } from "../overlay/inline-menu/abstractions/autofill-inline-menu-button"; +import { InitAutofillInlineMenuListMessage } from "../overlay/inline-menu/abstractions/autofill-inline-menu-list"; +import { GenerateFillScriptOptions, PageDetail } from "../services/abstractions/autofill.service"; + +export function createAutofillFormMock(customFields = {}): AutofillForm { + return { + opid: "default-form-opid", + htmlID: "default-htmlID", + htmlAction: "default-htmlAction", + htmlMethod: "default-htmlMethod", + htmlName: "default-htmlName", + ...customFields, + }; +} + +export function createAutofillFieldMock(customFields = {}): AutofillField { + return { + opid: "default-input-field-opid", + elementNumber: 0, + viewable: true, + htmlID: "default-htmlID", + htmlName: "default-htmlName", + htmlClass: "default-htmlClass", + tabindex: "0", + title: "default-title", + "label-left": "default-label-left", + "label-right": "default-label-right", + "label-top": "default-label-top", + "label-tag": "default-label-tag", + "label-aria": "default-label-aria", + placeholder: "default-placeholder", + type: "text", + value: "default-value", + disabled: false, + readonly: false, + onePasswordFieldType: "", + form: "invalidFormId", + autoCompleteType: "off", + selectInfo: "", + maxLength: 0, + tagName: "input", + ...customFields, + }; +} + +export function createPageDetailMock(customFields = {}): PageDetail { + return { + frameId: 0, + tab: createChromeTabMock(), + details: createAutofillPageDetailsMock(), + ...customFields, + }; +} + +export function createAutofillPageDetailsMock(customFields = {}): AutofillPageDetails { + return { + title: "title", + url: "url", + documentUrl: "documentUrl", + forms: { + validFormId: { + opid: "opid", + htmlName: "htmlName", + htmlID: "htmlID", + htmlAction: "htmlAction", + htmlMethod: "htmlMethod", + }, + }, + fields: [createAutofillFieldMock({ opid: "non-password-field" })], + collectedTimestamp: 0, + ...customFields, + }; +} + +export function createChromeTabMock(customFields = {}): chrome.tabs.Tab { + return { + id: 1, + index: 1, + pinned: false, + highlighted: false, + windowId: 2, + active: true, + incognito: false, + selected: true, + discarded: false, + autoDiscardable: false, + groupId: 2, + url: "https://jest-testing-website.com", + ...customFields, + }; +} + +export function createGenerateFillScriptOptionsMock(customFields = {}): GenerateFillScriptOptions { + return { + skipUsernameOnlyFill: false, + onlyEmptyFields: false, + onlyVisibleFields: false, + fillNewPassword: false, + allowTotpAutofill: false, + autoSubmitLogin: false, + cipher: mock(), + tabUrl: "https://jest-testing-website.com", + defaultUriMatch: UriMatchStrategy.Domain, + ...customFields, + }; +} + +export function createAutofillScriptMock( + customFields = {}, + scriptTypes?: Record, +): AutofillScript { + let script: FillScript[] = [ + ["click_on_opid", "default-field"], + ["focus_by_opid", "default-field"], + ["fill_by_opid", "default-field", "default"], + ]; + if (scriptTypes) { + script = []; + for (const scriptType in scriptTypes) { + script.push(["click_on_opid", scriptType]); + script.push(["focus_by_opid", scriptType]); + script.push(["fill_by_opid", scriptType, scriptTypes[scriptType]]); + } + } + + return { + autosubmit: null, + metadata: {}, + properties: { + delay_between_operations: 20, + }, + savedUrls: [], + script, + itemType: "", + untrustedIframe: false, + ...customFields, + }; +} + +const overlayPagesTranslations = { + locale: "en", + opensInANewWindow: "opensInANewWindow", + toggleBitwardenVaultOverlay: "toggleBitwardenVaultOverlay", + unlockYourAccountToViewAutofillSuggestions: "unlockYourAccountToViewAutofillSuggestions", + unlockAccount: "unlockAccount", + fillCredentialsFor: "fillCredentialsFor", + username: "username", + view: "view", + noItemsToShow: "noItemsToShow", + newItem: "newItem", + addNewVaultItem: "addNewVaultItem", +}; +export function createInitAutofillInlineMenuButtonMessageMock( + customFields = {}, +): InitAutofillInlineMenuButtonMessage { + return { + command: "initAutofillInlineMenuButton", + translations: overlayPagesTranslations, + styleSheetUrl: "https://jest-testing-website.com", + authStatus: AuthenticationStatus.Unlocked, + portKey: "portKey", + ...customFields, + }; +} +export function createAutofillOverlayCipherDataMock( + index: number, + customFields = {}, +): InlineMenuCipherData { + return { + id: String(index), + name: `website login ${index}`, + login: { + username: `username${index}`, + passkey: null, + }, + type: CipherType.Login, + reprompt: CipherRepromptType.None, + favorite: false, + icon: { + imageEnabled: true, + image: "https://jest-testing-website.com/image.png", + fallbackImage: "https://jest-testing-website.com/fallback.png", + icon: "bw-icon", + }, + ...customFields, + }; +} + +export function createInitAutofillInlineMenuListMessageMock( + customFields = {}, +): InitAutofillInlineMenuListMessage { + return { + command: "initAutofillInlineMenuList", + translations: overlayPagesTranslations, + styleSheetUrl: "https://jest-testing-website.com", + theme: ThemeTypes.Light, + authStatus: AuthenticationStatus.Unlocked, + portKey: "portKey", + inlineMenuFillType: CipherType.Login, + ciphers: [ + createAutofillOverlayCipherDataMock(1, { + icon: { + imageEnabled: true, + image: "https://jest-testing-website.com/image.png", + fallbackImage: "", + icon: "bw-icon", + }, + }), + createAutofillOverlayCipherDataMock(2, { + icon: { + imageEnabled: true, + image: "", + fallbackImage: "https://jest-testing-website.com/fallback.png", + icon: "bw-icon", + }, + }), + createAutofillOverlayCipherDataMock(3, { + name: "", + login: { username: "" }, + icon: { imageEnabled: true, image: "", fallbackImage: "", icon: "bw-icon" }, + }), + createAutofillOverlayCipherDataMock(4, { + icon: { imageEnabled: false, image: "", fallbackImage: "", icon: "" }, + }), + createAutofillOverlayCipherDataMock(5), + createAutofillOverlayCipherDataMock(6), + createAutofillOverlayCipherDataMock(7), + createAutofillOverlayCipherDataMock(8), + ], + ...customFields, + }; +} + +export function createFocusedFieldDataMock( + customFields: Partial = {}, +): FocusedFieldData { + return { + focusedFieldRects: { + top: 1, + left: 2, + height: 3, + width: 4, + }, + focusedFieldStyles: { + paddingRight: "6px", + paddingLeft: "6px", + }, + inlineMenuFillType: CipherType.Login, + tabId: 1, + frameId: 2, + ...customFields, + }; +} + +export function createPortSpyMock(name: string) { + return mock({ + name, + onMessage: { + addListener: jest.fn(), + removeListener: jest.fn(), + }, + onDisconnect: { + addListener: jest.fn(), + }, + postMessage: jest.fn(), + disconnect: jest.fn(), + sender: { + tab: createChromeTabMock(), + url: "https://jest-testing-website.com", + }, + }); +} + +export function createMutationRecordMock(customFields = {}): MutationRecord { + return { + addedNodes: mock(), + attributeName: "default-attributeName", + attributeNamespace: "default-attributeNamespace", + nextSibling: null, + oldValue: "default-oldValue", + previousSibling: null, + removedNodes: mock(), + target: null, + type: "attributes", + ...customFields, + }; +} diff --git a/apps/browser/src/autofill/spec/fido2-testing-utils.ts b/apps/browser/src/autofill/spec/fido2-testing-utils.ts new file mode 100644 index 00000000000..5c739235dc7 --- /dev/null +++ b/apps/browser/src/autofill/spec/fido2-testing-utils.ts @@ -0,0 +1,74 @@ +import { mock } from "jest-mock-extended"; + +import { + AssertCredentialResult, + CreateCredentialResult, +} from "@bitwarden/common/platform/abstractions/fido2/fido2-client.service.abstraction"; + +export function createCredentialCreationOptionsMock( + customFields: Partial = {}, +): CredentialCreationOptions { + return mock({ + publicKey: mock({ + authenticatorSelection: { authenticatorAttachment: "platform" }, + excludeCredentials: [{ id: new ArrayBuffer(32), type: "public-key" }], + pubKeyCredParams: [{ alg: -7, type: "public-key" }], + user: { id: new ArrayBuffer(32), name: "test", displayName: "test" }, + }), + ...customFields, + }); +} + +export function createCreateCredentialResultMock( + customFields: Partial = {}, +): CreateCredentialResult { + return mock({ + credentialId: "mock", + clientDataJSON: "mock", + attestationObject: "mock", + authData: "mock", + publicKey: "mock", + publicKeyAlgorithm: -7, + transports: ["internal"], + ...customFields, + }); +} + +export function createCredentialRequestOptionsMock( + customFields: Partial = {}, +): CredentialRequestOptions { + return mock({ + mediation: "optional", + publicKey: mock({ + allowCredentials: [{ id: new ArrayBuffer(32), type: "public-key" }], + }), + ...customFields, + }); +} + +export function createAssertCredentialResultMock( + customFields: Partial = {}, +): AssertCredentialResult { + return mock({ + credentialId: "mock", + clientDataJSON: "mock", + authenticatorData: "mock", + signature: "mock", + userHandle: "mock", + ...customFields, + }); +} + +export function setupMockedWebAuthnSupport() { + (globalThis as any).PublicKeyCredential = class PolyfillPublicKeyCredential { + static isUserVerifyingPlatformAuthenticatorAvailable = () => Promise.resolve(true); + }; + (globalThis as any).AuthenticatorAttestationResponse = + class PolyfillAuthenticatorAttestationResponse {}; + (globalThis as any).AuthenticatorAssertionResponse = + class PolyfillAuthenticatorAssertionResponse {}; + (globalThis as any).navigator.credentials = { + create: jest.fn().mockResolvedValue({}), + get: jest.fn().mockResolvedValue({}), + }; +} diff --git a/apps/browser/src/autofill/spec/testing-utils.ts b/apps/browser/src/autofill/spec/testing-utils.ts new file mode 100644 index 00000000000..1a3f3a52234 --- /dev/null +++ b/apps/browser/src/autofill/spec/testing-utils.ts @@ -0,0 +1,203 @@ +import { mock } from "jest-mock-extended"; + +export function triggerTestFailure() { + expect(true).toBe("Test has failed."); +} + +const scheduler = typeof setImmediate === "function" ? setImmediate : setTimeout; +export function flushPromises() { + return new Promise(function (resolve) { + scheduler(resolve); + }); +} + +export function postWindowMessage(data: any, origin = "https://localhost/", source = window) { + globalThis.dispatchEvent(new MessageEvent("message", { data, origin, source })); +} + +export function sendMockExtensionMessage( + message: any, + sender?: chrome.runtime.MessageSender, + sendResponse?: CallableFunction, +) { + (chrome.runtime.onMessage.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback( + message || {}, + sender || mock(), + sendResponse || jest.fn(), + ); + }, + ); +} + +export function triggerRuntimeOnConnectEvent(port: chrome.runtime.Port) { + (chrome.runtime.onConnect.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback(port); + }, + ); +} + +export function sendPortMessage(port: chrome.runtime.Port, message: any) { + (port.onMessage.addListener as unknown as jest.SpyInstance).mock.calls.forEach((call) => { + const callback = call[0]; + callback(message || {}, port); + }); +} + +export function triggerPortOnConnectEvent(port: chrome.runtime.Port) { + (chrome.runtime.onConnect.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback(port); + }, + ); +} + +export function triggerPortOnMessageEvent(port: chrome.runtime.Port, message: any) { + (port.onMessage.addListener as unknown as jest.SpyInstance).mock.calls.forEach((call) => { + const callback = call[0]; + callback(message, port); + }); +} + +export function triggerPortOnDisconnectEvent(port: chrome.runtime.Port) { + (port.onDisconnect.addListener as unknown as jest.SpyInstance).mock.calls.forEach((call) => { + const callback = call[0]; + callback(port); + }); +} + +export function triggerWindowOnFocusedChangedEvent(windowId: number) { + (chrome.windows.onFocusChanged.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback(windowId); + }, + ); +} + +export function triggerTabOnActivatedEvent(activeInfo: chrome.tabs.TabActiveInfo) { + (chrome.tabs.onActivated.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback(activeInfo); + }, + ); +} + +export function triggerTabOnReplacedEvent(addedTabId: number, removedTabId: number) { + (chrome.tabs.onReplaced.addListener as unknown as jest.SpyInstance).mock.calls.forEach((call) => { + const callback = call[0]; + callback(addedTabId, removedTabId); + }); +} + +export function triggerTabOnUpdatedEvent( + tabId: number, + changeInfo: chrome.tabs.TabChangeInfo, + tab: chrome.tabs.Tab, +) { + (chrome.tabs.onUpdated.addListener as unknown as jest.SpyInstance).mock.calls.forEach((call) => { + const callback = call[0]; + callback(tabId, changeInfo, tab); + }); +} + +export function triggerTabOnRemovedEvent(tabId: number, removeInfo: chrome.tabs.TabRemoveInfo) { + (chrome.tabs.onRemoved.addListener as unknown as jest.SpyInstance).mock.calls.forEach((call) => { + const callback = call[0]; + callback(tabId, removeInfo); + }); +} + +export function triggerOnAlarmEvent(alarm: chrome.alarms.Alarm) { + (chrome.alarms.onAlarm.addListener as unknown as jest.SpyInstance).mock.calls.forEach((call) => { + const callback = call[0]; + callback(alarm); + }); +} + +export function triggerWebNavigationOnCommittedEvent( + details: chrome.webNavigation.WebNavigationFramedCallbackDetails, +) { + (chrome.webNavigation.onCommitted.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback(details); + }, + ); +} + +export function triggerWebNavigationOnCompletedEvent( + details: chrome.webNavigation.WebNavigationFramedCallbackDetails, +) { + (chrome.webNavigation.onCompleted.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback(details); + }, + ); +} + +export function triggerWebRequestOnBeforeRequestEvent( + details: chrome.webRequest.WebRequestDetails, +) { + (chrome.webRequest.onBeforeRequest.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback(details); + }, + ); +} + +export function triggerWebRequestOnBeforeRedirectEvent( + details: chrome.webRequest.WebRequestDetails, +) { + ( + chrome.webRequest.onBeforeRedirect.addListener as unknown as jest.SpyInstance + ).mock.calls.forEach((call) => { + const callback = call[0]; + callback(details); + }); +} + +export function triggerWebRequestOnCompletedEvent(details: chrome.webRequest.WebResponseDetails) { + (chrome.webRequest.onCompleted.addListener as unknown as jest.SpyInstance).mock.calls.forEach( + (call) => { + const callback = call[0]; + callback(details); + }, + ); +} + +export function mockQuerySelectorAllDefinedCall() { + const originalDocumentQuerySelectorAll = document.querySelectorAll; + globalThis.document.querySelectorAll = function (selector: string) { + return originalDocumentQuerySelectorAll.call( + document, + selector === ":defined" ? "*" : selector, + ); + }; + + const originalShadowRootQuerySelectorAll = ShadowRoot.prototype.querySelectorAll; + ShadowRoot.prototype.querySelectorAll = function (selector: string) { + return originalShadowRootQuerySelectorAll.call(this, selector === ":defined" ? "*" : selector); + }; + + const originalElementQuerySelectorAll = Element.prototype.querySelectorAll; + Element.prototype.querySelectorAll = function (selector: string) { + return originalElementQuerySelectorAll.call(this, selector === ":defined" ? "*" : selector); + }; + + return { + mockRestore: () => { + document.querySelectorAll = originalDocumentQuerySelectorAll; + ShadowRoot.prototype.querySelectorAll = originalShadowRootQuerySelectorAll; + Element.prototype.querySelectorAll = originalElementQuerySelectorAll; + }, + }; +} diff --git a/apps/browser/src/autofill/types/index.ts b/apps/browser/src/autofill/types/index.ts index 8bab87709d2..a14ef1330cc 100644 --- a/apps/browser/src/autofill/types/index.ts +++ b/apps/browser/src/autofill/types/index.ts @@ -1,5 +1,7 @@ import { Region } from "@bitwarden/common/platform/abstractions/environment.service"; import { VaultTimeoutAction } from "@bitwarden/common/src/enums/vault-timeout-action.enum"; +import { VaultTimeout } from "@bitwarden/common/types/vault-timeout.type"; +import { CipherType } from "@bitwarden/common/vault/enums"; export type UserSettings = { avatarColor: string | null; @@ -30,13 +32,7 @@ export type UserSettings = { utcDate: string; version: string; }; - settings: { - equivalentDomains: string[][]; - }; - neverDomains?: { [key: string]: any }; - disableAddLoginNotification?: boolean; - disableChangedPasswordNotification?: boolean; - vaultTimeout: number; + vaultTimeout: VaultTimeout; vaultTimeoutAction: VaultTimeoutAction; }; @@ -58,3 +54,5 @@ export type FillableFormFieldElement = HTMLInputElement | HTMLSelectElement | HT export type FormFieldElement = FillableFormFieldElement | HTMLSpanElement; export type FormElementWithAttribute = FormFieldElement & Record; + +export type AutofillCipherTypeId = CipherType.Login | CipherType.Card | CipherType.Identity; diff --git a/apps/browser/src/autofill/utils/index.spec.ts b/apps/browser/src/autofill/utils/index.spec.ts new file mode 100644 index 00000000000..62a707860c3 --- /dev/null +++ b/apps/browser/src/autofill/utils/index.spec.ts @@ -0,0 +1,246 @@ +import { AutofillPort } from "../enums/autofill-port.enum"; +import { triggerPortOnDisconnectEvent } from "../spec/testing-utils"; + +import { logoIcon, logoLockedIcon } from "./svg-icons"; + +import { + buildSvgDomElement, + generateRandomCustomElementName, + sendExtensionMessage, + setElementStyles, + setupExtensionDisconnectAction, + setupAutofillInitDisconnectAction, + debounce, +} from "./index"; + +describe("buildSvgDomElement", () => { + it("returns an SVG DOM element", () => { + const builtSVG = buildSvgDomElement(logoIcon); + const builtSVGAriaVisible = buildSvgDomElement(logoLockedIcon, false); + + expect(builtSVG.tagName).toEqual("svg"); + expect(builtSVG.getAttribute("aria-hidden")).toEqual("true"); + expect(builtSVGAriaVisible.tagName).toEqual("svg"); + expect(builtSVGAriaVisible.getAttribute("aria-hidden")).toEqual("false"); + }); +}); + +describe("generateRandomCustomElementName", () => { + it("returns a randomized value", async () => { + let generatedValue = ""; + + expect(generatedValue).toHaveLength(0); + + generatedValue = generateRandomCustomElementName(); + + expect(generatedValue.length).toBeGreaterThan(0); + }); +}); + +describe("sendExtensionMessage", () => { + it("sends a message to the extension", async () => { + const extensionMessagePromise = sendExtensionMessage("some-extension-message"); + + // Jest doesn't give anyway to select the typed overload of "sendMessage", + // a cast is needed to get the correct spy type. + const sendMessageSpy = jest.spyOn(chrome.runtime, "sendMessage") as unknown as jest.SpyInstance< + void, + [message: string, responseCallback: (response: string) => void], + unknown + >; + + expect(sendMessageSpy).toHaveBeenCalled(); + + const [latestCall] = sendMessageSpy.mock.calls; + const responseCallback = latestCall[1]; + + responseCallback("sendMessageResponse"); + + const response = await extensionMessagePromise; + expect(response).toEqual("sendMessageResponse"); + }); +}); + +describe("setElementStyles", () => { + const passedRules = { backgroundColor: "hotpink", color: "cyan" }; + const expectedCSSRuleString = "background-color: hotpink; color: cyan;"; + const expectedImportantCSSRuleString = + "background-color: hotpink !important; color: cyan !important;"; + + it("sets the passed styles to the passed HTMLElement", async () => { + const domParser = new DOMParser(); + const testDivDOM = domParser.parseFromString( + "
This is an unexciting div.
", + "text/html", + ); + const testDiv = testDivDOM.querySelector("div"); + + expect(testDiv.getAttribute("style")).toEqual(null); + + setElementStyles(testDiv, passedRules); + + expect(testDiv.getAttribute("style")).toEqual(expectedCSSRuleString); + }); + + it("sets the passed styles with !important flag to the passed HTMLElement", () => { + const domParser = new DOMParser(); + const testDivDOM = domParser.parseFromString( + "
This is an unexciting div.
", + "text/html", + ); + const testDiv = testDivDOM.querySelector("div"); + + expect(testDiv.style.cssText).toEqual(""); + + setElementStyles(testDiv, passedRules, true); + + expect(testDiv.style.cssText).toEqual(expectedImportantCSSRuleString); + }); + + it("makes no changes when no element is passed", () => { + const domParser = new DOMParser(); + const testDivDOM = domParser.parseFromString( + "
This is an unexciting div.
", + "text/html", + ); + const testDiv = testDivDOM.querySelector("div"); + + expect(testDiv.style.cssText).toEqual(""); + + setElementStyles(testDiv, passedRules); + + expect(testDiv.style.cssText).toEqual(expectedCSSRuleString); + + setElementStyles(undefined, passedRules, true); + + expect(testDiv.style.cssText).toEqual(expectedCSSRuleString); + }); + + it("makes no changes when no CSS rules are passed", () => { + const domParser = new DOMParser(); + const testDivDOM = domParser.parseFromString( + "
This is an unexciting div.
", + "text/html", + ); + const testDiv = testDivDOM.querySelector("div"); + + expect(testDiv.style.cssText).toEqual(""); + + setElementStyles(testDiv, passedRules); + + expect(testDiv.style.cssText).toEqual(expectedCSSRuleString); + + setElementStyles(testDiv, {}, true); + + expect(testDiv.style.cssText).toEqual(expectedCSSRuleString); + }); +}); + +describe("setupExtensionDisconnectAction", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it("connects a port to the extension background and sets up an onDisconnect listener", () => { + const onDisconnectCallback = jest.fn(); + let port: chrome.runtime.Port; + jest.spyOn(chrome.runtime, "connect").mockImplementation(() => { + port = { + onDisconnect: { + addListener: onDisconnectCallback, + removeListener: jest.fn(), + }, + } as unknown as chrome.runtime.Port; + + return port; + }); + + setupExtensionDisconnectAction(onDisconnectCallback); + + expect(chrome.runtime.connect).toHaveBeenCalledWith({ + name: AutofillPort.InjectedScript, + }); + expect(port.onDisconnect.addListener).toHaveBeenCalledWith(expect.any(Function)); + }); +}); + +describe("setupAutofillInitDisconnectAction", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it("skips setting up the extension disconnect action if the bitwardenAutofillInit object is not populated", () => { + const onDisconnectCallback = jest.fn(); + window.bitwardenAutofillInit = undefined; + const portConnectSpy = jest.spyOn(chrome.runtime, "connect").mockImplementation(() => { + return { + onDisconnect: { + addListener: onDisconnectCallback, + removeListener: jest.fn(), + }, + } as unknown as chrome.runtime.Port; + }); + + setupAutofillInitDisconnectAction(window); + + expect(portConnectSpy).not.toHaveBeenCalled(); + }); + + it("destroys the autofill init instance when the port is disconnected", () => { + let port: chrome.runtime.Port; + const autofillInitDestroy: CallableFunction = jest.fn(); + window.bitwardenAutofillInit = { + destroy: autofillInitDestroy, + } as any; + jest.spyOn(chrome.runtime, "connect").mockImplementation(() => { + port = { + onDisconnect: { + addListener: jest.fn(), + removeListener: jest.fn(), + }, + } as unknown as chrome.runtime.Port; + + return port; + }); + + setupAutofillInitDisconnectAction(window); + triggerPortOnDisconnectEvent(port as chrome.runtime.Port); + + expect(chrome.runtime.connect).toHaveBeenCalled(); + expect(port.onDisconnect.addListener).toHaveBeenCalled(); + expect(autofillInitDestroy).toHaveBeenCalled(); + expect(window.bitwardenAutofillInit).toBeUndefined(); + }); +}); + +describe("debounce", () => { + const debouncedFunction = jest.fn(); + const debounced = debounce(debouncedFunction, 100); + + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.clearAllTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + it("does not call the method until the delay is complete", () => { + debounced(); + jest.advanceTimersByTime(50); + expect(debouncedFunction).not.toHaveBeenCalled(); + }); + + it("calls the method a single time when the debounce is triggered multiple times", () => { + debounced(); + debounced(); + debounced(); + jest.advanceTimersByTime(100); + + expect(debouncedFunction).toHaveBeenCalledTimes(1); + }); +}); diff --git a/apps/browser/src/autofill/utils/index.ts b/apps/browser/src/autofill/utils/index.ts new file mode 100644 index 00000000000..598e3bc3efe --- /dev/null +++ b/apps/browser/src/autofill/utils/index.ts @@ -0,0 +1,544 @@ +import { AutofillPort } from "../enums/autofill-port.enum"; +import { FillableFormFieldElement, FormElementWithAttribute, FormFieldElement } from "../types"; + +/** + * Generates a random string of characters. + * + * @param length - The length of the random string to generate. + */ +export function generateRandomChars(length: number): string { + const chars = "abcdefghijklmnopqrstuvwxyz"; + const randomChars = []; + const randomBytes = new Uint8Array(length); + globalThis.crypto.getRandomValues(randomBytes); + + for (let byteIndex = 0; byteIndex < randomBytes.length; byteIndex++) { + const byte = randomBytes[byteIndex]; + randomChars.push(chars[byte % chars.length]); + } + + return randomChars.join(""); +} + +/** + * Polyfills the requestIdleCallback API with a setTimeout fallback. + * + * @param callback - The callback function to run when the browser is idle. + * @param options - The options to pass to the requestIdleCallback function. + */ +export function requestIdleCallbackPolyfill( + callback: () => void, + options?: Record, +): number | NodeJS.Timeout { + if ("requestIdleCallback" in globalThis) { + return globalThis.requestIdleCallback(() => callback(), options); + } + + return globalThis.setTimeout(() => callback(), 1); +} + +/** + * Polyfills the cancelIdleCallback API with a clearTimeout fallback. + * + * @param id - The ID of the idle callback to cancel. + */ +export function cancelIdleCallbackPolyfill(id: NodeJS.Timeout | number) { + if ("cancelIdleCallback" in globalThis) { + return globalThis.cancelIdleCallback(id as number); + } + + return globalThis.clearTimeout(id); +} + +/** + * Generates a random string of characters that formatted as a custom element name. + */ +export function generateRandomCustomElementName(): string { + const length = Math.floor(Math.random() * 5) + 8; // Between 8 and 12 characters + const numHyphens = Math.min(Math.max(Math.floor(Math.random() * 4), 1), length - 1); // At least 1, maximum of 3 hyphens + + const hyphenIndices: number[] = []; + while (hyphenIndices.length < numHyphens) { + const index = Math.floor(Math.random() * (length - 1)) + 1; + if (!hyphenIndices.includes(index)) { + hyphenIndices.push(index); + } + } + hyphenIndices.sort((a, b) => a - b); + + let randomString = ""; + let prevIndex = 0; + + for (let index = 0; index < hyphenIndices.length; index++) { + const hyphenIndex = hyphenIndices[index]; + randomString = randomString + generateRandomChars(hyphenIndex - prevIndex) + "-"; + prevIndex = hyphenIndex; + } + + randomString += generateRandomChars(length - prevIndex); + + return randomString; +} + +/** + * Builds a DOM element from an SVG string. + * + * @param svgString - The SVG string to build the DOM element from. + * @param ariaHidden - Determines whether the SVG should be hidden from screen readers. + */ +export function buildSvgDomElement(svgString: string, ariaHidden = true): HTMLElement { + const domParser = new DOMParser(); + const svgDom = domParser.parseFromString(svgString, "image/svg+xml"); + const domElement = svgDom.documentElement; + domElement.setAttribute("aria-hidden", `${ariaHidden}`); + + return domElement; +} + +/** + * Sends a message to the extension. + * + * @param command - The command to send. + * @param options - The options to send with the command. + */ +export async function sendExtensionMessage( + command: string, + options: Record = {}, +): Promise { + if ( + typeof browser !== "undefined" && + typeof browser.runtime !== "undefined" && + typeof browser.runtime.sendMessage !== "undefined" + ) { + return browser.runtime.sendMessage({ command, ...options }); + } + + return new Promise((resolve) => + chrome.runtime.sendMessage(Object.assign({ command }, options), (response) => { + if (chrome.runtime.lastError) { + resolve(null); + } + + resolve(response); + }), + ); +} + +/** + * Sets CSS styles on an element. + * + * @param element - The element to set the styles on. + * @param styles - The styles to set on the element. + * @param priority - Determines whether the styles should be set as important. + */ +export function setElementStyles( + element: HTMLElement, + styles: Partial, + priority?: boolean, +) { + if (!element || !styles || !Object.keys(styles).length) { + return; + } + + for (const styleProperty in styles) { + element.style.setProperty( + styleProperty.replace(/([a-z])([A-Z])/g, "$1-$2"), // Convert camelCase to kebab-case + styles[styleProperty], + priority ? "important" : undefined, + ); + } +} + +/** + * Sets up a long-lived connection with the extension background + * and triggers an onDisconnect event if the extension context + * is invalidated. + * + * @param callback - Callback export function to run when the extension disconnects + */ +export function setupExtensionDisconnectAction(callback: (port: chrome.runtime.Port) => void) { + const port = chrome.runtime.connect({ name: AutofillPort.InjectedScript }); + const onDisconnectCallback = (disconnectedPort: chrome.runtime.Port) => { + callback(disconnectedPort); + port.onDisconnect.removeListener(onDisconnectCallback); + }; + port.onDisconnect.addListener(onDisconnectCallback); +} + +/** + * Handles setup of the extension disconnect action for the autofill init class + * in both instances where the overlay might or might not be initialized. + * + * @param windowContext - The global window context + */ +export function setupAutofillInitDisconnectAction(windowContext: Window) { + if (!windowContext.bitwardenAutofillInit) { + return; + } + + const onDisconnectCallback = () => { + windowContext.bitwardenAutofillInit.destroy(); + delete windowContext.bitwardenAutofillInit; + }; + setupExtensionDisconnectAction(onDisconnectCallback); +} + +/** + * Identifies whether an element is a fillable form field. + * This is determined by whether the element is a form field and not a span. + * + * @param formFieldElement - The form field element to check. + */ +export function elementIsFillableFormField( + formFieldElement: FormFieldElement, +): formFieldElement is FillableFormFieldElement { + return !elementIsSpanElement(formFieldElement); +} + +/** + * Identifies whether an element is an instance of a specific tag name. + * + * @param element - The element to check. + * @param tagName - The tag name to check against. + */ +export function elementIsInstanceOf( + element: Element, + tagName: string, +): element is T { + return nodeIsElement(element) && element.tagName.toLowerCase() === tagName; +} + +/** + * Identifies whether an element is a span element. + * + * @param element - The element to check. + */ +export function elementIsSpanElement(element: Element): element is HTMLSpanElement { + return elementIsInstanceOf(element, "span"); +} + +/** + * Identifies whether an element is an input field. + * + * @param element - The element to check. + */ +export function elementIsInputElement(element: Element): element is HTMLInputElement { + return elementIsInstanceOf(element, "input"); +} + +/** + * Identifies whether an element is a select field. + * + * @param element - The element to check. + */ +export function elementIsSelectElement(element: Element): element is HTMLSelectElement { + return elementIsInstanceOf(element, "select"); +} + +/** + * Identifies whether an element is a textarea field. + * + * @param element - The element to check. + */ +export function elementIsTextAreaElement(element: Element): element is HTMLTextAreaElement { + return elementIsInstanceOf(element, "textarea"); +} + +/** + * Identifies whether an element is a form element. + * + * @param element - The element to check. + */ +export function elementIsFormElement(element: Element): element is HTMLFormElement { + return elementIsInstanceOf(element, "form"); +} + +/** + * Identifies whether an element is a label element. + * + * @param element - The element to check. + */ +export function elementIsLabelElement(element: Element): element is HTMLLabelElement { + return elementIsInstanceOf(element, "label"); +} + +/** + * Identifies whether an element is a description details `dd` element. + * + * @param element - The element to check. + */ +export function elementIsDescriptionDetailsElement(element: Element): element is HTMLElement { + return elementIsInstanceOf(element, "dd"); +} + +/** + * Identifies whether an element is a description term `dt` element. + * + * @param element - The element to check. + */ +export function elementIsDescriptionTermElement(element: Element): element is HTMLElement { + return elementIsInstanceOf(element, "dt"); +} + +/** + * Identifies whether a node is an HTML element. + * + * @param node - The node to check. + */ +export function nodeIsElement(node: Node): node is Element { + if (!node) { + return false; + } + + return node?.nodeType === Node.ELEMENT_NODE; +} + +/** + * Identifies whether a node is an input element. + * + * @param node - The node to check. + */ +export function nodeIsInputElement(node: Node): node is HTMLInputElement { + return nodeIsElement(node) && elementIsInputElement(node); +} + +/** + * Identifies whether a node is a form element. + * + * @param node - The node to check. + */ +export function nodeIsFormElement(node: Node): node is HTMLFormElement { + return nodeIsElement(node) && elementIsFormElement(node); +} + +export function nodeIsTypeSubmitElement(node: Node): node is HTMLElement { + return nodeIsElement(node) && getPropertyOrAttribute(node as HTMLElement, "type") === "submit"; +} + +export function nodeIsButtonElement(node: Node): node is HTMLButtonElement { + return ( + nodeIsElement(node) && + (elementIsInstanceOf(node, "button") || + getPropertyOrAttribute(node as HTMLElement, "type") === "button") + ); +} + +export function nodeIsAnchorElement(node: Node): node is HTMLAnchorElement { + return nodeIsElement(node) && elementIsInstanceOf(node, "a"); +} + +/** + * Returns a boolean representing the attribute value of an element. + * + * @param element + * @param attributeName + * @param checkString + */ +export function getAttributeBoolean( + element: HTMLElement, + attributeName: string, + checkString = false, +): boolean { + if (checkString) { + return getPropertyOrAttribute(element, attributeName) === "true"; + } + + return Boolean(getPropertyOrAttribute(element, attributeName)); +} + +/** + * Get the value of a property or attribute from a FormFieldElement. + * + * @param element + * @param attributeName + */ +export function getPropertyOrAttribute(element: HTMLElement, attributeName: string): string | null { + if (attributeName in element) { + return (element as FormElementWithAttribute)[attributeName]; + } + + return element.getAttribute(attributeName); +} + +/** + * Throttles a callback function to run at most once every `limit` milliseconds. + * + * @param callback - The callback function to throttle. + * @param limit - The time in milliseconds to throttle the callback. + */ +export function throttle(callback: (_args: any) => any, limit: number) { + let waitingDelay = false; + return function (...args: unknown[]) { + if (!waitingDelay) { + callback.apply(this, args); + waitingDelay = true; + globalThis.setTimeout(() => (waitingDelay = false), limit); + } + }; +} + +/** + * Debounces a callback function to run after a delay of `delay` milliseconds. + * + * @param callback - The callback function to debounce. + * @param delay - The time in milliseconds to debounce the callback. + * @param immediate - Determines whether the callback should run immediately. + */ +export function debounce(callback: (_args: any) => any, delay: number, immediate?: boolean) { + let timeout: NodeJS.Timeout; + return function (...args: unknown[]) { + const callImmediately = !!immediate && !timeout; + + if (timeout) { + globalThis.clearTimeout(timeout); + } + timeout = globalThis.setTimeout(() => { + timeout = null; + if (!callImmediately) { + callback.apply(this, args); + } + }, delay); + + if (callImmediately) { + callback.apply(this, args); + } + }; +} + +/** + * Gathers and normalizes keywords from a potential submit button element. Used + * to verify if the element submits a login or change password form. + * + * @param element - The element to gather keywords from. + */ +export function getSubmitButtonKeywordsSet(element: HTMLElement): Set { + const keywords = [ + element.textContent, + element.getAttribute("type"), + element.getAttribute("value"), + element.getAttribute("aria-label"), + element.getAttribute("aria-labelledby"), + element.getAttribute("aria-describedby"), + element.getAttribute("title"), + element.getAttribute("id"), + element.getAttribute("name"), + element.getAttribute("class"), + ]; + + const keywordsSet = new Set(); + for (let i = 0; i < keywords.length; i++) { + if (typeof keywords[i] === "string") { + // Iterate over all keywords metadata and split them by non-letter characters. + // This ensures we check against individual words and not the entire string. + keywords[i] + .toLowerCase() + .replace(/[-\s]/g, "") + .split(/[^\p{L}]+/gu) + .forEach((keyword) => { + if (keyword) { + keywordsSet.add(keyword); + } + }); + } + } + + return keywordsSet; +} + +/** + * Generates the origin and subdomain match patterns for the URL. + * + * @param url - The URL of the tab + */ +export function generateDomainMatchPatterns(url: string): string[] { + try { + const extensionUrlPattern = + /^(chrome|chrome-extension|moz-extension|safari-web-extension):\/\/\/?/; + if (extensionUrlPattern.test(url)) { + return []; + } + + // Add protocol to URL if it is missing to allow for parsing the hostname correctly + const urlPattern = /^(https?|file):\/\/\/?/; + if (!urlPattern.test(url)) { + url = `https://${url}`; + } + + let protocolGlob = "*://"; + if (url.startsWith("file:///")) { + protocolGlob = "*:///"; // File URLs require three slashes to be a valid match pattern + } + + const parsedUrl = new URL(url); + const originMatchPattern = `${protocolGlob}${parsedUrl.hostname}/*`; + + const splitHost = parsedUrl.hostname.split("."); + const domain = splitHost.slice(-2).join("."); + const subDomainMatchPattern = `${protocolGlob}*.${domain}/*`; + + return [originMatchPattern, subDomainMatchPattern]; + } catch { + return []; + } +} + +/** + * Determines if the status code of the web response is invalid. An invalid status code is + * any status code that is not in the 200-299 range. + * + * @param statusCode - The status code of the web response + */ +export function isInvalidResponseStatusCode(statusCode: number) { + return statusCode < 200 || statusCode >= 300; +} + +/** + * Determines if the current context is within a sandboxed iframe. + */ +export function currentlyInSandboxedIframe(): boolean { + return ( + String(self.origin).toLowerCase() === "null" || + globalThis.frameElement?.hasAttribute("sandbox") || + globalThis.location.hostname === "" + ); +} + +/** + * This object allows us to map a special character to a key name. The key name is used + * in gathering the i18n translation of the written version of the special character. + */ +export const specialCharacterToKeyMap: Record = { + " ": "spaceCharacterDescriptor", + "~": "tildeCharacterDescriptor", + "`": "backtickCharacterDescriptor", + "!": "exclamationCharacterDescriptor", + "@": "atSignCharacterDescriptor", + "#": "hashSignCharacterDescriptor", + $: "dollarSignCharacterDescriptor", + "%": "percentSignCharacterDescriptor", + "^": "caretCharacterDescriptor", + "&": "ampersandCharacterDescriptor", + "*": "asteriskCharacterDescriptor", + "(": "parenLeftCharacterDescriptor", + ")": "parenRightCharacterDescriptor", + "-": "hyphenCharacterDescriptor", + _: "underscoreCharacterDescriptor", + "+": "plusCharacterDescriptor", + "=": "equalsCharacterDescriptor", + "{": "braceLeftCharacterDescriptor", + "}": "braceRightCharacterDescriptor", + "[": "bracketLeftCharacterDescriptor", + "]": "bracketRightCharacterDescriptor", + "|": "pipeCharacterDescriptor", + "\\": "backSlashCharacterDescriptor", + ":": "colonCharacterDescriptor", + ";": "semicolonCharacterDescriptor", + '"': "doubleQuoteCharacterDescriptor", + "'": "singleQuoteCharacterDescriptor", + "<": "lessThanCharacterDescriptor", + ">": "greaterThanCharacterDescriptor", + ",": "commaCharacterDescriptor", + ".": "periodCharacterDescriptor", + "?": "questionCharacterDescriptor", + "/": "forwardSlashCharacterDescriptor", +}; diff --git a/apps/browser/src/autofill/utils/svg-icons.ts b/apps/browser/src/autofill/utils/svg-icons.ts new file mode 100644 index 00000000000..b04d18608ec --- /dev/null +++ b/apps/browser/src/autofill/utils/svg-icons.ts @@ -0,0 +1,38 @@ +export const logoIcon = + ''; + +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/commands.background.ts b/apps/browser/src/background/commands.background.ts index 0cbf91c6666..2aec43ba4f7 100644 --- a/apps/browser/src/background/commands.background.ts +++ b/apps/browser/src/background/commands.background.ts @@ -1,13 +1,14 @@ import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { ExtensionCommand, ExtensionCommandType } from "@bitwarden/common/autofill/constants"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { openUnlockPopout } from "../auth/popup/utils/auth-popout-window"; +import { LockedVaultPendingNotificationsData } from "../autofill/background/abstractions/notification.background"; import { BrowserApi } from "../platform/browser/browser-api"; import MainBackground from "./main.background"; -import LockedVaultPendingNotificationsItem from "./models/lockedVaultPendingNotificationsItem"; export default class CommandsBackground { private isSafari: boolean; @@ -15,27 +16,24 @@ export default class CommandsBackground { constructor( private main: MainBackground, - private passwordGenerationService: PasswordGenerationServiceAbstraction, private platformUtilsService: PlatformUtilsService, private vaultTimeoutService: VaultTimeoutService, - private authService: AuthService + private authService: AuthService, + private generatePasswordToClipboard: () => Promise, ) { this.isSafari = this.platformUtilsService.isSafari(); this.isVivaldi = this.platformUtilsService.isVivaldi(); } - async init() { - BrowserApi.messageListener( - "commands.background", - async (msg: any, sender: chrome.runtime.MessageSender, sendResponse: any) => { - if (msg.command === "unlockCompleted" && msg.data.target === "commands.background") { - await this.processCommand( - msg.data.commandToRetry.msg.command, - msg.data.commandToRetry.sender - ); - } + init() { + BrowserApi.messageListener("commands.background", (msg: any) => { + if (msg.command === "unlockCompleted" && msg.data.target === "commands.background") { + this.processCommand( + msg.data.commandToRetry.message.command, + msg.data.commandToRetry.sender, + ).catch((error) => this.main.logService.error(error)); } - ); + }); if (chrome && chrome.commands) { chrome.commands.onCommand.addListener(async (command: string) => { @@ -49,8 +47,23 @@ export default class CommandsBackground { case "generate_password": await this.generatePasswordToClipboard(); break; - case "autofill_login": - await this.autoFillLogin(sender ? sender.tab : null); + case ExtensionCommand.AutofillLogin: + await this.triggerAutofillCommand( + sender ? sender.tab : null, + ExtensionCommand.AutofillCommand, + ); + break; + case ExtensionCommand.AutofillCard: + await this.triggerAutofillCommand( + sender ? sender.tab : null, + ExtensionCommand.AutofillCard, + ); + break; + case ExtensionCommand.AutofillIdentity: + await this.triggerAutofillCommand( + sender ? sender.tab : null, + ExtensionCommand.AutofillIdentity, + ); break; case "open_popup": await this.openPopup(); @@ -63,26 +76,27 @@ export default class CommandsBackground { } } - private async generatePasswordToClipboard() { - const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {}; - const password = await this.passwordGenerationService.generatePassword(options); - this.platformUtilsService.copyToClipboard(password, { window: window }); - this.passwordGenerationService.addHistory(password); - } - - private async autoFillLogin(tab?: chrome.tabs.Tab) { + private async triggerAutofillCommand( + tab?: chrome.tabs.Tab, + commandSender?: ExtensionCommandType, + ) { if (!tab) { tab = await BrowserApi.getTabFromCurrentWindowId(); } - if (tab == null) { + if (tab == null || !commandSender) { return; } if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { - const retryMessage: LockedVaultPendingNotificationsItem = { + const retryMessage: LockedVaultPendingNotificationsData = { commandToRetry: { - msg: { command: "autofill_login" }, + message: { + command: + commandSender === ExtensionCommand.AutofillCommand + ? ExtensionCommand.AutofillLogin + : commandSender, + }, sender: { tab: tab }, }, target: "commands.background", @@ -90,14 +104,14 @@ export default class CommandsBackground { await BrowserApi.tabSendMessageData( tab, "addToLockedVaultPendingNotifications", - retryMessage + retryMessage, ); - BrowserApi.tabSendMessageData(tab, "promptForLogin"); + await openUnlockPopout(tab); return; } - await this.main.collectPageDetailsForContentScript(tab, "autofill_cmd"); + await this.main.collectPageDetailsForContentScript(tab, commandSender); } private async openPopup() { @@ -106,6 +120,6 @@ export default class CommandsBackground { return; } - this.main.openPopup(); + await this.main.openPopup(); } } diff --git a/apps/browser/src/background/idle.background.ts b/apps/browser/src/background/idle.background.ts index 7200301c795..a5d50e8508f 100644 --- a/apps/browser/src/background/idle.background.ts +++ b/apps/browser/src/background/idle.background.ts @@ -1,33 +1,41 @@ -import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { firstValueFrom } from "rxjs"; -import { BrowserStateService } from "../platform/services/abstractions/browser-state.service"; +import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; const IdleInterval = 60 * 5; // 5 minutes export default class IdleBackground { - private idle: any; - private idleTimer: number = null; + private idle: typeof chrome.idle | typeof browser.idle | null; + private idleTimer: number | NodeJS.Timeout = null; private idleState = "active"; constructor( private vaultTimeoutService: VaultTimeoutService, - private stateService: BrowserStateService, - private notificationsService: NotificationsService + private notificationsService: NotificationsService, + private accountService: AccountService, + private vaultTimeoutSettingsService: VaultTimeoutSettingsService, ) { this.idle = chrome.idle || (browser != null ? browser.idle : null); } - async init() { + init() { if (!this.idle) { return; } const idleHandler = (newState: string) => { if (newState === "active") { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.notificationsService.reconnectFromActivity(); } else { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.notificationsService.disconnectFromInactivity(); } }; @@ -39,35 +47,47 @@ export default class IdleBackground { } if (this.idle.onStateChanged) { - this.idle.onStateChanged.addListener(async (newState: string) => { - if (newState === "locked") { - // If the screen is locked or the screensaver activates - const timeout = await this.stateService.getVaultTimeout(); - if (timeout === -2) { - // On System Lock vault timeout option - const action = await this.stateService.getVaultTimeoutAction(); - if (action === VaultTimeoutAction.LogOut) { - await this.vaultTimeoutService.logOut(); - } else { - await this.vaultTimeoutService.lock(); + this.idle.onStateChanged.addListener( + async (newState: chrome.idle.IdleState | browser.idle.IdleState) => { + if (newState === "locked") { + // Need to check if any of the current users have their timeout set to `onLocked` + const allUsers = await firstValueFrom(this.accountService.accounts$); + for (const userId in allUsers) { + // If the screen is locked or the screensaver activates + const timeout = await firstValueFrom( + this.vaultTimeoutSettingsService.getVaultTimeoutByUserId$(userId), + ); + if (timeout === VaultTimeoutStringType.OnLocked) { + // On System Lock vault timeout option + const action = await firstValueFrom( + this.vaultTimeoutSettingsService.getVaultTimeoutActionByUserId$(userId), + ); + if (action === VaultTimeoutAction.LogOut) { + await this.vaultTimeoutService.logOut(userId); + } else { + await this.vaultTimeoutService.lock(userId); + } + } } } - } - }); + }, + ); } } private pollIdle(handler: (newState: string) => void) { if (this.idleTimer != null) { - window.clearTimeout(this.idleTimer); + globalThis.clearTimeout(this.idleTimer); this.idleTimer = null; } + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.idle.queryState(IdleInterval, (state: string) => { if (state !== this.idleState) { this.idleState = state; handler(state); } - this.idleTimer = window.setTimeout(() => this.pollIdle(handler), 5000); + this.idleTimer = globalThis.setTimeout(() => this.pollIdle(handler), 5000); }); } } diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 3aba0c77679..764304f4ff9 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1,214 +1,382 @@ -import { AvatarUpdateService as AvatarUpdateServiceAbstraction } from "@bitwarden/common/abstractions/account/avatar-update.service"; +import { Subject, filter, firstValueFrom, map, merge, timeout } from "rxjs"; + +import { CollectionService, DefaultCollectionService } from "@bitwarden/admin-console/common"; +import { + AuthRequestService, + AuthRequestServiceAbstraction, + DefaultLockService, + InternalUserDecryptionOptionsServiceAbstraction, + LoginEmailServiceAbstraction, + LogoutReason, + PinService, + PinServiceAbstraction, + UserDecryptionOptionsService, +} from "@bitwarden/auth/common"; import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service"; import { AuditService as AuditServiceAbstraction } from "@bitwarden/common/abstractions/audit.service"; -import { DevicesServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices.service.abstraction"; import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service"; import { NotificationsService as NotificationsServiceAbstraction } from "@bitwarden/common/abstractions/notifications.service"; import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; -import { SettingsService as SettingsServiceAbstraction } from "@bitwarden/common/abstractions/settings.service"; -import { TotpService as TotpServiceAbstraction } from "@bitwarden/common/abstractions/totp.service"; import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { InternalPolicyService as InternalPolicyServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { ProviderService as ProviderServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/provider.service"; +import { OrganizationService } from "@bitwarden/common/admin-console/services/organization/organization.service"; import { PolicyApiService } from "@bitwarden/common/admin-console/services/policy/policy-api.service"; +import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; import { ProviderService } from "@bitwarden/common/admin-console/services/provider.service"; -import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; +import { AccountService as AccountServiceAbstraction } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; +import { AvatarService as AvatarServiceAbstraction } from "@bitwarden/common/auth/abstractions/avatar.service"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; +import { DevicesServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices/devices.service.abstraction"; import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/auth/abstractions/key-connector.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TokenService as TokenServiceAbstraction } from "@bitwarden/common/auth/abstractions/token.service"; -import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/auth/abstractions/two-factor.service"; 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 { AuthRequestCryptoServiceImplementation } from "@bitwarden/common/auth/services/auth-request-crypto.service.implementation"; +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 { DeviceTrustCryptoService } from "@bitwarden/common/auth/services/device-trust-crypto.service.implementation"; +import { AvatarService } from "@bitwarden/common/auth/services/avatar.service"; +import { DeviceTrustService } from "@bitwarden/common/auth/services/device-trust.service.implementation"; +import { DevicesServiceImplementation } from "@bitwarden/common/auth/services/devices/devices.service.implementation"; import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; +import { MasterPasswordService } from "@bitwarden/common/auth/services/master-password/master-password.service"; +import { SsoLoginService } from "@bitwarden/common/auth/services/sso-login.service"; import { TokenService } from "@bitwarden/common/auth/services/token.service"; -import { TwoFactorService } from "@bitwarden/common/auth/services/two-factor.service"; import { UserVerificationApiService } from "@bitwarden/common/auth/services/user-verification/user-verification-api.service"; import { UserVerificationService } from "@bitwarden/common/auth/services/user-verification/user-verification.service"; +import { + AutofillSettingsService, + AutofillSettingsServiceAbstraction, +} from "@bitwarden/common/autofill/services/autofill-settings.service"; +import { + BadgeSettingsService, + BadgeSettingsServiceAbstraction, +} from "@bitwarden/common/autofill/services/badge-settings.service"; +import { + DefaultDomainSettingsService, + DomainSettingsService, +} from "@bitwarden/common/autofill/services/domain-settings.service"; +import { + UserNotificationSettingsService, + UserNotificationSettingsServiceAbstraction, +} from "@bitwarden/common/autofill/services/user-notification-settings.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { DefaultBillingAccountProfileStateService } from "@bitwarden/common/billing/services/account/billing-account-profile-state.service"; +import { ClientType } from "@bitwarden/common/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; +import { DefaultProcessReloadService } from "@bitwarden/common/key-management/services/default-process-reload.service"; import { AppIdService as AppIdServiceAbstraction } from "@bitwarden/common/platform/abstractions/app-id.service"; import { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto.service"; import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { RegionConfig } from "@bitwarden/common/platform/abstractions/environment.service"; +import { Fido2ActiveRequestManager as Fido2ActiveRequestManagerAbstraction } from "@bitwarden/common/platform/abstractions/fido2/fido2-active-request-manager.abstraction"; +import { Fido2AuthenticatorService as Fido2AuthenticatorServiceAbstraction } from "@bitwarden/common/platform/abstractions/fido2/fido2-authenticator.service.abstraction"; +import { Fido2ClientService as Fido2ClientServiceAbstraction } from "@bitwarden/common/platform/abstractions/fido2/fido2-client.service.abstraction"; +import { Fido2UserInterfaceService as Fido2UserInterfaceServiceAbstraction } from "@bitwarden/common/platform/abstractions/fido2/fido2-user-interface.service.abstraction"; import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/platform/abstractions/file-upload/file-upload.service"; import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { KeyGenerationService as KeyGenerationServiceAbstraction } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService as LogServiceAbstraction } from "@bitwarden/common/platform/abstractions/log.service"; -import { MessagingService as MessagingServiceAbstraction } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; +import { StateService as StateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service"; import { - AbstractMemoryStorageService, AbstractStorageService, + ObservableStorageService, } from "@bitwarden/common/platform/abstractions/storage.service"; import { SystemService as SystemServiceAbstraction } from "@bitwarden/common/platform/abstractions/system.service"; import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; +import { Message, MessageListener, MessageSender } from "@bitwarden/common/platform/messaging"; +// eslint-disable-next-line no-restricted-imports -- Used for dependency creation +import { SubjectMessageSender } from "@bitwarden/common/platform/messaging/internal"; +import { Lazy } from "@bitwarden/common/platform/misc/lazy"; +import { clearCaches } from "@bitwarden/common/platform/misc/sequentialize"; +import { Account } from "@bitwarden/common/platform/models/domain/account"; import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { ScheduledTaskNames } from "@bitwarden/common/platform/scheduling"; import { AppIdService } from "@bitwarden/common/platform/services/app-id.service"; import { ConfigApiService } from "@bitwarden/common/platform/services/config/config-api.service"; +import { DefaultConfigService } from "@bitwarden/common/platform/services/config/default-config.service"; import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; import { ContainerService } from "@bitwarden/common/platform/services/container.service"; +import { BulkEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/bulk-encrypt.service.implementation"; import { EncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/encrypt.service.implementation"; +import { FallbackBulkEncryptService } from "@bitwarden/common/platform/services/cryptography/fallback-bulk-encrypt.service"; import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation"; +import { Fido2ActiveRequestManager } from "@bitwarden/common/platform/services/fido2/fido2-active-request-manager"; +import { Fido2AuthenticatorService } from "@bitwarden/common/platform/services/fido2/fido2-authenticator.service"; +import { Fido2ClientService } from "@bitwarden/common/platform/services/fido2/fido2-client.service"; import { FileUploadService } from "@bitwarden/common/platform/services/file-upload/file-upload.service"; -import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service"; +import { KeyGenerationService } from "@bitwarden/common/platform/services/key-generation.service"; +import { MigrationBuilderService } from "@bitwarden/common/platform/services/migration-builder.service"; +import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner"; +import { DefaultSdkService } from "@bitwarden/common/platform/services/sdk/default-sdk.service"; +import { NoopSdkClientFactory } from "@bitwarden/common/platform/services/sdk/noop-sdk-client-factory"; +import { StateService } from "@bitwarden/common/platform/services/state.service"; import { SystemService } from "@bitwarden/common/platform/services/system.service"; +import { UserAutoUnlockKeyService } from "@bitwarden/common/platform/services/user-auto-unlock-key.service"; import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service"; -import { AvatarUpdateService } from "@bitwarden/common/services/account/avatar-update.service"; +import { + ActiveUserStateProvider, + DerivedStateProvider, + GlobalStateProvider, + SingleUserStateProvider, + StateEventRunnerService, + StateProvider, +} from "@bitwarden/common/platform/state"; +/* eslint-disable import/no-restricted-paths -- We need the implementation to inject, but generally these should not be accessed */ +import { DefaultActiveUserStateProvider } from "@bitwarden/common/platform/state/implementations/default-active-user-state.provider"; +import { DefaultGlobalStateProvider } from "@bitwarden/common/platform/state/implementations/default-global-state.provider"; +import { DefaultSingleUserStateProvider } from "@bitwarden/common/platform/state/implementations/default-single-user-state.provider"; +import { DefaultStateProvider } from "@bitwarden/common/platform/state/implementations/default-state.provider"; +import { InlineDerivedStateProvider } from "@bitwarden/common/platform/state/implementations/inline-derived-state"; +import { StateEventRegistrarService } from "@bitwarden/common/platform/state/state-event-registrar.service"; +/* eslint-enable import/no-restricted-paths */ +import { PrimarySecondaryStorageService } from "@bitwarden/common/platform/storage/primary-secondary-storage.service"; +import { WindowStorageService } from "@bitwarden/common/platform/storage/window-storage.service"; +import { SyncService } from "@bitwarden/common/platform/sync"; +// eslint-disable-next-line no-restricted-imports -- Needed for service creation +import { DefaultSyncService } from "@bitwarden/common/platform/sync/internal"; +import { DefaultThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { ApiService } from "@bitwarden/common/services/api.service"; import { AuditService } from "@bitwarden/common/services/audit.service"; -import { DevicesServiceImplementation } from "@bitwarden/common/services/devices/devices.service.implementation"; import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; import { NotificationsService } from "@bitwarden/common/services/notifications.service"; import { SearchService } from "@bitwarden/common/services/search.service"; -import { TotpService } from "@bitwarden/common/services/totp.service"; import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; -import { - PasswordGenerationService, - PasswordGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/password"; -import { - UsernameGenerationService, - UsernameGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/username"; import { PasswordStrengthService, PasswordStrengthServiceAbstraction, } from "@bitwarden/common/tools/password-strength"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service"; import { SendApiService as SendApiServiceAbstraction } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { SendStateProvider } from "@bitwarden/common/tools/send/services/send-state.provider"; +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 { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { CipherService as CipherServiceAbstraction } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CollectionService as CollectionServiceAbstraction } from "@bitwarden/common/vault/abstractions/collection.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"; import { InternalFolderService as InternalFolderServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; -import { SyncNotifierService as SyncNotifierServiceAbstraction } from "@bitwarden/common/vault/abstractions/sync/sync-notifier.service.abstraction"; -import { SyncService as SyncServiceAbstraction } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { TotpService as TotpServiceAbstraction } from "@bitwarden/common/vault/abstractions/totp.service"; +import { VaultSettingsService as VaultSettingsServiceAbstraction } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { + CipherAuthorizationService, + DefaultCipherAuthorizationService, +} from "@bitwarden/common/vault/services/cipher-authorization.service"; import { CipherService } from "@bitwarden/common/vault/services/cipher.service"; -import { CollectionService } from "@bitwarden/common/vault/services/collection.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 { SyncNotifierService } from "@bitwarden/common/vault/services/sync/sync-notifier.service"; -import { SyncService } from "@bitwarden/common/vault/services/sync/sync.service"; +import { FolderService } from "@bitwarden/common/vault/services/folder/folder.service"; +import { TotpService } from "@bitwarden/common/vault/services/totp.service"; +import { VaultSettingsService } from "@bitwarden/common/vault/services/vault-settings/vault-settings.service"; import { + PasswordGenerationServiceAbstraction, + UsernameGenerationServiceAbstraction, + legacyPasswordGenerationServiceFactory, + legacyUsernameGenerationServiceFactory, +} from "@bitwarden/generator-legacy"; +import { + ImportApiService, + ImportApiServiceAbstraction, + ImportService, + ImportServiceAbstraction, +} from "@bitwarden/importer/core"; +import { + DefaultKdfConfigService, + KdfConfigService, + BiometricStateService, + BiometricsService, + DefaultBiometricStateService, + KeyService as KeyServiceAbstraction, +} from "@bitwarden/key-management"; +import { + IndividualVaultExportService, + IndividualVaultExportServiceAbstraction, + OrganizationVaultExportService, + OrganizationVaultExportServiceAbstraction, VaultExportService, VaultExportServiceAbstraction, -} from "@bitwarden/exporter/vault-export"; +} from "@bitwarden/vault-export-core"; -import { BrowserOrganizationService } from "../admin-console/services/browser-organization.service"; -import { BrowserPolicyService } from "../admin-console/services/browser-policy.service"; +import { OverlayNotificationsBackground as OverlayNotificationsBackgroundInterface } from "../autofill/background/abstractions/overlay-notifications.background"; +import { OverlayBackground as OverlayBackgroundInterface } from "../autofill/background/abstractions/overlay.background"; +import { AutoSubmitLoginBackground } from "../autofill/background/auto-submit-login.background"; import ContextMenusBackground from "../autofill/background/context-menus.background"; import NotificationBackground from "../autofill/background/notification.background"; +import { OverlayNotificationsBackground } from "../autofill/background/overlay-notifications.background"; +import { OverlayBackground } from "../autofill/background/overlay.background"; import TabsBackground from "../autofill/background/tabs.background"; +import WebRequestBackground from "../autofill/background/web-request.background"; import { CipherContextMenuHandler } from "../autofill/browser/cipher-context-menu-handler"; import { ContextMenuClickedHandler } from "../autofill/browser/context-menu-clicked-handler"; import { MainContextMenuHandler } from "../autofill/browser/main-context-menu-handler"; +import LegacyOverlayBackground from "../autofill/deprecated/background/overlay.background.deprecated"; +import { Fido2Background as Fido2BackgroundAbstraction } from "../autofill/fido2/background/abstractions/fido2.background"; +import { Fido2Background } from "../autofill/fido2/background/fido2.background"; +import { BrowserFido2UserInterfaceService } from "../autofill/fido2/services/browser-fido2-user-interface.service"; import { AutofillService as AutofillServiceAbstraction } from "../autofill/services/abstractions/autofill.service"; import AutofillService from "../autofill/services/autofill.service"; +import { InlineMenuFieldQualificationService } from "../autofill/services/inline-menu-field-qualification.service"; import { SafariApp } from "../browser/safariApp"; -import { Account } from "../models/account"; +import { BackgroundBrowserBiometricsService } from "../key-management/biometrics/background-browser-biometrics.service"; +import { BrowserKeyService } from "../key-management/browser-key.service"; import { BrowserApi } from "../platform/browser/browser-api"; import { flagEnabled } from "../platform/flags"; import { UpdateBadge } from "../platform/listeners/update-badge"; -import BrowserPopoutWindowService from "../platform/popup/browser-popout-window.service"; -import { BrowserStateService as StateServiceAbstraction } from "../platform/services/abstractions/browser-state.service"; -import { BrowserConfigService } from "../platform/services/browser-config.service"; -import { BrowserCryptoService } from "../platform/services/browser-crypto.service"; +/* eslint-disable no-restricted-imports */ +import { ChromeMessageSender } from "../platform/messaging/chrome-message.sender"; +/* eslint-enable no-restricted-imports */ +import { OffscreenDocumentService } from "../platform/offscreen-document/abstractions/offscreen-document"; +import { DefaultOffscreenDocumentService } from "../platform/offscreen-document/offscreen-document.service"; +import { BrowserTaskSchedulerService } from "../platform/services/abstractions/browser-task-scheduler.service"; import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; -import { BrowserI18nService } from "../platform/services/browser-i18n.service"; import BrowserLocalStorageService from "../platform/services/browser-local-storage.service"; -import BrowserMessagingPrivateModeBackgroundService from "../platform/services/browser-messaging-private-mode-background.service"; -import BrowserMessagingService from "../platform/services/browser-messaging.service"; -import BrowserPlatformUtilsService from "../platform/services/browser-platform-utils.service"; -import { BrowserStateService } from "../platform/services/browser-state.service"; -import { KeyGenerationService } from "../platform/services/key-generation.service"; +import BrowserMemoryStorageService from "../platform/services/browser-memory-storage.service"; +import { BrowserScriptInjectorService } from "../platform/services/browser-script-injector.service"; +import I18nService from "../platform/services/i18n.service"; import { LocalBackedSessionStorageService } from "../platform/services/local-backed-session-storage.service"; -import { BrowserSendService } from "../services/browser-send.service"; -import { BrowserSettingsService } from "../services/browser-settings.service"; +import { BackgroundPlatformUtilsService } from "../platform/services/platform-utils/background-platform-utils.service"; +import { BrowserPlatformUtilsService } from "../platform/services/platform-utils/browser-platform-utils.service"; +import { PopupViewCacheBackgroundService } from "../platform/services/popup-view-cache-background.service"; +import { BrowserSdkClientFactory } from "../platform/services/sdk/browser-sdk-client-factory"; +import { BackgroundTaskSchedulerService } from "../platform/services/task-scheduler/background-task-scheduler.service"; +import { BackgroundMemoryStorageService } from "../platform/storage/background-memory-storage.service"; +import { BrowserStorageServiceProvider } from "../platform/storage/browser-storage-service.provider"; +import { OffscreenStorageService } from "../platform/storage/offscreen-storage.service"; +import { SyncServiceListener } from "../platform/sync/sync-service.listener"; +import { fromChromeRuntimeMessaging } from "../platform/utils/from-chrome-runtime-messaging"; import VaultTimeoutService from "../services/vault-timeout/vault-timeout.service"; -import { BrowserFolderService } from "../vault/services/browser-folder.service"; +import FilelessImporterBackground from "../tools/background/fileless-importer.background"; import { VaultFilterService } from "../vault/services/vault-filter.service"; import CommandsBackground from "./commands.background"; import IdleBackground from "./idle.background"; import { NativeMessagingBackground } from "./nativeMessaging.background"; import RuntimeBackground from "./runtime.background"; -import WebRequestBackground from "./webRequest.background"; export default class MainBackground { - messagingService: MessagingServiceAbstraction; - storageService: AbstractStorageService; + messagingService: MessageSender; + storageService: BrowserLocalStorageService; secureStorageService: AbstractStorageService; - memoryStorageService: AbstractMemoryStorageService; + memoryStorageService: AbstractStorageService; + memoryStorageForStateProviders: AbstractStorageService & ObservableStorageService; + largeObjectMemoryStorageForStateProviders: AbstractStorageService & ObservableStorageService; i18nService: I18nServiceAbstraction; platformUtilsService: PlatformUtilsServiceAbstraction; logService: LogServiceAbstraction; - cryptoService: CryptoServiceAbstraction; + keyGenerationService: KeyGenerationServiceAbstraction; + keyService: KeyServiceAbstraction; cryptoFunctionService: CryptoFunctionServiceAbstraction; + masterPasswordService: InternalMasterPasswordServiceAbstraction; tokenService: TokenServiceAbstraction; appIdService: AppIdServiceAbstraction; apiService: ApiServiceAbstraction; environmentService: BrowserEnvironmentService; - settingsService: SettingsServiceAbstraction; cipherService: CipherServiceAbstraction; folderService: InternalFolderServiceAbstraction; - collectionService: CollectionServiceAbstraction; - vaultTimeoutService: VaultTimeoutService; + userDecryptionOptionsService: InternalUserDecryptionOptionsServiceAbstraction; + collectionService: CollectionService; + vaultTimeoutService?: VaultTimeoutService; vaultTimeoutSettingsService: VaultTimeoutSettingsServiceAbstraction; - syncService: SyncServiceAbstraction; passwordGenerationService: PasswordGenerationServiceAbstraction; + syncService: SyncService; passwordStrengthService: PasswordStrengthServiceAbstraction; totpService: TotpServiceAbstraction; autofillService: AutofillServiceAbstraction; containerService: ContainerService; auditService: AuditServiceAbstraction; authService: AuthServiceAbstraction; + loginEmailService: LoginEmailServiceAbstraction; + importApiService: ImportApiServiceAbstraction; + importService: ImportServiceAbstraction; exportService: VaultExportServiceAbstraction; searchService: SearchServiceAbstraction; notificationsService: NotificationsServiceAbstraction; stateService: StateServiceAbstraction; + userNotificationSettingsService: UserNotificationSettingsServiceAbstraction; + autofillSettingsService: AutofillSettingsServiceAbstraction; + badgeSettingsService: BadgeSettingsServiceAbstraction; + domainSettingsService: DomainSettingsService; systemService: SystemServiceAbstraction; + processReloadService: ProcessReloadServiceAbstraction; eventCollectionService: EventCollectionServiceAbstraction; eventUploadService: EventUploadServiceAbstraction; policyService: InternalPolicyServiceAbstraction; sendService: InternalSendServiceAbstraction; + sendStateProvider: SendStateProvider; fileUploadService: FileUploadServiceAbstraction; cipherFileUploadService: CipherFileUploadServiceAbstraction; organizationService: InternalOrganizationServiceAbstraction; providerService: ProviderServiceAbstraction; keyConnectorService: KeyConnectorServiceAbstraction; userVerificationService: UserVerificationServiceAbstraction; - twoFactorService: TwoFactorServiceAbstraction; vaultFilterService: VaultFilterService; usernameGenerationService: UsernameGenerationServiceAbstraction; encryptService: EncryptService; + bulkEncryptService: FallbackBulkEncryptService; folderApiService: FolderApiServiceAbstraction; policyApiService: PolicyApiServiceAbstraction; sendApiService: SendApiServiceAbstraction; userVerificationApiService: UserVerificationApiServiceAbstraction; - syncNotifierService: SyncNotifierServiceAbstraction; - avatarUpdateService: AvatarUpdateServiceAbstraction; + fido2UserInterfaceService: Fido2UserInterfaceServiceAbstraction; + fido2AuthenticatorService: Fido2AuthenticatorServiceAbstraction; + fido2ActiveRequestManager: Fido2ActiveRequestManagerAbstraction; + fido2ClientService: Fido2ClientServiceAbstraction; + avatarService: AvatarServiceAbstraction; mainContextMenuHandler: MainContextMenuHandler; cipherContextMenuHandler: CipherContextMenuHandler; - configService: BrowserConfigService; + configService: ConfigService; configApiService: ConfigApiServiceAbstraction; devicesApiService: DevicesApiServiceAbstraction; devicesService: DevicesServiceAbstraction; - deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction; - authRequestCryptoService: AuthRequestCryptoServiceAbstraction; - browserPopoutWindowService: BrowserPopoutWindowService; - - // Passed to the popup for Safari to workaround issues with theming, downloading, etc. - backgroundWindow = window; + deviceTrustService: DeviceTrustServiceAbstraction; + authRequestService: AuthRequestServiceAbstraction; + accountService: AccountServiceAbstraction; + globalStateProvider: GlobalStateProvider; + pinService: PinServiceAbstraction; + singleUserStateProvider: SingleUserStateProvider; + activeUserStateProvider: ActiveUserStateProvider; + derivedStateProvider: DerivedStateProvider; + stateProvider: StateProvider; + taskSchedulerService: BrowserTaskSchedulerService; + fido2Background: Fido2BackgroundAbstraction; + individualVaultExportService: IndividualVaultExportServiceAbstraction; + organizationVaultExportService: OrganizationVaultExportServiceAbstraction; + vaultSettingsService: VaultSettingsServiceAbstraction; + biometricStateService: BiometricStateService; + biometricsService: BiometricsService; + stateEventRunnerService: StateEventRunnerService; + ssoLoginService: SsoLoginServiceAbstraction; + billingAccountProfileStateService: BillingAccountProfileStateService; + // eslint-disable-next-line rxjs/no-exposed-subjects -- Needed to give access to services module + intraprocessMessagingSubject: Subject>>; + userAutoUnlockKeyService: UserAutoUnlockKeyService; + scriptInjectorService: BrowserScriptInjectorService; + kdfConfigService: KdfConfigService; + offscreenDocumentService: OffscreenDocumentService; + syncServiceListener: SyncServiceListener; + themeStateService: DefaultThemeStateService; + autoSubmitLoginBackground: AutoSubmitLoginBackground; + sdkService: SdkService; + cipherAuthorizationService: CipherAuthorizationService; + inlineMenuFieldQualificationService: InlineMenuFieldQualificationService; onUpdatedRan: boolean; onReplacedRan: boolean; @@ -218,6 +386,9 @@ export default class MainBackground { private contextMenusBackground: ContextMenusBackground; private idleBackground: IdleBackground; private notificationBackground: NotificationBackground; + private overlayBackground: OverlayBackgroundInterface; + private overlayNotificationsBackground: OverlayNotificationsBackgroundInterface; + private filelessImporterBackground: FilelessImporterBackground; private runtimeBackground: RuntimeBackground; private tabsBackground: TabsBackground; private webRequestBackground: WebRequestBackground; @@ -225,258 +396,518 @@ export default class MainBackground { private syncTimeout: any; private isSafari: boolean; private nativeMessagingBackground: NativeMessagingBackground; - popupOnlyContext: boolean; - constructor(public isPrivateMode: boolean = false) { - this.popupOnlyContext = isPrivateMode || BrowserApi.manifestVersion === 3; + private popupViewCacheBackgroundService: PopupViewCacheBackgroundService; + constructor() { // Services const lockedCallback = async (userId?: string) => { if (this.notificationsService != null) { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.notificationsService.updateConnection(false); } await this.refreshBadge(); await this.refreshMenu(true); if (this.systemService != null) { await this.systemService.clearPendingClipboard(); - await this.systemService.startProcessReload(this.authService); + await this.processReloadService.startProcessReload(this.authService); } }; - const logoutCallback = async (expired: boolean, userId?: string) => - await this.logout(expired, userId); + const logoutCallback = async (logoutReason: LogoutReason, userId?: UserId) => + await this.logout(logoutReason, userId); - this.messagingService = this.popupOnlyContext - ? new BrowserMessagingPrivateModeBackgroundService() - : new BrowserMessagingService(); - this.logService = new ConsoleLogService(false); - this.cryptoFunctionService = new WebCryptoFunctionService(window); - this.storageService = new BrowserLocalStorageService(); - this.secureStorageService = new BrowserLocalStorageService(); - this.memoryStorageService = - BrowserApi.manifestVersion === 3 - ? new LocalBackedSessionStorageService( - new EncryptServiceImplementation(this.cryptoFunctionService, this.logService, false), - new KeyGenerationService(this.cryptoFunctionService) - ) - : new MemoryStorageService(); - this.stateService = new BrowserStateService( + const runtimeNativeMessagingBackground = () => this.nativeMessagingBackground; + + const refreshAccessTokenErrorCallback = () => { + // Send toast to popup + this.messagingService.send("showToast", { + type: "error", + title: this.i18nService.t("errorRefreshingAccessToken"), + message: this.i18nService.t("errorRefreshingAccessTokenDesc"), + }); + }; + + const isDev = process.env.ENV === "development"; + this.logService = new ConsoleLogService(isDev); + this.cryptoFunctionService = new WebCryptoFunctionService(self); + this.keyGenerationService = new KeyGenerationService(this.cryptoFunctionService); + this.storageService = new BrowserLocalStorageService(this.logService); + + this.intraprocessMessagingSubject = new Subject>>(); + + this.messagingService = MessageSender.combine( + new SubjectMessageSender(this.intraprocessMessagingSubject), + new ChromeMessageSender(this.logService), + ); + + const messageListener = new MessageListener( + merge( + this.intraprocessMessagingSubject.asObservable(), // For messages from the same context + fromChromeRuntimeMessaging(), // For messages from other contexts + ), + ); + + this.offscreenDocumentService = new DefaultOffscreenDocumentService(this.logService); + + this.platformUtilsService = new BackgroundPlatformUtilsService( + this.messagingService, + (clipboardValue, clearMs) => this.clearClipboard(clipboardValue, clearMs), + self, + this.offscreenDocumentService, + ); + + this.secureStorageService = this.storageService; // secure storage is not supported in browsers, so we use local storage and warn users when it is used + + if (BrowserApi.isManifestVersion(3)) { + // manifest v3 can reuse the same storage. They are split for v2 due to lacking a good sync mechanism, which isn't true for v3 + this.memoryStorageForStateProviders = new BrowserMemoryStorageService(); // mv3 stores to storage.session + this.memoryStorageService = this.memoryStorageForStateProviders; + } else { + this.memoryStorageForStateProviders = new BackgroundMemoryStorageService(); // mv2 stores to memory + this.memoryStorageService = this.memoryStorageForStateProviders; + } + + if (BrowserApi.isManifestVersion(3)) { + // Creates a session key for mv3 storage of large memory items + const sessionKey = new Lazy(async () => { + // Key already in session storage + const sessionStorage = new BrowserMemoryStorageService(); + const existingKey = await sessionStorage.get("session-key"); + if (existingKey) { + if (sessionStorage.valuesRequireDeserialization) { + return SymmetricCryptoKey.fromJSON(existingKey); + } + return existingKey; + } + + // New key + const { derivedKey } = await this.keyGenerationService.createKeyWithPurpose( + 128, + "ephemeral", + "bitwarden-ephemeral", + ); + await sessionStorage.save("session-key", derivedKey); + return derivedKey; + }); + + this.largeObjectMemoryStorageForStateProviders = new LocalBackedSessionStorageService( + sessionKey, + this.storageService, + // For local backed session storage, we expect that the encrypted data on disk will persist longer than the encryption key in memory + // and failures to decrypt because of that are completely expected. For this reason, we pass in `false` to the `EncryptServiceImplementation` + // so that MAC failures are not logged. + new EncryptServiceImplementation(this.cryptoFunctionService, this.logService, false), + this.platformUtilsService, + this.logService, + ); + } else { + // mv2 stores to the same location + this.largeObjectMemoryStorageForStateProviders = this.memoryStorageForStateProviders; + } + + const localStorageStorageService = BrowserApi.isManifestVersion(3) + ? new OffscreenStorageService(this.offscreenDocumentService) + : new WindowStorageService(self.localStorage); + + const storageServiceProvider = new BrowserStorageServiceProvider( + this.storageService, + this.memoryStorageForStateProviders, + this.largeObjectMemoryStorageForStateProviders, + new PrimarySecondaryStorageService(this.storageService, localStorageStorageService), + ); + + this.globalStateProvider = new DefaultGlobalStateProvider( + storageServiceProvider, + this.logService, + ); + + const stateEventRegistrarService = new StateEventRegistrarService( + this.globalStateProvider, + storageServiceProvider, + ); + + this.stateEventRunnerService = new StateEventRunnerService( + this.globalStateProvider, + storageServiceProvider, + ); + + this.encryptService = BrowserApi.isManifestVersion(2) + ? new MultithreadEncryptServiceImplementation( + this.cryptoFunctionService, + this.logService, + true, + ) + : new EncryptServiceImplementation(this.cryptoFunctionService, this.logService, true); + + this.singleUserStateProvider = new DefaultSingleUserStateProvider( + storageServiceProvider, + stateEventRegistrarService, + this.logService, + ); + this.accountService = new AccountServiceImplementation( + this.messagingService, + this.logService, + this.globalStateProvider, + ); + this.activeUserStateProvider = new DefaultActiveUserStateProvider( + this.accountService, + this.singleUserStateProvider, + ); + this.derivedStateProvider = new InlineDerivedStateProvider(); + this.stateProvider = new DefaultStateProvider( + this.activeUserStateProvider, + this.singleUserStateProvider, + this.globalStateProvider, + this.derivedStateProvider, + ); + + this.taskSchedulerService = new BackgroundTaskSchedulerService( + this.logService, + this.stateProvider, + ); + this.taskSchedulerService.registerTaskHandler(ScheduledTaskNames.scheduleNextSyncInterval, () => + this.fullSync(), + ); + + this.environmentService = new BrowserEnvironmentService( + this.logService, + this.stateProvider, + this.accountService, + process.env.ADDITIONAL_REGIONS as unknown as RegionConfig[], + ); + this.biometricStateService = new DefaultBiometricStateService(this.stateProvider); + + this.userNotificationSettingsService = new UserNotificationSettingsService(this.stateProvider); + + this.tokenService = new TokenService( + this.singleUserStateProvider, + this.globalStateProvider, + this.platformUtilsService.supportsSecureStorage(), + this.secureStorageService, + this.keyGenerationService, + this.encryptService, + this.logService, + logoutCallback, + ); + + this.popupViewCacheBackgroundService = new PopupViewCacheBackgroundService( + messageListener, + this.globalStateProvider, + ); + + const migrationRunner = new MigrationRunner( + this.storageService, + this.logService, + new MigrationBuilderService(), + ClientType.Browser, + ); + + this.stateService = new StateService( this.storageService, this.secureStorageService, this.memoryStorageService, this.logService, - new StateFactory(GlobalState, Account) + new StateFactory(GlobalState, Account), + this.accountService, + this.environmentService, + this.tokenService, + migrationRunner, ); - this.platformUtilsService = new BrowserPlatformUtilsService( - this.messagingService, - (clipboardValue, clearMs) => { - if (this.systemService != null) { - this.systemService.clearClipboard(clipboardValue, clearMs); - } - }, - async () => { - if (this.nativeMessagingBackground != null) { - const promise = this.nativeMessagingBackground.getResponse(); - try { - await this.nativeMessagingBackground.send({ command: "biometricUnlock" }); - } catch (e) { - return Promise.reject(e); - } - - return promise.then((result) => result.response === "unlocked"); - } - }, - window + this.masterPasswordService = new MasterPasswordService( + this.stateProvider, + this.stateService, + this.keyGenerationService, + this.encryptService, + this.logService, ); - this.i18nService = new BrowserI18nService(BrowserApi.getUILanguage(window), this.stateService); - this.encryptService = flagEnabled("multithreadDecryption") - ? new MultithreadEncryptServiceImplementation( - this.cryptoFunctionService, - this.logService, - true - ) - : new EncryptServiceImplementation(this.cryptoFunctionService, this.logService, true); - this.cryptoService = new BrowserCryptoService( + + this.i18nService = new I18nService(BrowserApi.getUILanguage(), this.globalStateProvider); + + this.biometricsService = new BackgroundBrowserBiometricsService( + runtimeNativeMessagingBackground, + ); + + this.kdfConfigService = new DefaultKdfConfigService(this.stateProvider); + + this.pinService = new PinService( + this.accountService, + this.cryptoFunctionService, + this.encryptService, + this.kdfConfigService, + this.keyGenerationService, + this.logService, + this.masterPasswordService, + this.stateProvider, + this.stateService, + ); + + this.keyService = new BrowserKeyService( + this.pinService, + this.masterPasswordService, + this.keyGenerationService, this.cryptoFunctionService, this.encryptService, this.platformUtilsService, this.logService, - this.stateService + this.stateService, + this.accountService, + this.stateProvider, + this.biometricStateService, + this.biometricsService, + this.kdfConfigService, ); - this.tokenService = new TokenService(this.stateService); - this.appIdService = new AppIdService(this.storageService); - this.environmentService = new BrowserEnvironmentService(this.stateService, this.logService); + + this.appIdService = new AppIdService(this.storageService, this.logService); + + this.userDecryptionOptionsService = new UserDecryptionOptionsService(this.stateProvider); + this.organizationService = new OrganizationService(this.stateProvider); + this.policyService = new PolicyService(this.stateProvider, this.organizationService); + + this.vaultTimeoutSettingsService = new VaultTimeoutSettingsService( + this.accountService, + this.pinService, + this.userDecryptionOptionsService, + this.keyService, + this.tokenService, + this.policyService, + this.biometricStateService, + this.stateProvider, + this.logService, + VaultTimeoutStringType.OnRestart, // default vault timeout + ); + this.apiService = new ApiService( this.tokenService, this.platformUtilsService, this.environmentService, this.appIdService, - (expired: boolean) => this.logout(expired) + refreshAccessTokenErrorCallback, + this.logService, + (logoutReason: LogoutReason, userId?: UserId) => this.logout(logoutReason, userId), + this.vaultTimeoutSettingsService, ); - this.settingsService = new BrowserSettingsService(this.stateService); + + this.domainSettingsService = new DefaultDomainSettingsService(this.stateProvider); this.fileUploadService = new FileUploadService(this.logService); this.cipherFileUploadService = new CipherFileUploadService( this.apiService, - this.fileUploadService + this.fileUploadService, ); - this.searchService = new SearchService(this.logService, this.i18nService); + this.searchService = new SearchService(this.logService, this.i18nService, this.stateProvider); - this.cipherService = new CipherService( - this.cryptoService, - this.settingsService, - this.apiService, - this.i18nService, - this.searchService, - this.stateService, + this.collectionService = new DefaultCollectionService( + this.keyService, this.encryptService, - this.cipherFileUploadService - ); - this.folderService = new BrowserFolderService( - this.cryptoService, this.i18nService, - this.cipherService, - this.stateService + this.stateProvider, ); - this.folderApiService = new FolderApiService(this.folderService, this.apiService); - this.collectionService = new CollectionService( - this.cryptoService, - this.i18nService, - this.stateService - ); - this.syncNotifierService = new SyncNotifierService(); - this.organizationService = new BrowserOrganizationService(this.stateService); - this.policyService = new BrowserPolicyService(this.stateService, this.organizationService); - this.policyApiService = new PolicyApiService( + + this.autofillSettingsService = new AutofillSettingsService( + this.stateProvider, this.policyService, - this.apiService, - this.stateService ); + this.badgeSettingsService = new BadgeSettingsService(this.stateProvider); + this.policyApiService = new PolicyApiService(this.policyService, this.apiService); this.keyConnectorService = new KeyConnectorService( - this.stateService, - this.cryptoService, + this.accountService, + this.masterPasswordService, + this.keyService, this.apiService, this.tokenService, this.logService, this.organizationService, - this.cryptoFunctionService, - logoutCallback + this.keyGenerationService, + logoutCallback, + this.stateProvider, ); - this.vaultFilterService = new VaultFilterService( - this.stateService, - this.organizationService, - this.folderService, - this.cipherService, - this.collectionService, - this.policyService + + const sdkClientFactory = flagEnabled("sdk") + ? new BrowserSdkClientFactory() + : new NoopSdkClientFactory(); + this.sdkService = new DefaultSdkService( + sdkClientFactory, + this.environmentService, + this.platformUtilsService, + this.accountService, + this.kdfConfigService, + this.keyService, + this.apiService, ); this.passwordStrengthService = new PasswordStrengthService(); - this.passwordGenerationService = new PasswordGenerationService( - this.cryptoService, + this.passwordGenerationService = legacyPasswordGenerationServiceFactory( + this.encryptService, + this.keyService, this.policyService, - this.stateService + this.accountService, + this.stateProvider, ); - this.twoFactorService = new TwoFactorService(this.i18nService, this.platformUtilsService); - - // eslint-disable-next-line - const that = this; - const backgroundMessagingService = new (class extends MessagingServiceAbstraction { - // AuthService should send the messages to the background not popup. - send = (subscriber: string, arg: any = {}) => { - const message = Object.assign({}, { command: subscriber }, arg); - that.runtimeBackground.processMessage(message, that as any, null); - }; - })(); + this.userDecryptionOptionsService = new UserDecryptionOptionsService(this.stateProvider); this.devicesApiService = new DevicesApiServiceImplementation(this.apiService); - this.deviceTrustCryptoService = new DeviceTrustCryptoService( + this.deviceTrustService = new DeviceTrustService( + this.keyGenerationService, this.cryptoFunctionService, - this.cryptoService, + this.keyService, this.encryptService, - this.stateService, this.appIdService, this.devicesApiService, this.i18nService, - this.platformUtilsService + this.platformUtilsService, + this.stateProvider, + this.secureStorageService, + this.userDecryptionOptionsService, + this.logService, + this.configService, ); this.devicesService = new DevicesServiceImplementation(this.devicesApiService); - this.authRequestCryptoService = new AuthRequestCryptoServiceImplementation(this.cryptoService); + this.authRequestService = new AuthRequestService( + this.appIdService, + this.accountService, + this.masterPasswordService, + this.keyService, + this.encryptService, + this.apiService, + this.stateProvider, + ); this.authService = new AuthService( - this.cryptoService, + this.accountService, + this.messagingService, + this.keyService, this.apiService, - this.tokenService, - this.appIdService, - this.platformUtilsService, - backgroundMessagingService, - this.logService, - this.keyConnectorService, - this.environmentService, this.stateService, - this.twoFactorService, - this.i18nService, - this.encryptService, - this.passwordStrengthService, - this.policyService, - this.deviceTrustCryptoService, - this.authRequestCryptoService + this.tokenService, ); + this.billingAccountProfileStateService = new DefaultBillingAccountProfileStateService( + this.stateProvider, + ); + + this.ssoLoginService = new SsoLoginService(this.stateProvider); + this.userVerificationApiService = new UserVerificationApiService(this.apiService); - this.userVerificationService = new UserVerificationService( - this.stateService, - this.cryptoService, - this.i18nService, - this.userVerificationApiService + this.configApiService = new ConfigApiService(this.apiService, this.tokenService); + + this.configService = new DefaultConfigService( + this.configApiService, + this.environmentService, + this.logService, + this.stateProvider, + this.authService, ); - this.vaultTimeoutSettingsService = new VaultTimeoutSettingsService( - this.cryptoService, - this.tokenService, - this.policyService, - this.stateService, - this.userVerificationService + this.themeStateService = new DefaultThemeStateService( + this.globalStateProvider, + this.configService, ); + this.bulkEncryptService = new FallbackBulkEncryptService(this.encryptService); + + this.cipherService = new CipherService( + this.keyService, + this.domainSettingsService, + this.apiService, + this.i18nService, + this.searchService, + this.stateService, + this.autofillSettingsService, + this.encryptService, + this.bulkEncryptService, + this.cipherFileUploadService, + this.configService, + this.stateProvider, + this.accountService, + ); + this.folderService = new FolderService( + this.keyService, + this.encryptService, + this.i18nService, + this.cipherService, + this.stateProvider, + ); + this.folderApiService = new FolderApiService(this.folderService, this.apiService); + + this.userVerificationService = new UserVerificationService( + this.keyService, + this.accountService, + this.masterPasswordService, + this.i18nService, + this.userVerificationApiService, + this.userDecryptionOptionsService, + this.pinService, + this.logService, + this.vaultTimeoutSettingsService, + this.platformUtilsService, + this.kdfConfigService, + ); + + this.vaultFilterService = new VaultFilterService( + this.organizationService, + this.folderService, + this.cipherService, + this.collectionService, + this.policyService, + this.stateProvider, + this.accountService, + ); + + this.vaultSettingsService = new VaultSettingsService(this.stateProvider); + this.vaultTimeoutService = new VaultTimeoutService( + this.accountService, + this.masterPasswordService, this.cipherService, this.folderService, this.collectionService, - this.cryptoService, this.platformUtilsService, this.messagingService, this.searchService, this.stateService, this.authService, this.vaultTimeoutSettingsService, + this.stateEventRunnerService, + this.taskSchedulerService, + this.logService, lockedCallback, - logoutCallback + logoutCallback, ); - this.containerService = new ContainerService(this.cryptoService, this.encryptService); - this.sendService = new BrowserSendService( - this.cryptoService, + this.containerService = new ContainerService(this.keyService, this.encryptService); + + this.sendStateProvider = new SendStateProvider(this.stateProvider); + this.sendService = new SendService( + this.keyService, this.i18nService, - this.cryptoFunctionService, - this.stateService + this.keyGenerationService, + this.sendStateProvider, + this.encryptService, ); this.sendApiService = new SendApiService( this.apiService, this.fileUploadService, - this.sendService + this.sendService, ); - this.providerService = new ProviderService(this.stateService); - this.syncService = new SyncService( + + this.avatarService = new AvatarService(this.apiService, this.stateProvider); + + this.providerService = new ProviderService(this.stateProvider); + + this.syncService = new DefaultSyncService( + this.masterPasswordService, + this.accountService, this.apiService, - this.settingsService, + this.domainSettingsService, this.folderService, this.cipherService, - this.cryptoService, + this.keyService, this.collectionService, this.messagingService, this.policyService, @@ -488,114 +919,215 @@ export default class MainBackground { this.folderApiService, this.organizationService, this.sendApiService, - logoutCallback + this.userDecryptionOptionsService, + this.avatarService, + logoutCallback, + this.billingAccountProfileStateService, + this.tokenService, + this.authService, + this.stateProvider, ); + + this.syncServiceListener = new SyncServiceListener( + this.syncService, + messageListener, + this.messagingService, + this.logService, + ); + this.eventUploadService = new EventUploadService( this.apiService, - this.stateService, - this.logService + this.stateProvider, + this.logService, + this.authService, + this.taskSchedulerService, ); this.eventCollectionService = new EventCollectionService( this.cipherService, - this.stateService, + this.stateProvider, this.organizationService, - this.eventUploadService + this.eventUploadService, + this.authService, + this.accountService, ); this.totpService = new TotpService(this.cryptoFunctionService, this.logService); + this.scriptInjectorService = new BrowserScriptInjectorService( + this.platformUtilsService, + this.logService, + ); this.autofillService = new AutofillService( this.cipherService, - this.stateService, + this.autofillSettingsService, this.totpService, this.eventCollectionService, this.logService, - this.settingsService, - this.userVerificationService + this.domainSettingsService, + this.userVerificationService, + this.billingAccountProfileStateService, + this.scriptInjectorService, + this.accountService, + this.authService, + this.configService, + this.userNotificationSettingsService, + messageListener, ); this.auditService = new AuditService(this.cryptoFunctionService, this.apiService); - this.exportService = new VaultExportService( + + this.importApiService = new ImportApiService(this.apiService); + + this.importService = new ImportService( + this.cipherService, + this.folderService, + this.importApiService, + this.i18nService, + this.collectionService, + this.keyService, + this.encryptService, + this.pinService, + this.accountService, + ); + + this.individualVaultExportService = new IndividualVaultExportService( this.folderService, this.cipherService, - this.apiService, - this.cryptoService, + this.pinService, + this.keyService, + this.encryptService, this.cryptoFunctionService, - this.stateService + this.kdfConfigService, + this.accountService, ); + + this.organizationVaultExportService = new OrganizationVaultExportService( + this.cipherService, + this.apiService, + this.pinService, + this.keyService, + this.encryptService, + this.cryptoFunctionService, + this.collectionService, + this.kdfConfigService, + this.accountService, + ); + + this.exportService = new VaultExportService( + this.individualVaultExportService, + this.organizationVaultExportService, + ); + this.notificationsService = new NotificationsService( + this.logService, this.syncService, this.appIdService, this.apiService, this.environmentService, logoutCallback, - this.logService, this.stateService, this.authService, - this.messagingService + this.messagingService, + this.taskSchedulerService, ); - this.configApiService = new ConfigApiService(this.apiService, this.authService); - - this.configService = new BrowserConfigService( - this.stateService, - this.configApiService, - this.authService, - this.environmentService, + this.fido2UserInterfaceService = new BrowserFido2UserInterfaceService(this.authService); + this.fido2AuthenticatorService = new Fido2AuthenticatorService( + this.cipherService, + this.fido2UserInterfaceService, + this.syncService, + this.accountService, + this.logService, + ); + this.fido2ActiveRequestManager = new Fido2ActiveRequestManager(); + this.fido2ClientService = new Fido2ClientService( + this.fido2AuthenticatorService, + this.configService, + this.authService, + this.vaultSettingsService, + this.domainSettingsService, + this.taskSchedulerService, + this.fido2ActiveRequestManager, this.logService, - true ); - this.browserPopoutWindowService = new BrowserPopoutWindowService(); - const systemUtilsServiceReloadCallback = () => { - const forceWindowReload = - this.platformUtilsService.isSafari() || - this.platformUtilsService.isFirefox() || - this.platformUtilsService.isOpera(); - BrowserApi.reloadExtension(forceWindowReload ? window : null); - return Promise.resolve(); + const systemUtilsServiceReloadCallback = async () => { + await this.taskSchedulerService.clearAllScheduledTasks(); + if (this.platformUtilsService.isSafari()) { + // If we do `chrome.runtime.reload` on safari they will send an onInstalled reason of install + // and that prompts us to show a new tab, this apparently doesn't happen on sideloaded + // extensions and only shows itself production scenarios. See: https://bitwarden.atlassian.net/browse/PM-12298 + self.location.reload(); + return; + } + + BrowserApi.reloadExtension(); }; this.systemService = new SystemService( - this.messagingService, this.platformUtilsService, + this.autofillSettingsService, + this.taskSchedulerService, + ); + + this.processReloadService = new DefaultProcessReloadService( + this.pinService, + this.messagingService, systemUtilsServiceReloadCallback, - this.stateService + this.vaultTimeoutSettingsService, + this.biometricStateService, + this.accountService, ); // Other fields this.isSafari = this.platformUtilsService.isSafari(); // Background + + this.fido2Background = new Fido2Background( + this.logService, + this.fido2ActiveRequestManager, + this.fido2ClientService, + this.vaultSettingsService, + this.scriptInjectorService, + this.configService, + this.authService, + ); + + const lockService = new DefaultLockService(this.accountService, this.vaultTimeoutService); + this.runtimeBackground = new RuntimeBackground( this, this.autofillService, this.platformUtilsService as BrowserPlatformUtilsService, - this.i18nService, this.notificationsService, - this.systemService, + this.autofillSettingsService, + this.processReloadService, this.environmentService, this.messagingService, this.logService, this.configService, - this.browserPopoutWindowService + messageListener, + this.accountService, + lockService, ); this.nativeMessagingBackground = new NativeMessagingBackground( - this.cryptoService, + this.keyService, + this.encryptService, this.cryptoFunctionService, this.runtimeBackground, - this.i18nService, this.messagingService, this.appIdService, this.platformUtilsService, - this.stateService, this.logService, - this.authService + this.authService, + this.biometricStateService, + this.accountService, ); this.commandsBackground = new CommandsBackground( this, - this.passwordGenerationService, this.platformUtilsService, this.vaultTimeoutService, - this.authService + this.authService, + () => this.generatePasswordToClipboard(), ); this.notificationBackground = new NotificationBackground( this.autofillService, @@ -603,130 +1135,221 @@ export default class MainBackground { this.authService, this.policyService, this.folderService, - this.stateService, - this.environmentService + this.userNotificationSettingsService, + this.domainSettingsService, + this.environmentService, + this.logService, + this.themeStateService, + this.configService, + this.accountService, ); - this.tabsBackground = new TabsBackground(this, this.notificationBackground); - if (!this.popupOnlyContext) { - const contextMenuClickedHandler = new ContextMenuClickedHandler( - (options) => this.platformUtilsService.copyToClipboard(options.text, { window: self }), - async (_tab) => { - const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {}; - const password = await this.passwordGenerationService.generatePassword(options); - this.platformUtilsService.copyToClipboard(password, { window: window }); - this.passwordGenerationService.addHistory(password); - }, - async (tab, cipher) => { - this.loginToAutoFill = cipher; - if (tab == null) { - return; - } + this.overlayNotificationsBackground = new OverlayNotificationsBackground( + this.logService, + this.configService, + this.notificationBackground, + ); - BrowserApi.tabSendMessage(tab, { - command: "collectPageDetails", - tab: tab, - sender: "contextMenu", - }); - }, - this.authService, - this.cipherService, - this.totpService, - this.eventCollectionService, - this.userVerificationService - ); + this.filelessImporterBackground = new FilelessImporterBackground( + this.configService, + this.authService, + this.policyService, + this.notificationBackground, + this.importService, + this.syncService, + this.scriptInjectorService, + ); - this.contextMenusBackground = new ContextMenusBackground(contextMenuClickedHandler); - } + this.autoSubmitLoginBackground = new AutoSubmitLoginBackground( + this.logService, + this.autofillService, + this.scriptInjectorService, + this.authService, + this.configService, + this.platformUtilsService, + this.policyService, + ); + + const contextMenuClickedHandler = new ContextMenuClickedHandler( + (options) => this.platformUtilsService.copyToClipboard(options.text), + async (_tab) => { + const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {}; + const password = await this.passwordGenerationService.generatePassword(options); + this.platformUtilsService.copyToClipboard(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.passwordGenerationService.addHistory(password); + }, + async (tab, cipher) => { + this.loginToAutoFill = cipher; + if (tab == null) { + return; + } + + // 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 + BrowserApi.tabSendMessage(tab, { + command: "collectPageDetails", + tab: tab, + sender: "contextMenu", + }); + }, + this.authService, + this.cipherService, + this.totpService, + this.eventCollectionService, + this.userVerificationService, + this.accountService, + ); + + this.contextMenusBackground = new ContextMenusBackground(contextMenuClickedHandler); this.idleBackground = new IdleBackground( this.vaultTimeoutService, - this.stateService, - this.notificationsService + this.notificationsService, + this.accountService, + this.vaultTimeoutSettingsService, ); - this.webRequestBackground = new WebRequestBackground( - this.platformUtilsService, + + this.usernameGenerationService = legacyUsernameGenerationServiceFactory( + this.apiService, + this.i18nService, + this.keyService, + this.encryptService, + this.policyService, + this.accountService, + this.stateProvider, + ); + + this.mainContextMenuHandler = new MainContextMenuHandler( + this.stateService, + this.autofillSettingsService, + this.i18nService, + this.logService, + this.billingAccountProfileStateService, + ); + + this.cipherContextMenuHandler = new CipherContextMenuHandler( + this.mainContextMenuHandler, + this.authService, this.cipherService, - this.authService ); - this.usernameGenerationService = new UsernameGenerationService( - this.cryptoService, - this.stateService, - this.apiService - ); - - this.avatarUpdateService = new AvatarUpdateService(this.apiService, this.stateService); - - if (!this.popupOnlyContext) { - this.mainContextMenuHandler = new MainContextMenuHandler( - this.stateService, - this.i18nService, - this.logService - ); - - this.cipherContextMenuHandler = new CipherContextMenuHandler( - this.mainContextMenuHandler, + if (chrome.webRequest != null && chrome.webRequest.onAuthRequired != null) { + this.webRequestBackground = new WebRequestBackground( + this.platformUtilsService, + this.cipherService, this.authService, - this.cipherService + chrome.webRequest, ); } + + this.userAutoUnlockKeyService = new UserAutoUnlockKeyService(this.keyService); + + this.cipherAuthorizationService = new DefaultCipherAuthorizationService( + this.collectionService, + this.organizationService, + ); + + this.inlineMenuFieldQualificationService = new InlineMenuFieldQualificationService(); } async bootstrap() { - this.containerService.attachToGlobal(window); + this.containerService.attachToGlobal(self); - await this.stateService.init(); + // Only the "true" background should run migrations + await this.stateService.init({ runMigrations: true }); + + // This is here instead of in in the InitService b/c we don't plan for + // side effects to run in the Browser InitService. + const accounts = await firstValueFrom(this.accountService.accounts$); + + const setUserKeyInMemoryPromises = []; + for (const userId of Object.keys(accounts) as UserId[]) { + // For each acct, we must await the process of setting the user key in memory + // if the auto user key is set to avoid race conditions of any code trying to access + // the user key from mem. + setUserKeyInMemoryPromises.push( + this.userAutoUnlockKeyService.setUserKeyInMemoryIfAutoUserKeySet(userId), + ); + } + await Promise.all(setUserKeyInMemoryPromises); + + await (this.i18nService as I18nService).init(); + (this.eventUploadService as EventUploadService).init(true); + + this.popupViewCacheBackgroundService.startObservingTabChanges(); await this.vaultTimeoutService.init(true); - await (this.i18nService as BrowserI18nService).init(); - await (this.eventUploadService as EventUploadService).init(true); + this.fido2Background.init(); await this.runtimeBackground.init(); await this.notificationBackground.init(); - await this.commandsBackground.init(); + this.overlayNotificationsBackground.init(); + this.filelessImporterBackground.init(); + this.commandsBackground.init(); + this.contextMenusBackground?.init(); + this.idleBackground.init(); + this.webRequestBackground?.startListening(); + this.syncServiceListener?.listener$().subscribe(); + await this.autoSubmitLoginBackground.init(); - this.configService.init(); - this.twoFactorService.init(); - - await this.tabsBackground.init(); - if (!this.popupOnlyContext) { - this.contextMenusBackground?.init(); + if ( + BrowserApi.isManifestVersion(2) && + (await this.configService.getFeatureFlag(FeatureFlag.PM4154_BulkEncryptionService)) + ) { + await this.bulkEncryptService.setFeatureFlagEncryptService( + new BulkEncryptServiceImplementation(this.cryptoFunctionService, this.logService), + ); } - await this.idleBackground.init(); - await this.webRequestBackground.init(); - if (this.platformUtilsService.isFirefox() && !this.isPrivateMode) { - // Set Private Mode windows to the default icon - they do not share state with the background page - const privateWindows = await BrowserApi.getPrivateModeWindows(); - privateWindows.forEach(async (win) => { - await new UpdateBadge(self).setBadgeIcon("", win.id); - }); + // If the user is logged out, switch to the next account + const active = await firstValueFrom(this.accountService.activeAccount$); + if (active != null) { + const authStatus = await firstValueFrom( + this.authService.authStatuses$.pipe(map((statuses) => statuses[active.id])), + ); + if (authStatus === AuthenticationStatus.LoggedOut) { + const nextUpAccount = await firstValueFrom(this.accountService.nextUpAccount$); + await this.switchAccount(nextUpAccount?.id); + } + } - BrowserApi.onWindowCreated(async (win) => { - if (win.incognito) { - await new UpdateBadge(self).setBadgeIcon("", win.id); - } - }); + await this.initOverlayAndTabsBackground(); + + if (flagEnabled("sdk")) { + // Warn if the SDK for some reason can't be initialized + let supported = false; + let error: Error; + try { + supported = await firstValueFrom(this.sdkService.supported$); + } catch (e) { + error = e; + } + + if (!supported) { + this.sdkService + .failedToInitialize("background", error) + .catch((e) => this.logService.error(e)); + } } return new Promise((resolve) => { setTimeout(async () => { - await this.environmentService.setUrlsFromStorage(); - // Workaround to ignore stateService.activeAccount until URLs are set - // TODO: Remove this when implementing ticket PM-2637 - this.environmentService.initialized = true; - if (!this.isPrivateMode) { - await this.refreshBadge(); - } - this.fullSync(true); + await this.refreshBadge(); + await this.fullSync(true); + this.taskSchedulerService.setInterval( + ScheduledTaskNames.scheduleNextSyncInterval, + 5 * 60 * 1000, // check every 5 minutes + ); setTimeout(() => this.notificationsService.init(), 2500); + await this.taskSchedulerService.verifyAlarmsState(); resolve(); }, 500); }); } async refreshBadge() { - await new UpdateBadge(self).run({ existingServices: this as any }); + await new UpdateBadge(self, this).run(); } async refreshMenu(forLocked = false) { @@ -751,50 +1374,167 @@ export default class MainBackground { } } - async logout(expired: boolean, userId?: string) { - await this.eventUploadService.uploadEvents(userId); + async updateOverlayCiphers() { + // overlayBackground null in popup only contexts + if (this.overlayBackground) { + await this.overlayBackground.updateOverlayCiphers(); + } + } + + /** + * Switch accounts to indicated userId -- null is no active user + */ + async switchAccount(userId: UserId) { + let nextAccountStatus: AuthenticationStatus; + try { + // HACK to ensure account is switched before proceeding + const switchPromise = firstValueFrom( + this.accountService.activeAccount$.pipe( + filter((account) => (account?.id ?? null) === (userId ?? null)), + timeout({ + first: 1_000, + with: () => { + throw new Error( + "The account switch process did not complete in a reasonable amount of time.", + ); + }, + }), + ), + ); + await this.popupViewCacheBackgroundService.clearState(); + await this.accountService.switchAccount(userId); + await switchPromise; + // Clear sequentialized caches + clearCaches(); + + if (userId == null) { + await this.refreshBadge(); + await this.refreshMenu(); + await this.updateOverlayCiphers(); + this.messagingService.send("goHome"); + return; + } + + nextAccountStatus = await this.authService.getAuthStatus(userId); + const forcePasswordReset = + (await firstValueFrom(this.masterPasswordService.forceSetPasswordReason$(userId))) != + ForceSetPasswordReason.None; + + await this.systemService.clearPendingClipboard(); + await this.notificationsService.updateConnection(false); + + if (nextAccountStatus === AuthenticationStatus.LoggedOut) { + 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(); + await this.refreshMenu(); + await this.updateOverlayCiphers(); + await this.syncService.fullSync(false); + } + } finally { + this.messagingService.send("switchAccountFinish", { + userId: userId, + status: nextAccountStatus, + }); + } + } + + async logout(logoutReason: LogoutReason, userId?: UserId) { + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe( + map((a) => a?.id), + timeout({ + first: 2000, + with: () => { + throw new Error("No active account found to logout"); + }, + }), + ), + ); + + const userBeingLoggedOut = userId ?? activeUserId; + + await this.eventUploadService.uploadEvents(userBeingLoggedOut); + + const newActiveUser = + userBeingLoggedOut === activeUserId + ? await firstValueFrom(this.accountService.nextUpAccount$.pipe(map((a) => a?.id))) + : null; + + await this.switchAccount(newActiveUser); + + // HACK: We shouldn't wait for the authentication status to change but instead subscribe to the + // authentication status to do various actions. + const logoutPromise = firstValueFrom( + this.authService.authStatusFor$(userBeingLoggedOut).pipe( + filter((authenticationStatus) => authenticationStatus === AuthenticationStatus.LoggedOut), + timeout({ + first: 5_000, + with: () => { + throw new Error("The logout process did not complete in a reasonable amount of time."); + }, + }), + ), + ); await Promise.all([ - this.syncService.setLastSync(new Date(0), userId), - this.cryptoService.clearKeys(userId), - this.settingsService.clear(userId), - this.cipherService.clear(userId), - this.folderService.clear(userId), - this.collectionService.clear(userId), - this.policyService.clear(userId), - this.passwordGenerationService.clear(userId), - this.vaultTimeoutSettingsService.clear(userId), - this.keyConnectorService.clear(), + this.keyService.clearKeys(userBeingLoggedOut), + this.cipherService.clear(userBeingLoggedOut), + this.folderService.clear(userBeingLoggedOut), + this.collectionService.clear(userBeingLoggedOut), + this.vaultTimeoutSettingsService.clear(userBeingLoggedOut), this.vaultFilterService.clear(), + this.biometricStateService.logout(userBeingLoggedOut), + this.popupViewCacheBackgroundService.clearState(), + /* We intentionally do not clear: + * - autofillSettingsService + * - badgeSettingsService + * - userNotificationSettingsService + */ ]); //Needs to be checked before state is cleaned - const needStorageReseed = await this.needsStorageReseed(); + const needStorageReseed = await this.needsStorageReseed(userBeingLoggedOut); - await this.stateService.clean({ userId: userId }); + await this.stateService.clean({ userId: userBeingLoggedOut }); + await this.accountService.clean(userBeingLoggedOut); - if (userId == null || userId === (await this.stateService.getUserId())) { - this.searchService.clearIndex(); - this.messagingService.send("doneLoggingOut", { expired: expired, userId: userId }); - } + await this.stateEventRunnerService.handleEvent("logout", userBeingLoggedOut); + + // HACK: Wait for the user logging outs authentication status to transition to LoggedOut + await logoutPromise; + + this.messagingService.send("doneLoggingOut", { + logoutReason: logoutReason, + userId: userBeingLoggedOut, + }); if (needStorageReseed) { await this.reseedStorage(); } - if (BrowserApi.manifestVersion === 3) { + if (BrowserApi.isManifestVersion(3)) { + // 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 BrowserApi.sendMessage("updateBadge"); } await this.refreshBadge(); - await this.mainContextMenuHandler.noAccess(); - this.notificationsService.updateConnection(false); + await this.mainContextMenuHandler?.noAccess(); + await this.notificationsService.updateConnection(false); await this.systemService.clearPendingClipboard(); - await this.systemService.startProcessReload(this.authService); + await this.processReloadService.startProcessReload(this.authService); } - private async needsStorageReseed(): Promise { - const currentVaultTimeout = await this.stateService.getVaultTimeout(); - return currentVaultTimeout == null ? false : true; + private async needsStorageReseed(userId: UserId): Promise { + const currentVaultTimeout = await firstValueFrom( + this.vaultTimeoutSettingsService.getVaultTimeoutByUserId$(userId), + ); + return currentVaultTimeout == VaultTimeoutStringType.Never ? false : true; } async collectPageDetailsForContentScript(tab: any, sender: string, frameId: number = null) { @@ -807,6 +1547,8 @@ export default class MainBackground { options.frameId = frameId; } + // 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 BrowserApi.tabSendMessage( tab, { @@ -814,7 +1556,7 @@ export default class MainBackground { tab: tab, sender: sender, }, - options + options, ); } @@ -837,25 +1579,12 @@ export default class MainBackground { return; } - const getStorage = (): Promise => - new Promise((resolve) => { - chrome.storage.local.get(null, (o: any) => resolve(o)); - }); + await this.storageService.fillBuffer(); + } - const clearStorage = (): Promise => - new Promise((resolve) => { - chrome.storage.local.clear(() => resolve()); - }); - - const storage = await getStorage(); - await clearStorage(); - - for (const key in storage) { - // eslint-disable-next-line - if (!storage.hasOwnProperty(key)) { - continue; - } - await this.storageService.save(key, storage[key]); + async clearClipboard(clipboardValue: string, clearMs: number) { + if (this.systemService != null) { + await this.systemService.clearClipboard(clipboardValue, clearMs); } } @@ -870,17 +1599,82 @@ export default class MainBackground { if (override || lastSyncAgo >= syncInternal) { await this.syncService.fullSync(override); - this.scheduleNextSync(); + } + } + + /** + * Temporary solution to handle initialization of the overlay background behind a feature flag. + * Will be reverted to instantiation within the constructor once the feature flag is removed. + */ + async initOverlayAndTabsBackground() { + if ( + this.overlayBackground || + this.tabsBackground || + (await firstValueFrom(this.authService.activeAccountStatus$)) === + AuthenticationStatus.LoggedOut + ) { + return; + } + + const inlineMenuPositioningImprovementsEnabled = await this.configService.getFeatureFlag( + FeatureFlag.InlineMenuPositioningImprovements, + ); + + if (!inlineMenuPositioningImprovementsEnabled) { + this.overlayBackground = new LegacyOverlayBackground( + this.cipherService, + this.autofillService, + this.authService, + this.environmentService, + this.domainSettingsService, + this.autofillSettingsService, + this.i18nService, + this.platformUtilsService, + this.themeStateService, + ); } else { - this.scheduleNextSync(); - } - } - - private scheduleNextSync() { - if (this.syncTimeout) { - clearTimeout(this.syncTimeout); + this.overlayBackground = new OverlayBackground( + this.logService, + this.cipherService, + this.autofillService, + this.authService, + this.environmentService, + this.domainSettingsService, + this.autofillSettingsService, + this.i18nService, + this.platformUtilsService, + this.vaultSettingsService, + this.fido2ActiveRequestManager, + this.inlineMenuFieldQualificationService, + this.themeStateService, + this.totpService, + () => this.generatePassword(), + (password) => this.addPasswordToHistory(password), + ); } - this.syncTimeout = setTimeout(async () => await this.fullSync(), 5 * 60 * 1000); // check every 5 minutes + this.tabsBackground = new TabsBackground( + this, + this.notificationBackground, + this.overlayBackground, + ); + + await this.overlayBackground.init(); + await this.tabsBackground.init(); } + + generatePassword = async (): Promise => { + const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {}; + return await this.passwordGenerationService.generatePassword(options); + }; + + generatePasswordToClipboard = async () => { + const password = await this.generatePassword(); + this.platformUtilsService.copyToClipboard(password); + await this.addPasswordToHistory(password); + }; + + addPasswordToHistory = async (password: string) => { + await this.passwordGenerationService.addHistory(password); + }; } diff --git a/apps/browser/src/background/models/add-unlock-vault-queue-message.ts b/apps/browser/src/background/models/add-unlock-vault-queue-message.ts deleted file mode 100644 index 9ddde271008..00000000000 --- a/apps/browser/src/background/models/add-unlock-vault-queue-message.ts +++ /dev/null @@ -1,6 +0,0 @@ -import NotificationQueueMessage from "./notificationQueueMessage"; -import { NotificationQueueMessageType } from "./notificationQueueMessageType"; - -export default class AddUnlockVaultQueueMessage extends NotificationQueueMessage { - type: NotificationQueueMessageType.UnlockVault; -} diff --git a/apps/browser/src/background/models/addChangePasswordQueueMessage.ts b/apps/browser/src/background/models/addChangePasswordQueueMessage.ts deleted file mode 100644 index 16491032e9b..00000000000 --- a/apps/browser/src/background/models/addChangePasswordQueueMessage.ts +++ /dev/null @@ -1,8 +0,0 @@ -import NotificationQueueMessage from "./notificationQueueMessage"; -import { NotificationQueueMessageType } from "./notificationQueueMessageType"; - -export default class AddChangePasswordQueueMessage extends NotificationQueueMessage { - type: NotificationQueueMessageType.ChangePassword; - cipherId: string; - newPassword: string; -} diff --git a/apps/browser/src/background/models/addLoginQueueMessage.ts b/apps/browser/src/background/models/addLoginQueueMessage.ts deleted file mode 100644 index d5db5db135b..00000000000 --- a/apps/browser/src/background/models/addLoginQueueMessage.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; -import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; -import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; - -import NotificationQueueMessage from "./notificationQueueMessage"; -import { NotificationQueueMessageType } from "./notificationQueueMessageType"; - -export default class AddLoginQueueMessage extends NotificationQueueMessage { - type: NotificationQueueMessageType.AddLogin; - username: string; - password: string; - uri: string; - - static toCipherView(message: AddLoginQueueMessage, folderId?: string): CipherView { - const uriView = new LoginUriView(); - uriView.uri = message.uri; - - const loginView = new LoginView(); - loginView.uris = [uriView]; - loginView.username = message.username; - loginView.password = message.password; - - const cipherView = new CipherView(); - cipherView.name = (Utils.getHostname(message.uri) || message.domain).replace(/^www\./, ""); - cipherView.folderId = folderId; - cipherView.type = CipherType.Login; - cipherView.login = loginView; - - return cipherView; - } -} diff --git a/apps/browser/src/background/models/addLoginRuntimeMessage.ts b/apps/browser/src/background/models/addLoginRuntimeMessage.ts deleted file mode 100644 index e234edeb673..00000000000 --- a/apps/browser/src/background/models/addLoginRuntimeMessage.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default class AddLoginRuntimeMessage { - username: string; - password: string; - url: string; -} diff --git a/apps/browser/src/background/models/changePasswordRuntimeMessage.ts b/apps/browser/src/background/models/changePasswordRuntimeMessage.ts deleted file mode 100644 index 072848226e5..00000000000 --- a/apps/browser/src/background/models/changePasswordRuntimeMessage.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default class ChangePasswordRuntimeMessage { - currentPassword: string; - newPassword: string; - url: string; -} diff --git a/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts b/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts deleted file mode 100644 index 53f8405cd50..00000000000 --- a/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default class LockedVaultPendingNotificationsItem { - commandToRetry: { - msg: { - command: string; - data?: any; - }; - sender: chrome.runtime.MessageSender; - }; - target: string; -} diff --git a/apps/browser/src/background/models/notificationQueueMessage.ts b/apps/browser/src/background/models/notificationQueueMessage.ts deleted file mode 100644 index f0984133aef..00000000000 --- a/apps/browser/src/background/models/notificationQueueMessage.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NotificationQueueMessageType } from "./notificationQueueMessageType"; - -export default class NotificationQueueMessage { - type: NotificationQueueMessageType; - domain: string; - tabId: number; - expires: Date; - wasVaultLocked: boolean; -} diff --git a/apps/browser/src/background/models/notificationQueueMessageType.ts b/apps/browser/src/background/models/notificationQueueMessageType.ts deleted file mode 100644 index 2ce1a1840d8..00000000000 --- a/apps/browser/src/background/models/notificationQueueMessageType.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum NotificationQueueMessageType { - AddLogin = 0, - ChangePassword = 1, - UnlockVault = 2, -} diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index 88fd81a3a70..69f66dfa7c8 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -1,27 +1,26 @@ +import { firstValueFrom, map } from "rxjs"; + +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 { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; -import { - MasterKey, - SymmetricCryptoKey, - UserKey, -} from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { UserKey } from "@bitwarden/common/types/key"; +import { KeyService, BiometricStateService } from "@bitwarden/key-management"; import { BrowserApi } from "../platform/browser/browser-api"; import RuntimeBackground from "./runtime.background"; const MessageValidTimeout = 10 * 1000; -const EncryptionAlgorithm = "sha1"; +const HashAlgorithmForEncryption = "sha1"; type Message = { command: string; @@ -64,6 +63,7 @@ export class NativeMessagingBackground { private port: browser.runtime.Port | chrome.runtime.Port; private resolver: any = null; + private rejecter: any = null; private privateKey: Uint8Array = null; private publicKey: Uint8Array = null; private secureSetupResolve: any = null; @@ -72,30 +72,31 @@ export class NativeMessagingBackground { private validatingFingerprint: boolean; constructor( - private cryptoService: CryptoService, + private keyService: KeyService, + private encryptService: EncryptService, private cryptoFunctionService: CryptoFunctionService, private runtimeBackground: RuntimeBackground, - private i18nService: I18nService, private messagingService: MessagingService, private appIdService: AppIdService, private platformUtilsService: PlatformUtilsService, - private stateService: StateService, private logService: LogService, - private authService: AuthService + private authService: AuthService, + private biometricStateService: BiometricStateService, + private accountService: AccountService, ) { - this.stateService.setBiometricFingerprintValidated(false); - if (chrome?.permissions?.onAdded) { // Reload extension to activate nativeMessaging chrome.permissions.onAdded.addListener((permissions) => { - BrowserApi.reloadExtension(null); + if (permissions.permissions?.includes("nativeMessaging")) { + BrowserApi.reloadExtension(); + } }); } } async connect() { this.appId = await this.appIdService.getAppId(); - this.stateService.setBiometricFingerprintValidated(false); + await this.biometricStateService.setFingerprintValidated(false); return new Promise((resolve, reject) => { this.port = BrowserApi.connectNative("com.8bit.bitwarden"); @@ -121,7 +122,7 @@ export class NativeMessagingBackground { break; case "disconnected": if (this.connecting) { - reject("startDesktop"); + reject(new Error("startDesktop")); } this.connected = false; this.port.disconnect(); @@ -136,12 +137,12 @@ export class NativeMessagingBackground { const decrypted = await this.cryptoFunctionService.rsaDecrypt( encrypted, this.privateKey, - EncryptionAlgorithm + HashAlgorithmForEncryption, ); if (this.validatingFingerprint) { this.validatingFingerprint = false; - this.stateService.setBiometricFingerprintValidated(true); + await this.biometricStateService.setFingerprintValidated(true); } this.sharedSecret = new SymmetricCryptoKey(decrypted); this.secureSetupResolve(); @@ -157,30 +158,32 @@ export class NativeMessagingBackground { this.privateKey = null; this.connected = false; - this.messagingService.send("showDialog", { - title: { key: "nativeMessagingInvalidEncryptionTitle" }, - content: { key: "nativeMessagingInvalidEncryptionDesc" }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", + this.rejecter({ + message: "invalidateEncryption", }); - break; + return; case "verifyFingerprint": { if (this.sharedSecret == null) { this.validatingFingerprint = true; + // 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.showFingerprintDialog(); } break; } case "wrongUserId": - this.showWrongUserDialog(); - break; + this.rejecter({ + message: "wrongUserId", + }); + return; default: // Ignore since it belongs to another device if (!this.platformUtilsService.isSafari() && message.appId !== this.appId) { return; } + // 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.onMessage(message.message); } }); @@ -197,19 +200,11 @@ export class NativeMessagingBackground { this.privateKey = null; this.connected = false; - const reason = error != null ? "desktopIntegrationDisabled" : null; - reject(reason); - }); - }); - } + this.logService.error("NativeMessaging port disconnected because of error: " + error); - showWrongUserDialog() { - this.messagingService.send("showDialog", { - title: { key: "nativeMessagingWrongUserTitle" }, - content: { key: "nativeMessagingWrongUserDesc" }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", + const reason = error != null ? "desktopIntegrationDisabled" : null; + reject(new Error(reason)); + }); }); } @@ -218,7 +213,7 @@ export class NativeMessagingBackground { await this.connect(); } - message.userId = await this.stateService.getUserId(); + message.userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; message.timestamp = Date.now(); if (this.platformUtilsService.isSafari()) { @@ -233,12 +228,19 @@ export class NativeMessagingBackground { await this.secureCommunication(); } - return await this.cryptoService.encrypt(JSON.stringify(message), this.sharedSecret); + return await this.encryptService.encrypt(JSON.stringify(message), this.sharedSecret); } getResponse(): Promise { return new Promise((resolve, reject) => { - this.resolver = resolve; + this.resolver = function (response: any) { + resolve(response); + }; + this.rejecter = function (resp: any) { + reject({ + message: resp, + }); + }; }); } @@ -264,13 +266,7 @@ export class NativeMessagingBackground { this.privateKey = null; this.connected = false; - this.messagingService.send("showDialog", { - title: { key: "nativeMessagingInvalidEncryptionTitle" }, - content: { key: "nativeMessagingInvalidEncryptionDesc" }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", - }); + this.rejecter("invalidateEncryption"); } } @@ -278,7 +274,11 @@ export class NativeMessagingBackground { let message = rawMessage as ReceiveMessage; if (!this.platformUtilsService.isSafari()) { message = JSON.parse( - await this.cryptoService.decryptToUtf8(rawMessage as EncString, this.sharedSecret) + await this.encryptService.decryptToUtf8( + rawMessage as EncString, + this.sharedSecret, + "ipc-desktop-ipc-channel-key", + ), ); } @@ -289,32 +289,20 @@ export class NativeMessagingBackground { switch (message.command) { case "biometricUnlock": { - await this.stateService.setBiometricAwaitingAcceptance(null); - - if (message.response === "not enabled") { - this.messagingService.send("showDialog", { - title: { key: "biometricsNotEnabledTitle" }, - content: { key: "biometricsNotEnabledDesc" }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", - }); - break; - } else if (message.response === "not supported") { - this.messagingService.send("showDialog", { - title: { key: "biometricsNotSupportedTitle" }, - content: { key: "biometricsNotSupportedDesc" }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", - }); - break; + if ( + ["not available", "not enabled", "not supported", "not unlocked", "canceled"].includes( + message.response, + ) + ) { + this.rejecter(message.response); + return; } - const enabled = await this.stateService.getBiometricUnlock(); + // Check for initial setup of biometric unlock + const enabled = await firstValueFrom(this.biometricStateService.biometricUnlockEnabled$); if (enabled === null || enabled === false) { if (message.response === "unlocked") { - await this.stateService.setBiometricUnlock(true); + await this.biometricStateService.setBiometricUnlockEnabled(true); } break; } @@ -328,65 +316,50 @@ export class NativeMessagingBackground { try { if (message.userKeyB64) { const userKey = new SymmetricCryptoKey( - Utils.fromB64ToArray(message.userKeyB64) + Utils.fromB64ToArray(message.userKeyB64), ) as UserKey; - await this.cryptoService.setUserKey(userKey); - } else if (message.keyB64) { - // Backwards compatibility to support cases in which the user hasn't updated their desktop app - // TODO: Remove after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3472) - let encUserKey = await this.stateService.getEncryptedCryptoSymmetricKey(); - encUserKey ||= await this.stateService.getMasterKeyEncryptedUserKey(); - if (!encUserKey) { - throw new Error("No encrypted user key found"); - } - const masterKey = new SymmetricCryptoKey( - Utils.fromB64ToArray(message.keyB64) - ) as MasterKey; - const userKey = await this.cryptoService.decryptUserKeyWithMasterKey( - masterKey, - new EncString(encUserKey) + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), ); - await this.cryptoService.setMasterKey(masterKey); - await this.cryptoService.setUserKey(userKey); + const isUserKeyValid = await this.keyService.validateUserKey(userKey, activeUserId); + if (isUserKeyValid) { + await this.keyService.setUserKey(userKey, activeUserId); + } else { + this.logService.error("Unable to verify biometric unlocked userkey"); + await this.keyService.clearKeys(activeUserId); + this.rejecter("userkey wrong"); + return; + } } else { throw new Error("No key received"); } } catch (e) { this.logService.error("Unable to set key: " + e); - this.messagingService.send("showDialog", { - title: { key: "biometricsFailedTitle" }, - content: { key: "biometricsFailedDesc" }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", - }); - - // Exit early - if (this.resolver) { - this.resolver(message); - } + this.rejecter("userkey wrong"); return; } // Verify key is correct by attempting to decrypt a secret try { - await this.cryptoService.getFingerprint(await this.stateService.getUserId()); + const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + await this.keyService.getFingerprint(userId); } catch (e) { this.logService.error("Unable to verify key: " + e); - await this.cryptoService.clearKeys(); - this.showWrongUserDialog(); - - // Exit early - if (this.resolver) { - this.resolver(message); - } + await this.keyService.clearKeys(); + this.rejecter("userkey wrong"); return; } - this.runtimeBackground.processMessage({ command: "unlocked" }, null, null); + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.runtimeBackground.processMessage({ command: "unlocked" }); } break; } + case "biometricUnlockAvailable": { + this.resolver(message); + break; + } default: this.logService.error("NativeMessage, got unknown command: " + message.command); break; @@ -401,11 +374,14 @@ export class NativeMessagingBackground { const [publicKey, privateKey] = await this.cryptoFunctionService.rsaGenerateKeyPair(2048); this.publicKey = publicKey; this.privateKey = privateKey; + const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.sendUnencrypted({ command: "setupEncryption", publicKey: Utils.fromBufferToB64(publicKey), - userId: await this.stateService.getUserId(), + userId: userId, }); return new Promise((resolve, reject) => (this.secureSetupResolve = resolve)); @@ -422,9 +398,9 @@ export class NativeMessagingBackground { } private async showFingerprintDialog() { - const fingerprint = await this.cryptoService.getFingerprint( - await this.stateService.getUserId(), - this.publicKey + const fingerprint = await this.keyService.getFingerprint( + (await firstValueFrom(this.accountService.activeAccount$))?.id, + this.publicKey, ); this.messagingService.send("showNativeMessagingFinterprintDialog", { diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index dcf828ef4a0..f934c8544bd 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -1,39 +1,53 @@ +import { firstValueFrom, map, mergeMap } from "rxjs"; + +import { LockService } from "@bitwarden/auth/common"; import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AutofillOverlayVisibility, ExtensionCommand } from "@bitwarden/common/autofill/constants"; +import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { SystemService } from "@bitwarden/common/platform/abstractions/system.service"; +import { devFlagEnabled } from "@bitwarden/common/platform/misc/flags"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { MessageListener, isExternalMessage } from "../../../../libs/common/src/platform/messaging"; +import { + closeUnlockPopout, + openSsoAuthResultPopout, + openTwoFactorAuthPopout, +} from "../auth/popup/utils/auth-popout-window"; +import { LockedVaultPendingNotificationsData } from "../autofill/background/abstractions/notification.background"; import { AutofillService } from "../autofill/services/abstractions/autofill.service"; import { BrowserApi } from "../platform/browser/browser-api"; -import { BrowserPopoutWindowService } from "../platform/popup/abstractions/browser-popout-window.service"; import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; -import BrowserPlatformUtilsService from "../platform/services/browser-platform-utils.service"; +import { BrowserPlatformUtilsService } from "../platform/services/platform-utils/browser-platform-utils.service"; import MainBackground from "./main.background"; -import LockedVaultPendingNotificationsItem from "./models/lockedVaultPendingNotificationsItem"; export default class RuntimeBackground { private autofillTimeout: any; private pageDetailsToAutoFill: any[] = []; private onInstalledReason: string = null; - private lockedVaultPendingNotifications: LockedVaultPendingNotificationsItem[] = []; + private lockedVaultPendingNotifications: LockedVaultPendingNotificationsData[] = []; constructor( private main: MainBackground, private autofillService: AutofillService, private platformUtilsService: BrowserPlatformUtilsService, - private i18nService: I18nService, private notificationsService: NotificationsService, - private systemService: SystemService, + private autofillSettingsService: AutofillSettingsServiceAbstraction, + private processReloadSerivce: ProcessReloadServiceAbstraction, private environmentService: BrowserEnvironmentService, private messagingService: MessagingService, private logService: LogService, - private configService: ConfigServiceAbstraction, - private browserPopoutWindowService: BrowserPopoutWindowService + private configService: ConfigService, + private messageListener: MessageListener, + private accountService: AccountService, + private readonly lockService: LockService, ) { // onInstalled listener must be wired up before anything else, so we do it in the ctor chrome.runtime.onInstalled.addListener((details: any) => { @@ -47,118 +61,68 @@ export default class RuntimeBackground { } await this.checkOnInstalled(); - const backgroundMessageListener = async ( + const backgroundMessageListener = ( msg: any, sender: chrome.runtime.MessageSender, - sendResponse: any + sendResponse: (response: any) => void, ) => { - await this.processMessage(msg, sender, sendResponse); + const messagesWithResponse = [ + "biometricUnlock", + "biometricUnlockAvailable", + "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag", + "getInlineMenuFieldQualificationFeatureFlag", + ]; + + if (messagesWithResponse.includes(msg.command)) { + this.processMessageWithSender(msg, sender).then( + (value) => sendResponse({ result: value }), + (error) => sendResponse({ error: { ...error, message: error.message } }), + ); + return true; + } + + void this.processMessageWithSender(msg, sender).catch((err) => + this.logService.error( + `Error while processing message in RuntimeBackground '${msg?.command}'.`, + err, + ), + ); + return false; }; + this.messageListener.allMessages$ + .pipe( + mergeMap(async (message: any) => { + try { + await this.processMessage(message); + } catch (err) { + this.logService.error(err); + } + }), + ) + .subscribe(); + + // For messages that require the full on message interface BrowserApi.messageListener("runtime.background", backgroundMessageListener); - if (this.main.popupOnlyContext) { - (window as any).bitwardenBackgroundMessageListener = backgroundMessageListener; - } } - async processMessage(msg: any, sender: chrome.runtime.MessageSender, sendResponse: any) { - const cipherId = msg.data?.cipherId; - + // Messages that need the chrome sender and send back a response need to be registered in this method. + async processMessageWithSender(msg: any, sender: chrome.runtime.MessageSender) { switch (msg.command) { - case "loggedIn": - case "unlocked": { - let item: LockedVaultPendingNotificationsItem; - - if (this.lockedVaultPendingNotifications?.length > 0) { - item = this.lockedVaultPendingNotifications.pop(); - await this.browserPopoutWindowService.closeUnlockPrompt(); - } - - await this.main.refreshBadge(); - await this.main.refreshMenu(false); - this.notificationsService.updateConnection(msg.command === "unlocked"); - this.systemService.cancelProcessReload(); - - if (item) { - await BrowserApi.focusWindow(item.commandToRetry.sender.tab.windowId); - await BrowserApi.focusTab(item.commandToRetry.sender.tab.id); - await BrowserApi.tabSendMessageData( - item.commandToRetry.sender.tab, - "unlockCompleted", - item - ); - } - break; - } - case "addToLockedVaultPendingNotifications": - this.lockedVaultPendingNotifications.push(msg.data); - break; - case "logout": - await this.main.logout(msg.expired, msg.userId); - break; - case "syncCompleted": - if (msg.successfully) { - setTimeout(async () => { - await this.main.refreshBadge(); - await this.main.refreshMenu(); - }, 2000); - this.main.avatarUpdateService.loadColorFromState(); - this.configService.triggerServerConfigFetch(); - } - break; - case "openPopup": - await this.main.openPopup(); - break; - case "promptForLogin": - case "bgReopenPromptForLogin": - await this.browserPopoutWindowService.openUnlockPrompt(sender.tab?.windowId); - break; - case "passwordReprompt": - if (cipherId) { - await this.browserPopoutWindowService.openPasswordRepromptPrompt(sender.tab?.windowId, { - cipherId: cipherId, - senderTabId: sender.tab.id, - action: msg.data?.action, - }); - } - break; - case "openAddEditCipher": { - const addEditCipherUrl = - cipherId == null - ? "popup/index.html#/edit-cipher" - : "popup/index.html#/edit-cipher?cipherId=" + cipherId; - - BrowserApi.openBitwardenExtensionTab(addEditCipherUrl, true); - break; - } - case "closeTab": - setTimeout(() => { - BrowserApi.closeBitwardenExtensionTab(); - }, msg.delay ?? 0); - break; case "triggerAutofillScriptInjection": - await this.autofillService.injectAutofillScripts( - sender, - await this.configService.getFeatureFlag(FeatureFlag.AutofillV2) - ); + await this.autofillService.injectAutofillScripts(sender.tab, sender.frameId); break; case "bgCollectPageDetails": await this.main.collectPageDetailsForContentScript(sender.tab, msg.sender, sender.frameId); break; - case "bgUpdateContextMenu": - case "editedCipher": - case "addedCipher": - case "deletedCipher": - await this.main.refreshBadge(); - await this.main.refreshMenu(); - break; - case "bgReseedStorage": - await this.main.reseedStorage(); - break; case "collectPageDetailsResponse": switch (msg.sender) { case "autofiller": - case "autofill_cmd": { + case ExtensionCommand.AutofillCommand: { + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); + await this.accountService.setAccountActivity(activeUserId, new Date()); const totpCode = await this.autofillService.doAutoFillActiveTab( [ { @@ -167,13 +131,41 @@ export default class RuntimeBackground { details: msg.details, }, ], - msg.sender === "autofill_cmd" + msg.sender === ExtensionCommand.AutofillCommand, ); if (totpCode != null) { - this.platformUtilsService.copyToClipboard(totpCode, { window: window }); + this.platformUtilsService.copyToClipboard(totpCode); } break; } + case ExtensionCommand.AutofillCard: { + await this.autofillService.doAutoFillActiveTab( + [ + { + frameId: sender.frameId, + tab: msg.tab, + details: msg.details, + }, + ], + msg.sender === ExtensionCommand.AutofillCard, + CipherType.Card, + ); + break; + } + case ExtensionCommand.AutofillIdentity: { + await this.autofillService.doAutoFillActiveTab( + [ + { + frameId: sender.frameId, + tab: msg.tab, + details: msg.details, + }, + ], + msg.sender === ExtensionCommand.AutofillIdentity, + CipherType.Identity, + ); + break; + } case "contextMenu": clearTimeout(this.autofillTimeout); this.pageDetailsToAutoFill.push({ @@ -187,40 +179,146 @@ export default class RuntimeBackground { break; } break; + case "biometricUnlock": { + const result = await this.main.biometricsService.authenticateBiometric(); + return result; + } + case "biometricUnlockAvailable": { + const result = await this.main.biometricsService.isBiometricUnlockAvailable(); + return result; + } + case "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag": { + return await this.configService.getFeatureFlag( + FeatureFlag.UseTreeWalkerApiForPageDetailsCollection, + ); + } + case "getInlineMenuFieldQualificationFeatureFlag": { + return await this.configService.getFeatureFlag(FeatureFlag.InlineMenuFieldQualification); + } + } + } + + async processMessage(msg: any) { + switch (msg.command) { + case "loggedIn": + case "unlocked": { + let item: LockedVaultPendingNotificationsData; + + if (msg.command === "loggedIn") { + await this.main.initOverlayAndTabsBackground(); + await this.sendBwInstalledMessageToVault(); + await this.autofillService.reloadAutofillScripts(); + } + + if (this.lockedVaultPendingNotifications?.length > 0) { + item = this.lockedVaultPendingNotifications.pop(); + await closeUnlockPopout(); + } + + await this.notificationsService.updateConnection(msg.command === "loggedIn"); + this.processReloadSerivce.cancelProcessReload(); + + if (item) { + await BrowserApi.focusWindow(item.commandToRetry.sender.tab.windowId); + await BrowserApi.focusTab(item.commandToRetry.sender.tab.id); + await BrowserApi.tabSendMessageData( + item.commandToRetry.sender.tab, + "unlockCompleted", + item, + ); + } + + // @TODO these need to happen last to avoid blocking `tabSendMessageData` above + // The underlying cause exists within `cipherService.getAllDecrypted` via + // `getAllDecryptedForUrl` and is anticipated to be refactored + await this.main.refreshBadge(); + await this.main.refreshMenu(false); + + if (await this.configService.getFeatureFlag(FeatureFlag.ExtensionRefresh)) { + await this.autofillService.setAutoFillOnPageLoadOrgPolicy(); + } + break; + } + case "addToLockedVaultPendingNotifications": + this.lockedVaultPendingNotifications.push(msg.data); + break; + case "lockVault": + await this.main.vaultTimeoutService.lock(msg.userId); + break; + case "lockAll": + { + await this.lockService.lockAll(); + this.messagingService.send("lockAllFinished", { requestId: msg.requestId }); + } + break; + case "logout": + await this.main.logout(msg.expired, msg.userId); + break; + case "syncCompleted": + if (msg.successfully) { + setTimeout(async () => { + await this.main.refreshBadge(); + await this.main.refreshMenu(); + }, 2000); + await this.configService.ensureConfigFetched(); + await this.main.updateOverlayCiphers(); + + if (await this.configService.getFeatureFlag(FeatureFlag.ExtensionRefresh)) { + await this.autofillService.setAutoFillOnPageLoadOrgPolicy(); + } + } + break; + case "openPopup": + await this.main.openPopup(); + break; + case "bgUpdateContextMenu": + case "editedCipher": + case "addedCipher": + case "deletedCipher": + await this.main.refreshBadge(); + await this.main.refreshMenu(); + break; + case "bgReseedStorage": { + await this.main.reseedStorage(); + break; + } case "authResult": { - const vaultUrl = this.environmentService.getWebVaultUrl(); + const env = await firstValueFrom(this.environmentService.environment$); + const vaultUrl = env.getWebVaultUrl(); if (msg.referrer == null || Utils.getHostname(vaultUrl) !== msg.referrer) { return; } - try { - BrowserApi.createNewTab( - "popup/index.html?uilocation=popout#/sso?code=" + - encodeURIComponent(msg.code) + - "&state=" + - encodeURIComponent(msg.state) - ); - } catch { - this.logService.error("Unable to open sso popout tab"); + if (msg.lastpass) { + this.messagingService.send("importCallbackLastPass", { + code: msg.code, + state: msg.state, + }); + } else { + try { + await openSsoAuthResultPopout(msg); + } catch { + this.logService.error("Unable to open sso popout tab"); + } } break; } case "webAuthnResult": { - const vaultUrl = this.environmentService.getWebVaultUrl(); + const env = await firstValueFrom(this.environmentService.environment$); + const vaultUrl = env.getWebVaultUrl(); if (msg.referrer == null || Utils.getHostname(vaultUrl) !== msg.referrer) { return; } - const params = - `webAuthnResponse=${encodeURIComponent(msg.data)};` + - `remember=${encodeURIComponent(msg.remember)}`; - BrowserApi.openBitwardenExtensionTab(`popup/index.html#/2fa;${params}`, false); + await openTwoFactorAuthPopout(msg); break; } case "reloadPopup": - this.messagingService.send("reloadPopup"); + if (isExternalMessage(msg)) { + this.messagingService.send("reloadPopup"); + } break; case "emailVerificationRequired": this.messagingService.send("showDialog", { @@ -232,10 +330,16 @@ export default class RuntimeBackground { }); break; case "getClickedElementResponse": - this.platformUtilsService.copyToClipboard(msg.identifier, { window: window }); + this.platformUtilsService.copyToClipboard(msg.identifier); break; - default: + case "switchAccount": { + await this.main.switchAccount(msg.userId); break; + } + case "clearClipboard": { + await this.main.clearClipboard(msg.clipboardValue, msg.timeoutMs); + break; + } } } @@ -249,7 +353,7 @@ export default class RuntimeBackground { }); if (totpCode != null) { - this.platformUtilsService.copyToClipboard(totpCode, { window: window }); + this.platformUtilsService.copyToClipboard(totpCode); } // reset @@ -259,9 +363,17 @@ export default class RuntimeBackground { private async checkOnInstalled() { setTimeout(async () => { + void this.autofillService.loadAutofillScriptsOnInstall(); + if (this.onInstalledReason != null) { if (this.onInstalledReason === "install") { - BrowserApi.createNewTab("https://bitwarden.com/browser-start/"); + if (!devFlagEnabled("skipWelcomeOnInstall")) { + void BrowserApi.createNewTab("https://bitwarden.com/browser-start/"); + } + + await this.autofillSettingsService.setInlineMenuVisibility( + AutofillOverlayVisibility.OnFieldFocus, + ); if (await this.environmentService.hasManagedEnvironment()) { await this.environmentService.setUrlsToManagedEnvironment(); @@ -272,4 +384,27 @@ export default class RuntimeBackground { } }, 100); } + + async sendBwInstalledMessageToVault() { + try { + const env = await firstValueFrom(this.environmentService.environment$); + const vaultUrl = env.getWebVaultUrl(); + const urlObj = new URL(vaultUrl); + + const tabs = await BrowserApi.tabsQuery({ url: `${urlObj.href}*` }); + + if (!tabs?.length) { + return; + } + + for (const tab of tabs) { + await BrowserApi.executeScriptInTab(tab.id, { + file: "content/send-on-installed-message.js", + runAt: "document_end", + }); + } + } catch (e) { + this.logService.error(`Error sending on installed message to vault: ${e}`); + } + } } diff --git a/apps/browser/src/background/service-factories/cipher-file-upload-service.factory.ts b/apps/browser/src/background/service-factories/cipher-file-upload-service.factory.ts deleted file mode 100644 index 7c83958927f..00000000000 --- a/apps/browser/src/background/service-factories/cipher-file-upload-service.factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CipherFileUploadService as CipherFileUploadServiceAbstraction } from "@bitwarden/common/vault/abstractions/file-upload/cipher-file-upload.service"; -import { CipherFileUploadService } from "@bitwarden/common/vault/services/file-upload/cipher-file-upload.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - FileUploadServiceInitOptions, - fileUploadServiceFactory, -} from "../../platform/background/service-factories/file-upload-service.factory"; - -type CipherFileUploadServiceFactoyOptions = FactoryOptions; - -export type CipherFileUploadServiceInitOptions = CipherFileUploadServiceFactoyOptions & - ApiServiceInitOptions & - FileUploadServiceInitOptions; - -export function cipherFileUploadServiceFactory( - cache: { cipherFileUploadService?: CipherFileUploadServiceAbstraction } & CachedServices, - opts: CipherFileUploadServiceInitOptions -): Promise { - return factory( - cache, - "cipherFileUploadService", - opts, - async () => - new CipherFileUploadService( - await apiServiceFactory(cache, opts), - await fileUploadServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/background/service-factories/cipher-file-upload.service.factory.ts b/apps/browser/src/background/service-factories/cipher-file-upload.service.factory.ts deleted file mode 100644 index 7c83958927f..00000000000 --- a/apps/browser/src/background/service-factories/cipher-file-upload.service.factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CipherFileUploadService as CipherFileUploadServiceAbstraction } from "@bitwarden/common/vault/abstractions/file-upload/cipher-file-upload.service"; -import { CipherFileUploadService } from "@bitwarden/common/vault/services/file-upload/cipher-file-upload.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - FileUploadServiceInitOptions, - fileUploadServiceFactory, -} from "../../platform/background/service-factories/file-upload-service.factory"; - -type CipherFileUploadServiceFactoyOptions = FactoryOptions; - -export type CipherFileUploadServiceInitOptions = CipherFileUploadServiceFactoyOptions & - ApiServiceInitOptions & - FileUploadServiceInitOptions; - -export function cipherFileUploadServiceFactory( - cache: { cipherFileUploadService?: CipherFileUploadServiceAbstraction } & CachedServices, - opts: CipherFileUploadServiceInitOptions -): Promise { - return factory( - cache, - "cipherFileUploadService", - opts, - async () => - new CipherFileUploadService( - await apiServiceFactory(cache, opts), - await fileUploadServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/background/service-factories/devices-api-service.factory.ts b/apps/browser/src/background/service-factories/devices-api-service.factory.ts deleted file mode 100644 index 8999b7c2c72..00000000000 --- a/apps/browser/src/background/service-factories/devices-api-service.factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; - -type DevicesApiServiceFactoryOptions = FactoryOptions; - -export type DevicesApiServiceInitOptions = DevicesApiServiceFactoryOptions & ApiServiceInitOptions; - -export function devicesApiServiceFactory( - cache: { devicesApiService?: DevicesApiServiceAbstraction } & CachedServices, - opts: DevicesApiServiceInitOptions -): Promise { - return factory( - cache, - "devicesApiService", - opts, - async () => new DevicesApiServiceImplementation(await apiServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/background/service-factories/event-collection-service.factory.ts b/apps/browser/src/background/service-factories/event-collection-service.factory.ts deleted file mode 100644 index 5ed6c24ca4b..00000000000 --- a/apps/browser/src/background/service-factories/event-collection-service.factory.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { EventCollectionService as AbstractEventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; -import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; - -import { - organizationServiceFactory, - OrganizationServiceInitOptions, -} from "../../admin-console/background/service-factories/organization-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../platform/background/service-factories/state-service.factory"; -import { - cipherServiceFactory, - CipherServiceInitOptions, -} from "../../vault/background/service_factories/cipher-service.factory"; - -import { - eventUploadServiceFactory, - EventUploadServiceInitOptions, -} from "./event-upload-service.factory"; - -type EventCollectionServiceOptions = FactoryOptions; - -export type EventCollectionServiceInitOptions = EventCollectionServiceOptions & - CipherServiceInitOptions & - StateServiceInitOptions & - OrganizationServiceInitOptions & - EventUploadServiceInitOptions; - -export function eventCollectionServiceFactory( - cache: { eventCollectionService?: AbstractEventCollectionService } & CachedServices, - opts: EventCollectionServiceInitOptions -): Promise { - return factory( - cache, - "eventCollectionService", - opts, - async () => - new EventCollectionService( - await cipherServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await organizationServiceFactory(cache, opts), - await eventUploadServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/background/service-factories/event-upload-service.factory.ts b/apps/browser/src/background/service-factories/event-upload-service.factory.ts deleted file mode 100644 index f9e72395a74..00000000000 --- a/apps/browser/src/background/service-factories/event-upload-service.factory.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { EventUploadService as AbstractEventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service"; -import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; - -import { - ApiServiceInitOptions, - apiServiceFactory, -} from "../../platform/background/service-factories/api-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../platform/background/service-factories/log-service.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../platform/background/service-factories/state-service.factory"; - -type EventUploadServiceOptions = FactoryOptions; - -export type EventUploadServiceInitOptions = EventUploadServiceOptions & - ApiServiceInitOptions & - StateServiceInitOptions & - LogServiceInitOptions; - -export function eventUploadServiceFactory( - cache: { eventUploadService?: AbstractEventUploadService } & CachedServices, - opts: EventUploadServiceInitOptions -): Promise { - return factory( - cache, - "eventUploadService", - opts, - async () => - new EventUploadService( - await apiServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await logServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/background/service-factories/password-generation-service.factory.ts b/apps/browser/src/background/service-factories/password-generation-service.factory.ts deleted file mode 100644 index d97e8ce98a6..00000000000 --- a/apps/browser/src/background/service-factories/password-generation-service.factory.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - PasswordGenerationService, - PasswordGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/password"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../admin-console/background/service-factories/policy-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../platform/background/service-factories/state-service.factory"; - -type PasswordGenerationServiceFactoryOptions = FactoryOptions; - -export type PasswordGenerationServiceInitOptions = PasswordGenerationServiceFactoryOptions & - CryptoServiceInitOptions & - PolicyServiceInitOptions & - StateServiceInitOptions; - -export function passwordGenerationServiceFactory( - cache: { passwordGenerationService?: PasswordGenerationServiceAbstraction } & CachedServices, - opts: PasswordGenerationServiceInitOptions -): Promise { - return factory( - cache, - "passwordGenerationService", - opts, - async () => - new PasswordGenerationService( - await cryptoServiceFactory(cache, opts), - await policyServiceFactory(cache, opts), - await stateServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/background/service-factories/search-service.factory.ts b/apps/browser/src/background/service-factories/search-service.factory.ts deleted file mode 100644 index 6ff9691c524..00000000000 --- a/apps/browser/src/background/service-factories/search-service.factory.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { SearchService as AbstractSearchService } from "@bitwarden/common/abstractions/search.service"; -import { SearchService } from "@bitwarden/common/services/search.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../platform/background/service-factories/i18n-service.factory"; -import { - logServiceFactory, - LogServiceInitOptions, -} from "../../platform/background/service-factories/log-service.factory"; - -type SearchServiceFactoryOptions = FactoryOptions; - -export type SearchServiceInitOptions = SearchServiceFactoryOptions & - LogServiceInitOptions & - I18nServiceInitOptions; - -export function searchServiceFactory( - cache: { searchService?: AbstractSearchService } & CachedServices, - opts: SearchServiceInitOptions -): Promise { - return factory( - cache, - "searchService", - opts, - async () => - new SearchService(await logServiceFactory(cache, opts), await i18nServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/background/service-factories/send-service.factory.ts b/apps/browser/src/background/service-factories/send-service.factory.ts deleted file mode 100644 index bc0f83787fd..00000000000 --- a/apps/browser/src/background/service-factories/send-service.factory.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { InternalSendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; - -import { cryptoFunctionServiceFactory } from "../../platform/background/service-factories/crypto-function-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../platform/background/service-factories/crypto-service.factory"; -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../platform/background/service-factories/i18n-service.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../platform/background/service-factories/state-service.factory"; -import { BrowserSendService } from "../../services/browser-send.service"; - -type SendServiceFactoryOptions = FactoryOptions; - -export type SendServiceInitOptions = SendServiceFactoryOptions & - CryptoServiceInitOptions & - I18nServiceInitOptions & - StateServiceInitOptions; - -export function sendServiceFactory( - cache: { sendService?: InternalSendService } & CachedServices, - opts: SendServiceInitOptions -): Promise { - return factory( - cache, - "sendService", - opts, - async () => - new BrowserSendService( - await cryptoServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await cryptoFunctionServiceFactory(cache, opts), - await stateServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/background/service-factories/settings-service.factory.ts b/apps/browser/src/background/service-factories/settings-service.factory.ts deleted file mode 100644 index 17e22a6678d..00000000000 --- a/apps/browser/src/background/service-factories/settings-service.factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { SettingsService as AbstractSettingsService } from "@bitwarden/common/abstractions/settings.service"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../platform/background/service-factories/state-service.factory"; -import { BrowserSettingsService } from "../../services/browser-settings.service"; - -type SettingsServiceFactoryOptions = FactoryOptions; - -export type SettingsServiceInitOptions = SettingsServiceFactoryOptions & StateServiceInitOptions; - -export function settingsServiceFactory( - cache: { settingsService?: AbstractSettingsService } & CachedServices, - opts: SettingsServiceInitOptions -): Promise { - return factory( - cache, - "settingsService", - opts, - async () => new BrowserSettingsService(await stateServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts b/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts deleted file mode 100644 index b019db3297d..00000000000 --- a/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { VaultTimeoutService as AbstractVaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; - -import { - authServiceFactory, - AuthServiceInitOptions, -} from "../../auth/background/service-factories/auth-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../platform/background/service-factories/factory-options"; -import { - messagingServiceFactory, - MessagingServiceInitOptions, -} from "../../platform/background/service-factories/messaging-service.factory"; -import { - platformUtilsServiceFactory, - PlatformUtilsServiceInitOptions, -} from "../../platform/background/service-factories/platform-utils-service.factory"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../platform/background/service-factories/state-service.factory"; -import VaultTimeoutService from "../../services/vault-timeout/vault-timeout.service"; -import { - cipherServiceFactory, - CipherServiceInitOptions, -} from "../../vault/background/service_factories/cipher-service.factory"; -import { - collectionServiceFactory, - CollectionServiceInitOptions, -} from "../../vault/background/service_factories/collection-service.factory"; -import { - folderServiceFactory, - FolderServiceInitOptions, -} from "../../vault/background/service_factories/folder-service.factory"; - -import { searchServiceFactory, SearchServiceInitOptions } from "./search-service.factory"; -import { - vaultTimeoutSettingsServiceFactory, - VaultTimeoutSettingsServiceInitOptions, -} from "./vault-timeout-settings-service.factory"; - -type VaultTimeoutServiceFactoryOptions = FactoryOptions & { - vaultTimeoutServiceOptions: { - lockedCallback: (userId?: string) => Promise; - loggedOutCallback: (expired: boolean, userId?: string) => Promise; - }; -}; - -export type VaultTimeoutServiceInitOptions = VaultTimeoutServiceFactoryOptions & - CipherServiceInitOptions & - FolderServiceInitOptions & - CollectionServiceInitOptions & - CryptoServiceInitOptions & - PlatformUtilsServiceInitOptions & - MessagingServiceInitOptions & - SearchServiceInitOptions & - StateServiceInitOptions & - AuthServiceInitOptions & - VaultTimeoutSettingsServiceInitOptions; - -export function vaultTimeoutServiceFactory( - cache: { vaultTimeoutService?: AbstractVaultTimeoutService } & CachedServices, - opts: VaultTimeoutServiceInitOptions -): Promise { - return factory( - cache, - "vaultTimeoutService", - opts, - async () => - new VaultTimeoutService( - await cipherServiceFactory(cache, opts), - await folderServiceFactory(cache, opts), - await collectionServiceFactory(cache, opts), - await cryptoServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await messagingServiceFactory(cache, opts), - await searchServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await authServiceFactory(cache, opts), - await vaultTimeoutSettingsServiceFactory(cache, opts), - opts.vaultTimeoutServiceOptions.lockedCallback, - opts.vaultTimeoutServiceOptions.loggedOutCallback - ) - ); -} diff --git a/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts b/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts deleted file mode 100644 index eda86c0a156..00000000000 --- a/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { VaultTimeoutSettingsService as AbstractVaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../admin-console/background/service-factories/policy-service.factory"; -import { - tokenServiceFactory, - TokenServiceInitOptions, -} from "../../auth/background/service-factories/token-service.factory"; -import { - userVerificationServiceFactory, - UserVerificationServiceInitOptions, -} from "../../auth/background/service-factories/user-verification-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../platform/background/service-factories/factory-options"; -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../platform/background/service-factories/state-service.factory"; - -type VaultTimeoutSettingsServiceFactoryOptions = FactoryOptions; - -export type VaultTimeoutSettingsServiceInitOptions = VaultTimeoutSettingsServiceFactoryOptions & - CryptoServiceInitOptions & - TokenServiceInitOptions & - PolicyServiceInitOptions & - StateServiceInitOptions & - UserVerificationServiceInitOptions; - -export function vaultTimeoutSettingsServiceFactory( - cache: { vaultTimeoutSettingsService?: AbstractVaultTimeoutSettingsService } & CachedServices, - opts: VaultTimeoutSettingsServiceInitOptions -): Promise { - return factory( - cache, - "vaultTimeoutSettingsService", - opts, - async () => - new VaultTimeoutSettingsService( - await cryptoServiceFactory(cache, opts), - await tokenServiceFactory(cache, opts), - await policyServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await userVerificationServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/background/webRequest.background.ts b/apps/browser/src/background/webRequest.background.ts deleted file mode 100644 index 6dd50c23e26..00000000000 --- a/apps/browser/src/background/webRequest.background.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { UriMatchType } from "@bitwarden/common/enums"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; - -import { BrowserApi } from "../platform/browser/browser-api"; - -export default class WebRequestBackground { - private pendingAuthRequests: any[] = []; - private webRequest: any; - private isFirefox: boolean; - - constructor( - platformUtilsService: PlatformUtilsService, - private cipherService: CipherService, - private authService: AuthService - ) { - if (BrowserApi.manifestVersion === 2) { - this.webRequest = (window as any).chrome.webRequest; - } - this.isFirefox = platformUtilsService.isFirefox(); - } - - async init() { - if (!this.webRequest || !this.webRequest.onAuthRequired) { - return; - } - - this.webRequest.onAuthRequired.addListener( - async (details: any, callback: any) => { - if (!details.url || this.pendingAuthRequests.indexOf(details.requestId) !== -1) { - if (callback) { - callback(); - } - return; - } - - this.pendingAuthRequests.push(details.requestId); - - if (this.isFirefox) { - // eslint-disable-next-line - return new Promise(async (resolve, reject) => { - await this.resolveAuthCredentials(details.url, resolve, reject); - }); - } else { - await this.resolveAuthCredentials(details.url, callback, callback); - } - }, - { urls: ["http://*/*", "https://*/*"] }, - [this.isFirefox ? "blocking" : "asyncBlocking"] - ); - - this.webRequest.onCompleted.addListener((details: any) => this.completeAuthRequest(details), { - urls: ["http://*/*"], - }); - this.webRequest.onErrorOccurred.addListener( - (details: any) => this.completeAuthRequest(details), - { - urls: ["http://*/*"], - } - ); - } - - // eslint-disable-next-line - private async resolveAuthCredentials(domain: string, success: Function, error: Function) { - if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { - error(); - return; - } - - try { - const ciphers = await this.cipherService.getAllDecryptedForUrl( - domain, - null, - UriMatchType.Host - ); - if (ciphers == null || ciphers.length !== 1) { - error(); - return; - } - - success({ - authCredentials: { - username: ciphers[0].login.username, - password: ciphers[0].login.password, - }, - }); - } catch { - error(); - } - } - - private completeAuthRequest(details: any) { - const i = this.pendingAuthRequests.indexOf(details.requestId); - if (i > -1) { - this.pendingAuthRequests.splice(i, 1); - } - } -} diff --git a/apps/browser/src/billing/popup/settings/premium-v2.component.html b/apps/browser/src/billing/popup/settings/premium-v2.component.html new file mode 100644 index 00000000000..f578de8ae7a --- /dev/null +++ b/apps/browser/src/billing/popup/settings/premium-v2.component.html @@ -0,0 +1,60 @@ + + + + + + + +
+

{{ "premiumFeatures" | i18n }}

+ + +
+
    +
  • + {{ "ppremiumSignUpStorage" | i18n }} +
  • +
  • + {{ "premiumSignUpTwoStepOptions" | i18n }} +
  • +
  • + {{ "premiumSignUpEmergency" | i18n }} +
  • +
  • + {{ "ppremiumSignUpReports" | i18n }} +
  • +
  • + {{ "ppremiumSignUpTotp" | i18n }} +
  • +
  • + {{ "ppremiumSignUpSupport" | i18n }} +
  • +
  • + {{ "ppremiumSignUpFuture" | i18n }} +
  • +
+
+

{{ priceString }}

+
+
+ + +
+
diff --git a/apps/browser/src/billing/popup/settings/premium-v2.component.ts b/apps/browser/src/billing/popup/settings/premium-v2.component.ts new file mode 100644 index 00000000000..ef4c39942a2 --- /dev/null +++ b/apps/browser/src/billing/popup/settings/premium-v2.component.ts @@ -0,0 +1,86 @@ +import { CommonModule, CurrencyPipe, Location } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { + ButtonModule, + CardComponent, + DialogService, + ItemModule, + SectionComponent, +} from "@bitwarden/components"; + +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({ + selector: "app-premium", + templateUrl: "premium-v2.component.html", + standalone: true, + imports: [ + ButtonModule, + CardComponent, + CommonModule, + CurrentAccountComponent, + ItemModule, + JslibModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + RouterModule, + SectionComponent, + ], +}) +export class PremiumV2Component extends BasePremiumComponent { + priceString: string; + + constructor( + i18nService: I18nService, + platformUtilsService: PlatformUtilsService, + apiService: ApiService, + configService: ConfigService, + logService: LogService, + private location: Location, + private currencyPipe: CurrencyPipe, + dialogService: DialogService, + environmentService: EnvironmentService, + billingAccountProfileStateService: BillingAccountProfileStateService, + ) { + super( + i18nService, + platformUtilsService, + apiService, + configService, + logService, + dialogService, + environmentService, + billingAccountProfileStateService, + ); + + // Support old price string. Can be removed in future once all translations are properly updated. + const thePrice = this.currencyPipe.transform(this.price, "$"); + // Safari extension crashes due to $1 appearing in the price string ($10.00). Escape the $ to fix. + const formattedPrice = this.platformUtilsService.isSafari() + ? thePrice.replace("$", "$$$") + : thePrice; + this.priceString = i18nService.t("premiumPriceV2", formattedPrice); + if (this.priceString.indexOf("%price%") > -1) { + this.priceString = this.priceString.replace("%price%", thePrice); + } + } + + goBack() { + this.location.back(); + } +} diff --git a/apps/browser/src/billing/popup/settings/premium.component.html b/apps/browser/src/billing/popup/settings/premium.component.html new file mode 100644 index 00000000000..a8f9855e62d --- /dev/null +++ b/apps/browser/src/billing/popup/settings/premium.component.html @@ -0,0 +1,72 @@ +
+
+ +
+

+ {{ "premiumMembership" | i18n }} +

+
+
+
+
+ +

{{ "premiumNotCurrentMember" | i18n }}

+

{{ "premiumSignUpAndGet" | i18n }}

+
    +
  • + + {{ "ppremiumSignUpStorage" | i18n }} +
  • +
  • + + {{ "premiumSignUpTwoStepOptions" | i18n }} +
  • +
  • + + {{ "ppremiumSignUpReports" | i18n }} +
  • +
  • + + {{ "ppremiumSignUpTotp" | i18n }} +
  • +
  • + + {{ "ppremiumSignUpSupport" | i18n }} +
  • +
  • + + {{ "ppremiumSignUpFuture" | i18n }} +
  • +
+

{{ priceString }}

+ + +
+ +

{{ "premiumCurrentMember" | i18n }}

+

{{ "premiumCurrentMemberThanks" | i18n }}

+ +
+
+
diff --git a/apps/browser/src/billing/popup/settings/premium.component.ts b/apps/browser/src/billing/popup/settings/premium.component.ts new file mode 100644 index 00000000000..ed64574d17d --- /dev/null +++ b/apps/browser/src/billing/popup/settings/premium.component.ts @@ -0,0 +1,59 @@ +import { CurrencyPipe, Location } from "@angular/common"; +import { Component } from "@angular/core"; + +import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { DialogService } from "@bitwarden/components"; + +@Component({ + selector: "app-premium", + templateUrl: "premium.component.html", +}) +export class PremiumComponent extends BasePremiumComponent { + priceString: string; + + constructor( + i18nService: I18nService, + platformUtilsService: PlatformUtilsService, + apiService: ApiService, + configService: ConfigService, + logService: LogService, + private location: Location, + private currencyPipe: CurrencyPipe, + dialogService: DialogService, + environmentService: EnvironmentService, + billingAccountProfileStateService: BillingAccountProfileStateService, + ) { + super( + i18nService, + platformUtilsService, + apiService, + configService, + logService, + dialogService, + environmentService, + billingAccountProfileStateService, + ); + + // Support old price string. Can be removed in future once all translations are properly updated. + const thePrice = this.currencyPipe.transform(this.price, "$"); + // Safari extension crashes due to $1 appearing in the price string ($10.00). Escape the $ to fix. + const formattedPrice = this.platformUtilsService.isSafari() + ? thePrice.replace("$", "$$$") + : thePrice; + this.priceString = i18nService.t("premiumPrice", formattedPrice); + if (this.priceString.indexOf("%price%") > -1) { + this.priceString = this.priceString.replace("%price%", thePrice); + } + } + + goBack() { + this.location.back(); + } +} diff --git a/apps/browser/src/browser/safariApp.ts b/apps/browser/src/browser/safariApp.ts index 683c9ef08a0..f96a560e3f1 100644 --- a/apps/browser/src/browser/safariApp.ts +++ b/apps/browser/src/browser/safariApp.ts @@ -19,7 +19,7 @@ export class SafariApp { }, (response: any) => { resolve(response); - } + }, ); }); } diff --git a/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.ts b/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.ts new file mode 100644 index 00000000000..0cd48c45938 --- /dev/null +++ b/apps/browser/src/key-management/biometrics/background-browser-biometrics.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from "@angular/core"; + +import { NativeMessagingBackground } from "../../background/nativeMessaging.background"; + +import { BrowserBiometricsService } from "./browser-biometrics.service"; + +@Injectable() +export class BackgroundBrowserBiometricsService extends BrowserBiometricsService { + constructor(private nativeMessagingBackground: () => NativeMessagingBackground) { + super(); + } + + async authenticateBiometric(): Promise { + const responsePromise = this.nativeMessagingBackground().getResponse(); + await this.nativeMessagingBackground().send({ command: "biometricUnlock" }); + const response = await responsePromise; + return response.response === "unlocked"; + } + + async isBiometricUnlockAvailable(): Promise { + const responsePromise = this.nativeMessagingBackground().getResponse(); + await this.nativeMessagingBackground().send({ command: "biometricUnlockAvailable" }); + const response = await responsePromise; + return response.response === "available"; + } + + async biometricsNeedsSetup(): Promise { + return false; + } + + async biometricsSupportsAutoSetup(): Promise { + return false; + } + + async biometricsSetup(): Promise {} +} diff --git a/apps/browser/src/key-management/biometrics/browser-biometrics.service.ts b/apps/browser/src/key-management/biometrics/browser-biometrics.service.ts new file mode 100644 index 00000000000..7ffbed45415 --- /dev/null +++ b/apps/browser/src/key-management/biometrics/browser-biometrics.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from "@angular/core"; + +import { BiometricsService } from "@bitwarden/key-management"; + +import { BrowserApi } from "../../platform/browser/browser-api"; + +@Injectable() +export abstract class BrowserBiometricsService extends BiometricsService { + async supportsBiometric() { + const platformInfo = await BrowserApi.getPlatformInfo(); + if (platformInfo.os === "mac" || platformInfo.os === "win" || platformInfo.os === "linux") { + return true; + } + return false; + } + + abstract authenticateBiometric(): Promise; + abstract isBiometricUnlockAvailable(): Promise; +} diff --git a/apps/browser/src/key-management/biometrics/foreground-browser-biometrics.ts b/apps/browser/src/key-management/biometrics/foreground-browser-biometrics.ts new file mode 100644 index 00000000000..f50468c8b7a --- /dev/null +++ b/apps/browser/src/key-management/biometrics/foreground-browser-biometrics.ts @@ -0,0 +1,34 @@ +import { BrowserApi } from "../../platform/browser/browser-api"; + +import { BrowserBiometricsService } from "./browser-biometrics.service"; + +export class ForegroundBrowserBiometricsService extends BrowserBiometricsService { + async authenticateBiometric(): Promise { + const response = await BrowserApi.sendMessageWithResponse<{ + result: boolean; + error: string; + }>("biometricUnlock"); + if (!response.result) { + throw response.error; + } + return response.result; + } + + async isBiometricUnlockAvailable(): Promise { + const response = await BrowserApi.sendMessageWithResponse<{ + result: boolean; + error: string; + }>("biometricUnlockAvailable"); + return response.result && response.result === true; + } + + async biometricsNeedsSetup(): Promise { + return false; + } + + async biometricsSupportsAutoSetup(): Promise { + return false; + } + + async biometricsSetup(): Promise {} +} diff --git a/apps/browser/src/key-management/browser-key.service.ts b/apps/browser/src/key-management/browser-key.service.ts new file mode 100644 index 00000000000..ad2524dbc4b --- /dev/null +++ b/apps/browser/src/key-management/browser-key.service.ts @@ -0,0 +1,89 @@ +import { firstValueFrom } from "rxjs"; + +import { PinServiceAbstraction } from "@bitwarden/auth/common"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { KeySuffixOptions } from "@bitwarden/common/platform/enums"; +import { USER_KEY } from "@bitwarden/common/platform/services/key-state/user-key.state"; +import { StateProvider } from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; +import { UserKey } from "@bitwarden/common/types/key"; +import { + KdfConfigService, + DefaultKeyService, + BiometricsService, + BiometricStateService, +} from "@bitwarden/key-management"; + +export class BrowserKeyService extends DefaultKeyService { + constructor( + pinService: PinServiceAbstraction, + masterPasswordService: InternalMasterPasswordServiceAbstraction, + keyGenerationService: KeyGenerationService, + cryptoFunctionService: CryptoFunctionService, + encryptService: EncryptService, + platformUtilService: PlatformUtilsService, + logService: LogService, + stateService: StateService, + accountService: AccountService, + stateProvider: StateProvider, + private biometricStateService: BiometricStateService, + private biometricsService: BiometricsService, + kdfConfigService: KdfConfigService, + ) { + super( + pinService, + masterPasswordService, + keyGenerationService, + cryptoFunctionService, + encryptService, + platformUtilService, + logService, + stateService, + accountService, + stateProvider, + kdfConfigService, + ); + } + override async hasUserKeyStored(keySuffix: KeySuffixOptions, userId?: UserId): Promise { + if (keySuffix === KeySuffixOptions.Biometric) { + const biometricUnlockPromise = + userId == null + ? firstValueFrom(this.biometricStateService.biometricUnlockEnabled$) + : this.biometricStateService.getBiometricUnlockEnabled(userId); + return await biometricUnlockPromise; + } + return super.hasUserKeyStored(keySuffix, userId); + } + + /** + * Browser doesn't store biometric keys, so we retrieve them from the desktop and return + * if we successfully saved it into memory as the User Key + * @returns the `UserKey` if the user passes a biometrics prompt, otherwise return `null`. + */ + protected override async getKeyFromStorage( + keySuffix: KeySuffixOptions, + userId?: UserId, + ): Promise { + if (keySuffix === KeySuffixOptions.Biometric) { + const biometricsResult = await this.biometricsService.authenticateBiometric(); + + if (!biometricsResult) { + return null; + } + + const userKey = await firstValueFrom(this.stateProvider.getUserState$(USER_KEY, userId)); + if (userKey) { + return userKey; + } + } + + return await super.getKeyFromStorage(keySuffix, userId); + } +} diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 7bd5e9f5a06..9c2d2d610bc 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2023.9.1", + "version": "2024.11.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", @@ -15,23 +15,26 @@ "128": "images/icon128.png" }, "content_scripts": [ - { - "all_frames": true, - "js": ["content/trigger-autofill-script-injection.js"], - "matches": ["http://*/*", "https://*/*", "file:///*"], - "run_at": "document_start" - }, { "all_frames": false, - "js": ["content/message_handler.js"], - "matches": ["http://*/*", "https://*/*", "file:///*"], + "js": ["content/content-message-handler.js"], + "matches": ["*://*/*", "file:///*"], + "exclude_matches": ["*://*/*.xml*", "file:///*.xml*"], "run_at": "document_start" }, { "all_frames": true, "css": ["content/autofill.css"], - "matches": ["http://*/*", "https://*/*", "file:///*"], - "run_at": "document_end" + "js": ["content/trigger-autofill-script-injection.js"], + "matches": ["*://*/*", "file:///*"], + "exclude_matches": ["*://*/*.xml*", "file:///*.xml*"], + "run_at": "document_start" + }, + { + "all_frames": false, + "js": ["content/lp-fileless-importer.js"], + "matches": ["https://lastpass.com/export.php"], + "run_at": "document_start" } ], "background": { @@ -47,20 +50,50 @@ "default_popup": "popup/index.html" }, "permissions": [ - "tabs", - "contextMenus", - "storage", - "unlimitedStorage", + "", + "*://*/*", + "alarms", "clipboardRead", "clipboardWrite", + "contextMenus", "idle", - "http://*/*", - "https://*/*", + "storage", + "tabs", + "unlimitedStorage", + "webNavigation", "webRequest", "webRequestBlocking" ], - "optional_permissions": ["nativeMessaging"], + "__safari__permissions": [ + "", + "*://*/*", + "alarms", + "clipboardRead", + "clipboardWrite", + "contextMenus", + "idle", + "nativeMessaging", + "storage", + "tabs", + "unlimitedStorage", + "webNavigation", + "webRequest", + "webRequestBlocking" + ], + "optional_permissions": ["nativeMessaging", "privacy"], + "__firefox__optional_permissions": ["nativeMessaging"], + "__safari__optional_permissions": null, "content_security_policy": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'", + "sandbox": { + "pages": [ + "overlay/menu-button.html", + "overlay/menu-list.html", + "overlay/button.html", + "overlay/list.html" + ], + "content_security_policy": "sandbox allow-scripts; script-src 'self'" + }, + "__firefox__sandbox": null, "commands": { "_execute_browser_action": { "suggested_key": { @@ -69,7 +102,14 @@ }, "description": "__MSG_commandOpenPopup__" }, - "_execute_sidebar_action": { + "__firefox___execute_sidebar_action": { + "suggested_key": { + "default": "Alt+Shift+Y", + "linux": "Alt+Shift+U" + }, + "description": "__MSG_commandOpenSidebar__" + }, + "__opera___execute_sidebar_action": { "suggested_key": { "default": "Alt+Shift+Y", "linux": "Alt+Shift+U" @@ -80,7 +120,13 @@ "suggested_key": { "default": "Ctrl+Shift+L" }, - "description": "__MSG_commandAutofillDesc__" + "description": "__MSG_commandAutofillLoginDesc__" + }, + "autofill_card": { + "description": "__MSG_commandAutofillCardDesc__" + }, + "autofill_identity": { + "description": "__MSG_commandAutofillIdentityDesc__" }, "generate_password": { "suggested_key": { @@ -93,22 +139,38 @@ } }, "web_accessible_resources": [ + "content/fido2-page-script.js", + "content/lp-suppress-import-download.js", "notification/bar.html", "images/icon38.png", - "images/icon38_locked.png" + "images/icon38_locked.png", + "overlay/menu-button.html", + "overlay/menu-list.html", + "overlay/menu.html", + "overlay/button.html", + "overlay/list.html", + "popup/fonts/*" ], - "applications": { + "__firefox__browser_specific_settings": { "gecko": { "id": "{446900e4-71c2-419f-a6a7-df9c091e268b}", "strict_min_version": "91.0" } }, - "sidebar_action": { + "__firefox__sidebar_action": { "default_title": "Bitwarden", "default_panel": "popup/index.html?uilocation=sidebar", - "default_icon": "images/icon19.png" + "default_icon": "images/icon19.png", + "open_at_install": false, + "browser_style": false }, - "storage": { - "managed_schema": "managed_schema.json" - } + "__opera__sidebar_action": { + "default_title": "Bitwarden", + "default_panel": "popup/index.html?uilocation=sidebar", + "default_icon": "images/icon19.png", + "open_at_install": false, + "browser_style": false + }, + "storage": { "managed_schema": "managed_schema.json" }, + "__firefox__storage": null } diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 7a42aa0ffae..fb44505ae8d 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2023.9.1", + "version": "2024.11.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", @@ -16,39 +16,33 @@ "128": "images/icon128.png" }, "content_scripts": [ - { - "all_frames": true, - "js": [ - "content/autofill.js", - "content/autofiller.js", - "content/notificationBar.js", - "content/contextMenuHandler.js" - ], - "matches": ["http://*/*", "https://*/*", "file:///*"], - "run_at": "document_start" - }, { "all_frames": false, - "js": ["content/message_handler.js"], - "matches": ["http://*/*", "https://*/*", "file:///*"], + "js": ["content/content-message-handler.js"], + "matches": ["*://*/*", "file:///*"], + "exclude_matches": ["*://*/*.xml*", "file:///*.xml*"], "run_at": "document_start" }, { "all_frames": true, "css": ["content/autofill.css"], - "matches": ["http://*/*", "https://*/*", "file:///*"], - "run_at": "document_end" + "js": ["content/trigger-autofill-script-injection.js", "content/misc-utils.js"], + "matches": ["*://*/*", "file:///*"], + "exclude_matches": ["*://*/*.xml*", "file:///*.xml*"], + "run_at": "document_start" }, { - "all_frames": true, - "js": ["content/misc-utils.js"], - "matches": ["http://*/*", "https://*/*", "file:///*"], - "run_at": "document_end" + "all_frames": false, + "js": ["content/lp-fileless-importer.js"], + "matches": ["https://lastpass.com/export.php"], + "run_at": "document_start" } ], "background": { - "service_worker": "background.js", - "type": "module" + "service_worker": "background.js" + }, + "__firefox__background": { + "scripts": ["background.js"] }, "action": { "default_icon": { @@ -59,20 +53,55 @@ "default_popup": "popup/index.html" }, "permissions": [ - "tabs", - "contextMenus", - "storage", - "unlimitedStorage", + "activeTab", + "alarms", "clipboardRead", "clipboardWrite", + "contextMenus", "idle", - "alarms" + "offscreen", + "scripting", + "storage", + "tabs", + "unlimitedStorage", + "webNavigation", + "webRequest", + "webRequestAuthProvider" ], - "optional_permissions": ["nativeMessaging"], - "host_permissions": ["http://*/*", "https://*/*"], + "__safari__permissions": [ + "activeTab", + "alarms", + "clipboardRead", + "clipboardWrite", + "contextMenus", + "idle", + "nativeMessaging", + "offscreen", + "scripting", + "storage", + "tabs", + "unlimitedStorage", + "webNavigation", + "webRequest", + "webRequestAuthProvider" + ], + "optional_permissions": ["nativeMessaging", "privacy"], + "__firefox__optional_permissions": ["nativeMessaging"], + "__safari__optional_permissions": null, + "host_permissions": ["https://*/*", "http://*/*"], "content_security_policy": { - "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" + "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'", + "sandbox": "sandbox allow-scripts; script-src 'self'" }, + "sandbox": { + "pages": [ + "overlay/menu-button.html", + "overlay/menu-list.html", + "overlay/button.html", + "overlay/list.html" + ] + }, + "__firefox__sandbox": null, "commands": { "_execute_action": { "suggested_key": { @@ -81,7 +110,7 @@ }, "description": "__MSG_commandOpenPopup__" }, - "_execute_sidebar_action": { + "__firefox___execute_sidebar_action": { "suggested_key": { "default": "Alt+Shift+Y", "linux": "Alt+Shift+U" @@ -92,7 +121,13 @@ "suggested_key": { "default": "Ctrl+Shift+L" }, - "description": "__MSG_commandAutofillDesc__" + "description": "__MSG_commandAutofillLoginDesc__" + }, + "autofill_card": { + "description": "__MSG_commandAutofillCardDesc__" + }, + "autofill_identity": { + "description": "__MSG_commandAutofillIdentityDesc__" }, "generate_password": { "suggested_key": { @@ -106,22 +141,35 @@ }, "web_accessible_resources": [ { - "resources": ["notification/bar.html", "images/icon38.png", "images/icon38_locked.png"], + "resources": [ + "content/fido2-page-script.js", + "notification/bar.html", + "images/icon38.png", + "images/icon38_locked.png", + "overlay/menu-button.html", + "overlay/menu-list.html", + "overlay/menu.html", + "overlay/button.html", + "overlay/list.html", + "popup/fonts/*" + ], "matches": [""] } ], - "applications": { + "__firefox__browser_specific_settings": { "gecko": { "id": "{446900e4-71c2-419f-a6a7-df9c091e268b}", "strict_min_version": "91.0" } }, - "sidebar_action": { + "__firefox__sidebar_action": { "default_title": "Bitwarden", "default_panel": "popup/index.html?uilocation=sidebar", - "default_icon": "images/icon19.png" + "default_icon": "images/icon19.png", + "open_at_install": false }, "storage": { "managed_schema": "managed_schema.json" - } + }, + "__firefox__storage": null } diff --git a/apps/browser/src/models/account.ts b/apps/browser/src/models/account.ts deleted file mode 100644 index 57d7844fde6..00000000000 --- a/apps/browser/src/models/account.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Jsonify } from "type-fest"; - -import { - Account as BaseAccount, - AccountSettings as BaseAccountSettings, -} from "@bitwarden/common/platform/models/domain/account"; - -import { BrowserComponentState } from "./browserComponentState"; -import { BrowserGroupingsComponentState } from "./browserGroupingsComponentState"; -import { BrowserSendComponentState } from "./browserSendComponentState"; - -export class AccountSettings extends BaseAccountSettings { - vaultTimeout = -1; // On Restart - - static fromJSON(json: Jsonify): AccountSettings { - if (json == null) { - return null; - } - - return Object.assign(new AccountSettings(), json, super.fromJSON(json)); - } -} - -export class Account extends BaseAccount { - settings?: AccountSettings = new AccountSettings(); - groupings?: BrowserGroupingsComponentState; - send?: BrowserSendComponentState; - ciphers?: BrowserComponentState; - sendType?: BrowserComponentState; - - constructor(init: Partial) { - super(init); - Object.assign(this.settings, { - ...new AccountSettings(), - ...this.settings, - }); - this.groupings = init?.groupings ?? new BrowserGroupingsComponentState(); - this.send = init?.send ?? new BrowserSendComponentState(); - this.ciphers = init?.ciphers ?? new BrowserComponentState(); - this.sendType = init?.sendType ?? new BrowserComponentState(); - } - - static fromJSON(json: Jsonify): Account { - if (json == null) { - return null; - } - - return Object.assign(new Account({}), json, super.fromJSON(json), { - settings: AccountSettings.fromJSON(json.settings), - groupings: BrowserGroupingsComponentState.fromJSON(json.groupings), - send: BrowserSendComponentState.fromJSON(json.send), - ciphers: BrowserComponentState.fromJSON(json.ciphers), - sendType: BrowserComponentState.fromJSON(json.sendType), - }); - } -} diff --git a/apps/browser/src/models/biometricErrors.ts b/apps/browser/src/models/biometricErrors.ts index 822a5c16f42..42d9c679d34 100644 --- a/apps/browser/src/models/biometricErrors.ts +++ b/apps/browser/src/models/biometricErrors.ts @@ -3,7 +3,16 @@ type BiometricError = { description: string; }; -export type BiometricErrorTypes = "startDesktop" | "desktopIntegrationDisabled"; +export type BiometricErrorTypes = + | "startDesktop" + | "desktopIntegrationDisabled" + | "not enabled" + | "not supported" + | "not unlocked" + | "invalidateEncryption" + | "userkey wrong" + | "wrongUserId" + | "not available"; export const BiometricErrors: Record = { startDesktop: { @@ -14,4 +23,32 @@ export const BiometricErrors: Record = { title: "desktopIntegrationDisabledTitle", description: "desktopIntegrationDisabledDesc", }, + "not enabled": { + title: "biometricsNotEnabledTitle", + description: "biometricsNotEnabledDesc", + }, + "not supported": { + title: "biometricsNotSupportedTitle", + description: "biometricsNotSupportedDesc", + }, + "not unlocked": { + title: "biometricsUnlockNotUnlockedTitle", + description: "biometricsUnlockNotUnlockedDesc", + }, + invalidateEncryption: { + title: "nativeMessagingInvalidEncryptionTitle", + description: "nativeMessagingInvalidEncryptionDesc", + }, + "userkey wrong": { + title: "nativeMessagingWrongUserKeyTitle", + description: "nativeMessagingWrongUserKeyDesc", + }, + wrongUserId: { + title: "biometricsWrongUserTitle", + description: "biometricsWrongUserDesc", + }, + "not available": { + title: "biometricsNotAvailableTitle", + description: "biometricsNotAvailableDesc", + }, }; diff --git a/apps/browser/src/models/browserGroupingsComponentState.ts b/apps/browser/src/models/browserGroupingsComponentState.ts index 57e80216c23..36b4cc9ac04 100644 --- a/apps/browser/src/models/browserGroupingsComponentState.ts +++ b/apps/browser/src/models/browserGroupingsComponentState.ts @@ -1,8 +1,8 @@ +import { CollectionView } from "@bitwarden/admin-console/common"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { DeepJsonify } from "@bitwarden/common/types/deep-jsonify"; -import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; +import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { BrowserComponentState } from "./browserComponentState"; diff --git a/apps/browser/src/models/browserSendComponentState.ts b/apps/browser/src/models/browserSendComponentState.ts index 9158efc21d4..81dd93323bb 100644 --- a/apps/browser/src/models/browserSendComponentState.ts +++ b/apps/browser/src/models/browserSendComponentState.ts @@ -1,5 +1,3 @@ -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { DeepJsonify } from "@bitwarden/common/types/deep-jsonify"; @@ -7,13 +5,6 @@ import { BrowserComponentState } from "./browserComponentState"; export class BrowserSendComponentState extends BrowserComponentState { sends: SendView[]; - typeCounts: Map; - - toJSON() { - return Utils.merge(this, { - typeCounts: Utils.mapToRecord(this.typeCounts), - }); - } static fromJSON(json: DeepJsonify) { if (json == null) { @@ -22,7 +13,6 @@ export class BrowserSendComponentState extends BrowserComponentState { return Object.assign(new BrowserSendComponentState(), json, { sends: json.sends?.map((s) => SendView.fromJSON(s)), - typeCounts: Utils.recordToMap(json.typeCounts), }); } } diff --git a/apps/browser/src/platform/alarms/alarm-state.ts b/apps/browser/src/platform/alarms/alarm-state.ts deleted file mode 100644 index c58d6035175..00000000000 --- a/apps/browser/src/platform/alarms/alarm-state.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { clearClipboardAlarmName } from "../../autofill/clipboard"; -import { BrowserApi } from "../browser/browser-api"; - -export const alarmKeys = [clearClipboardAlarmName] as const; -export type AlarmKeys = (typeof alarmKeys)[number]; - -type AlarmState = { [T in AlarmKeys]: number | undefined }; - -const alarmState: AlarmState = { - clearClipboard: null, - //TODO once implemented vaultTimeout: null; - //TODO once implemented checkNotifications: null; - //TODO once implemented (if necessary) processReload: null; -}; - -/** - * Retrieves the set alarm time (planned execution) for a give an commandName {@link AlarmState} - * @param commandName A command that has been previously registered with {@link AlarmState} - * @returns {Promise} null or Unix epoch timestamp when the alarm action is supposed to execute - * @example - * // getAlarmTime(clearClipboard) - */ -export async function getAlarmTime(commandName: AlarmKeys): Promise { - let alarmTime: number; - if (BrowserApi.manifestVersion == 3) { - const fromSessionStore = await chrome.storage.session.get(commandName); - alarmTime = fromSessionStore[commandName]; - } else { - alarmTime = alarmState[commandName]; - } - - return alarmTime; -} - -/** - * Registers an action that should execute after the given time has passed - * @param commandName A command that has been previously registered with {@link AlarmState} - * @param delay_ms The number of ms from now in which the command should execute from - * @example - * // setAlarmTime(clearClipboard, 5000) register the clearClipboard action which will execute when at least 5 seconds from now have passed - */ -export async function setAlarmTime(commandName: AlarmKeys, delay_ms: number): Promise { - if (!delay_ms || delay_ms === 0) { - await this.clearAlarmTime(commandName); - return; - } - - const time = Date.now() + delay_ms; - await setAlarmTimeInternal(commandName, time); -} - -/** - * Clears the time currently set for a given command - * @param commandName A command that has been previously registered with {@link AlarmState} - */ -export async function clearAlarmTime(commandName: AlarmKeys): Promise { - await setAlarmTimeInternal(commandName, null); -} - -async function setAlarmTimeInternal(commandName: AlarmKeys, time: number): Promise { - if (BrowserApi.manifestVersion == 3) { - await chrome.storage.session.set({ [commandName]: time }); - } else { - alarmState[commandName] = time; - } -} diff --git a/apps/browser/src/platform/alarms/on-alarm-listener.ts b/apps/browser/src/platform/alarms/on-alarm-listener.ts deleted file mode 100644 index 25516930233..00000000000 --- a/apps/browser/src/platform/alarms/on-alarm-listener.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ClearClipboard, clearClipboardAlarmName } from "../../autofill/clipboard"; - -import { alarmKeys, clearAlarmTime, getAlarmTime } from "./alarm-state"; - -export const onAlarmListener = async (alarm: chrome.alarms.Alarm) => { - alarmKeys.forEach(async (key) => { - const executionTime = await getAlarmTime(key); - if (!executionTime) { - return; - } - - const currentDate = Date.now(); - if (executionTime > currentDate) { - return; - } - - await clearAlarmTime(key); - - switch (key) { - case clearClipboardAlarmName: - ClearClipboard.run(); - break; - default: - } - }); -}; diff --git a/apps/browser/src/platform/alarms/register-alarms.ts b/apps/browser/src/platform/alarms/register-alarms.ts deleted file mode 100644 index 2833e7c8882..00000000000 --- a/apps/browser/src/platform/alarms/register-alarms.ts +++ /dev/null @@ -1,29 +0,0 @@ -const NUMBER_OF_ALARMS = 6; - -export function registerAlarms() { - alarmsToBeCreated(NUMBER_OF_ALARMS); -} - -/** - * Creates staggered alarms that periodically (1min) raise OnAlarm events. The staggering is calculated based on the number of alarms passed in. - * @param numberOfAlarms Number of named alarms, that shall be registered - * @example - * // alarmsToBeCreated(2) results in 2 alarms separated by 30 seconds - * @example - * // alarmsToBeCreated(4) results in 4 alarms separated by 15 seconds - * @example - * // alarmsToBeCreated(6) results in 6 alarms separated by 10 seconds - * @example - * // alarmsToBeCreated(60) results in 60 alarms separated by 1 second - */ -function alarmsToBeCreated(numberOfAlarms: number): void { - const oneMinuteInMs = 60 * 1000; - const offset = oneMinuteInMs / numberOfAlarms; - - let calculatedWhen: number = Date.now() + offset; - - for (let index = 0; index < numberOfAlarms; index++) { - chrome.alarms.create(`bw_alarm${index}`, { periodInMinutes: 1, when: calculatedWhen }); - calculatedWhen += offset; - } -} diff --git a/apps/browser/src/platform/background.html b/apps/browser/src/platform/background.html index 0cd95f3f020..dd5767ab209 100644 --- a/apps/browser/src/platform/background.html +++ b/apps/browser/src/platform/background.html @@ -1,4 +1,5 @@ -īģŋ + + diff --git a/apps/browser/src/platform/background.ts b/apps/browser/src/platform/background.ts index f7913dade9f..0cd9b3285e6 100644 --- a/apps/browser/src/platform/background.ts +++ b/apps/browser/src/platform/background.ts @@ -1,38 +1,7 @@ +import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; + import MainBackground from "../background/main.background"; -import { onAlarmListener } from "./alarms/on-alarm-listener"; -import { registerAlarms } from "./alarms/register-alarms"; -import { BrowserApi } from "./browser/browser-api"; -import { - contextMenusClickedListener, - onCommandListener, - onInstallListener, - runtimeMessageListener, - windowsOnFocusChangedListener, - tabsOnActivatedListener, - tabsOnReplacedListener, - tabsOnUpdatedListener, -} from "./listeners"; - -if (BrowserApi.manifestVersion === 3) { - chrome.commands.onCommand.addListener(onCommandListener); - chrome.runtime.onInstalled.addListener(onInstallListener); - chrome.alarms.onAlarm.addListener(onAlarmListener); - registerAlarms(); - chrome.windows.onFocusChanged.addListener(windowsOnFocusChangedListener); - chrome.tabs.onActivated.addListener(tabsOnActivatedListener); - chrome.tabs.onReplaced.addListener(tabsOnReplacedListener); - chrome.tabs.onUpdated.addListener(tabsOnUpdatedListener); - chrome.contextMenus.onClicked.addListener(contextMenusClickedListener); - BrowserApi.messageListener( - "runtime.background", - (message: { command: string }, sender, sendResponse) => { - runtimeMessageListener(message, sender); - } - ); -} else { - const bitwardenMain = ((window as any).bitwardenMain = new MainBackground()); - bitwardenMain.bootstrap().then(() => { - // Finished bootstrapping - }); -} +const logService = new ConsoleLogService(false); +const bitwardenMain = ((self as any).bitwardenMain = new MainBackground()); +bitwardenMain.bootstrap().catch((error) => logService.error(error)); diff --git a/apps/browser/src/platform/background/service-factories/api-service.factory.ts b/apps/browser/src/platform/background/service-factories/api-service.factory.ts deleted file mode 100644 index bcde07fbb20..00000000000 --- a/apps/browser/src/platform/background/service-factories/api-service.factory.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { ApiService as AbstractApiService } from "@bitwarden/common/abstractions/api.service"; -import { ApiService } from "@bitwarden/common/services/api.service"; - -import { - tokenServiceFactory, - TokenServiceInitOptions, -} from "../../../auth/background/service-factories/token-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../background/service-factories/factory-options"; - -import { AppIdServiceInitOptions, appIdServiceFactory } from "./app-id-service.factory"; -import { - environmentServiceFactory, - EnvironmentServiceInitOptions, -} from "./environment-service.factory"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "./platform-utils-service.factory"; - -type ApiServiceFactoryOptions = FactoryOptions & { - apiServiceOptions: { - logoutCallback: (expired: boolean) => Promise; - customUserAgent?: string; - }; -}; - -export type ApiServiceInitOptions = ApiServiceFactoryOptions & - TokenServiceInitOptions & - PlatformUtilsServiceInitOptions & - EnvironmentServiceInitOptions & - AppIdServiceInitOptions; - -export function apiServiceFactory( - cache: { apiService?: AbstractApiService } & CachedServices, - opts: ApiServiceInitOptions -): Promise { - return factory( - cache, - "apiService", - opts, - async () => - new ApiService( - await tokenServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await environmentServiceFactory(cache, opts), - await appIdServiceFactory(cache, opts), - opts.apiServiceOptions.logoutCallback, - opts.apiServiceOptions.customUserAgent - ) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/app-id-service.factory.ts b/apps/browser/src/platform/background/service-factories/app-id-service.factory.ts deleted file mode 100644 index 30397d737ef..00000000000 --- a/apps/browser/src/platform/background/service-factories/app-id-service.factory.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { DiskStorageOptions } from "@koa/multer"; - -import { AppIdService as AbstractAppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { AppIdService } from "@bitwarden/common/platform/services/app-id.service"; - -import { FactoryOptions, CachedServices, factory } from "./factory-options"; -import { diskStorageServiceFactory } from "./storage-service.factory"; - -type AppIdServiceFactoryOptions = FactoryOptions; - -export type AppIdServiceInitOptions = AppIdServiceFactoryOptions & DiskStorageOptions; - -export function appIdServiceFactory( - cache: { appIdService?: AbstractAppIdService } & CachedServices, - opts: AppIdServiceInitOptions -): Promise { - return factory( - cache, - "appIdService", - opts, - async () => new AppIdService(await diskStorageServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/crypto-function-service.factory.ts b/apps/browser/src/platform/background/service-factories/crypto-function-service.factory.ts deleted file mode 100644 index bcfffb6bd08..00000000000 --- a/apps/browser/src/platform/background/service-factories/crypto-function-service.factory.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service"; - -import { CachedServices, factory, FactoryOptions } from "./factory-options"; - -type CryptoFunctionServiceFactoryOptions = FactoryOptions & { - cryptoFunctionServiceOptions: { - win: Window | typeof globalThis; - }; -}; - -export type CryptoFunctionServiceInitOptions = CryptoFunctionServiceFactoryOptions; - -export function cryptoFunctionServiceFactory( - cache: { cryptoFunctionService?: CryptoFunctionService } & CachedServices, - opts: CryptoFunctionServiceFactoryOptions -): Promise { - return factory( - cache, - "cryptoFunctionService", - opts, - () => new WebCryptoFunctionService(opts.cryptoFunctionServiceOptions.win) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/crypto-service.factory.ts b/apps/browser/src/platform/background/service-factories/crypto-service.factory.ts deleted file mode 100644 index 7f66a4f6fe7..00000000000 --- a/apps/browser/src/platform/background/service-factories/crypto-service.factory.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { CryptoService as AbstractCryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; - -import { - StateServiceInitOptions, - stateServiceFactory, -} from "../../../platform/background/service-factories/state-service.factory"; -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../background/service-factories/log-service.factory"; -import { BrowserCryptoService } from "../../services/browser-crypto.service"; - -import { - cryptoFunctionServiceFactory, - CryptoFunctionServiceInitOptions, -} from "./crypto-function-service.factory"; -import { encryptServiceFactory, EncryptServiceInitOptions } from "./encrypt-service.factory"; -import { FactoryOptions, CachedServices, factory } from "./factory-options"; -import { - PlatformUtilsServiceInitOptions, - platformUtilsServiceFactory, -} from "./platform-utils-service.factory"; - -type CryptoServiceFactoryOptions = FactoryOptions; - -export type CryptoServiceInitOptions = CryptoServiceFactoryOptions & - CryptoFunctionServiceInitOptions & - EncryptServiceInitOptions & - PlatformUtilsServiceInitOptions & - LogServiceInitOptions & - StateServiceInitOptions; - -export function cryptoServiceFactory( - cache: { cryptoService?: AbstractCryptoService } & CachedServices, - opts: CryptoServiceInitOptions -): Promise { - return factory( - cache, - "cryptoService", - opts, - async () => - new BrowserCryptoService( - await cryptoFunctionServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await platformUtilsServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - await stateServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/encrypt-service.factory.ts b/apps/browser/src/platform/background/service-factories/encrypt-service.factory.ts deleted file mode 100644 index 75e8c1974e2..00000000000 --- a/apps/browser/src/platform/background/service-factories/encrypt-service.factory.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { EncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/encrypt.service.implementation"; - -import { - LogServiceInitOptions, - logServiceFactory, -} from "../../background/service-factories/log-service.factory"; - -import { - cryptoFunctionServiceFactory, - CryptoFunctionServiceInitOptions, -} from "./crypto-function-service.factory"; -import { FactoryOptions, CachedServices, factory } from "./factory-options"; - -type EncryptServiceFactoryOptions = FactoryOptions & { - encryptServiceOptions: { - logMacFailures: boolean; - }; -}; - -export type EncryptServiceInitOptions = EncryptServiceFactoryOptions & - CryptoFunctionServiceInitOptions & - LogServiceInitOptions; - -export function encryptServiceFactory( - cache: { encryptService?: EncryptServiceImplementation } & CachedServices, - opts: EncryptServiceInitOptions -): Promise { - return factory( - cache, - "encryptService", - opts, - async () => - new EncryptServiceImplementation( - await cryptoFunctionServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - opts.encryptServiceOptions.logMacFailures - ) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/environment-service.factory.ts b/apps/browser/src/platform/background/service-factories/environment-service.factory.ts deleted file mode 100644 index 5150c7bd4a0..00000000000 --- a/apps/browser/src/platform/background/service-factories/environment-service.factory.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { BrowserEnvironmentService } from "../../services/browser-environment.service"; - -import { CachedServices, factory, FactoryOptions } from "./factory-options"; -import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; -import { - stateServiceFactory as stateServiceFactory, - StateServiceInitOptions, -} from "./state-service.factory"; - -type EnvironmentServiceFactoryOptions = FactoryOptions; - -export type EnvironmentServiceInitOptions = EnvironmentServiceFactoryOptions & - StateServiceInitOptions & - LogServiceInitOptions; - -export function environmentServiceFactory( - cache: { environmentService?: BrowserEnvironmentService } & CachedServices, - opts: EnvironmentServiceInitOptions -): Promise { - return factory( - cache, - "environmentService", - opts, - async () => - new BrowserEnvironmentService( - await stateServiceFactory(cache, opts), - await logServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/factory-options.ts b/apps/browser/src/platform/background/service-factories/factory-options.ts deleted file mode 100644 index 7dde09204ef..00000000000 --- a/apps/browser/src/platform/background/service-factories/factory-options.ts +++ /dev/null @@ -1,30 +0,0 @@ -export type CachedServices = Record; - -export type FactoryOptions = { - alwaysInitializeNewService?: boolean; - doNotStoreInitializedService?: boolean; - [optionsKey: string]: unknown; -}; - -export async function factory< - TCache extends CachedServices, - TName extends keyof TCache, - TOpts extends FactoryOptions ->( - cachedServices: TCache, - name: TName, - opts: TOpts, - factory: () => TCache[TName] | Promise -): Promise { - let instance = cachedServices[name]; - if (opts.alwaysInitializeNewService || !instance) { - const instanceOrPromise = factory(); - instance = instanceOrPromise instanceof Promise ? await instanceOrPromise : instanceOrPromise; - } - - if (!opts.doNotStoreInitializedService) { - cachedServices[name] = instance; - } - - return instance as TCache[TName]; -} diff --git a/apps/browser/src/platform/background/service-factories/file-upload-service.factory.ts b/apps/browser/src/platform/background/service-factories/file-upload-service.factory.ts deleted file mode 100644 index d890a3b37a7..00000000000 --- a/apps/browser/src/platform/background/service-factories/file-upload-service.factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/platform/abstractions/file-upload/file-upload.service"; -import { FileUploadService } from "@bitwarden/common/platform/services/file-upload/file-upload.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../background/service-factories/factory-options"; - -import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; - -type FileUploadServiceFactoryOptions = FactoryOptions; - -export type FileUploadServiceInitOptions = FileUploadServiceFactoryOptions & LogServiceInitOptions; - -export function fileUploadServiceFactory( - cache: { fileUploadService?: FileUploadServiceAbstraction } & CachedServices, - opts: FileUploadServiceInitOptions -): Promise { - return factory( - cache, - "fileUploadService", - opts, - async () => new FileUploadService(await logServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/i18n-service.factory.ts b/apps/browser/src/platform/background/service-factories/i18n-service.factory.ts deleted file mode 100644 index 3dd7e1814ff..00000000000 --- a/apps/browser/src/platform/background/service-factories/i18n-service.factory.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { I18nService as AbstractI18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { I18nService as BaseI18nService } from "@bitwarden/common/platform/services/i18n.service"; - -import I18nService from "../../services/i18n.service"; - -import { FactoryOptions, CachedServices, factory } from "./factory-options"; - -type I18nServiceFactoryOptions = FactoryOptions & { - i18nServiceOptions: { - systemLanguage: string; - }; -}; - -export type I18nServiceInitOptions = I18nServiceFactoryOptions; - -export async function i18nServiceFactory( - cache: { i18nService?: AbstractI18nService } & CachedServices, - opts: I18nServiceInitOptions -): Promise { - const service = await factory( - cache, - "i18nService", - opts, - () => new I18nService(opts.i18nServiceOptions.systemLanguage) - ); - if (!(service as BaseI18nService as any).inited) { - await (service as BaseI18nService).init(); - } - return service; -} diff --git a/apps/browser/src/platform/background/service-factories/key-generation-service.factory.ts b/apps/browser/src/platform/background/service-factories/key-generation-service.factory.ts deleted file mode 100644 index 7dbcf3fa79e..00000000000 --- a/apps/browser/src/platform/background/service-factories/key-generation-service.factory.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { KeyGenerationService } from "../../services/key-generation.service"; - -import { - cryptoFunctionServiceFactory, - CryptoFunctionServiceInitOptions, -} from "./crypto-function-service.factory"; -import { FactoryOptions, CachedServices, factory } from "./factory-options"; - -type KeyGenerationServiceFactoryOptions = FactoryOptions; - -export type KeyGenerationServiceInitOptions = KeyGenerationServiceFactoryOptions & - CryptoFunctionServiceInitOptions; - -export function keyGenerationServiceFactory( - cache: { keyGenerationService?: KeyGenerationService } & CachedServices, - opts: KeyGenerationServiceInitOptions -): Promise { - return factory( - cache, - "keyGenerationService", - opts, - async () => new KeyGenerationService(await cryptoFunctionServiceFactory(cache, opts)) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/log-service.factory.ts b/apps/browser/src/platform/background/service-factories/log-service.factory.ts deleted file mode 100644 index 69e49fabb70..00000000000 --- a/apps/browser/src/platform/background/service-factories/log-service.factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { LogLevelType } from "@bitwarden/common/enums"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; - -import { FactoryOptions, CachedServices, factory } from "./factory-options"; - -type LogServiceFactoryOptions = FactoryOptions & { - logServiceOptions: { - isDev: boolean; - filter?: (level: LogLevelType) => boolean; - }; -}; - -export type LogServiceInitOptions = LogServiceFactoryOptions; - -export function logServiceFactory( - cache: { logService?: LogService } & CachedServices, - opts: LogServiceInitOptions -): Promise { - return factory( - cache, - "logService", - opts, - () => new ConsoleLogService(opts.logServiceOptions.isDev, opts.logServiceOptions.filter) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/messaging-service.factory.ts b/apps/browser/src/platform/background/service-factories/messaging-service.factory.ts deleted file mode 100644 index 0d0c797056e..00000000000 --- a/apps/browser/src/platform/background/service-factories/messaging-service.factory.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { MessagingService as AbstractMessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../background/service-factories/factory-options"; -import BrowserMessagingService from "../../services/browser-messaging.service"; - -type MessagingServiceFactoryOptions = FactoryOptions; - -export type MessagingServiceInitOptions = MessagingServiceFactoryOptions; - -export function messagingServiceFactory( - cache: { messagingService?: AbstractMessagingService } & CachedServices, - opts: MessagingServiceInitOptions -): Promise { - return factory(cache, "messagingService", opts, () => new BrowserMessagingService()); -} diff --git a/apps/browser/src/platform/background/service-factories/platform-utils-service.factory.ts b/apps/browser/src/platform/background/service-factories/platform-utils-service.factory.ts deleted file mode 100644 index 5748c523f70..00000000000 --- a/apps/browser/src/platform/background/service-factories/platform-utils-service.factory.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; - -import BrowserPlatformUtilsService from "../../services/browser-platform-utils.service"; - -import { CachedServices, factory, FactoryOptions } from "./factory-options"; -import { MessagingServiceInitOptions, messagingServiceFactory } from "./messaging-service.factory"; - -type PlatformUtilsServiceFactoryOptions = FactoryOptions & { - platformUtilsServiceOptions: { - clipboardWriteCallback: (clipboardValue: string, clearMs: number) => Promise; - biometricCallback: () => Promise; - win: Window & typeof globalThis; - }; -}; - -export type PlatformUtilsServiceInitOptions = PlatformUtilsServiceFactoryOptions & - MessagingServiceInitOptions; - -export function platformUtilsServiceFactory( - cache: { platformUtilsService?: PlatformUtilsService } & CachedServices, - opts: PlatformUtilsServiceInitOptions -): Promise { - return factory( - cache, - "platformUtilsService", - opts, - async () => - new BrowserPlatformUtilsService( - await messagingServiceFactory(cache, opts), - opts.platformUtilsServiceOptions.clipboardWriteCallback, - opts.platformUtilsServiceOptions.biometricCallback, - opts.platformUtilsServiceOptions.win - ) - ); -} diff --git a/apps/browser/src/platform/background/service-factories/state-service.factory.ts b/apps/browser/src/platform/background/service-factories/state-service.factory.ts deleted file mode 100644 index 7d3aaf9b6f3..00000000000 --- a/apps/browser/src/platform/background/service-factories/state-service.factory.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; - -import { Account } from "../../../models/account"; -import { BrowserStateService } from "../../services/browser-state.service"; - -import { CachedServices, factory, FactoryOptions } from "./factory-options"; -import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; -import { - diskStorageServiceFactory, - secureStorageServiceFactory, - memoryStorageServiceFactory, - DiskStorageServiceInitOptions, - SecureStorageServiceInitOptions, - MemoryStorageServiceInitOptions, -} from "./storage-service.factory"; - -type StateServiceFactoryOptions = FactoryOptions & { - stateServiceOptions: { - useAccountCache?: boolean; - stateFactory: StateFactory; - }; -}; - -export type StateServiceInitOptions = StateServiceFactoryOptions & - DiskStorageServiceInitOptions & - SecureStorageServiceInitOptions & - MemoryStorageServiceInitOptions & - LogServiceInitOptions; - -export async function stateServiceFactory( - cache: { stateService?: BrowserStateService } & CachedServices, - opts: StateServiceInitOptions -): Promise { - const service = await factory( - cache, - "stateService", - opts, - async () => - await new BrowserStateService( - await diskStorageServiceFactory(cache, opts), - await secureStorageServiceFactory(cache, opts), - await memoryStorageServiceFactory(cache, opts), - await logServiceFactory(cache, opts), - opts.stateServiceOptions.stateFactory, - opts.stateServiceOptions.useAccountCache - ) - ); - service.init(); - return service; -} diff --git a/apps/browser/src/platform/background/service-factories/storage-service.factory.ts b/apps/browser/src/platform/background/service-factories/storage-service.factory.ts deleted file mode 100644 index 9de8f1cffca..00000000000 --- a/apps/browser/src/platform/background/service-factories/storage-service.factory.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - AbstractMemoryStorageService, - AbstractStorageService, -} from "@bitwarden/common/platform/abstractions/storage.service"; -import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service"; - -import { BrowserApi } from "../../browser/browser-api"; -import BrowserLocalStorageService from "../../services/browser-local-storage.service"; -import { LocalBackedSessionStorageService } from "../../services/local-backed-session-storage.service"; - -import { EncryptServiceInitOptions, encryptServiceFactory } from "./encrypt-service.factory"; -import { CachedServices, factory, FactoryOptions } from "./factory-options"; -import { - KeyGenerationServiceInitOptions, - keyGenerationServiceFactory, -} from "./key-generation-service.factory"; - -type StorageServiceFactoryOptions = FactoryOptions; - -export type DiskStorageServiceInitOptions = StorageServiceFactoryOptions; -export type SecureStorageServiceInitOptions = StorageServiceFactoryOptions; -export type MemoryStorageServiceInitOptions = StorageServiceFactoryOptions & - EncryptServiceInitOptions & - KeyGenerationServiceInitOptions; - -export function diskStorageServiceFactory( - cache: { diskStorageService?: AbstractStorageService } & CachedServices, - opts: DiskStorageServiceInitOptions -): Promise { - return factory(cache, "diskStorageService", opts, () => new BrowserLocalStorageService()); -} - -export function secureStorageServiceFactory( - cache: { secureStorageService?: AbstractStorageService } & CachedServices, - opts: SecureStorageServiceInitOptions -): Promise { - return factory(cache, "secureStorageService", opts, () => new BrowserLocalStorageService()); -} - -export function memoryStorageServiceFactory( - cache: { memoryStorageService?: AbstractMemoryStorageService } & CachedServices, - opts: MemoryStorageServiceInitOptions -): Promise { - return factory(cache, "memoryStorageService", opts, async () => { - if (BrowserApi.manifestVersion === 3) { - return new LocalBackedSessionStorageService( - await encryptServiceFactory(cache, opts), - await keyGenerationServiceFactory(cache, opts) - ); - } - return new MemoryStorageService(); - }); -} diff --git a/apps/browser/src/platform/browser/browser-api.register-content-scripts-polyfill.ts b/apps/browser/src/platform/browser/browser-api.register-content-scripts-polyfill.ts new file mode 100644 index 00000000000..cce41a61ee4 --- /dev/null +++ b/apps/browser/src/platform/browser/browser-api.register-content-scripts-polyfill.ts @@ -0,0 +1,435 @@ +/** + * MIT License + * + * Copyright (c) Federico Brigante (https://fregante.com) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * @see https://github.com/fregante/content-scripts-register-polyfill + * @version 4.0.2 + */ +import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; + +import { BrowserApi } from "./browser-api"; + +let registerContentScripts: ( + contentScriptOptions: browser.contentScripts.RegisteredContentScriptOptions, + callback?: (registeredContentScript: browser.contentScripts.RegisteredContentScript) => void, +) => Promise; +export async function registerContentScriptsPolyfill( + contentScriptOptions: browser.contentScripts.RegisteredContentScriptOptions, + callback?: (registeredContentScript: browser.contentScripts.RegisteredContentScript) => void, +) { + if (!registerContentScripts) { + registerContentScripts = buildRegisterContentScriptsPolyfill(); + } + + return registerContentScripts(contentScriptOptions, callback); +} + +function buildRegisterContentScriptsPolyfill() { + const logService = new ConsoleLogService(false); + const chromeProxy = globalThis.chrome && NestedProxy(globalThis.chrome); + const patternValidationRegex = + /^(https?|wss?|file|ftp|\*):\/\/(\*|\*\.[^*/]+|[^*/]+)\/.*$|^file:\/\/\/.*$|^resource:\/\/(\*|\*\.[^*/]+|[^*/]+)\/.*$|^about:/; + const isFirefox = globalThis.navigator?.userAgent.includes("Firefox/"); + const gotScripting = Boolean(globalThis.chrome?.scripting); + const gotNavigation = typeof chrome === "object" && "webNavigation" in chrome; + + function NestedProxy(target: T): T { + return new Proxy(target, { + get(target, prop) { + if (!target[prop as keyof T]) { + return; + } + + if (typeof target[prop as keyof T] !== "function") { + return NestedProxy(target[prop as keyof T] as object); + } + + return (...arguments_: any[]) => + new Promise((resolve, reject) => { + (target[prop as keyof T] as CallableFunction)(...arguments_, (result: any) => { + if (chrome.runtime.lastError) { + reject(new Error(chrome.runtime.lastError.message)); + } else { + resolve(result); + } + }); + }); + }, + }); + } + + function assertValidPattern(matchPattern: string) { + if (!isValidPattern(matchPattern)) { + throw new Error( + `${matchPattern} is an invalid pattern, it must match ${String(patternValidationRegex)}`, + ); + } + } + + function isValidPattern(matchPattern: string) { + return matchPattern === "" || patternValidationRegex.test(matchPattern); + } + + function getRawPatternRegex(matchPattern: string) { + assertValidPattern(matchPattern); + let [, protocol, host = "", pathname] = matchPattern.split(/(^[^:]+:[/][/])([^/]+)?/); + protocol = protocol + .replace("*", isFirefox ? "(https?|wss?)" : "https?") + .replaceAll(/[/]/g, "[/]"); + + if (host === "*") { + host = "[^/]+"; + } else if (host) { + host = host + .replace(/^[*][.]/, "([^/]+.)*") + .replaceAll(/[.]/g, "[.]") + .replace(/[*]$/, "[^.]+"); + } + + pathname = pathname + .replaceAll(/[/]/g, "[/]") + .replaceAll(/[.]/g, "[.]") + .replaceAll(/[*]/g, ".*"); + + return "^" + protocol + host + "(" + pathname + ")?$"; + } + + function patternToRegex(...matchPatterns: string[]) { + if (matchPatterns.length === 0) { + return /$./; + } + + if (matchPatterns.includes("")) { + // regex + return /^(https?|file|ftp):[/]+/; + } + + if (matchPatterns.includes("*://*/*")) { + // all stars regex + return isFirefox ? /^(https?|wss?):[/][/][^/]+([/].*)?$/ : /^https?:[/][/][^/]+([/].*)?$/; + } + + return new RegExp(matchPatterns.map((x) => getRawPatternRegex(x)).join("|")); + } + + function castAllFramesTarget(target: number | { tabId: number; frameId: number }) { + if (typeof target === "object") { + return { ...target, allFrames: false }; + } + + return { + tabId: target, + frameId: undefined, + allFrames: true, + }; + } + + function castArray(possibleArray: any | any[]) { + if (Array.isArray(possibleArray)) { + return possibleArray; + } + + return [possibleArray]; + } + + function arrayOrUndefined(value?: number) { + return value === undefined ? undefined : [value]; + } + + async function insertCSS( + { + tabId, + frameId, + files, + allFrames, + matchAboutBlank, + runAt, + }: { + tabId: number; + frameId?: number; + files: browser.extensionTypes.ExtensionFileOrCode[]; + allFrames: boolean; + matchAboutBlank: boolean; + runAt: browser.extensionTypes.RunAt; + }, + { ignoreTargetErrors }: { ignoreTargetErrors?: boolean } = {}, + ) { + const everyInsertion = Promise.all( + files.map(async (content) => { + if (typeof content === "string") { + content = { file: content }; + } + + if (gotScripting) { + return chrome.scripting.insertCSS({ + target: { + tabId, + frameIds: arrayOrUndefined(frameId), + allFrames: frameId === undefined ? allFrames : undefined, + }, + files: "file" in content ? [content.file] : undefined, + css: "code" in content ? content.code : undefined, + }); + } + + return chromeProxy.tabs.insertCSS(tabId, { + ...content, + matchAboutBlank, + allFrames, + frameId, + runAt: runAt ?? "document_start", + }); + }), + ); + + if (ignoreTargetErrors) { + await catchTargetInjectionErrors(everyInsertion); + } else { + await everyInsertion; + } + } + function assertNoCode(files: browser.extensionTypes.ExtensionFileOrCode[]) { + if (files.some((content) => "code" in content)) { + throw new Error("chrome.scripting does not support injecting strings of `code`"); + } + } + + async function executeScript( + { + tabId, + frameId, + files, + allFrames, + matchAboutBlank, + runAt, + }: { + tabId: number; + frameId?: number; + files: browser.extensionTypes.ExtensionFileOrCode[]; + allFrames: boolean; + matchAboutBlank: boolean; + runAt: browser.extensionTypes.RunAt; + }, + { ignoreTargetErrors }: { ignoreTargetErrors?: boolean } = {}, + ) { + const normalizedFiles = files.map((file) => (typeof file === "string" ? { file } : file)); + + if (gotScripting) { + assertNoCode(normalizedFiles); + const injection = chrome.scripting.executeScript({ + target: { + tabId, + frameIds: arrayOrUndefined(frameId), + allFrames: frameId === undefined ? allFrames : undefined, + }, + files: normalizedFiles.map(({ file }: { file: string }) => file), + }); + + if (ignoreTargetErrors) { + await catchTargetInjectionErrors(injection); + } else { + await injection; + } + + return; + } + + const executions = []; + for (const content of normalizedFiles) { + if ("code" in content) { + await executions.at(-1); + } + + executions.push( + chromeProxy.tabs.executeScript(tabId, { + ...content, + matchAboutBlank, + allFrames, + frameId, + runAt, + }), + ); + } + + if (ignoreTargetErrors) { + await catchTargetInjectionErrors(Promise.all(executions)); + } else { + await Promise.all(executions); + } + } + + async function injectContentScript( + where: { tabId: number; frameId: number }, + scripts: { + css: browser.extensionTypes.ExtensionFileOrCode[]; + js: browser.extensionTypes.ExtensionFileOrCode[]; + matchAboutBlank: boolean; + runAt: browser.extensionTypes.RunAt; + }, + options = {}, + ) { + const targets = castArray(where); + await Promise.all( + targets.map(async (target) => + injectContentScriptInSpecificTarget(castAllFramesTarget(target), scripts, options), + ), + ); + } + + async function injectContentScriptInSpecificTarget( + { frameId, tabId, allFrames }: { frameId?: number; tabId: number; allFrames: boolean }, + scripts: { + css: browser.extensionTypes.ExtensionFileOrCode[]; + js: browser.extensionTypes.ExtensionFileOrCode[]; + matchAboutBlank: boolean; + runAt: browser.extensionTypes.RunAt; + }, + options = {}, + ) { + const injections = castArray(scripts).flatMap((script) => [ + insertCSS( + { + tabId, + frameId, + allFrames, + files: script.css ?? [], + matchAboutBlank: script.matchAboutBlank ?? script.match_about_blank, + runAt: script.runAt ?? script.run_at, + }, + options, + ), + executeScript( + { + tabId, + frameId, + allFrames, + files: script.js ?? [], + matchAboutBlank: script.matchAboutBlank ?? script.match_about_blank, + runAt: script.runAt ?? script.run_at, + }, + options, + ), + ]); + await Promise.all(injections); + } + + async function catchTargetInjectionErrors(promise: Promise) { + try { + await promise; + } catch (error) { + const targetErrors = + /^No frame with id \d+ in tab \d+.$|^No tab with id: \d+.$|^The tab was closed.$|^The frame was removed.$/; + if (!targetErrors.test(error?.message)) { + throw error; + } + } + } + + async function isOriginPermitted(url: string) { + return chromeProxy.permissions.contains({ + origins: [new URL(url).origin + "/*"], + }); + } + + return async ( + contentScriptOptions: browser.contentScripts.RegisteredContentScriptOptions, + callback: CallableFunction, + ) => { + const { + js = [], + css = [], + matchAboutBlank, + matches = [], + excludeMatches, + runAt, + } = contentScriptOptions; + let { allFrames } = contentScriptOptions; + + if (gotNavigation) { + allFrames = false; + } else if (allFrames) { + logService.warning( + "`allFrames: true` requires the `webNavigation` permission to work correctly: https://github.com/fregante/content-scripts-register-polyfill#permissions", + ); + } + + if (matches.length === 0) { + throw new Error( + "Type error for parameter contentScriptOptions (Error processing matches: Array requires at least 1 items; you have 0) for contentScripts.register.", + ); + } + + await Promise.all( + matches.map(async (pattern: string) => { + if (!(await chromeProxy.permissions.contains({ origins: [pattern] }))) { + throw new Error(`Permission denied to register a content script for ${pattern}`); + } + }), + ); + + const matchesRegex = patternToRegex(...matches); + const excludeMatchesRegex = patternToRegex( + ...(excludeMatches !== null && excludeMatches !== void 0 ? excludeMatches : []), + ); + const inject = async (url: string, tabId: number, frameId = 0) => { + if ( + !matchesRegex.test(url) || + excludeMatchesRegex.test(url) || + !(await isOriginPermitted(url)) + ) { + return; + } + + await injectContentScript( + { tabId, frameId }, + { css, js, matchAboutBlank, runAt }, + { ignoreTargetErrors: true }, + ); + }; + const tabListener = async ( + tabId: number, + { status }: chrome.tabs.TabChangeInfo, + { url }: chrome.tabs.Tab, + ) => { + if (status === "loading" && url) { + void inject(url, tabId); + } + }; + const navListener = async ({ + tabId, + frameId, + url, + }: chrome.webNavigation.WebNavigationTransitionCallbackDetails) => { + void inject(url, tabId, frameId); + }; + + if (gotNavigation) { + BrowserApi.addListener(chrome.webNavigation.onCommitted, navListener); + } else { + BrowserApi.addListener(chrome.tabs.onUpdated, tabListener); + } + + const registeredContentScript = { + async unregister() { + if (gotNavigation) { + chrome.webNavigation.onCommitted.removeListener(navListener); + } else { + chrome.tabs.onUpdated.removeListener(tabListener); + } + }, + }; + + if (typeof callback === "function") { + callback(registeredContentScript); + } + + return registeredContentScript; + }; +} diff --git a/apps/browser/src/platform/browser/browser-api.spec.ts b/apps/browser/src/platform/browser/browser-api.spec.ts index af9e633a7f1..6e8a0f3002d 100644 --- a/apps/browser/src/platform/browser/browser-api.spec.ts +++ b/apps/browser/src/platform/browser/browser-api.spec.ts @@ -9,13 +9,374 @@ describe("BrowserApi", () => { jest.clearAllMocks(); }); + describe("isManifestVersion", () => { + beforeEach(() => { + jest.spyOn(BrowserApi, "manifestVersion", "get").mockReturnValue(3); + }); + + it("returns true if the manifest version matches the provided version", () => { + const result = BrowserApi.isManifestVersion(3); + + expect(result).toBe(true); + }); + + it("returns false if the manifest version does not match the provided version", () => { + const result = BrowserApi.isManifestVersion(2); + + expect(result).toBe(false); + }); + }); + + describe("getWindow", () => { + it("will get the current window if a window id is not provided", () => { + // 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 + BrowserApi.getWindow(); + + expect(chrome.windows.getCurrent).toHaveBeenCalledWith({ populate: true }, expect.anything()); + }); + + it("will get the window with the provided id if one is provided", () => { + const windowId = 1; + + // 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 + BrowserApi.getWindow(windowId); + + expect(chrome.windows.get).toHaveBeenCalledWith( + windowId, + { populate: true }, + expect.anything(), + ); + }); + }); + + describe("getCurrentWindow", () => { + it("will get the current window", () => { + // 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 + BrowserApi.getCurrentWindow(); + + expect(chrome.windows.getCurrent).toHaveBeenCalledWith({ populate: true }, expect.anything()); + }); + }); + + describe("getWindowById", () => { + it("will get the window associated with the passed window id", () => { + const windowId = 1; + + // 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 + BrowserApi.getWindowById(windowId); + + expect(chrome.windows.get).toHaveBeenCalledWith( + windowId, + { populate: true }, + expect.anything(), + ); + }); + }); + + describe("removeWindow", () => { + it("removes the window based on the passed window id", () => { + const windowId = 10; + + // 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 + BrowserApi.removeWindow(windowId); + + expect(chrome.windows.remove).toHaveBeenCalledWith(windowId, expect.anything()); + }); + }); + + describe("updateWindowProperties", () => { + it("will update the window with the provided window options", () => { + const windowId = 1; + const windowOptions: chrome.windows.UpdateInfo = { + focused: true, + }; + + // 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 + BrowserApi.updateWindowProperties(windowId, windowOptions); + + expect(chrome.windows.update).toHaveBeenCalledWith( + windowId, + windowOptions, + expect.anything(), + ); + }); + }); + + describe("focusWindow", () => { + it("will focus the window with the provided window id", () => { + const windowId = 1; + + // 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 + BrowserApi.focusWindow(windowId); + + expect(chrome.windows.update).toHaveBeenCalledWith( + windowId, + { focused: true }, + expect.anything(), + ); + }); + }); + + describe("getTab", () => { + it("returns `null` if the tabId is a falsy value", async () => { + const result = await BrowserApi.getTab(null); + + expect(result).toBeNull(); + }); + + it("returns the tab within manifest v3", async () => { + const tabId = 1; + jest.spyOn(BrowserApi, "manifestVersion", "get").mockReturnValue(3); + (chrome.tabs.get as jest.Mock).mockImplementation( + (tabId) => ({ id: tabId }) as chrome.tabs.Tab, + ); + + const result = await BrowserApi.getTab(tabId); + + expect(result).toEqual({ id: tabId }); + }); + + it("returns the tab within manifest v2", async () => { + const tabId = 1; + jest.spyOn(BrowserApi, "manifestVersion", "get").mockReturnValue(2); + (chrome.tabs.get as jest.Mock).mockImplementation((tabId, callback) => + callback({ id: tabId } as chrome.tabs.Tab), + ); + + const result = BrowserApi.getTab(tabId); + + await expect(result).resolves.toEqual({ id: tabId }); + }); + }); + + describe("getBackgroundPage", () => { + it("returns a null value if the `getBackgroundPage` method is not available", () => { + chrome.extension.getBackgroundPage = undefined; + + const result = BrowserApi.getBackgroundPage(); + + expect(result).toBeNull(); + }); + + it("returns the background page if the `getBackgroundPage` method is available", () => { + chrome.extension.getBackgroundPage = jest.fn().mockReturnValue(window); + + const result = BrowserApi.getBackgroundPage(); + + expect(result).toEqual(window); + }); + }); + + describe("isBackgroundPage", () => { + it("returns false if the passed window is `undefined`", () => { + const result = BrowserApi.isBackgroundPage(undefined); + + expect(result).toBe(false); + }); + + it("returns false if the current window is not the background page", () => { + chrome.extension.getBackgroundPage = jest.fn().mockReturnValue(null); + + const result = BrowserApi.isBackgroundPage(window); + + expect(result).toBe(false); + }); + + it("returns true if the current window is the background page", () => { + chrome.extension.getBackgroundPage = jest.fn().mockReturnValue(window); + + const result = BrowserApi.isBackgroundPage(window); + + expect(result).toBe(true); + }); + }); + + describe("getExtensionViews", () => { + it("returns an empty array if the `getViews` method is not available", () => { + chrome.extension.getViews = undefined; + + const result = BrowserApi.getExtensionViews(); + + expect(result).toEqual([]); + }); + + it("returns the extension views if the `getViews` method is available", () => { + const views = [window]; + chrome.extension.getViews = jest.fn().mockReturnValue(views); + + const result = BrowserApi.getExtensionViews(); + + expect(result).toEqual(views); + }); + }); + + describe("isPopupOpen", () => { + it("returns true if the popup is open", async () => { + chrome.extension.getViews = jest.fn().mockReturnValue([window]); + + const result = await BrowserApi.isPopupOpen(); + + expect(result).toBe(true); + }); + + it("returns false if the popup is not open", async () => { + chrome.extension.getViews = jest.fn().mockReturnValue([]); + + const result = await BrowserApi.isPopupOpen(); + + expect(result).toBe(false); + }); + }); + + describe("getFrameDetails", () => { + it("returns the frame details of the specified frame", async () => { + const tabId = 1; + const frameId = 2; + const mockFrameDetails = mock(); + chrome.webNavigation.getFrame = jest + .fn() + .mockImplementation((_details, callback) => callback(mockFrameDetails)); + + const returnFrame = await BrowserApi.getFrameDetails({ tabId, frameId }); + + expect(chrome.webNavigation.getFrame).toHaveBeenCalledWith( + { tabId, frameId }, + expect.any(Function), + ); + expect(returnFrame).toEqual(mockFrameDetails); + }); + }); + + describe("getAllFrameDetails", () => { + it("returns all sub frame details of the specified tab", async () => { + const tabId = 1; + const mockFrameDetails1 = mock(); + const mockFrameDetails2 = mock(); + chrome.webNavigation.getAllFrames = jest + .fn() + .mockImplementation((_details, callback) => + callback([mockFrameDetails1, mockFrameDetails2]), + ); + + const frames = await BrowserApi.getAllFrameDetails(tabId); + + expect(chrome.webNavigation.getAllFrames).toHaveBeenCalledWith( + { tabId }, + expect.any(Function), + ); + expect(frames).toEqual([mockFrameDetails1, mockFrameDetails2]); + }); + }); + + describe("reloadExtension", () => { + it("forwards call to extension runtime", () => { + BrowserApi.reloadExtension(); + expect(chrome.runtime.reload).toHaveBeenCalled(); + }); + }); + + describe("reloadOpenWindows", () => { + const href = window.location.href; + const reload = window.location.reload; + + afterEach(() => { + window.location.href = href; + window.location.reload = reload; + }); + + it("skips reloading any windows if no views can be found", () => { + Object.defineProperty(window, "location", { + value: { reload: jest.fn(), href: "chrome-extension://id-value/background.html" }, + writable: true, + }); + chrome.extension.getViews = jest.fn().mockReturnValue([]); + + BrowserApi.reloadOpenWindows(); + + expect(window.location.reload).not.toHaveBeenCalled(); + }); + + it("reloads all open windows", () => { + Object.defineProperty(window, "location", { + value: { reload: jest.fn(), href: "chrome-extension://id-value/index.html" }, + writable: true, + }); + const views = [window]; + chrome.extension.getViews = jest.fn().mockReturnValue(views); + + BrowserApi.reloadOpenWindows(); + + expect(window.location.reload).toHaveBeenCalledTimes(views.length); + }); + + it("skips reloading the background page", () => { + Object.defineProperty(window, "location", { + value: { reload: jest.fn(), href: "chrome-extension://id-value/background.html" }, + writable: true, + }); + const views = [window]; + chrome.extension.getViews = jest.fn().mockReturnValue(views); + chrome.extension.getBackgroundPage = jest.fn().mockReturnValue(window); + + BrowserApi.reloadOpenWindows(); + + expect(window.location.reload).toHaveBeenCalledTimes(0); + }); + + it("skips reloading the current href if it is exempt", () => { + Object.defineProperty(window, "location", { + value: { reload: jest.fn(), href: "chrome-extension://id-value/index.html" }, + writable: true, + }); + const mockWindow = mock({ + location: { + href: "chrome-extension://id-value/sidebar.html", + reload: jest.fn(), + }, + }); + const views = [window, mockWindow]; + chrome.extension.getViews = jest.fn().mockReturnValue(views); + window.location.href = "chrome-extension://id-value/index.html"; + + BrowserApi.reloadOpenWindows(true); + + expect(window.location.reload).toHaveBeenCalledTimes(0); + expect(mockWindow.location.reload).toHaveBeenCalledTimes(1); + }); + }); + + describe("getBrowserAction", () => { + it("returns the `chrome.action` API if the extension manifest is for version 3", () => { + jest.spyOn(BrowserApi, "manifestVersion", "get").mockReturnValue(3); + + const result = BrowserApi.getBrowserAction(); + + expect(result).toEqual(chrome.action); + }); + + it("returns the `chrome.browserAction` API if the extension manifest is for version 2", () => { + jest.spyOn(BrowserApi, "manifestVersion", "get").mockReturnValue(2); + + const result = BrowserApi.getBrowserAction(); + + expect(result).toEqual(chrome.browserAction); + }); + }); + describe("executeScriptInTab", () => { it("calls to the extension api to execute a script within the give tabId", async () => { const tabId = 1; const injectDetails = mock(); jest.spyOn(BrowserApi, "manifestVersion", "get").mockReturnValue(2); (chrome.tabs.executeScript as jest.Mock).mockImplementation( - (tabId, injectDetails, callback) => callback(executeScriptResult) + (tabId, injectDetails, callback) => callback(executeScriptResult), ); const result = await BrowserApi.executeScriptInTab(tabId, injectDetails); @@ -23,7 +384,7 @@ describe("BrowserApi", () => { expect(chrome.tabs.executeScript).toHaveBeenCalledWith( tabId, injectDetails, - expect.any(Function) + expect.any(Function), ); expect(result).toEqual(executeScriptResult); }); @@ -45,12 +406,172 @@ describe("BrowserApi", () => { target: { tabId: tabId, allFrames: injectDetails.allFrames, - frameIds: null, }, files: [injectDetails.file], injectImmediately: true, + world: "ISOLATED", + }); + expect(result).toEqual(executeScriptResult); + }); + + it("injects the script into a specified frameId when the extension is built for manifest v3", async () => { + const tabId = 1; + const frameId = 2; + const injectDetails = mock({ + file: "file.js", + allFrames: true, + runAt: "document_start", + frameId, + }); + jest.spyOn(BrowserApi, "manifestVersion", "get").mockReturnValue(3); + (chrome.scripting.executeScript as jest.Mock).mockResolvedValue(executeScriptResult); + + await BrowserApi.executeScriptInTab(tabId, injectDetails); + + expect(chrome.scripting.executeScript).toHaveBeenCalledWith({ + target: { + tabId: tabId, + frameIds: [frameId], + }, + files: [injectDetails.file], + injectImmediately: true, + world: "ISOLATED", + }); + }); + + it("injects the script into the MAIN world context when injecting a script for manifest v3", async () => { + const tabId = 1; + const injectDetails = mock({ + file: null, + allFrames: true, + runAt: "document_start", + frameId: null, + }); + const scriptingApiDetails = { world: "MAIN" as chrome.scripting.ExecutionWorld }; + jest.spyOn(BrowserApi, "manifestVersion", "get").mockReturnValue(3); + (chrome.scripting.executeScript as jest.Mock).mockResolvedValue(executeScriptResult); + + const result = await BrowserApi.executeScriptInTab(tabId, injectDetails, scriptingApiDetails); + + expect(chrome.scripting.executeScript).toHaveBeenCalledWith({ + target: { + tabId: tabId, + allFrames: injectDetails.allFrames, + }, + files: null, + injectImmediately: true, + world: "MAIN", }); expect(result).toEqual(executeScriptResult); }); }); + + describe("browserAutofillSettingsOverridden", () => { + it("returns true if the browser autofill settings are overridden", async () => { + const expectedDetails = { + value: false, + levelOfControl: "controlled_by_this_extension", + } as chrome.types.ChromeSettingGetResultDetails; + chrome.privacy.services.autofillAddressEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + chrome.privacy.services.autofillCreditCardEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + chrome.privacy.services.passwordSavingEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + + const result = await BrowserApi.browserAutofillSettingsOverridden(); + + expect(result).toBe(true); + }); + + it("returns false if the browser autofill settings are not overridden", async () => { + const expectedDetails = { + value: true, + levelOfControl: "controlled_by_this_extension", + } as chrome.types.ChromeSettingGetResultDetails; + chrome.privacy.services.autofillAddressEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + chrome.privacy.services.autofillCreditCardEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + chrome.privacy.services.passwordSavingEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + + const result = await BrowserApi.browserAutofillSettingsOverridden(); + + expect(result).toBe(false); + }); + + it("returns false if the browser autofill settings are not controlled by the extension", async () => { + const expectedDetails = { + value: false, + levelOfControl: "controlled_by_other_extensions", + } as chrome.types.ChromeSettingGetResultDetails; + chrome.privacy.services.autofillAddressEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + chrome.privacy.services.autofillCreditCardEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + chrome.privacy.services.passwordSavingEnabled.get = jest.fn((details, callback) => + callback(expectedDetails), + ); + + const result = await BrowserApi.browserAutofillSettingsOverridden(); + + expect(result).toBe(false); + }); + }); + + describe("updateDefaultBrowserAutofillSettings", () => { + it("updates the default browser autofill settings", async () => { + await BrowserApi.updateDefaultBrowserAutofillSettings(false); + + expect(chrome.privacy.services.autofillAddressEnabled.set).toHaveBeenCalledWith({ + value: false, + }); + expect(chrome.privacy.services.autofillCreditCardEnabled.set).toHaveBeenCalledWith({ + value: false, + }); + expect(chrome.privacy.services.passwordSavingEnabled.set).toHaveBeenCalledWith({ + value: false, + }); + }); + }); + + describe("registerContentScriptsMv2", () => { + const details: browser.contentScripts.RegisteredContentScriptOptions = { + matches: [""], + js: [{ file: "content/fido2/page-script.js" }], + }; + + it("registers content scripts through the `browser.contentScripts` API when the API is available", async () => { + globalThis.browser = mock({ + contentScripts: { register: jest.fn() }, + }); + + await BrowserApi.registerContentScriptsMv2(details); + + expect(browser.contentScripts.register).toHaveBeenCalledWith(details); + }); + + it("registers content scripts through the `registerContentScriptsPolyfill` when the `browser.contentScripts.register` API is not available", async () => { + globalThis.browser = mock({ + contentScripts: { register: undefined }, + }); + jest.spyOn(BrowserApi, "addListener"); + + await BrowserApi.registerContentScriptsMv2(details); + + expect(BrowserApi.addListener).toHaveBeenCalledWith( + chrome.webNavigation.onCommitted, + expect.any(Function), + ); + }); + }); }); diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index b71b8b80b6c..072ef74004f 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -1,14 +1,16 @@ +import { Observable } from "rxjs"; + import { DeviceType } from "@bitwarden/common/enums"; +import { isBrowserSafariApi } from "@bitwarden/platform"; import { TabMessage } from "../../types/tab-messages"; -import BrowserPlatformUtilsService from "../services/browser-platform-utils.service"; +import { BrowserPlatformUtilsService } from "../services/platform-utils/browser-platform-utils.service"; + +import { registerContentScriptsPolyfill } from "./browser-api.register-content-scripts-polyfill"; export class BrowserApi { static isWebExtensionsApi: boolean = typeof browser !== "undefined"; - static isSafariApi: boolean = - navigator.userAgent.indexOf(" Safari/") !== -1 && - navigator.userAgent.indexOf(" Chrome/") === -1 && - navigator.userAgent.indexOf(" Chromium/") === -1; + static isSafariApi: boolean = isBrowserSafariApi(); static isChromeApi: boolean = !BrowserApi.isSafariApi && typeof chrome !== "undefined"; static isFirefoxOnAndroid: boolean = navigator.userAgent.indexOf("Firefox/") !== -1 && navigator.userAgent.indexOf("Android") !== -1; @@ -17,24 +19,109 @@ export class BrowserApi { return chrome.runtime.getManifest().manifest_version; } - static getWindow(windowId?: number): Promise | void { + /** + * Determines if the extension manifest version is the given version. + * + * @param expectedVersion - The expected manifest version to check against. + */ + static isManifestVersion(expectedVersion: 2 | 3) { + return BrowserApi.manifestVersion === expectedVersion; + } + + /** + * Gets the current window or the window with the given id. + * + * @param windowId - The id of the window to get. If not provided, the current window is returned. + */ + static async getWindow(windowId?: number): Promise { if (!windowId) { - return; + return BrowserApi.getCurrentWindow(); } - return new Promise((resolve) => - chrome.windows.get(windowId, { populate: true }, (window) => resolve(window)) - ); + return await BrowserApi.getWindowById(windowId); + } + + /** + * Gets the currently active browser window. + */ + static async getCurrentWindow(): Promise { + return new Promise((resolve) => chrome.windows.getCurrent({ populate: true }, resolve)); + } + + /** + * Gets the window with the given id. + * + * @param windowId - The id of the window to get. + */ + static async getWindowById(windowId: number): Promise { + return new Promise((resolve) => chrome.windows.get(windowId, { populate: true }, resolve)); } static async createWindow(options: chrome.windows.CreateData): Promise { + return new Promise((resolve) => { + chrome.windows.create(options, async (newWindow) => { + if (!BrowserApi.isSafariApi) { + return resolve(newWindow); + } + // Safari doesn't close the default extension popup when a new window is created so we need to + // manually trigger the close by focusing the main window after the new window is created + const allWindows = await new Promise((resolve) => { + chrome.windows.getAll({ windowTypes: ["normal"] }, (windows) => resolve(windows)); + }); + + const mainWindow = allWindows.find((window) => window.id !== newWindow.id); + + // No main window found, resolve the new window + if (mainWindow == null || !mainWindow.id) { + return resolve(newWindow); + } + + // Focus the main window to close the extension popup + chrome.windows.update(mainWindow.id, { focused: true }, () => { + // Refocus the newly created window + chrome.windows.update(newWindow.id, { focused: true }, () => { + resolve(newWindow); + }); + }); + }); + }); + } + + /** + * Removes the window with the given id. + * + * @param windowId - The id of the window to remove. + */ + static async removeWindow(windowId: number): Promise { + return new Promise((resolve) => chrome.windows.remove(windowId, () => resolve())); + } + + /** + * Updates the properties of the window with the given id. + * + * @param windowId - The id of the window to update. + * @param options - The window properties to update. + */ + static async updateWindowProperties( + windowId: number, + options: chrome.windows.UpdateInfo, + ): Promise { return new Promise((resolve) => - chrome.windows.create(options, (window) => { - resolve(window); - }) + chrome.windows.update(windowId, options, () => { + resolve(); + }), ); } + /** + * Focuses the window with the given id. + * + * @param windowId - The id of the window to focus. + */ + static async focusWindow(windowId: number) { + await BrowserApi.updateWindowProperties(windowId, { focused: true }); + } + static async getTabFromCurrentWindowId(): Promise | null { return await BrowserApi.tabsQueryFirst({ active: true, @@ -42,19 +129,24 @@ export class BrowserApi { }); } + /** + * Gets the tab with the given id. + * + * @param tabId - The id of the tab to get. + */ static async getTab(tabId: number): Promise | null { if (!tabId) { return null; } - if (BrowserApi.manifestVersion === 3) { + if (BrowserApi.isManifestVersion(3)) { return await chrome.tabs.get(tabId); } return new Promise((resolve) => chrome.tabs.get(tabId, (tab) => { resolve(tab); - }) + }), ); } @@ -91,7 +183,7 @@ export class BrowserApi { static tabSendMessageData( tab: chrome.tabs.Tab, command: string, - data: any = null + data: any = null, ): Promise { const obj: any = { command: command, @@ -104,21 +196,21 @@ export class BrowserApi { return BrowserApi.tabSendMessage(tab, obj); } - static async tabSendMessage( + static async tabSendMessage( tab: chrome.tabs.Tab, obj: T, - options: chrome.tabs.MessageSendOptions = null - ): Promise { + options: chrome.tabs.MessageSendOptions = null, + ): Promise { if (!tab || !tab.id) { return; } - return new Promise((resolve) => { - chrome.tabs.sendMessage(tab.id, obj, options, () => { + return new Promise((resolve) => { + chrome.tabs.sendMessage(tab.id, obj, options, (response) => { if (chrome.runtime.lastError) { // Some error happened } - resolve(); + resolve(response); }); }); } @@ -127,103 +219,167 @@ export class BrowserApi { tabId: number, message: TabMessage, options?: chrome.tabs.MessageSendOptions, - responseCallback?: (response: T) => void + responseCallback?: (response: T) => void, ) { chrome.tabs.sendMessage(tabId, message, options, responseCallback); } - static async removeTab(tabId: number) { - await chrome.tabs.remove(tabId); - } - - static async getPrivateModeWindows(): Promise { - return (await browser.windows.getAll()).filter((win) => win.incognito); - } - static async onWindowCreated(callback: (win: chrome.windows.Window) => any) { + // FIXME: Make sure that is does not cause a memory leak in Safari or use BrowserApi.AddListener + // and test that it doesn't break. + // eslint-disable-next-line no-restricted-syntax return chrome.windows.onCreated.addListener(callback); } + /** + * Gets the background page for the extension. This method is + * not valid within manifest v3 background service workers. As + * a result, it will return null when called from that context. + */ static getBackgroundPage(): any { + if (typeof chrome.extension.getBackgroundPage === "undefined") { + return null; + } + return chrome.extension.getBackgroundPage(); } + /** + * Accepts a window object and determines if it is + * associated with the background page of the extension. + * + * @param window - The window to check. + */ static isBackgroundPage(window: Window & typeof globalThis): boolean { - return window === chrome.extension.getBackgroundPage(); + return typeof window !== "undefined" && window === BrowserApi.getBackgroundPage(); } - static getApplicationVersion(): string { - return chrome.runtime.getManifest().version; + /** + * Gets the extension views that match the given properties. This method is not + * available within background service worker. As a result, it will return an + * empty array when called from that context. + * + * @param fetchProperties - The properties used to filter extension views. + */ + static getExtensionViews(fetchProperties?: chrome.extension.FetchProperties): Window[] { + if (typeof chrome.extension.getViews === "undefined") { + return []; + } + + return chrome.extension.getViews(fetchProperties); } + /** + * Queries all extension views that are of type `popup` + * and returns whether any are currently open. + */ static async isPopupOpen(): Promise { - return Promise.resolve(chrome.extension.getViews({ type: "popup" }).length > 0); + return Promise.resolve(BrowserApi.getExtensionViews({ type: "popup" }).length > 0); } static createNewTab(url: string, active = true): Promise { return new Promise((resolve) => - chrome.tabs.create({ url: url, active: active }, (tab) => resolve(tab)) + chrome.tabs.create({ url: url, active: active }, (tab) => resolve(tab)), ); } - static async focusWindow(windowId: number) { - await chrome.windows.update(windowId, { focused: true }); + /** + * Gathers the details for a specified sub-frame of a tab. + * + * @param details - The details of the frame to get. + */ + static async getFrameDetails( + details: chrome.webNavigation.GetFrameDetails, + ): Promise { + return new Promise((resolve) => chrome.webNavigation.getFrame(details, resolve)); } - static async openBitwardenExtensionTab(relativeUrl: string, active = true) { - let url = relativeUrl; - if (!relativeUrl.includes("uilocation=tab")) { - const fullUrl = chrome.extension.getURL(relativeUrl); - const parsedUrl = new URL(fullUrl); - parsedUrl.searchParams.set("uilocation", "tab"); - url = parsedUrl.toString(); - } - - const createdTab = await this.createNewTab(url, active); - this.focusWindow(createdTab.windowId); - } - - static async closeBitwardenExtensionTab() { - const tabs = await BrowserApi.tabsQuery({ - active: true, - title: "Bitwarden", - windowType: "normal", - currentWindow: true, - }); - - if (tabs.length === 0) { - return; - } - - const tabToClose = tabs[tabs.length - 1]; - BrowserApi.removeTab(tabToClose.id); + /** + * Gets all frames associated with a tab. + * + * @param tabId - The id of the tab to get the frames for. + */ + static async getAllFrameDetails( + tabId: chrome.tabs.Tab["id"], + ): Promise { + return new Promise((resolve) => chrome.webNavigation.getAllFrames({ tabId }, resolve)); } // Keep track of all the events registered in a Safari popup so we can remove // them when the popup gets unloaded, otherwise we cause a memory leak - private static registeredMessageListeners: any[] = []; - private static registeredStorageChangeListeners: any[] = []; + private static trackedChromeEventListeners: [ + event: chrome.events.Event<(...args: unknown[]) => unknown>, + callback: (...args: unknown[]) => unknown, + ][] = []; static messageListener( name: string, - callback: (message: any, sender: chrome.runtime.MessageSender, response: any) => void + callback: ( + message: any, + sender: chrome.runtime.MessageSender, + sendResponse: any, + ) => boolean | void, ) { - chrome.runtime.onMessage.addListener(callback); + BrowserApi.addListener(chrome.runtime.onMessage, callback); + } - if (BrowserApi.isSafariApi && !BrowserApi.isBackgroundPage(window)) { - BrowserApi.registeredMessageListeners.push(callback); + static messageListener$() { + return new Observable((subscriber) => { + const handler = (message: unknown) => { + subscriber.next(message); + }; + + BrowserApi.addListener(chrome.runtime.onMessage, handler); + + return () => BrowserApi.removeListener(chrome.runtime.onMessage, handler); + }); + } + + static storageChangeListener( + callback: Parameters[0], + ) { + BrowserApi.addListener(chrome.storage.onChanged, callback); + } + + /** + * Adds a callback to the given chrome event in a cross-browser platform manner. + * + * **Important:** All event listeners in the browser extension popup context must + * use this instead of the native APIs to handle unsubscribing from Safari properly. + * + * @param event - The event in which to add the listener to. + * @param callback - The callback you want registered onto the event. + */ + static addListener unknown>( + event: chrome.events.Event, + callback: T, + ) { + event.addListener(callback); + + if (BrowserApi.isSafariApi && !BrowserApi.isBackgroundPage(self)) { + BrowserApi.trackedChromeEventListeners.push([event, callback]); BrowserApi.setupUnloadListeners(); } } - static storageChangeListener( - callback: Parameters[0] + /** + * Removes a callback from the given chrome event in a cross-browser platform manner. + * @param event - The event in which to remove the listener from. + * @param callback - The callback you want removed from the event. + */ + static removeListener unknown>( + event: chrome.events.Event, + callback: T, ) { - chrome.storage.onChanged.addListener(callback); + event.removeListener(callback); - if (BrowserApi.isSafariApi && !BrowserApi.isBackgroundPage(window)) { - BrowserApi.registeredStorageChangeListeners.push(callback); - BrowserApi.setupUnloadListeners(); + if (BrowserApi.isSafariApi && !BrowserApi.isBackgroundPage(self)) { + const index = BrowserApi.trackedChromeEventListeners.findIndex(([_event, eventListener]) => { + return eventListener == callback; + }); + if (index !== -1) { + BrowserApi.trackedChromeEventListeners.splice(index, 1); + } } } @@ -231,15 +387,11 @@ export class BrowserApi { private static setupUnloadListeners() { // The MDN recommend using 'visibilitychange' but that event is fired any time the popup window is obscured as well // 'pagehide' works just like 'unload' but is compatible with the back/forward cache, so we prefer using that one - window.onpagehide = () => { - for (const callback of BrowserApi.registeredMessageListeners) { - chrome.runtime.onMessage.removeListener(callback); + self.addEventListener("pagehide", () => { + for (const [event, callback] of BrowserApi.trackedChromeEventListeners) { + event.removeListener(callback); } - - for (const callback of BrowserApi.registeredStorageChangeListeners) { - chrome.storage.onChanged.removeListener(callback); - } - }; + }); } static sendMessage(subscriber: string, arg: any = {}) { @@ -247,7 +399,14 @@ export class BrowserApi { return chrome.runtime.sendMessage(message); } + static sendMessageWithResponse(subscriber: string, arg: any = {}) { + const message = Object.assign({}, { command: subscriber }, arg); + return new Promise((resolve) => chrome.runtime.sendMessage(message, resolve)); + } + static async focusTab(tabId: number) { + // 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 chrome.tabs.update(tabId, { active: true, highlighted: true }); } @@ -256,6 +415,8 @@ export class BrowserApi { // Reactivating the active tab dismisses the popup tab. The promise final // condition is only called if the popup wasn't already dismissed (future proofing). // ref: https://bugzilla.mozilla.org/show_bug.cgi?id=1433604 + // 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 browser.tabs.update({ active: true }).finally(win.close); } else { win.close(); @@ -266,27 +427,34 @@ export class BrowserApi { return process.env.ENV !== "production"; } - static getUILanguage(win: Window) { + static getUILanguage() { return chrome.i18n.getUILanguage(); } - static reloadExtension(win: Window) { - if (win != null) { - return (win.location as any).reload(true); - } else { - return chrome.runtime.reload(); - } + /** + * Handles reloading the extension using the underlying functionality exposed by the browser API. + */ + static reloadExtension() { + return chrome.runtime.reload(); } + /** + * Reloads all open extension views, except the background page. Will also + * skip reloading the current window location if exemptCurrentHref is true. + * + * @param exemptCurrentHref - Whether to exempt the current window location from the reload. + */ static reloadOpenWindows(exemptCurrentHref = false) { - const currentHref = window.location.href; - const views = chrome.extension.getViews() as Window[]; + const views = BrowserApi.getExtensionViews(); + if (!views.length) { + return; + } + + const currentHref = self.location.href; views .filter((w) => w.location.href != null && !w.location.href.includes("background.html")) .filter((w) => !exemptCurrentHref || w.location.href !== currentHref) - .forEach((w) => { - w.location.reload(); - }); + .forEach((w) => w.location.reload()); } static connectNative(application: string): browser.runtime.Port | chrome.runtime.Port { @@ -301,11 +469,22 @@ export class BrowserApi { if (BrowserApi.isWebExtensionsApi) { return browser.permissions.request(permission); } - return new Promise((resolve, reject) => { + return new Promise((resolve) => { chrome.permissions.request(permission, resolve); }); } + /** + * Checks if the user has provided the given permissions to the extension. + * + * @param permissions - The permissions to check. + */ + static async permissionsGranted(permissions: string[]): Promise { + return new Promise((resolve) => + chrome.permissions.contains({ permissions }, (result) => resolve(result)), + ); + } + static getPlatformInfo(): Promise { if (BrowserApi.isWebExtensionsApi) { return browser.runtime.getPlatformInfo(); @@ -315,12 +494,15 @@ export class BrowserApi { }); } + /** + * Returns the supported BrowserAction API based on the manifest version. + */ static getBrowserAction() { - return BrowserApi.manifestVersion === 3 ? chrome.action : chrome.browserAction; + return BrowserApi.isManifestVersion(3) ? chrome.action : chrome.browserAction; } static getSidebarAction( - win: Window & typeof globalThis + win: Window & typeof globalThis, ): OperaSidebarAction | FirefoxSidebarAction | null { const deviceType = BrowserPlatformUtilsService.getDevice(win); if (deviceType !== DeviceType.FirefoxExtension && deviceType !== DeviceType.OperaExtension) { @@ -329,23 +511,45 @@ export class BrowserApi { return win.opr?.sidebarAction || browser.sidebarAction; } + static captureVisibleTab(): Promise { + return new Promise((resolve) => { + chrome.tabs.captureVisibleTab(null, { format: "png" }, resolve); + }); + } + /** * Extension API helper method used to execute a script in a tab. + * * @see https://developer.chrome.com/docs/extensions/reference/tabs/#method-executeScript - * @param {number} tabId - * @param {chrome.tabs.InjectDetails} details - * @returns {Promise} + * @param tabId - The id of the tab to execute the script in. + * @param details {@link "InjectDetails" https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/extensionTypes/InjectDetails} + * @param scriptingApiDetails {@link "ExecutionWorld" https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/ExecutionWorld} */ - static executeScriptInTab(tabId: number, details: chrome.tabs.InjectDetails) { - if (BrowserApi.manifestVersion === 3) { + static executeScriptInTab( + tabId: number, + details: chrome.tabs.InjectDetails, + scriptingApiDetails?: { + world: chrome.scripting.ExecutionWorld; + }, + ): Promise { + if (BrowserApi.isManifestVersion(3)) { + const target: chrome.scripting.InjectionTarget = { + tabId, + }; + + if (typeof details.frameId === "number") { + target.frameIds = [details.frameId]; + } + + if (!target.frameIds?.length && details.allFrames) { + target.allFrames = details.allFrames; + } + return chrome.scripting.executeScript({ - target: { - tabId: tabId, - allFrames: details.allFrames, - frameIds: details.frameId ? [details.frameId] : null, - }, + target, files: details.file ? [details.file] : null, injectImmediately: details.runAt === "document_start", + world: scriptingApiDetails?.world || "ISOLATED", }); } @@ -355,4 +559,80 @@ export class BrowserApi { }); }); } + + /** + * Identifies if the browser autofill settings are overridden by the extension. + */ + static async browserAutofillSettingsOverridden(): Promise { + const checkOverrideStatus = (details: chrome.types.ChromeSettingGetResultDetails) => + details.levelOfControl === "controlled_by_this_extension" && !details.value; + + const autofillAddressOverridden: boolean = await new Promise((resolve) => + chrome.privacy.services.autofillAddressEnabled.get({}, (details) => + resolve(checkOverrideStatus(details)), + ), + ); + + const autofillCreditCardOverridden: boolean = await new Promise((resolve) => + chrome.privacy.services.autofillCreditCardEnabled.get({}, (details) => + resolve(checkOverrideStatus(details)), + ), + ); + + const passwordSavingOverridden: boolean = await new Promise((resolve) => + chrome.privacy.services.passwordSavingEnabled.get({}, (details) => + resolve(checkOverrideStatus(details)), + ), + ); + + return autofillAddressOverridden && autofillCreditCardOverridden && passwordSavingOverridden; + } + + /** + * Updates the browser autofill settings to the given value. + * + * @param value - Determines whether to enable or disable the autofill settings. + */ + static updateDefaultBrowserAutofillSettings(value: boolean) { + chrome.privacy.services.autofillAddressEnabled.set({ value }); + chrome.privacy.services.autofillCreditCardEnabled.set({ value }); + chrome.privacy.services.passwordSavingEnabled.set({ value }); + } + + /** + * Handles registration of static content scripts within manifest v2. + * + * @param contentScriptOptions - Details of the registered content scripts + */ + static async registerContentScriptsMv2( + contentScriptOptions: browser.contentScripts.RegisteredContentScriptOptions, + ): Promise { + if (typeof browser !== "undefined" && !!browser.contentScripts?.register) { + return await browser.contentScripts.register(contentScriptOptions); + } + + return await registerContentScriptsPolyfill(contentScriptOptions); + } + + /** + * Handles registration of static content scripts within manifest v3. + * + * @param scripts - Details of the registered content scripts + */ + static async registerContentScriptsMv3( + scripts: chrome.scripting.RegisteredContentScript[], + ): Promise { + await chrome.scripting.registerContentScripts(scripts); + } + + /** + * Handles unregistering of static content scripts within manifest v3. + * + * @param filter - Optional filter to unregister content scripts. Passing an empty object will unregister all content scripts. + */ + static async unregisterContentScriptsMv3( + filter?: chrome.scripting.ContentScriptFilter, + ): Promise { + await chrome.scripting.unregisterContentScripts(filter); + } } diff --git a/apps/browser/src/platform/browser/from-chrome-event.spec.ts b/apps/browser/src/platform/browser/from-chrome-event.spec.ts new file mode 100644 index 00000000000..36a0e73b75e --- /dev/null +++ b/apps/browser/src/platform/browser/from-chrome-event.spec.ts @@ -0,0 +1,103 @@ +import { fromChromeEvent } from "./from-chrome-event"; + +describe("fromChromeEvent", () => { + class FakeEvent implements chrome.events.Event<(arg1: string, arg2: number) => void> { + listenerWasAdded: boolean; + listenerWasRemoved: boolean; + activeListeners: ((arg1: string, arg2: number) => void)[] = []; + + addListener(callback: (arg1: string, arg2: number) => void): void { + this.listenerWasAdded = true; + this.activeListeners.push(callback); + } + getRules(callback: (rules: chrome.events.Rule[]) => void): void; + getRules(ruleIdentifiers: string[], callback: (rules: chrome.events.Rule[]) => void): void; + getRules(ruleIdentifiers: unknown, callback?: unknown): void { + throw new Error("Method not implemented."); + } + hasListener(callback: (arg1: string, arg2: number) => void): boolean { + throw new Error("Method not implemented."); + } + removeRules(ruleIdentifiers?: string[], callback?: () => void): void; + removeRules(callback?: () => void): void; + removeRules(ruleIdentifiers?: unknown, callback?: unknown): void { + throw new Error("Method not implemented."); + } + addRules(rules: chrome.events.Rule[], callback?: (rules: chrome.events.Rule[]) => void): void { + throw new Error("Method not implemented."); + } + removeListener(callback: (arg1: string, arg2: number) => void): void { + const index = this.activeListeners.findIndex((c) => c == callback); + if (index === -1) { + throw new Error("No registered callback."); + } + + this.listenerWasRemoved = true; + this.activeListeners.splice(index, 1); + } + hasListeners(): boolean { + throw new Error("Method not implemented."); + } + + fireEvent(arg1: string, arg2: number) { + this.activeListeners.forEach((listener) => { + listener(arg1, arg2); + }); + } + } + + let event: FakeEvent; + + beforeEach(() => { + event = new FakeEvent(); + }); + + it("should never call addListener when never subscribed to", () => { + fromChromeEvent(event); + expect(event.listenerWasAdded).toBeFalsy(); + }); + + it("should add a listener when subscribed to.", () => { + const eventObservable = fromChromeEvent(event); + eventObservable.subscribe(); + expect(event.listenerWasAdded).toBeTruthy(); + expect(event.activeListeners).toHaveLength(1); + }); + + it("should call remove listener when the created subscription is unsubscribed", () => { + const eventObservable = fromChromeEvent(event); + const subscription = eventObservable.subscribe(); + subscription.unsubscribe(); + expect(event.listenerWasAdded).toBeTruthy(); + expect(event.listenerWasRemoved).toBeTruthy(); + expect(event.activeListeners).toHaveLength(0); + }); + + it("should fire each callback given to subscribe", () => { + const eventObservable = fromChromeEvent(event); + + let subscription1Called = false; + let subscription2Called = false; + + const subscription1 = eventObservable.subscribe(([arg1, arg2]) => { + expect(arg1).toBe("Hi!"); + expect(arg2).toBe(2); + subscription1Called = true; + }); + + const subscription2 = eventObservable.subscribe(([arg1, arg2]) => { + expect(arg1).toBe("Hi!"); + expect(arg2).toBe(2); + subscription2Called = true; + }); + + event.fireEvent("Hi!", 2); + + subscription1.unsubscribe(); + subscription2.unsubscribe(); + + expect(event.activeListeners).toHaveLength(0); + expect(subscription1Called).toBeTruthy(); + expect(subscription2Called).toBeTruthy(); + }); +}); diff --git a/apps/browser/src/platform/browser/from-chrome-event.ts b/apps/browser/src/platform/browser/from-chrome-event.ts new file mode 100644 index 00000000000..e45dcdcd082 --- /dev/null +++ b/apps/browser/src/platform/browser/from-chrome-event.ts @@ -0,0 +1,39 @@ +import { Observable } from "rxjs"; + +import { BrowserApi } from "./browser-api"; + +/** + * Converts a Chrome event to an Observable stream. + * + * @typeParam T - The type of the event arguments. + * @param event - The Chrome event to convert. + * @returns An Observable stream of the event arguments. + * + * @remarks + * This function creates an Observable stream that listens to a Chrome event and emits its arguments + * whenever the event is triggered. If the event throws an error, the Observable will emit an error + * notification with the error message. + * + * @example + * ```typescript + * const onMessage = fromChromeEvent(chrome.runtime.onMessage); + * onMessage.subscribe((message) => console.log('Received message:', message)); + * ``` + */ +export function fromChromeEvent( + event: chrome.events.Event<(...args: T) => void>, +): Observable { + return new Observable((subscriber) => { + const handler = (...args: T) => { + if (chrome.runtime.lastError) { + subscriber.error(chrome.runtime.lastError); + return; + } + + subscriber.next(args); + }; + + BrowserApi.addListener(event, handler); + return () => BrowserApi.removeListener(event, handler); + }); +} diff --git a/apps/browser/src/platform/browser/run-inside-angular.operator.ts b/apps/browser/src/platform/browser/run-inside-angular.operator.ts new file mode 100644 index 00000000000..4e9b52b009c --- /dev/null +++ b/apps/browser/src/platform/browser/run-inside-angular.operator.ts @@ -0,0 +1,21 @@ +import { NgZone } from "@angular/core"; +import { MonoTypeOperatorFunction, Observable } from "rxjs"; + +export function runInsideAngular(ngZone: NgZone): MonoTypeOperatorFunction { + return (source: Observable) => + new Observable((subscriber) => { + const subscription = source.subscribe({ + next(value) { + ngZone.run(() => subscriber.next(value)); + }, + error(error: unknown) { + ngZone.run(() => subscriber.error(error)); + }, + complete() { + ngZone.run(() => subscriber.complete()); + }, + }); + + return () => subscription.unsubscribe(); + }); +} diff --git a/apps/browser/src/platform/browser/zoned-message-listener.service.ts b/apps/browser/src/platform/browser/zoned-message-listener.service.ts new file mode 100644 index 00000000000..ce9f7e2021e --- /dev/null +++ b/apps/browser/src/platform/browser/zoned-message-listener.service.ts @@ -0,0 +1,33 @@ +import { Injectable, NgZone } from "@angular/core"; +import { Observable } from "rxjs"; + +import { BrowserApi } from "./browser-api"; +import { runInsideAngular } from "./run-inside-angular.operator"; + +/** + * This service is used for listening to messages from the background script. + * It automatically runs all callbacks inside the Angular zone. + * This should be used instead of `BrowserApi.messageListener` in all popup-components. + * Not needed for services running in the background script. + */ +@Injectable({ providedIn: "root" }) +export class ZonedMessageListenerService { + constructor(private ngZone: NgZone) {} + + messageListener( + name: string, + callback: ( + message: any, + sender: chrome.runtime.MessageSender, + sendResponse: any, + ) => boolean | void, + ) { + BrowserApi.messageListener(name, (message, sender, sendResponse) => { + return this.ngZone.run(() => callback(message, sender, sendResponse)); + }); + } + + messageListener$(): Observable { + return BrowserApi.messageListener$().pipe(runInsideAngular(this.ngZone)); + } +} diff --git a/apps/browser/src/platform/decorators/dev-flag.decorator.spec.ts b/apps/browser/src/platform/decorators/dev-flag.decorator.spec.ts index c5401f8a097..da00bc6fe30 100644 --- a/apps/browser/src/platform/decorators/dev-flag.decorator.spec.ts +++ b/apps/browser/src/platform/decorators/dev-flag.decorator.spec.ts @@ -9,7 +9,7 @@ jest.mock("../flags", () => ({ })); class TestClass { - @devFlag("storeSessionDecrypted") test() { + @devFlag("managedEnvironment") test() { return "test"; } } diff --git a/apps/browser/src/platform/decorators/dev-flag.decorator.ts b/apps/browser/src/platform/decorators/dev-flag.decorator.ts index 4a67d6239e6..a31cdbc9924 100644 --- a/apps/browser/src/platform/decorators/dev-flag.decorator.ts +++ b/apps/browser/src/platform/decorators/dev-flag.decorator.ts @@ -6,7 +6,7 @@ export function devFlag(flag: keyof DevFlags) { descriptor.value = function (...args: any[]) { if (!devFlagEnabled(flag)) { throw new Error( - `This method should not be called, it is protected by a disabled dev flag.` + `This method should not be called, it is protected by a disabled dev flag.`, ); } return originalMethod.apply(this, args); diff --git a/apps/browser/src/platform/decorators/session-sync-observable/browser-session.decorator.spec.ts b/apps/browser/src/platform/decorators/session-sync-observable/browser-session.decorator.spec.ts deleted file mode 100644 index 5ddc3f8e07e..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/browser-session.decorator.spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { BehaviorSubject } from "rxjs"; - -import { AbstractMemoryStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; -import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service"; - -import { BrowserStateService } from "../../services/browser-state.service"; - -import { browserSession } from "./browser-session.decorator"; -import { SessionStorable } from "./session-storable"; -import { sessionSync } from "./session-sync.decorator"; - -// browserSession initializes SessionSyncers for each sessionSync decorated property -// We don't want to test SessionSyncers, so we'll mock them -jest.mock("./session-syncer"); - -describe("browserSession decorator", () => { - it("should throw if neither StateService nor MemoryStorageService is a constructor argument", () => { - @browserSession - class TestClass {} - expect(() => { - new TestClass(); - }).toThrowError( - "Cannot decorate TestClass with browserSession, Browser's AbstractMemoryStorageService must be accessible through the observed classes parameters" - ); - }); - - it("should create if StateService is a constructor argument", () => { - const stateService = Object.create(BrowserStateService.prototype, { - memoryStorageService: { - value: Object.create(MemoryStorageService.prototype, { - type: { value: MemoryStorageService.TYPE }, - }), - }, - }); - - @browserSession - class TestClass { - constructor(private stateService: BrowserStateService) {} - } - - expect(new TestClass(stateService)).toBeDefined(); - }); - - it("should create if MemoryStorageService is a constructor argument", () => { - const memoryStorageService = Object.create(MemoryStorageService.prototype, { - type: { value: MemoryStorageService.TYPE }, - }); - - @browserSession - class TestClass { - constructor(private memoryStorageService: AbstractMemoryStorageService) {} - } - - expect(new TestClass(memoryStorageService)).toBeDefined(); - }); - - describe("interaction with @sessionSync decorator", () => { - let memoryStorageService: MemoryStorageService; - - @browserSession - class TestClass { - @sessionSync({ initializer: (s: string) => s }) - private behaviorSubject = new BehaviorSubject(""); - - constructor(private memoryStorageService: MemoryStorageService) {} - - fromJSON(json: any) { - this.behaviorSubject.next(json); - } - } - - beforeEach(() => { - memoryStorageService = Object.create(MemoryStorageService.prototype, { - type: { value: MemoryStorageService.TYPE }, - }); - }); - - it("should create a session syncer", () => { - const testClass = new TestClass(memoryStorageService) as any as SessionStorable; - expect(testClass.__sessionSyncers.length).toEqual(1); - }); - - it("should initialize the session syncer", () => { - const testClass = new TestClass(memoryStorageService) as any as SessionStorable; - expect(testClass.__sessionSyncers[0].init).toHaveBeenCalled(); - }); - }); -}); diff --git a/apps/browser/src/platform/decorators/session-sync-observable/browser-session.decorator.ts b/apps/browser/src/platform/decorators/session-sync-observable/browser-session.decorator.ts deleted file mode 100644 index b325f6b9a56..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/browser-session.decorator.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Constructor } from "type-fest"; - -import { AbstractMemoryStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; - -import { SessionStorable } from "./session-storable"; -import { SessionSyncer } from "./session-syncer"; -import { SyncedItemMetadata } from "./sync-item-metadata"; - -/** - * Mark the class as syncing state across the browser session. This decorator finds rxjs BehaviorSubject properties - * marked with @sessionSync and syncs these values across the browser session. - * - * @param constructor - * @returns A new constructor that extends the original one to add session syncing. - */ -export function browserSession>(constructor: TCtor) { - return class extends constructor implements SessionStorable { - __syncedItemMetadata: SyncedItemMetadata[]; - __sessionSyncers: SessionSyncer[]; - - constructor(...args: any[]) { - super(...args); - - // Require state service to be injected - const storageService: AbstractMemoryStorageService = this.findStorageService( - [this as any].concat(args) - ); - - if (this.__syncedItemMetadata == null || !(this.__syncedItemMetadata instanceof Array)) { - return; - } - - this.__sessionSyncers = this.__syncedItemMetadata.map((metadata) => - this.buildSyncer(metadata, storageService) - ); - } - - buildSyncer(metadata: SyncedItemMetadata, storageSerice: AbstractMemoryStorageService) { - const syncer = new SessionSyncer( - (this as any)[metadata.propertyKey], - storageSerice, - metadata - ); - syncer.init(); - return syncer; - } - - findStorageService(args: any[]): AbstractMemoryStorageService { - const storageService = args.find(this.isMemoryStorageService); - - if (storageService) { - return storageService; - } - - const stateService = args.find( - (arg) => - arg?.memoryStorageService != null && this.isMemoryStorageService(arg.memoryStorageService) - ); - if (stateService) { - return stateService.memoryStorageService; - } - - throw new Error( - `Cannot decorate ${constructor.name} with browserSession, Browser's AbstractMemoryStorageService must be accessible through the observed classes parameters` - ); - } - - isMemoryStorageService(arg: any): arg is AbstractMemoryStorageService { - return arg.type != null && arg.type === AbstractMemoryStorageService.TYPE; - } - }; -} diff --git a/apps/browser/src/platform/decorators/session-sync-observable/index.ts b/apps/browser/src/platform/decorators/session-sync-observable/index.ts deleted file mode 100644 index c0c547192e7..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { browserSession } from "./browser-session.decorator"; -export { sessionSync } from "./session-sync.decorator"; diff --git a/apps/browser/src/platform/decorators/session-sync-observable/session-storable.ts b/apps/browser/src/platform/decorators/session-sync-observable/session-storable.ts deleted file mode 100644 index f5838b86ef9..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/session-storable.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SessionSyncer } from "./session-syncer"; -import { SyncedItemMetadata } from "./sync-item-metadata"; - -export interface SessionStorable { - __syncedItemMetadata: SyncedItemMetadata[]; - __sessionSyncers: SessionSyncer[]; -} diff --git a/apps/browser/src/platform/decorators/session-sync-observable/session-sync.decorator.spec.ts b/apps/browser/src/platform/decorators/session-sync-observable/session-sync.decorator.spec.ts deleted file mode 100644 index 7a6e7266081..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/session-sync.decorator.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { BehaviorSubject } from "rxjs"; - -import { sessionSync } from "./session-sync.decorator"; - -describe("sessionSync decorator", () => { - const initializer = (s: string) => "test"; - class TestClass { - @sessionSync({ initializer: initializer }) - private testProperty = new BehaviorSubject(""); - @sessionSync({ initializer: initializer, initializeAs: "array" }) - private secondTestProperty = new BehaviorSubject(""); - - complete() { - this.testProperty.complete(); - this.secondTestProperty.complete(); - } - } - - it("should add __syncedItemKeys to prototype", () => { - const testClass = new TestClass(); - expect((testClass as any).__syncedItemMetadata).toEqual([ - expect.objectContaining({ - propertyKey: "testProperty", - sessionKey: "testProperty_0", - initializer: initializer, - }), - expect.objectContaining({ - propertyKey: "secondTestProperty", - sessionKey: "secondTestProperty_1", - initializer: initializer, - initializeAs: "array", - }), - ]); - testClass.complete(); - }); - - class TestClass2 { - @sessionSync({ initializer: initializer }) - private testProperty = new BehaviorSubject(""); - - complete() { - this.testProperty.complete(); - } - } - - it("should maintain sessionKey index count for other test classes", () => { - const testClass = new TestClass2(); - expect((testClass as any).__syncedItemMetadata).toEqual([ - expect.objectContaining({ - propertyKey: "testProperty", - sessionKey: "testProperty_2", - initializer: initializer, - }), - ]); - testClass.complete(); - }); -}); diff --git a/apps/browser/src/platform/decorators/session-sync-observable/session-sync.decorator.ts b/apps/browser/src/platform/decorators/session-sync-observable/session-sync.decorator.ts deleted file mode 100644 index e439cea45a4..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/session-sync.decorator.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Jsonify } from "type-fest"; - -import { SessionStorable } from "./session-storable"; -import { InitializeOptions } from "./sync-item-metadata"; - -class BuildOptions> { - initializer?: (keyValuePair: TJson) => T; - initializeAs?: InitializeOptions; -} - -// Used to ensure uniqueness for each synced observable -let index = 0; - -/** - * A decorator used to indicate the BehaviorSubject should be synced for this browser session across all contexts. - * - * >**Note** This decorator does nothing if the enclosing class is not decorated with @browserSession. - * - * >**Note** The Behavior subject must be initialized with a default or in the constructor of the class. If it is not, an error will be thrown. - * - * >**!!Warning!!** If the property is overwritten at any time, the new value will not be synced across the browser session. - * - * @param buildOptions - * Builders for the value, requires either a constructor (ctor) for your BehaviorSubject type or an - * initializer function that takes a key value pair representation of the BehaviorSubject data - * and returns your instantiated BehaviorSubject value. `initializeAs can optionally be used to indicate - * the provided initializer function should be used to build an array of values. For example, - * ```ts - * \@sessionSync({ initializer: Foo.fromJSON, initializeAs: 'array' }) - * ``` - * is equivalent to - * ``` - * \@sessionSync({ initializer: (obj: any[]) => obj.map((f) => Foo.fromJSON }) - * ``` - * - * @returns decorator function - */ -export function sessionSync(buildOptions: BuildOptions) { - return (prototype: unknown, propertyKey: string) => { - // Force prototype into SessionStorable and implement it. - const p = prototype as SessionStorable; - - if (p.__syncedItemMetadata == null) { - p.__syncedItemMetadata = []; - } - - p.__syncedItemMetadata.push({ - propertyKey, - sessionKey: `${propertyKey}_${index++}`, - initializer: buildOptions.initializer, - initializeAs: buildOptions.initializeAs ?? "object", - }); - }; -} diff --git a/apps/browser/src/platform/decorators/session-sync-observable/session-syncer.spec.ts b/apps/browser/src/platform/decorators/session-sync-observable/session-syncer.spec.ts deleted file mode 100644 index afa66db0454..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/session-syncer.spec.ts +++ /dev/null @@ -1,287 +0,0 @@ -import { awaitAsync } from "@bitwarden/angular/../test-utils"; -import { mock, MockProxy } from "jest-mock-extended"; -import { BehaviorSubject, ReplaySubject } from "rxjs"; - -import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service"; - -import { BrowserApi } from "../../browser/browser-api"; - -import { SessionSyncer } from "./session-syncer"; -import { SyncedItemMetadata } from "./sync-item-metadata"; - -describe("session syncer", () => { - const propertyKey = "behaviorSubject"; - const sessionKey = "Test__" + propertyKey; - const metaData: SyncedItemMetadata = { - propertyKey, - sessionKey, - initializer: (s: string) => s, - initializeAs: "object", - }; - let storageService: MockProxy; - let sut: SessionSyncer; - let behaviorSubject: BehaviorSubject; - - beforeEach(() => { - behaviorSubject = new BehaviorSubject(""); - jest.spyOn(chrome.runtime, "getManifest").mockReturnValue({ - name: "bitwarden-test", - version: "0.0.0", - manifest_version: 3, - }); - - storageService = mock(); - storageService.has.mockResolvedValue(false); - sut = new SessionSyncer(behaviorSubject, storageService, metaData); - }); - - afterEach(() => { - jest.resetAllMocks(); - - behaviorSubject.complete(); - }); - - describe("constructor", () => { - it("should throw if subject is not an instance of Subject", () => { - expect(() => { - new SessionSyncer({} as any, storageService, null); - }).toThrowError("subject must inherit from Subject"); - }); - - it("should create if either ctor or initializer is provided", () => { - expect( - new SessionSyncer(behaviorSubject, storageService, { - propertyKey, - sessionKey, - initializeAs: "object", - initializer: () => null, - }) - ).toBeDefined(); - expect( - new SessionSyncer(behaviorSubject, storageService, { - propertyKey, - sessionKey, - initializer: (s: any) => s, - initializeAs: "object", - }) - ).toBeDefined(); - }); - it("should throw if neither ctor or initializer is provided", () => { - expect(() => { - new SessionSyncer(behaviorSubject, storageService, { - propertyKey, - sessionKey, - initializeAs: "object", - initializer: null, - }); - }).toThrowError("initializer must be provided"); - }); - }); - - describe("init", () => { - it("should ignore all updates currently in a ReplaySubject's buffer", () => { - const replaySubject = new ReplaySubject(Infinity); - replaySubject.next("1"); - replaySubject.next("2"); - replaySubject.next("3"); - sut = new SessionSyncer(replaySubject, storageService, metaData); - // block observing the subject - jest.spyOn(sut as any, "observe").mockImplementation(); - - sut.init(); - - expect(sut["ignoreNUpdates"]).toBe(3); - }); - - it("should ignore BehaviorSubject's initial value", () => { - const behaviorSubject = new BehaviorSubject("initial"); - sut = new SessionSyncer(behaviorSubject, storageService, metaData); - // block observing the subject - jest.spyOn(sut as any, "observe").mockImplementation(); - - sut.init(); - - expect(sut["ignoreNUpdates"]).toBe(1); - }); - - it("should grab an initial value from storage if it exists", async () => { - storageService.has.mockResolvedValue(true); - //Block a call to update - const updateSpy = jest.spyOn(sut as any, "updateFromMemory").mockImplementation(); - - sut.init(); - await awaitAsync(); - - expect(updateSpy).toHaveBeenCalledWith(); - }); - - it("should not grab an initial value from storage if it does not exist", async () => { - storageService.has.mockResolvedValue(false); - //Block a call to update - const updateSpy = jest.spyOn(sut as any, "update").mockImplementation(); - - sut.init(); - await awaitAsync(); - - expect(updateSpy).not.toHaveBeenCalled(); - }); - }); - - describe("a value is emitted on the observable", () => { - let sendMessageSpy: jest.SpyInstance; - const value = "test"; - const serializedValue = JSON.stringify(value); - - beforeEach(() => { - sendMessageSpy = jest.spyOn(BrowserApi, "sendMessage"); - - sut.init(); - - behaviorSubject.next(value); - }); - - it("should update sessionSyncers in other contexts", async () => { - // await finishing of fire-and-forget operation - await new Promise((resolve) => setTimeout(resolve, 100)); - - expect(sendMessageSpy).toHaveBeenCalledTimes(1); - expect(sendMessageSpy).toHaveBeenCalledWith(`${sessionKey}_update`, { - id: sut.id, - serializedValue, - }); - }); - }); - - describe("A message is received", () => { - let nextSpy: jest.SpyInstance; - let sendMessageSpy: jest.SpyInstance; - - beforeEach(() => { - nextSpy = jest.spyOn(behaviorSubject, "next"); - sendMessageSpy = jest.spyOn(BrowserApi, "sendMessage"); - - sut.init(); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - it("should ignore messages with the wrong command", async () => { - await sut.updateFromMessage({ command: "wrong_command", id: sut.id }); - - expect(storageService.getBypassCache).not.toHaveBeenCalled(); - expect(nextSpy).not.toHaveBeenCalled(); - }); - - it("should ignore messages from itself", async () => { - await sut.updateFromMessage({ command: `${sessionKey}_update`, id: sut.id }); - - expect(storageService.getBypassCache).not.toHaveBeenCalled(); - expect(nextSpy).not.toHaveBeenCalled(); - }); - - it("should update from message on emit from another instance", async () => { - const builder = jest.fn(); - jest.spyOn(SyncedItemMetadata, "builder").mockReturnValue(builder); - const value = "test"; - const serializedValue = JSON.stringify(value); - builder.mockReturnValue(value); - - // Expect no circular messaging - await awaitAsync(); - expect(sendMessageSpy).toHaveBeenCalledTimes(0); - - await sut.updateFromMessage({ - command: `${sessionKey}_update`, - id: "different_id", - serializedValue, - }); - await awaitAsync(); - - expect(storageService.getBypassCache).toHaveBeenCalledTimes(0); - - expect(nextSpy).toHaveBeenCalledTimes(1); - expect(nextSpy).toHaveBeenCalledWith(value); - expect(behaviorSubject.value).toBe(value); - - // Expect no circular messaging - expect(sendMessageSpy).toHaveBeenCalledTimes(0); - }); - }); - - describe("memory storage", () => { - const value = "test"; - const serializedValue = JSON.stringify(value); - let saveSpy: jest.SpyInstance; - const builder = jest.fn().mockReturnValue(value); - const manifestVersionSpy = jest.spyOn(BrowserApi, "manifestVersion", "get"); - const isBackgroundPageSpy = jest.spyOn(BrowserApi, "isBackgroundPage"); - - beforeEach(async () => { - jest.spyOn(SyncedItemMetadata, "builder").mockReturnValue(builder); - saveSpy = jest.spyOn(storageService, "save"); - - sut.init(); - await awaitAsync(); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - it("should always store on observed next for manifest version 3", async () => { - manifestVersionSpy.mockReturnValue(3); - isBackgroundPageSpy.mockReturnValueOnce(true).mockReturnValueOnce(false); - behaviorSubject.next(value); - await awaitAsync(); - behaviorSubject.next(value); - await awaitAsync(); - - expect(saveSpy).toHaveBeenCalledTimes(2); - }); - - it("should not store on message receive for manifest version 3", async () => { - manifestVersionSpy.mockReturnValue(3); - isBackgroundPageSpy.mockReturnValueOnce(true).mockReturnValueOnce(false); - await sut.updateFromMessage({ - command: `${sessionKey}_update`, - id: "different_id", - serializedValue, - }); - await awaitAsync(); - - expect(saveSpy).toHaveBeenCalledTimes(0); - }); - - it("should store on message receive for manifest version 2 for background page only", async () => { - manifestVersionSpy.mockReturnValue(2); - isBackgroundPageSpy.mockReturnValueOnce(true).mockReturnValueOnce(false); - await sut.updateFromMessage({ - command: `${sessionKey}_update`, - id: "different_id", - serializedValue, - }); - await awaitAsync(); - await sut.updateFromMessage({ - command: `${sessionKey}_update`, - id: "different_id", - serializedValue, - }); - await awaitAsync(); - - expect(saveSpy).toHaveBeenCalledTimes(1); - }); - - it("should store on observed next for manifest version 2 for background page only", async () => { - manifestVersionSpy.mockReturnValue(2); - isBackgroundPageSpy.mockReturnValueOnce(true).mockReturnValueOnce(false); - behaviorSubject.next(value); - await awaitAsync(); - behaviorSubject.next(value); - await awaitAsync(); - - expect(saveSpy).toHaveBeenCalledTimes(1); - }); - }); -}); diff --git a/apps/browser/src/platform/decorators/session-sync-observable/session-syncer.ts b/apps/browser/src/platform/decorators/session-sync-observable/session-syncer.ts deleted file mode 100644 index 001c546b9c6..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/session-syncer.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { BehaviorSubject, concatMap, ReplaySubject, skip, Subject, Subscription } from "rxjs"; - -import { AbstractMemoryStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; - -import { BrowserApi } from "../../browser/browser-api"; - -import { SyncedItemMetadata } from "./sync-item-metadata"; - -export class SessionSyncer { - subscription: Subscription; - id = Utils.newGuid(); - - // ignore initial values - private ignoreNUpdates = 0; - - constructor( - private subject: Subject, - private memoryStorageService: AbstractMemoryStorageService, - private metaData: SyncedItemMetadata - ) { - if (!(subject instanceof Subject)) { - throw new Error("subject must inherit from Subject"); - } - - if (metaData.initializer == null) { - throw new Error("initializer must be provided"); - } - } - - async init() { - switch (this.subject.constructor) { - case ReplaySubject: - // ignore all updates currently in the buffer - this.ignoreNUpdates = (this.subject as any)._buffer.length; - break; - case BehaviorSubject: - this.ignoreNUpdates = 1; - break; - default: - break; - } - - await this.observe(); - // must be synchronous - const hasInSessionMemory = await this.memoryStorageService.has(this.metaData.sessionKey); - if (hasInSessionMemory) { - await this.updateFromMemory(); - } - - this.listenForUpdates(); - } - - private async observe() { - const stream = this.subject.pipe(skip(this.ignoreNUpdates)); - this.ignoreNUpdates = 0; - - // This may be a memory leak. - // There is no good time to unsubscribe from this observable. Hopefully Manifest V3 clears memory from temporary - // contexts. If so, this is handled by destruction of the context. - this.subscription = stream - .pipe( - concatMap(async (next) => { - if (this.ignoreNUpdates > 0) { - this.ignoreNUpdates -= 1; - return; - } - await this.updateSession(next); - }) - ) - .subscribe(); - } - - private listenForUpdates() { - // This is an unawaited promise, but it will be executed asynchronously in the background. - BrowserApi.messageListener( - this.updateMessageCommand, - async (message) => await this.updateFromMessage(message) - ); - } - - async updateFromMessage(message: any) { - if (message.command != this.updateMessageCommand || message.id === this.id) { - return; - } - await this.update(message.serializedValue); - } - - async updateFromMemory() { - const value = await this.memoryStorageService.getBypassCache(this.metaData.sessionKey); - await this.update(value); - } - - async update(serializedValue: any) { - const unBuiltValue = JSON.parse(serializedValue); - if (BrowserApi.manifestVersion !== 3 && BrowserApi.isBackgroundPage(self)) { - await this.memoryStorageService.save(this.metaData.sessionKey, serializedValue); - } - const builder = SyncedItemMetadata.builder(this.metaData); - const value = builder(unBuiltValue); - this.ignoreNUpdates = 1; - this.subject.next(value); - } - - private async updateSession(value: any) { - const serializedValue = JSON.stringify(value); - if (BrowserApi.manifestVersion === 3 || BrowserApi.isBackgroundPage(self)) { - await this.memoryStorageService.save(this.metaData.sessionKey, serializedValue); - } - await BrowserApi.sendMessage(this.updateMessageCommand, { id: this.id, serializedValue }); - } - - private get updateMessageCommand() { - return `${this.metaData.sessionKey}_update`; - } -} diff --git a/apps/browser/src/platform/decorators/session-sync-observable/sync-item-metadata.ts b/apps/browser/src/platform/decorators/session-sync-observable/sync-item-metadata.ts deleted file mode 100644 index fe2b393923f..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/sync-item-metadata.ts +++ /dev/null @@ -1,25 +0,0 @@ -export type InitializeOptions = "array" | "record" | "object"; - -export class SyncedItemMetadata { - propertyKey: string; - sessionKey: string; - initializer: (keyValuePair: any) => any; - initializeAs: InitializeOptions; - - static builder(metadata: SyncedItemMetadata): (o: any) => any { - const itemBuilder = metadata.initializer; - if (metadata.initializeAs === "array") { - return (keyValuePair: any) => keyValuePair.map((o: any) => itemBuilder(o)); - } else if (metadata.initializeAs === "record") { - return (keyValuePair: any) => { - const record: Record = {}; - for (const key in keyValuePair) { - record[key] = itemBuilder(keyValuePair[key]); - } - return record; - }; - } else { - return (keyValuePair: any) => itemBuilder(keyValuePair); - } - } -} diff --git a/apps/browser/src/platform/decorators/session-sync-observable/synced-item-metadata.spec.ts b/apps/browser/src/platform/decorators/session-sync-observable/synced-item-metadata.spec.ts deleted file mode 100644 index 61eb63eaac0..00000000000 --- a/apps/browser/src/platform/decorators/session-sync-observable/synced-item-metadata.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SyncedItemMetadata } from "./sync-item-metadata"; - -describe("builder", () => { - const propertyKey = "propertyKey"; - const key = "key"; - const initializer = (s: any) => "used initializer"; - - it("should use initializer", () => { - const metadata: SyncedItemMetadata = { - propertyKey, - sessionKey: key, - initializer, - initializeAs: "object", - }; - const builder = SyncedItemMetadata.builder(metadata); - expect(builder({})).toBe("used initializer"); - }); - - it("should honor initialize as array", () => { - const metadata: SyncedItemMetadata = { - propertyKey, - sessionKey: key, - initializer: initializer, - initializeAs: "array", - }; - const builder = SyncedItemMetadata.builder(metadata); - expect(builder([{}])).toBeInstanceOf(Array); - expect(builder([{}])[0]).toBe("used initializer"); - }); - - it("should honor initialize as record", () => { - const metadata: SyncedItemMetadata = { - propertyKey, - sessionKey: key, - initializer: initializer, - initializeAs: "record", - }; - const builder = SyncedItemMetadata.builder(metadata); - expect(builder({ key: "" })).toBeInstanceOf(Object); - expect(builder({ key: "" })).toStrictEqual({ key: "used initializer" }); - }); -}); diff --git a/apps/browser/src/platform/flags.ts b/apps/browser/src/platform/flags.ts index 270835bc6a1..383e982f065 100644 --- a/apps/browser/src/platform/flags.ts +++ b/apps/browser/src/platform/flags.ts @@ -8,14 +8,17 @@ import { import { GroupPolicyEnvironment } from "../admin-console/types/group-policy-environment"; -// required to avoid linting errors when there are no flags -/* eslint-disable-next-line @typescript-eslint/ban-types */ -export type Flags = {} & SharedFlags; +import { BrowserApi } from "./browser/browser-api"; // required to avoid linting errors when there are no flags -/* eslint-disable-next-line @typescript-eslint/ban-types */ +// eslint-disable-next-line @typescript-eslint/ban-types +export type Flags = { + accountSwitching?: boolean; +} & SharedFlags; + +// required to avoid linting errors when there are no flags +// eslint-disable-next-line @typescript-eslint/ban-types export type DevFlags = { - storeSessionDecrypted?: boolean; managedEnvironment?: GroupPolicyEnvironment; } & SharedDevFlags; @@ -30,3 +33,14 @@ export function devFlagEnabled(flag: keyof DevFlags) { export function devFlagValue(flag: keyof DevFlags) { return baseDevFlagValue(flag); } + +/** Helper method to sync flag specifically for account switching, which as platform-based values. + * If this pattern needs to be repeated, it's better handled by increasing complexity of webpack configurations + * Not by expanding these flag getters. + */ +export function enableAccountSwitching(): boolean { + if (BrowserApi.isSafariApi) { + return false; + } + return flagEnabled("accountSwitching"); +} diff --git a/apps/browser/src/platform/globals.d.ts b/apps/browser/src/platform/globals.d.ts index 9c7be016b0b..a45700188e4 100644 --- a/apps/browser/src/platform/globals.d.ts +++ b/apps/browser/src/platform/globals.d.ts @@ -10,7 +10,7 @@ type OperaAddons = { installExtension: ( id: string, success_callback: () => void, - error_callback: (errorMessage: string) => void + error_callback: (errorMessage: string) => void, ) => void; }; @@ -49,7 +49,7 @@ type OperaSidebarAction = { path?: string | Record; tabId?: number; }, - callback?: () => void + callback?: () => void, ) => void; /** * @link https://dev.opera.com/extensions/sidebar-action-api/#method-setpanel @@ -84,7 +84,7 @@ type OperaSidebarAction = { */ getBadgeBackgroundColor: ( details: { tabId?: number }, - callback: (result: ColorArray) => void + callback: (result: ColorArray) => void, ) => void; /** * *Not supported on mac* @@ -117,6 +117,12 @@ interface Window { opera: unknown; } +interface ServiceWorkerGlobalScope { + chrome?: typeof chrome; + opr?: Opera | undefined; + opera?: unknown; +} + declare let opr: Opera | undefined; declare let opera: unknown | undefined; declare let safari: any; diff --git a/apps/browser/src/platform/listeners/combine.spec.ts b/apps/browser/src/platform/listeners/combine.spec.ts deleted file mode 100644 index 10a0fd30d1d..00000000000 --- a/apps/browser/src/platform/listeners/combine.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { combine } from "./combine"; - -describe("combine", () => { - it("runs", async () => { - const combined = combine([ - (arg: Record, serviceCache: Record) => { - arg["one"] = true; - serviceCache["one"] = true; - return Promise.resolve(); - }, - (arg: Record, serviceCache: Record) => { - if (serviceCache["one"] !== true) { - throw new Error("One should have ran."); - } - arg["two"] = true; - return Promise.resolve(); - }, - ]); - - const arg: Record = {}; - await combined(arg); - - expect(arg["one"]).toBeTruthy(); - - expect(arg["two"]).toBeTruthy(); - }); -}); diff --git a/apps/browser/src/platform/listeners/combine.ts b/apps/browser/src/platform/listeners/combine.ts deleted file mode 100644 index 91d2af7ba55..00000000000 --- a/apps/browser/src/platform/listeners/combine.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CachedServices } from "../background/service-factories/factory-options"; - -type Listener = (...args: [...T, CachedServices]) => Promise; - -export const combine = ( - listeners: Listener[], - startingServices: CachedServices = {} -) => { - return async (...args: T) => { - const cachedServices = { ...startingServices }; - for (const listener of listeners) { - await listener(...[...args, cachedServices]); - } - }; -}; diff --git a/apps/browser/src/platform/listeners/index.ts b/apps/browser/src/platform/listeners/index.ts deleted file mode 100644 index 60e304402aa..00000000000 --- a/apps/browser/src/platform/listeners/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { CipherContextMenuHandler } from "../../autofill/browser/cipher-context-menu-handler"; -import { ContextMenuClickedHandler } from "../../autofill/browser/context-menu-clicked-handler"; - -import { combine } from "./combine"; -import { onCommandListener } from "./on-command-listener"; -import { onInstallListener } from "./on-install-listener"; -import { UpdateBadge } from "./update-badge"; - -const windowsOnFocusChangedListener = combine([ - UpdateBadge.windowsOnFocusChangedListener, - CipherContextMenuHandler.windowsOnFocusChangedListener, -]); - -const tabsOnActivatedListener = combine([ - UpdateBadge.tabsOnActivatedListener, - CipherContextMenuHandler.tabsOnActivatedListener, -]); - -const tabsOnReplacedListener = combine([ - UpdateBadge.tabsOnReplacedListener, - CipherContextMenuHandler.tabsOnReplacedListener, -]); - -const tabsOnUpdatedListener = combine([ - UpdateBadge.tabsOnUpdatedListener, - CipherContextMenuHandler.tabsOnUpdatedListener, -]); - -const contextMenusClickedListener = ContextMenuClickedHandler.onClickedListener; - -// TODO: All message listeners should be RuntimeMessage in Notifications follow up then this type annotation can be inferred -const runtimeMessageListener = combine< - [message: { command: string }, sender: chrome.runtime.MessageSender] ->([ - UpdateBadge.messageListener, - CipherContextMenuHandler.messageListener, - ContextMenuClickedHandler.messageListener, -]); - -export { - windowsOnFocusChangedListener, - tabsOnActivatedListener, - tabsOnReplacedListener, - tabsOnUpdatedListener, - contextMenusClickedListener, - runtimeMessageListener, - onCommandListener, - onInstallListener, -}; diff --git a/apps/browser/src/platform/listeners/on-command-listener.ts b/apps/browser/src/platform/listeners/on-command-listener.ts index 0e2cf03828d..e69de29bb2d 100644 --- a/apps/browser/src/platform/listeners/on-command-listener.ts +++ b/apps/browser/src/platform/listeners/on-command-listener.ts @@ -1,104 +0,0 @@ -import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; - -import { authServiceFactory } from "../../auth/background/service-factories/auth-service.factory"; -import { autofillServiceFactory } from "../../autofill/background/service_factories/autofill-service.factory"; -import { GeneratePasswordToClipboardCommand } from "../../autofill/clipboard"; -import { AutofillTabCommand } from "../../autofill/commands/autofill-tab-command"; -import { Account } from "../../models/account"; -import { stateServiceFactory } from "../../platform/background/service-factories/state-service.factory"; -import { - passwordGenerationServiceFactory, - PasswordGenerationServiceInitOptions, -} from "../../tools/background/service_factories/password-generation-service.factory"; -import { CachedServices } from "../background/service-factories/factory-options"; -import { logServiceFactory } from "../background/service-factories/log-service.factory"; -import { BrowserApi } from "../browser/browser-api"; - -export const onCommandListener = async (command: string, tab: chrome.tabs.Tab) => { - switch (command) { - case "autofill_login": - await doAutoFillLogin(tab); - break; - case "generate_password": - await doGeneratePasswordToClipboard(tab); - break; - } -}; - -const doAutoFillLogin = async (tab: chrome.tabs.Tab): Promise => { - const cachedServices: CachedServices = {}; - const opts = { - cryptoFunctionServiceOptions: { - win: self, - }, - encryptServiceOptions: { - logMacFailures: true, - }, - logServiceOptions: { - isDev: false, - }, - platformUtilsServiceOptions: { - clipboardWriteCallback: () => Promise.resolve(), - biometricCallback: () => Promise.resolve(false), - win: self, - }, - stateServiceOptions: { - stateFactory: new StateFactory(GlobalState, Account), - }, - apiServiceOptions: { - logoutCallback: () => Promise.resolve(), - }, - keyConnectorServiceOptions: { - logoutCallback: () => Promise.resolve(), - }, - i18nServiceOptions: { - systemLanguage: BrowserApi.getUILanguage(self), - }, - }; - const logService = await logServiceFactory(cachedServices, opts); - const authService = await authServiceFactory(cachedServices, opts); - const autofillService = await autofillServiceFactory(cachedServices, opts); - - const authStatus = await authService.getAuthStatus(); - if (authStatus < AuthenticationStatus.Unlocked) { - // TODO: Add back in unlock on autofill - logService.info("Currently not unlocked, MV3 does not support unlock on autofill currently."); - return; - } - - const command = new AutofillTabCommand(autofillService); - await command.doAutofillTabCommand(tab); -}; - -const doGeneratePasswordToClipboard = async (tab: chrome.tabs.Tab): Promise => { - const stateFactory = new StateFactory(GlobalState, Account); - - const cache = {}; - const options: PasswordGenerationServiceInitOptions = { - cryptoFunctionServiceOptions: { - win: self, - }, - encryptServiceOptions: { - logMacFailures: false, - }, - logServiceOptions: { - isDev: false, - }, - platformUtilsServiceOptions: { - biometricCallback: () => Promise.resolve(true), - clipboardWriteCallback: () => Promise.resolve(), - win: self, - }, - stateServiceOptions: { - stateFactory: stateFactory, - }, - }; - - const command = new GeneratePasswordToClipboardCommand( - await passwordGenerationServiceFactory(cache, options), - await stateServiceFactory(cache, options) - ); - command.generatePasswordToClipboard(tab); -}; diff --git a/apps/browser/src/platform/listeners/on-install-listener.ts b/apps/browser/src/platform/listeners/on-install-listener.ts deleted file mode 100644 index 0394941e283..00000000000 --- a/apps/browser/src/platform/listeners/on-install-listener.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; - -import { Account } from "../../models/account"; -import { - EnvironmentServiceInitOptions, - environmentServiceFactory, -} from "../background/service-factories/environment-service.factory"; -import { BrowserApi } from "../browser/browser-api"; - -export async function onInstallListener(details: chrome.runtime.InstalledDetails) { - const cache = {}; - const opts: EnvironmentServiceInitOptions = { - encryptServiceOptions: { - logMacFailures: false, - }, - cryptoFunctionServiceOptions: { - win: self, - }, - logServiceOptions: { - isDev: false, - }, - stateServiceOptions: { - stateFactory: new StateFactory(GlobalState, Account), - }, - }; - const environmentService = await environmentServiceFactory(cache, opts); - - setTimeout(async () => { - if (details.reason != null && details.reason === chrome.runtime.OnInstalledReason.INSTALL) { - BrowserApi.createNewTab("https://bitwarden.com/browser-start/"); - - if (await environmentService.hasManagedEnvironment()) { - await environmentService.setUrlsToManagedEnvironment(); - } - } - }, 100); -} diff --git a/apps/browser/src/platform/listeners/update-badge.ts b/apps/browser/src/platform/listeners/update-badge.ts index 1b692eb9b97..9256c27f37b 100644 --- a/apps/browser/src/platform/listeners/update-badge.ts +++ b/apps/browser/src/platform/listeners/update-badge.ts @@ -1,21 +1,15 @@ +import { firstValueFrom } from "rxjs"; + import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; -import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; +import { BadgeSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/badge-settings.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; -import { ContainerService } from "@bitwarden/common/platform/services/container.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { authServiceFactory } from "../../auth/background/service-factories/auth-service.factory"; -import { Account } from "../../models/account"; -import { stateServiceFactory } from "../../platform/background/service-factories/state-service.factory"; -import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service"; +import MainBackground from "../../background/main.background"; import IconDetails from "../../vault/background/models/icon-details"; -import { cipherServiceFactory } from "../../vault/background/service_factories/cipher-service.factory"; import { BrowserApi } from "../browser/browser-api"; -import BrowserPlatformUtilsService from "../services/browser-platform-utils.service"; +import { BrowserPlatformUtilsService } from "../services/platform-utils/browser-platform-utils.service"; export type BadgeOptions = { tab?: chrome.tabs.Tab; @@ -24,87 +18,23 @@ export type BadgeOptions = { export class UpdateBadge { private authService: AuthService; - private stateService: BrowserStateService; + private badgeSettingsService: BadgeSettingsServiceAbstraction; private cipherService: CipherService; private badgeAction: typeof chrome.action | typeof chrome.browserAction; private sidebarAction: OperaSidebarAction | FirefoxSidebarAction; - private inited = false; private win: Window & typeof globalThis; - private static readonly listenedToCommands = [ - "updateBadge", - "loggedIn", - "unlocked", - "syncCompleted", - "bgUpdateContextMenu", - "editedCipher", - "addedCipher", - "deletedCipher", - ]; - - static async windowsOnFocusChangedListener( - windowId: number, - serviceCache: Record - ) { - await new UpdateBadge(self).run({ windowId, existingServices: serviceCache }); - } - - static async tabsOnActivatedListener( - activeInfo: chrome.tabs.TabActiveInfo, - serviceCache: Record - ) { - await new UpdateBadge(self).run({ - tabId: activeInfo.tabId, - existingServices: serviceCache, - windowId: activeInfo.windowId, - }); - } - - static async tabsOnReplacedListener( - addedTabId: number, - removedTabId: number, - serviceCache: Record - ) { - await new UpdateBadge(self).run({ tabId: addedTabId, existingServices: serviceCache }); - } - - static async tabsOnUpdatedListener( - tabId: number, - changeInfo: chrome.tabs.TabChangeInfo, - tab: chrome.tabs.Tab, - serviceCache: Record - ) { - await new UpdateBadge(self).run({ - tabId, - existingServices: serviceCache, - windowId: tab.windowId, - }); - } - - static async messageListener( - message: { command: string; tabId: number }, - serviceCache: Record - ) { - if (!UpdateBadge.listenedToCommands.includes(message.command)) { - return; - } - - await new UpdateBadge(self).run({ existingServices: serviceCache }); - } - - constructor(win: Window & typeof globalThis) { + constructor(win: Window & typeof globalThis, services: MainBackground) { this.badgeAction = BrowserApi.getBrowserAction(); this.sidebarAction = BrowserApi.getSidebarAction(self); this.win = win; + + this.badgeSettingsService = services.badgeSettingsService; + this.authService = services.authService; + this.cipherService = services.cipherService; } - async run(opts?: { - tabId?: number; - windowId?: number; - existingServices?: Record; - }): Promise { - await this.initServices(opts?.existingServices); - + async run(opts?: { tabId?: number; windowId?: number }): Promise { const authStatus = await this.authService.getAuthStatus(); await this.setBadgeBackgroundColor(); @@ -148,12 +78,10 @@ export class UpdateBadge { } async setUnlocked(opts: BadgeOptions) { - await this.initServices(); - await this.setBadgeIcon(""); - const disableBadgeCounter = await this.stateService.getDisableBadgeCounter(); - if (disableBadgeCounter) { + const enableBadgeCounter = await firstValueFrom(this.badgeSettingsService.enableBadgeCounter$); + if (!enableBadgeCounter) { return; } @@ -167,6 +95,8 @@ export class UpdateBadge { setBadgeBackgroundColor(color = "#294e5f") { if (this.badgeAction?.setBadgeBackgroundColor) { + // 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.badgeAction.setBadgeBackgroundColor({ color }); } if (this.isOperaSidebar(this.sidebarAction)) { @@ -196,6 +126,8 @@ export class UpdateBadge { private setActionText(text: string, tabId?: number) { if (this.badgeAction?.setBadgeText) { + // 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.badgeAction.setBadgeText({ text, tabId }); } } @@ -206,6 +138,8 @@ export class UpdateBadge { } else if (this.sidebarAction) { // Firefox const title = `Bitwarden${Utils.isNullOrEmpty(text) ? "" : ` [${text}]`}`; + // 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.sidebarAction.setTitle({ title, tabId }); } } @@ -216,6 +150,8 @@ export class UpdateBadge { } if (this.useSyncApiCalls) { + // 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.badgeAction.setIcon(options); } else { await new Promise((resolve) => this.badgeAction.setIcon(options, () => resolve())); @@ -229,7 +165,7 @@ export class UpdateBadge { if (this.isOperaSidebar(this.sidebarAction)) { await new Promise((resolve) => - (this.sidebarAction as OperaSidebarAction).setIcon(options, () => resolve()) + (this.sidebarAction as OperaSidebarAction).setIcon(options, () => resolve()), ); } else { await this.sidebarAction.setIcon(options); @@ -253,54 +189,8 @@ export class UpdateBadge { ); } - private async initServices(existingServiceCache?: Record): Promise { - if (this.inited) { - return this; - } - - const serviceCache: Record = existingServiceCache || {}; - const opts = { - cryptoFunctionServiceOptions: { win: self }, - encryptServiceOptions: { logMacFailures: false }, - logServiceOptions: { isDev: false }, - platformUtilsServiceOptions: { - clipboardWriteCallback: (clipboardValue: string, clearMs: number) => - Promise.reject("not implemented"), - biometricCallback: () => Promise.reject("not implemented"), - win: self, - }, - stateServiceOptions: { - stateFactory: new StateFactory(GlobalState, Account), - }, - apiServiceOptions: { - logoutCallback: () => Promise.reject("not implemented"), - }, - keyConnectorServiceOptions: { - logoutCallback: () => Promise.reject("not implemented"), - }, - i18nServiceOptions: { - systemLanguage: BrowserApi.getUILanguage(self), - }, - }; - this.stateService = await stateServiceFactory(serviceCache, opts); - this.authService = await authServiceFactory(serviceCache, opts); - this.cipherService = await cipherServiceFactory(serviceCache, opts); - - // Needed for cipher decryption - if (!self.bitwardenContainerService) { - new ContainerService( - serviceCache.cryptoService as CryptoService, - serviceCache.encryptService as EncryptService - ).attachToGlobal(self); - } - - this.inited = true; - - return this; - } - private isOperaSidebar( - action: OperaSidebarAction | FirefoxSidebarAction + action: OperaSidebarAction | FirefoxSidebarAction, ): action is OperaSidebarAction { return action != null && (action as OperaSidebarAction).setBadgeText != null; } diff --git a/apps/browser/src/platform/messaging/chrome-message.sender.ts b/apps/browser/src/platform/messaging/chrome-message.sender.ts new file mode 100644 index 00000000000..914b8fd43a4 --- /dev/null +++ b/apps/browser/src/platform/messaging/chrome-message.sender.ts @@ -0,0 +1,37 @@ +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { CommandDefinition, MessageSender } from "@bitwarden/common/platform/messaging"; +import { getCommand } from "@bitwarden/common/platform/messaging/internal"; + +type ErrorHandler = (logger: LogService, command: string) => void; + +const HANDLED_ERRORS: Record = { + "Could not establish connection. Receiving end does not exist.": (logger, command) => + logger.debug(`Receiving end didn't exist for command '${command}'`), + + "The message port closed before a response was received.": (logger, command) => + logger.debug(`Port was closed for command '${command}'`), +}; + +export class ChromeMessageSender implements MessageSender { + constructor(private readonly logService: LogService) {} + + send>( + commandDefinition: string | CommandDefinition, + payload: Record | T = {}, + ): void { + const command = getCommand(commandDefinition); + chrome.runtime.sendMessage(Object.assign(payload, { command: command }), () => { + if (chrome.runtime.lastError) { + const errorHandler = HANDLED_ERRORS[chrome.runtime.lastError.message]; + if (errorHandler != null) { + errorHandler(this.logService, command); + return; + } + + this.logService.warning( + `Unhandled error while sending message with command '${command}': ${chrome.runtime.lastError.message}`, + ); + } + }); + } +} diff --git a/apps/browser/src/platform/offscreen-document/abstractions/offscreen-document.ts b/apps/browser/src/platform/offscreen-document/abstractions/offscreen-document.ts new file mode 100644 index 00000000000..012f908f784 --- /dev/null +++ b/apps/browser/src/platform/offscreen-document/abstractions/offscreen-document.ts @@ -0,0 +1,29 @@ +export type OffscreenDocumentExtensionMessage = { + [key: string]: any; + command: string; + text?: string; +}; + +type OffscreenExtensionMessageEventParams = { + message: OffscreenDocumentExtensionMessage; + sender: chrome.runtime.MessageSender; +}; + +export type OffscreenDocumentExtensionMessageHandlers = { + [key: string]: ({ message, sender }: OffscreenExtensionMessageEventParams) => any; + offscreenCopyToClipboard: ({ message }: OffscreenExtensionMessageEventParams) => any; + offscreenReadFromClipboard: () => any; +}; + +export interface OffscreenDocument { + init(): void; +} + +export abstract class OffscreenDocumentService { + abstract offscreenApiSupported(): boolean; + abstract withDocument( + reasons: chrome.offscreen.Reason[], + justification: string, + callback: () => Promise | T, + ): Promise; +} diff --git a/apps/browser/src/platform/offscreen-document/index.html b/apps/browser/src/platform/offscreen-document/index.html new file mode 100644 index 00000000000..78c828043e5 --- /dev/null +++ b/apps/browser/src/platform/offscreen-document/index.html @@ -0,0 +1,13 @@ + + + + + + + Bitwarden Offscreen Document + + + diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.service.spec.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.service.spec.ts new file mode 100644 index 00000000000..da541403967 --- /dev/null +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.service.spec.ts @@ -0,0 +1,112 @@ +import { mock } from "jest-mock-extended"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; + +import { DefaultOffscreenDocumentService } from "./offscreen-document.service"; + +class TestCase { + synchronicity: string; + private _callback: () => Promise | any; + get callback() { + return jest.fn(this._callback); + } + + constructor(synchronicity: string, callback: () => Promise | any) { + this.synchronicity = synchronicity; + this._callback = callback; + } + + toString() { + return this.synchronicity; + } +} + +describe.each([ + new TestCase("synchronous callback", () => 42), + new TestCase("asynchronous callback", () => Promise.resolve(42)), +])("DefaultOffscreenDocumentService %s", (testCase) => { + const logService = mock(); + let sut: DefaultOffscreenDocumentService; + const reasons = [chrome.offscreen.Reason.TESTING]; + const justification = "justification is testing"; + const url = "offscreen-document/index.html"; + const api = { + createDocument: jest.fn(), + closeDocument: jest.fn(), + hasDocument: jest.fn().mockResolvedValue(false), + Reason: chrome.offscreen.Reason, + }; + let callback: jest.Mock<() => Promise | number>; + + beforeEach(() => { + callback = testCase.callback; + chrome.offscreen = api; + + sut = new DefaultOffscreenDocumentService(logService); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + describe("offscreenApiSupported", () => { + it("indicates whether the offscreen API is supported", () => { + expect(sut.offscreenApiSupported()).toBe(true); + }); + }); + + describe("withDocument", () => { + it("creates a document when none exists", async () => { + await sut.withDocument(reasons, justification, () => {}); + + expect(chrome.offscreen.createDocument).toHaveBeenCalledWith({ + url, + reasons, + justification, + }); + }); + + it("does not create a document when one exists", async () => { + api.hasDocument.mockResolvedValue(true); + + await sut.withDocument(reasons, justification, callback); + + expect(chrome.offscreen.createDocument).not.toHaveBeenCalled(); + }); + + describe.each([true, false])("hasDocument returns %s", (hasDocument) => { + beforeEach(() => { + api.hasDocument.mockResolvedValue(hasDocument); + }); + + it("calls the callback", async () => { + await sut.withDocument(reasons, justification, callback); + + expect(callback).toHaveBeenCalled(); + }); + + it("returns the callback result", async () => { + const result = await sut.withDocument(reasons, justification, callback); + + expect(result).toBe(42); + }); + + it("closes the document when the callback completes and no other callbacks are running", async () => { + await sut.withDocument(reasons, justification, callback); + + expect(chrome.offscreen.closeDocument).toHaveBeenCalled(); + }); + + it("does not close the document when the callback completes and other callbacks are running", async () => { + await Promise.all([ + sut.withDocument(reasons, justification, callback), + sut.withDocument(reasons, justification, callback), + sut.withDocument(reasons, justification, callback), + sut.withDocument(reasons, justification, callback), + ]); + + expect(chrome.offscreen.closeDocument).toHaveBeenCalledTimes(1); + }); + }); + }); +}); diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.service.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.service.ts new file mode 100644 index 00000000000..3a1227ea5e2 --- /dev/null +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.service.ts @@ -0,0 +1,59 @@ +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; + +import { OffscreenDocumentService } from "./abstractions/offscreen-document"; + +export class DefaultOffscreenDocumentService implements OffscreenDocumentService { + private workerCount = 0; + + constructor(private logService: LogService) {} + + offscreenApiSupported(): boolean { + return typeof chrome.offscreen !== "undefined"; + } + + async withDocument( + reasons: chrome.offscreen.Reason[], + justification: string, + callback: () => Promise | T, + ): Promise { + this.workerCount++; + try { + if (!(await this.documentExists())) { + await this.create(reasons, justification); + } + + return await callback(); + } finally { + this.workerCount--; + if (this.workerCount === 0) { + await this.close(); + } + } + } + + private async create(reasons: chrome.offscreen.Reason[], justification: string): Promise { + try { + await chrome.offscreen.createDocument({ + url: "offscreen-document/index.html", + reasons, + justification, + }); + } catch (e) { + // gobble multiple offscreen document creation errors + // TODO: remove this when the offscreen document service is fixed PM-8014 + if (e.message === "Only a single offscreen document may be created.") { + this.logService.info("Ignoring offscreen document creation error."); + return; + } + throw e; + } + } + + private async close(): Promise { + await chrome.offscreen.closeDocument(); + } + + private async documentExists(): Promise { + return await chrome.offscreen.hasDocument(); + } +} diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts new file mode 100644 index 00000000000..4065f2e46d7 --- /dev/null +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts @@ -0,0 +1,64 @@ +import { flushPromises, sendMockExtensionMessage } from "../../autofill/spec/testing-utils"; +import { BrowserApi } from "../browser/browser-api"; +import BrowserClipboardService from "../services/browser-clipboard.service"; + +describe("OffscreenDocument", () => { + const browserApiMessageListenerSpy = jest.spyOn(BrowserApi, "messageListener"); + const browserClipboardServiceCopySpy = jest.spyOn(BrowserClipboardService, "copy"); + const browserClipboardServiceReadSpy = jest.spyOn(BrowserClipboardService, "read"); + const consoleErrorSpy = jest.spyOn(console, "error"); + + require("../offscreen-document/offscreen-document"); + + describe("init", () => { + it("sets up a `chrome.runtime.onMessage` listener", () => { + expect(browserApiMessageListenerSpy).toHaveBeenCalledWith( + "offscreen-document", + expect.any(Function), + ); + }); + }); + + describe("extension message handlers", () => { + it("ignores messages that do not have a handler registered with the corresponding command", () => { + sendMockExtensionMessage({ command: "notAValidCommand" }); + + expect(browserClipboardServiceCopySpy).not.toHaveBeenCalled(); + expect(browserClipboardServiceReadSpy).not.toHaveBeenCalled(); + }); + + it("shows a console message if the handler throws an error", async () => { + const error = new Error("test error"); + browserClipboardServiceCopySpy.mockRejectedValueOnce(new Error("test error")); + + sendMockExtensionMessage({ command: "offscreenCopyToClipboard", text: "test" }); + await flushPromises(); + + expect(browserClipboardServiceCopySpy).toHaveBeenCalled(); + expect(consoleErrorSpy).toHaveBeenCalledWith( + "Error resolving extension message response", + error, + ); + }); + + describe("handleOffscreenCopyToClipboard", () => { + it("copies the message text", async () => { + const text = "test"; + + sendMockExtensionMessage({ command: "offscreenCopyToClipboard", text }); + await flushPromises(); + + expect(browserClipboardServiceCopySpy).toHaveBeenCalledWith(window, text); + }); + }); + + describe("handleOffscreenReadFromClipboard", () => { + it("reads the value from the clipboard service", async () => { + sendMockExtensionMessage({ command: "offscreenReadFromClipboard" }); + await flushPromises(); + + expect(browserClipboardServiceReadSpy).toHaveBeenCalledWith(window); + }); + }); + }); +}); diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.ts new file mode 100644 index 00000000000..938e3191e0d --- /dev/null +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.ts @@ -0,0 +1,98 @@ +import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; + +import { BrowserApi } from "../browser/browser-api"; +import BrowserClipboardService from "../services/browser-clipboard.service"; + +import { + OffscreenDocumentExtensionMessage, + OffscreenDocumentExtensionMessageHandlers, + OffscreenDocument as OffscreenDocumentInterface, +} from "./abstractions/offscreen-document"; + +class OffscreenDocument implements OffscreenDocumentInterface { + private consoleLogService: ConsoleLogService = new ConsoleLogService(false); + private readonly extensionMessageHandlers: OffscreenDocumentExtensionMessageHandlers = { + offscreenCopyToClipboard: ({ message }) => this.handleOffscreenCopyToClipboard(message), + offscreenReadFromClipboard: () => this.handleOffscreenReadFromClipboard(), + localStorageGet: ({ message }) => this.handleLocalStorageGet(message.key), + localStorageSave: ({ message }) => this.handleLocalStorageSave(message.key, message.value), + localStorageRemove: ({ message }) => this.handleLocalStorageRemove(message.key), + }; + + /** + * Initializes the offscreen document extension. + */ + init() { + this.setupExtensionMessageListener(); + } + + /** + * Copies the given text to the user's clipboard. + * + * @param message - The extension message containing the text to copy + */ + private async handleOffscreenCopyToClipboard(message: OffscreenDocumentExtensionMessage) { + await BrowserClipboardService.copy(self, message.text); + } + + /** + * Reads the user's clipboard and returns the text. + */ + private async handleOffscreenReadFromClipboard() { + return await BrowserClipboardService.read(self); + } + + private handleLocalStorageGet(key: string) { + return self.localStorage.getItem(key); + } + + private handleLocalStorageSave(key: string, value: string) { + self.localStorage.setItem(key, value); + } + + private handleLocalStorageRemove(key: string) { + self.localStorage.removeItem(key); + } + + /** + * Sets up the listener for extension messages. + */ + private setupExtensionMessageListener() { + BrowserApi.messageListener("offscreen-document", this.handleExtensionMessage); + } + + /** + * Handles extension messages sent to the extension background. + * + * @param message - The message received from the extension + * @param sender - The sender of the message + * @param sendResponse - The response to send back to the sender + */ + private handleExtensionMessage = ( + message: OffscreenDocumentExtensionMessage, + sender: chrome.runtime.MessageSender, + sendResponse: (response?: any) => void, + ) => { + const handler: CallableFunction | undefined = this.extensionMessageHandlers[message?.command]; + if (!handler) { + return; + } + + const messageResponse = handler({ message, sender }); + if (!messageResponse) { + return; + } + + Promise.resolve(messageResponse) + .then((response) => sendResponse(response)) + .catch((error) => + this.consoleLogService.error("Error resolving extension message response", error), + ); + return true; + }; +} + +(() => { + const offscreenDocument = new OffscreenDocument(); + offscreenDocument.init(); +})(); diff --git a/apps/browser/src/platform/polyfills/zone-patch-chrome-runtime.ts b/apps/browser/src/platform/polyfills/zone-patch-chrome-runtime.ts deleted file mode 100644 index fa731840f8b..00000000000 --- a/apps/browser/src/platform/polyfills/zone-patch-chrome-runtime.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Monkey patch `chrome.runtime.onMessage` event listeners to run in the Angular zone. - */ -Zone.__load_patch("ChromeRuntimeOnMessage", (global: any, Zone: ZoneType, api: _ZonePrivate) => { - const onMessage = global.chrome.runtime.onMessage; - if (typeof global?.chrome?.runtime?.onMessage === "undefined") { - return; - } - - // eslint-disable-next-line @typescript-eslint/ban-types - api.patchMethod(onMessage, "addListener", (delegate: Function) => (self: any, args: any[]) => { - const callback = args.length > 0 ? args[0] : null; - if (typeof callback === "function") { - const wrapperedCallback = Zone.current.wrap(callback, "ChromeRuntimeOnMessage"); - callback[api.symbol("chromeRuntimeOnMessageCallback")] = wrapperedCallback; - return delegate.call(self, wrapperedCallback); - } else { - return delegate.apply(self, args); - } - }); - - // eslint-disable-next-line @typescript-eslint/ban-types - api.patchMethod(onMessage, "removeListener", (delegate: Function) => (self: any, args: any[]) => { - const callback = args.length > 0 ? args[0] : null; - if (typeof callback === "function") { - const wrapperedCallback = callback[api.symbol("chromeRuntimeOnMessageCallback")]; - if (wrapperedCallback) { - return delegate.call(self, wrapperedCallback); - } else { - return delegate.apply(self, args); - } - } else { - return delegate.apply(self, args); - } - }); -}); diff --git a/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts b/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts deleted file mode 100644 index 0b3f55ee990..00000000000 --- a/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts +++ /dev/null @@ -1,15 +0,0 @@ -interface BrowserPopoutWindowService { - openUnlockPrompt(senderWindowId: number): Promise; - closeUnlockPrompt(): Promise; - openPasswordRepromptPrompt( - senderWindowId: number, - promptData: { - action: string; - cipherId: string; - senderTabId: number; - } - ): Promise; - closePasswordRepromptPrompt(): Promise; -} - -export { BrowserPopoutWindowService }; diff --git a/apps/browser/src/platform/popup/abstractions/browser-popup-utils.abstractions.ts b/apps/browser/src/platform/popup/abstractions/browser-popup-utils.abstractions.ts new file mode 100644 index 00000000000..c9952342e42 --- /dev/null +++ b/apps/browser/src/platform/popup/abstractions/browser-popup-utils.abstractions.ts @@ -0,0 +1,6 @@ +type ScrollOptions = { + delay: number; + containerSelector: string; +}; + +export { ScrollOptions }; diff --git a/apps/browser/src/platform/popup/browser-popout-window.service.ts b/apps/browser/src/platform/popup/browser-popout-window.service.ts deleted file mode 100644 index ee03e3a2ec4..00000000000 --- a/apps/browser/src/platform/popup/browser-popout-window.service.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { BrowserApi } from "../browser/browser-api"; - -import { BrowserPopoutWindowService as BrowserPopupWindowServiceInterface } from "./abstractions/browser-popout-window.service"; - -class BrowserPopoutWindowService implements BrowserPopupWindowServiceInterface { - private singleActionPopoutTabIds: Record = {}; - private defaultPopoutWindowOptions: chrome.windows.CreateData = { - type: "normal", - focused: true, - width: 500, - height: 800, - }; - - async openUnlockPrompt(senderWindowId: number) { - await this.openSingleActionPopout( - senderWindowId, - "popup/index.html?uilocation=popout", - "unlockPrompt" - ); - } - - async closeUnlockPrompt() { - await this.closeSingleActionPopout("unlockPrompt"); - } - - async openPasswordRepromptPrompt( - senderWindowId: number, - { - cipherId, - senderTabId, - action, - }: { - cipherId: string; - senderTabId: number; - action: string; - } - ) { - const promptWindowPath = - "popup/index.html#/view-cipher" + - "?uilocation=popout" + - `&cipherId=${cipherId}` + - `&senderTabId=${senderTabId}` + - `&action=${action}`; - - await this.openSingleActionPopout(senderWindowId, promptWindowPath, "passwordReprompt"); - } - - async closePasswordRepromptPrompt() { - await this.closeSingleActionPopout("passwordReprompt"); - } - - private async openSingleActionPopout( - senderWindowId: number, - popupWindowURL: string, - singleActionPopoutKey: string - ) { - const senderWindow = senderWindowId && (await BrowserApi.getWindow(senderWindowId)); - const url = chrome.extension.getURL(popupWindowURL); - const offsetRight = 15; - const offsetTop = 90; - const popupWidth = this.defaultPopoutWindowOptions.width; - const windowOptions = senderWindow - ? { - ...this.defaultPopoutWindowOptions, - url, - left: senderWindow.left + senderWindow.width - popupWidth - offsetRight, - top: senderWindow.top + offsetTop, - } - : { ...this.defaultPopoutWindowOptions, url }; - - const popupWindow = await BrowserApi.createWindow(windowOptions); - - await this.closeSingleActionPopout(singleActionPopoutKey); - this.singleActionPopoutTabIds[singleActionPopoutKey] = popupWindow?.tabs[0].id; - } - - private async closeSingleActionPopout(popoutKey: string) { - const tabId = this.singleActionPopoutTabIds[popoutKey]; - - if (tabId) { - await BrowserApi.removeTab(tabId); - } - this.singleActionPopoutTabIds[popoutKey] = null; - } -} - -export default BrowserPopoutWindowService; diff --git a/apps/browser/src/platform/popup/browser-popup-utils.spec.ts b/apps/browser/src/platform/popup/browser-popup-utils.spec.ts new file mode 100644 index 00000000000..73f0d23f4f2 --- /dev/null +++ b/apps/browser/src/platform/popup/browser-popup-utils.spec.ts @@ -0,0 +1,421 @@ +import { createChromeTabMock } from "../../autofill/spec/autofill-mocks"; +import { BrowserApi } from "../browser/browser-api"; + +import BrowserPopupUtils from "./browser-popup-utils"; + +describe("BrowserPopupUtils", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("inSidebar", () => { + it("should return true if the window contains the sidebar query param", () => { + const win = { location: { href: "https://jest-testing.com?uilocation=sidebar" } } as Window; + + expect(BrowserPopupUtils.inSidebar(win)).toBe(true); + }); + + it("should return false if the window does not contain the sidebar query param", () => { + const win = { location: { href: "https://jest-testing.com?uilocation=popout" } } as Window; + + expect(BrowserPopupUtils.inSidebar(win)).toBe(false); + }); + }); + + describe("inPopout", () => { + it("should return true if the window contains the popout query param", () => { + const win = { location: { href: "https://jest-testing.com?uilocation=popout" } } as Window; + + expect(BrowserPopupUtils.inPopout(win)).toBe(true); + }); + + it("should return false if the window does not contain the popout query param", () => { + const win = { location: { href: "https://jest-testing.com?uilocation=sidebar" } } as Window; + + expect(BrowserPopupUtils.inPopout(win)).toBe(false); + }); + }); + + describe("inSingleActionPopout", () => { + it("should return true if the window contains the singleActionPopout query param", () => { + const win = { + location: { href: "https://jest-testing.com?singleActionPopout=123" }, + } as Window; + + expect(BrowserPopupUtils.inSingleActionPopout(win, "123")).toBe(true); + }); + + it("should return false if the window does not contain the singleActionPopout query param", () => { + const win = { location: { href: "https://jest-testing.com" } } as Window; + + expect(BrowserPopupUtils.inSingleActionPopout(win, "123")).toBe(false); + }); + }); + + describe("inPopup", () => { + it("should return true if the window does not contain the popup query param", () => { + const win = { location: { href: "https://jest-testing.com" } } as Window; + + expect(BrowserPopupUtils.inPopup(win)).toBe(true); + }); + + it("should return true if the window contains the popup query param", () => { + const win = { location: { href: "https://jest-testing.com?uilocation=popup" } } as Window; + + expect(BrowserPopupUtils.inPopup(win)).toBe(true); + }); + + it("should return false if the window does not contain the popup query param", () => { + const win = { location: { href: "https://jest-testing.com?uilocation=sidebar" } } as Window; + + expect(BrowserPopupUtils.inPopup(win)).toBe(false); + }); + }); + + describe("getContentScrollY", () => { + it("should return the scroll position of the popup", () => { + const win = { + document: { getElementsByTagName: () => [{ scrollTop: 100 }] }, + } as unknown as Window; + + expect(BrowserPopupUtils.getContentScrollY(win)).toBe(100); + }); + }); + + describe("setContentScrollY", () => { + it("should set the scroll position of the popup", async () => { + window.document.body.innerHTML = ` +
+
+
+ `; + + await BrowserPopupUtils.setContentScrollY(window, 200); + + expect(window.document.getElementsByTagName("main")[0].scrollTop).toBe(200); + }); + + it("should not set the scroll position of the popup if the scrollY is null", async () => { + window.document.body.innerHTML = ` +
+
+
+ `; + + await BrowserPopupUtils.setContentScrollY(window, null); + + expect(window.document.getElementsByTagName("main")[0].scrollTop).toBe(0); + }); + + it("will set the scroll position of the popup after the provided delay", async () => { + jest.useRealTimers(); + window.document.body.innerHTML = ` +
+
+
+ `; + + await BrowserPopupUtils.setContentScrollY(window, 300, { + delay: 200, + containerSelector: ".scrolling-container", + }); + + expect(window.document.querySelector(".scrolling-container").scrollTop).toBe(300); + }); + }); + + describe("backgroundInitializationRequired", () => { + it("return true if the background page is a null value", () => { + jest.spyOn(BrowserApi, "getBackgroundPage").mockReturnValue(null); + + expect(BrowserPopupUtils.backgroundInitializationRequired()).toBe(true); + }); + + it("return false if the background page is not a null value", () => { + jest.spyOn(BrowserApi, "getBackgroundPage").mockReturnValue({}); + + expect(BrowserPopupUtils.backgroundInitializationRequired()).toBe(false); + }); + }); + + describe("openPopout", () => { + beforeEach(() => { + jest.spyOn(BrowserApi, "getWindow").mockResolvedValueOnce({ + id: 1, + left: 100, + top: 100, + focused: false, + alwaysOnTop: false, + incognito: false, + width: 380, + }); + jest.spyOn(BrowserApi, "createWindow").mockImplementation(); + }); + + it("creates a window with the default window options", async () => { + const url = "popup/index.html"; + jest.spyOn(BrowserPopupUtils as any, "isSingleActionPopoutOpen").mockResolvedValueOnce(false); + + await BrowserPopupUtils.openPopout(url); + + expect(BrowserApi.createWindow).toHaveBeenCalledWith({ + type: "popup", + focused: true, + width: 380, + height: 630, + left: 85, + top: 190, + url: `chrome-extension://id/${url}?uilocation=popout`, + }); + }); + + it("skips parsing the passed extension url path if the option to do that is set", () => { + const url = "popup/index.html?uilocation=popout#/tabs/vault"; + jest.spyOn(BrowserPopupUtils as any, "isSingleActionPopoutOpen").mockResolvedValueOnce(false); + jest.spyOn(BrowserPopupUtils as any, "buildPopoutUrl"); + + // 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 + BrowserPopupUtils.openPopout(url); + + expect(BrowserPopupUtils["buildPopoutUrl"]).not.toHaveBeenCalled(); + }); + + it("replaces any existing `uilocation=` query params within the passed extension url path to state the uilocation is a popup", async () => { + const url = "popup/index.html?uilocation=sidebar#/tabs/vault"; + jest.spyOn(BrowserPopupUtils as any, "isSingleActionPopoutOpen").mockResolvedValueOnce(false); + + await BrowserPopupUtils.openPopout(url); + + expect(BrowserApi.createWindow).toHaveBeenCalledWith({ + type: "popup", + focused: true, + width: 380, + height: 630, + left: 85, + top: 190, + url: `chrome-extension://id/popup/index.html?uilocation=popout#/tabs/vault`, + }); + }); + + it("creates a single action popout window", async () => { + const url = "popup/index.html"; + jest.spyOn(BrowserPopupUtils as any, "isSingleActionPopoutOpen").mockResolvedValueOnce(false); + + await BrowserPopupUtils.openPopout(url, { singleActionKey: "123" }); + + expect(BrowserApi.createWindow).toHaveBeenCalledWith({ + type: "popup", + focused: true, + width: 380, + height: 630, + left: 85, + top: 190, + url: `chrome-extension://id/${url}?uilocation=popout&singleActionPopout=123`, + }); + }); + + it("does not create a single action popout window if it is already open", async () => { + const url = "popup/index.html"; + jest.spyOn(BrowserPopupUtils as any, "isSingleActionPopoutOpen").mockResolvedValueOnce(true); + + await BrowserPopupUtils.openPopout(url, { singleActionKey: "123" }); + + expect(BrowserApi.createWindow).not.toHaveBeenCalled(); + }); + + it("creates a window with the provided window options", async () => { + const url = "popup/index.html"; + jest.spyOn(BrowserPopupUtils as any, "isSingleActionPopoutOpen").mockResolvedValueOnce(false); + + await BrowserPopupUtils.openPopout(url, { + windowOptions: { + type: "popup", + focused: false, + width: 100, + height: 100, + }, + }); + + expect(BrowserApi.createWindow).toHaveBeenCalledWith({ + type: "popup", + focused: false, + width: 100, + height: 100, + left: 85, + top: 190, + url: `chrome-extension://id/${url}?uilocation=popout`, + }); + }); + + it("opens a single action window if the forceCloseExistingWindows param is true", async () => { + const url = "popup/index.html"; + jest.spyOn(BrowserPopupUtils as any, "isSingleActionPopoutOpen").mockResolvedValueOnce(true); + + await BrowserPopupUtils.openPopout(url, { + singleActionKey: "123", + forceCloseExistingWindows: true, + }); + + expect(BrowserApi.createWindow).toHaveBeenCalledWith({ + type: "popup", + focused: true, + width: 380, + height: 630, + left: 85, + top: 190, + url: `chrome-extension://id/${url}?uilocation=popout&singleActionPopout=123`, + }); + }); + }); + + describe("openCurrentPagePopout", () => { + it("opens a popout window for the current page", async () => { + const win = { location: { href: "https://example.com#/tabs/current" } } as Window; + jest.spyOn(BrowserPopupUtils, "openPopout").mockImplementation(); + jest.spyOn(BrowserApi, "closePopup").mockImplementation(); + jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(false); + + await BrowserPopupUtils.openCurrentPagePopout(win); + + expect(BrowserPopupUtils.openPopout).toHaveBeenCalledWith("/#/tabs/vault"); + expect(BrowserApi.closePopup).not.toHaveBeenCalled(); + }); + + it("opens a popout window for the specified URL", async () => { + const win = {} as Window; + jest.spyOn(BrowserPopupUtils, "openPopout").mockImplementation(); + jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(false); + + await BrowserPopupUtils.openCurrentPagePopout(win, "https://example.com#/settings"); + + expect(BrowserPopupUtils.openPopout).toHaveBeenCalledWith("/#/settings"); + }); + + it("opens a popout window for the current page and closes the popup window", async () => { + const win = { location: { href: "https://example.com/#/tabs/vault" } } as Window; + jest.spyOn(BrowserPopupUtils, "openPopout").mockImplementation(); + jest.spyOn(BrowserApi, "closePopup").mockImplementation(); + jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(true); + + await BrowserPopupUtils.openCurrentPagePopout(win); + + expect(BrowserPopupUtils.openPopout).toHaveBeenCalledWith("/#/tabs/vault"); + expect(BrowserApi.closePopup).toHaveBeenCalledWith(win); + }); + }); + + describe("closeSingleActionPopout", () => { + it("closes any existing single action popouts", async () => { + const url = "popup/index.html"; + jest.useFakeTimers(); + jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValueOnce([ + createChromeTabMock({ + id: 10, + url: `chrome-extension://id/${url}?uilocation=popout&singleActionPopout=123`, + windowId: 11, + }), + createChromeTabMock({ + id: 20, + url: `chrome-extension://id/${url}?uilocation=popout&singleActionPopout=123`, + windowId: 21, + }), + createChromeTabMock({ + id: 30, + url: `chrome-extension://id/${url}?uilocation=popout&singleActionPopout=456`, + windowId: 31, + }), + ]); + jest.spyOn(BrowserApi, "removeWindow").mockResolvedValueOnce(); + + await BrowserPopupUtils.closeSingleActionPopout("123"); + jest.runOnlyPendingTimers(); + + expect(BrowserApi.removeWindow).toHaveBeenNthCalledWith(1, 11); + expect(BrowserApi.removeWindow).toHaveBeenNthCalledWith(2, 21); + expect(BrowserApi.removeWindow).not.toHaveBeenCalledWith(31); + }); + }); + + describe("isSingleActionPopoutOpen", () => { + const windowOptions = { + id: 1, + left: 100, + top: 100, + focused: false, + alwaysOnTop: false, + incognito: false, + width: 500, + height: 800, + }; + + beforeEach(() => { + jest.spyOn(BrowserApi, "updateWindowProperties").mockImplementation(); + jest.spyOn(BrowserApi, "removeWindow").mockImplementation(); + }); + + it("returns false if the popoutKey is not provided", async () => { + await expect(BrowserPopupUtils["isSingleActionPopoutOpen"](undefined, {})).resolves.toBe( + false, + ); + }); + + it("returns false if no popout windows are found", async () => { + jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValueOnce([]); + + await expect( + BrowserPopupUtils["isSingleActionPopoutOpen"]("123", windowOptions), + ).resolves.toBe(false); + }); + + it("returns false if no single action popout is found relating to the popoutKey", async () => { + jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValueOnce([ + createChromeTabMock({ + id: 10, + url: `chrome-extension://id/popup/index.html?uilocation=popout&singleActionPopout=123`, + }), + createChromeTabMock({ + id: 20, + url: `chrome-extension://id/popup/index.html?uilocation=popout&singleActionPopout=123`, + }), + createChromeTabMock({ + id: 30, + url: `chrome-extension://id/popup/index.html?uilocation=popout&singleActionPopout=456`, + }), + ]); + + await expect( + BrowserPopupUtils["isSingleActionPopoutOpen"]("789", windowOptions), + ).resolves.toBe(false); + }); + + it("returns true if a single action popout is found relating to the popoutKey", async () => { + jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValueOnce([ + createChromeTabMock({ + id: 10, + url: `chrome-extension://id/popup/index.html?uilocation=popout&singleActionPopout=123`, + }), + createChromeTabMock({ + id: 20, + url: `chrome-extension://id/popup/index.html?uilocation=popout&singleActionPopout=123`, + }), + createChromeTabMock({ + id: 30, + url: `chrome-extension://id/popup/index.html?uilocation=popout&singleActionPopout=456`, + }), + ]); + + await expect( + BrowserPopupUtils["isSingleActionPopoutOpen"]("123", windowOptions), + ).resolves.toBe(true); + expect(BrowserApi.updateWindowProperties).toHaveBeenCalledWith(2, { + focused: true, + width: 500, + height: 800, + top: 100, + left: 100, + }); + expect(BrowserApi.removeWindow).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/apps/browser/src/platform/popup/browser-popup-utils.ts b/apps/browser/src/platform/popup/browser-popup-utils.ts new file mode 100644 index 00000000000..fb53d3451f2 --- /dev/null +++ b/apps/browser/src/platform/popup/browser-popup-utils.ts @@ -0,0 +1,258 @@ +import { BrowserApi } from "../browser/browser-api"; + +import { ScrollOptions } from "./abstractions/browser-popup-utils.abstractions"; + +class BrowserPopupUtils { + /** + * Identifies if the popup is within the sidebar. + * + * @param win - The passed window object. + */ + static inSidebar(win: Window): boolean { + return BrowserPopupUtils.urlContainsSearchParams(win, "uilocation", "sidebar"); + } + + /** + * Identifies if the popup is within the popout. + * + * @param win - The passed window object. + */ + static inPopout(win: Window): boolean { + return BrowserPopupUtils.urlContainsSearchParams(win, "uilocation", "popout"); + } + + /** + * Identifies if the popup is within the single action popout. + * + * @param win - The passed window object. + * @param popoutKey - The single action popout key used to identify the popout. + */ + static inSingleActionPopout(win: Window, popoutKey: string): boolean { + return BrowserPopupUtils.urlContainsSearchParams(win, "singleActionPopout", popoutKey); + } + + /** + * Identifies if the popup is within the popup. + * + * @param win - The passed window object. + */ + static inPopup(win: Window): boolean { + return ( + win.location.href.indexOf("uilocation=") === -1 || + win.location.href.indexOf("uilocation=popup") > -1 + ); + } + + /** + * Gets the scroll position of the popup. + * + * @param win - The passed window object. + * @param scrollingContainer - Element tag name of the scrolling container. + */ + static getContentScrollY(win: Window, scrollingContainer = "main"): number { + const content = win.document.getElementsByTagName(scrollingContainer)[0]; + return content.scrollTop; + } + + /** + * Sets the scroll position of the popup. + * + * @param win - The passed window object. + * @param scrollYAmount - The amount to scroll the popup. + * @param options - Allows for setting the delay in ms to wait before scrolling the popup and the scrolling container tag name. + */ + static async setContentScrollY( + win: Window, + scrollYAmount: number | undefined, + options: ScrollOptions = { + delay: 0, + containerSelector: "main", + }, + ) { + const { delay, containerSelector } = options; + return new Promise((resolve) => + win.setTimeout(() => { + const container = win.document.querySelector(containerSelector); + if (!isNaN(scrollYAmount) && container) { + container.scrollTop = scrollYAmount; + } + + resolve(); + }, delay), + ); + } + + /** + * Identifies if the background page needs to be initialized. + */ + static backgroundInitializationRequired() { + return !BrowserApi.getBackgroundPage() || BrowserApi.isManifestVersion(3); + } + + /** + * Opens a popout window of any extension page. If the popout window is already open, it will be focused. + * + * @param extensionUrlPath - A relative path to the extension page. Example: "popup/index.html#/tabs/vault" + * @param options - Options for the popout window that overrides the default options. + */ + static async openPopout( + extensionUrlPath: string, + options: { + senderWindowId?: number; + singleActionKey?: string; + forceCloseExistingWindows?: boolean; + windowOptions?: Partial; + } = {}, + ) { + const { senderWindowId, singleActionKey, forceCloseExistingWindows, windowOptions } = options; + const defaultPopoutWindowOptions: chrome.windows.CreateData = { + type: "popup", + focused: true, + width: 380, + height: 630, + }; + const offsetRight = 15; + const offsetTop = 90; + const popupWidth = defaultPopoutWindowOptions.width; + const senderWindow = await BrowserApi.getWindow(senderWindowId); + const popoutWindowOptions = { + left: senderWindow.left + senderWindow.width - popupWidth - offsetRight, + top: senderWindow.top + offsetTop, + ...defaultPopoutWindowOptions, + ...windowOptions, + url: BrowserPopupUtils.buildPopoutUrl(extensionUrlPath, singleActionKey), + }; + + if ( + (await BrowserPopupUtils.isSingleActionPopoutOpen( + singleActionKey, + popoutWindowOptions, + forceCloseExistingWindows, + )) && + !forceCloseExistingWindows + ) { + return; + } + + return await BrowserApi.createWindow(popoutWindowOptions); + } + + /** + * Closes the single action popout window. + * + * @param popoutKey - The single action popout key used to identify the popout. + * @param delayClose - The amount of time to wait before closing the popout. Defaults to 0. + */ + static async closeSingleActionPopout(popoutKey: string, delayClose = 0): Promise { + const extensionUrl = chrome.runtime.getURL("popup/index.html"); + const tabs = await BrowserApi.tabsQuery({ url: `${extensionUrl}*` }); + for (const tab of tabs) { + if (!tab.url.includes(`singleActionPopout=${popoutKey}`)) { + continue; + } + + setTimeout(() => BrowserApi.removeWindow(tab.windowId), delayClose); + } + } + + /** + * Opens a popout window for the current page. + * If the current page is set for the current tab, then the + * popout window will be set for the vault items listing tab. + * + * @param win - The passed window object. + * @param href - The href to open in the popout window. + */ + static async openCurrentPagePopout(win: Window, href: string = null) { + const popoutUrl = href || win.location.href; + const parsedUrl = new URL(popoutUrl); + let hashRoute = parsedUrl.hash; + if (hashRoute.startsWith("#/tabs/current")) { + hashRoute = "#/tabs/vault"; + } + + await BrowserPopupUtils.openPopout(`${parsedUrl.pathname}${hashRoute}`); + + if (BrowserPopupUtils.inPopup(win)) { + BrowserApi.closePopup(win); + } + } + + /** + * Identifies if a single action window is open based on the passed popoutKey. + * Will focus the existing window, and close any other windows that might exist + * with the same popout key. + * + * @param popoutKey - The single action popout key used to identify the popout. + * @param windowInfo - The window info to use to update the existing window. + * @param forceCloseExistingWindows - Identifies if the existing windows should be closed. + */ + private static async isSingleActionPopoutOpen( + popoutKey: string | undefined, + windowInfo: chrome.windows.CreateData, + forceCloseExistingWindows = false, + ) { + if (!popoutKey) { + return false; + } + + const extensionUrl = chrome.runtime.getURL("popup/index.html"); + const popoutTabs = (await BrowserApi.tabsQuery({ url: `${extensionUrl}*` })).filter((tab) => + tab.url.includes(`singleActionPopout=${popoutKey}`), + ); + if (popoutTabs.length === 0) { + return false; + } + + if (!forceCloseExistingWindows) { + // Update first, remove it from list + const tab = popoutTabs.shift(); + await BrowserApi.updateWindowProperties(tab.windowId, { + focused: true, + width: windowInfo.width, + height: windowInfo.height, + top: windowInfo.top, + left: windowInfo.left, + }); + } + + popoutTabs.forEach((tab) => BrowserApi.removeWindow(tab.windowId)); + + return true; + } + + /** + * Identifies if the url contains the specified search param and value. + * + * @param win - The passed window object. + * @param searchParam - The search param to identify. + * @param searchValue - The search value to identify. + */ + private static urlContainsSearchParams( + win: Window, + searchParam: string, + searchValue: string, + ): boolean { + return win.location.href.indexOf(`${searchParam}=${searchValue}`) > -1; + } + + /** + * Builds the popout url path. Ensures that the uilocation param is set to + * `popout` and that the singleActionPopout param is set to the passed singleActionKey. + * + * @param extensionUrlPath - A relative path to the extension page. Example: "popup/index.html#/tabs/vault" + * @param singleActionKey - The single action popout key used to identify the popout. + */ + private static buildPopoutUrl(extensionUrlPath: string, singleActionKey: string) { + const parsedUrl = new URL(chrome.runtime.getURL(extensionUrlPath)); + parsedUrl.searchParams.set("uilocation", "popout"); + + if (singleActionKey) { + parsedUrl.searchParams.set("singleActionPopout", singleActionKey); + } + + return parsedUrl.toString(); + } +} + +export default BrowserPopupUtils; diff --git a/apps/browser/src/platform/popup/components/pop-out.component.html b/apps/browser/src/platform/popup/components/pop-out.component.html new file mode 100644 index 00000000000..c3f1f8ca150 --- /dev/null +++ b/apps/browser/src/platform/popup/components/pop-out.component.html @@ -0,0 +1,15 @@ + + + + + + diff --git a/apps/browser/src/platform/popup/components/pop-out.component.ts b/apps/browser/src/platform/popup/components/pop-out.component.ts new file mode 100644 index 00000000000..54bed7aa348 --- /dev/null +++ b/apps/browser/src/platform/popup/components/pop-out.component.ts @@ -0,0 +1,43 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input, OnInit } 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 { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { IconButtonModule } from "@bitwarden/components"; + +import BrowserPopupUtils from "../browser-popup-utils"; + +@Component({ + selector: "app-pop-out", + templateUrl: "pop-out.component.html", + standalone: true, + imports: [CommonModule, JslibModule, IconButtonModule], +}) +export class PopOutComponent implements OnInit { + @Input() show = true; + useRefreshVariant = false; + + constructor( + private platformUtilsService: PlatformUtilsService, + private configService: ConfigService, + ) {} + + async ngOnInit() { + this.useRefreshVariant = await this.configService.getFeatureFlag(FeatureFlag.ExtensionRefresh); + + if (this.show) { + if ( + (BrowserPopupUtils.inSidebar(window) && this.platformUtilsService.isFirefox()) || + BrowserPopupUtils.inPopout(window) + ) { + this.show = false; + } + } + } + + async expand() { + await BrowserPopupUtils.openCurrentPagePopout(window); + } +} diff --git a/apps/browser/src/platform/popup/header.component.html b/apps/browser/src/platform/popup/header.component.html new file mode 100644 index 00000000000..6b3677aacc7 --- /dev/null +++ b/apps/browser/src/platform/popup/header.component.html @@ -0,0 +1,13 @@ +
+
+ + + +
+ + + + +
+
+
diff --git a/apps/browser/src/platform/popup/header.component.ts b/apps/browser/src/platform/popup/header.component.ts new file mode 100644 index 00000000000..cba9f20b629 --- /dev/null +++ b/apps/browser/src/platform/popup/header.component.ts @@ -0,0 +1,33 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input } from "@angular/core"; +import { Observable, map, of, switchMap } from "rxjs"; + +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; + +import { CurrentAccountComponent } from "../../auth/popup/account-switching/current-account.component"; +import { enableAccountSwitching } from "../flags"; + +@Component({ + selector: "app-header", + templateUrl: "header.component.html", + standalone: true, + imports: [CommonModule, CurrentAccountComponent], +}) +export class HeaderComponent { + @Input() noTheme = false; + @Input() hideAccountSwitcher = false; + authedAccounts$: Observable; + constructor(authService: AuthService) { + this.authedAccounts$ = authService.authStatuses$.pipe( + map((record) => Object.values(record)), + switchMap((statuses) => { + if (!enableAccountSwitching()) { + return of(false); + } + + return of(statuses.some((status) => status !== AuthenticationStatus.LoggedOut)); + }), + ); + } +} diff --git a/apps/browser/src/platform/popup/layout/popup-compact-mode.service.ts b/apps/browser/src/platform/popup/layout/popup-compact-mode.service.ts new file mode 100644 index 00000000000..ffcd2321b15 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-compact-mode.service.ts @@ -0,0 +1,31 @@ +import { inject, Injectable } from "@angular/core"; +import { map, Observable } from "rxjs"; + +import { GlobalStateProvider, KeyDefinition, THEMING_DISK } from "@bitwarden/common/platform/state"; +import { CompactModeService } from "@bitwarden/components"; + +const COMPACT_MODE = new KeyDefinition(THEMING_DISK, "compactMode", { + deserializer: (s) => s, +}); + +/** + * Service to persist Compact Mode to state / user settings. + **/ +@Injectable({ providedIn: "root" }) +export class PopupCompactModeService implements CompactModeService { + private state = inject(GlobalStateProvider).get(COMPACT_MODE); + + enabled$: Observable = this.state.state$.pipe(map((state) => state ?? false)); + + init() { + this.enabled$.subscribe((enabled) => { + enabled + ? document.body.classList.add("tw-bit-compact") + : document.body.classList.remove("tw-bit-compact"); + }); + } + + async setEnabled(enabled: boolean) { + await this.state.update(() => enabled); + } +} diff --git a/apps/browser/src/platform/popup/layout/popup-footer.component.html b/apps/browser/src/platform/popup/layout/popup-footer.component.html new file mode 100644 index 00000000000..50ad535c891 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-footer.component.html @@ -0,0 +1,12 @@ +
+
+
+ +
+
+ +
+
+
diff --git a/apps/browser/src/platform/popup/layout/popup-footer.component.ts b/apps/browser/src/platform/popup/layout/popup-footer.component.ts new file mode 100644 index 00000000000..826a1d1c601 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-footer.component.ts @@ -0,0 +1,9 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "popup-footer", + templateUrl: "popup-footer.component.html", + standalone: true, + imports: [], +}) +export class PopupFooterComponent {} diff --git a/apps/browser/src/platform/popup/layout/popup-header.component.html b/apps/browser/src/platform/popup/layout/popup-header.component.html new file mode 100644 index 00000000000..ac52a630900 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-header.component.html @@ -0,0 +1,30 @@ +
+
+
+ +

+ {{ pageTitle }} +

+ +
+
+ +
+
+
diff --git a/apps/browser/src/platform/popup/layout/popup-header.component.ts b/apps/browser/src/platform/popup/layout/popup-header.component.ts new file mode 100644 index 00000000000..fcf7f57c89f --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-header.component.ts @@ -0,0 +1,54 @@ +import { BooleanInput, coerceBooleanProperty } from "@angular/cdk/coercion"; +import { CommonModule } from "@angular/common"; +import { Component, Input, Signal, inject } from "@angular/core"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { + AsyncActionsModule, + FunctionReturningAwaitable, + IconButtonModule, + TypographyModule, +} from "@bitwarden/components"; + +import { PopupRouterCacheService } from "../view-cache/popup-router-cache.service"; + +import { PopupPageComponent } from "./popup-page.component"; + +@Component({ + selector: "popup-header", + templateUrl: "popup-header.component.html", + standalone: true, + imports: [TypographyModule, CommonModule, IconButtonModule, JslibModule, AsyncActionsModule], +}) +export class PopupHeaderComponent { + private popupRouterCacheService = inject(PopupRouterCacheService); + protected pageContentScrolled: Signal = inject(PopupPageComponent).isScrolled; + + /** Background color */ + @Input() + background: "default" | "alt" = "default"; + + /** Display the back button, which uses Location.back() to go back one page in history */ + @Input() + get showBackButton() { + return this._showBackButton; + } + set showBackButton(value: BooleanInput) { + this._showBackButton = coerceBooleanProperty(value); + } + + private _showBackButton = false; + + /** Title string that will be inserted as an h1 */ + @Input({ required: true }) pageTitle: string; + + /** + * Async action that occurs when clicking the back button + * + * If unset, will call `location.back()` + **/ + @Input() + backAction: FunctionReturningAwaitable = async () => { + return this.popupRouterCacheService.back(); + }; +} diff --git a/apps/browser/src/platform/popup/layout/popup-layout.mdx b/apps/browser/src/platform/popup/layout/popup-layout.mdx new file mode 100644 index 00000000000..aa11b4099a9 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-layout.mdx @@ -0,0 +1,176 @@ +import { Meta, Story, Canvas } from "@storybook/addon-docs"; + +import * as stories from "./popup-layout.stories"; + + + +Please note that because these stories use `router-outlet`, there are issues with rendering content +when Light & Dark mode is selected. The stories are best viewed by selecting one color mode. + +# Popup Tab Navigation + +The popup tab navigation component composes together the popup page and the bottom tab navigation +footer. This component is intended to be used a level _above_ each extension tab's page code. + +The navigation footer contains the 4 main page links for the browser extension. It uses the Angular +router to determine which page is currently active, and style the button appropriately. Clicking on +the buttons will navigate to the correct route. The navigation footer has a max-width built in so +that the page looks nice when the extension is popped out. + +Long button names will be ellipsed. + +Usage example: + +```html + + + +``` + +# Popup Page + +The popup page handles positioning a page's `header` and `footer` elements, and inserting the rest +of the content into the `main` element with scroll. There is also a max-width built in so that the +page looks nice when the extension is popped out. + +**Slots** + +- `header` + - Use `popup-header` component. + - Every page should have a header. +- `footer` + - Use the `popup-footer` component. + - Not every page will have a footer. +- `above-scroll-area` + - When the page content overflows, this content will be "stuck" to the top of the page upon + scrolling. +- default + - Whatever content you want in `main`. + +**Inputs** + +- `loading` + - When `true`, displays a loading state overlay instead of the default content. Defaults to + `false`. +- `loadingText` + - Custom text to be applied to the loading element for screenreaders only. Defaults to "Loading". + +Basic usage example: + +```html + + +
This is content
+ +
+``` + +## Popup header + +**Args** + +- `pageTitle`: required + - Inserts title as an `h1`. +- `showBackButton`: optional, defaults to `false` + - Toggles the back button to appear. The back button uses `Location.back()` to navigate back one + page in history. +- `background`: optional + - `"default"` uses a white background + - `"alt"` uses a transparent background + +**Slots** + +- `end` + - Use to insert one or more interactive elements. + - The header handles the spacing between elements passed to the `end` slot. + +Usage example: + +```html + + + + + + +``` + +### Transparent header + + + + + +Common interactive elements to insert into the `end` slot are: + +- `app-current-account`: shows current account and switcher +- `app-pop-out`: shows popout button when the extension is not already popped out +- "Add" button: this can be accomplished with the Button component and any custom functionality for + that particular page + +## Popup footer + +Popup footer should be used when the page displays action buttons. It functions similarly to the +Dialog footer in that the calling code is responsible for passing in the different buttons that need +to be rendered. + +Usage example: + +```html + + + + +``` + +# Page types + +There are a few types of pages that are used in the browser extension. + +View the story source code to see examples of how to construct these types of pages. + +## Extension Tab + +Example of wrapping an extension page in the `popup-tab-navigation` component. + + + + + +## Extension Page + +Examples of using just the `popup-page` component, without and with a footer. + + + + + + + + + +## Popped out + +When the browser extension is popped out, the "popout" button should not be passed to the header. + + + + + +# Other stories + +## Centered Content + +An example of how to center the default content. + + + + + +## Loading + +An example of what the loading state looks like. + + + + diff --git a/apps/browser/src/platform/popup/layout/popup-layout.stories.ts b/apps/browser/src/platform/popup/layout/popup-layout.stories.ts new file mode 100644 index 00000000000..5b9417a6a19 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-layout.stories.ts @@ -0,0 +1,512 @@ +import { CommonModule } from "@angular/common"; +import { Component, importProvidersFrom } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; + +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { + AvatarModule, + BadgeModule, + ButtonModule, + I18nMockService, + IconButtonModule, + ItemModule, + NoItemsModule, + SearchModule, + SectionComponent, +} from "@bitwarden/components"; + +import { PopupRouterCacheService } from "../view-cache/popup-router-cache.service"; + +import { PopupFooterComponent } from "./popup-footer.component"; +import { PopupHeaderComponent } from "./popup-header.component"; +import { PopupPageComponent } from "./popup-page.component"; +import { PopupTabNavigationComponent } from "./popup-tab-navigation.component"; + +@Component({ + selector: "extension-container", + template: ` +
+ +
+ `, + standalone: true, +}) +class ExtensionContainerComponent {} + +@Component({ + selector: "vault-placeholder", + template: ` + + + + + + + + + + + + + + + + + + + + `, + standalone: true, + imports: [CommonModule, ItemModule, BadgeModule, IconButtonModule, SectionComponent], +}) +class VaultComponent { + protected data = Array.from(Array(20).keys()); +} + +@Component({ + selector: "mock-add-button", + template: ` + + `, + standalone: true, + imports: [ButtonModule], +}) +class MockAddButtonComponent {} + +@Component({ + selector: "mock-popout-button", + template: ` + + `, + standalone: true, + imports: [IconButtonModule], +}) +class MockPopoutButtonComponent {} + +@Component({ + selector: "mock-current-account", + template: ` + + `, + standalone: true, + imports: [AvatarModule], +}) +class MockCurrentAccountComponent {} + +@Component({ + selector: "mock-search", + template: ` `, + standalone: true, + imports: [SearchModule], +}) +class MockSearchComponent {} + +@Component({ + selector: "mock-vault-page", + template: ` + + + + + + + + + + + + `, + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + MockAddButtonComponent, + MockPopoutButtonComponent, + MockCurrentAccountComponent, + MockSearchComponent, + VaultComponent, + ], +}) +class MockVaultPageComponent {} + +@Component({ + selector: "mock-vault-page-popped", + template: ` + + + + + + + + + + `, + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + MockAddButtonComponent, + MockPopoutButtonComponent, + MockCurrentAccountComponent, + VaultComponent, + ], +}) +class MockVaultPagePoppedComponent {} + +@Component({ + selector: "mock-generator-page", + template: ` + + + + + + + + +
Generator content here
+
+ `, + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + MockAddButtonComponent, + MockPopoutButtonComponent, + MockCurrentAccountComponent, + ], +}) +class MockGeneratorPageComponent {} + +@Component({ + selector: "mock-send-page", + template: ` + + + + + + + + +
Send content here
+
+ `, + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + MockAddButtonComponent, + MockPopoutButtonComponent, + MockCurrentAccountComponent, + ], +}) +class MockSendPageComponent {} + +@Component({ + selector: "mock-settings-page", + template: ` + + + + + + + + +
Settings content here
+
+ `, + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + MockAddButtonComponent, + MockPopoutButtonComponent, + MockCurrentAccountComponent, + ], +}) +class MockSettingsPageComponent {} + +@Component({ + selector: "mock-vault-subpage", + template: ` + + + + + + + + + + + + + + `, + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + PopupFooterComponent, + ButtonModule, + MockAddButtonComponent, + MockPopoutButtonComponent, + MockCurrentAccountComponent, + VaultComponent, + IconButtonModule, + ], +}) +class MockVaultSubpageComponent {} + +export default { + title: "Browser/Popup Layout", + component: PopupPageComponent, + decorators: [ + moduleMetadata({ + imports: [ + PopupTabNavigationComponent, + PopupHeaderComponent, + PopupPageComponent, + PopupFooterComponent, + CommonModule, + RouterModule, + ExtensionContainerComponent, + MockVaultSubpageComponent, + MockVaultPageComponent, + MockSendPageComponent, + MockGeneratorPageComponent, + MockSettingsPageComponent, + MockVaultPagePoppedComponent, + NoItemsModule, + VaultComponent, + ], + providers: [ + { + provide: I18nService, + useFactory: () => { + return new I18nMockService({ + back: "Back", + loading: "Loading", + search: "Search", + }); + }, + }, + { + provide: PolicyService, + useFactory: () => { + return { + policyAppliesToActiveUser$: () => { + return { + pipe: () => ({ + subscribe: () => ({}), + }), + }; + }, + }; + }, + }, + { + provide: SendService, + useFactory: () => { + return { + sends$: () => { + return { pipe: () => ({}) }; + }, + }; + }, + }, + ], + }), + applicationConfig({ + providers: [ + importProvidersFrom( + RouterModule.forRoot( + [ + { path: "", redirectTo: "tabs/vault", pathMatch: "full" }, + { path: "tabs/vault", component: MockVaultPageComponent }, + { path: "tabs/generator", component: MockGeneratorPageComponent }, + { path: "tabs/send", component: MockSendPageComponent }, + { path: "tabs/settings", component: MockSettingsPageComponent }, + // in case you are coming from a story that also uses the router + { path: "**", redirectTo: "tabs/vault" }, + ], + { useHash: true }, + ), + ), + { + provide: PopupRouterCacheService, + useValue: { + back() {}, + } as Partial, + }, + ], + }), + ], +} as Meta; + +type Story = StoryObj; + +export const PopupTabNavigation: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` + + + + + + `, + }), +}; + +export const PopupPage: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` + + + + `, + }), +}; + +export const PopupPageWithFooter: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` + + + + `, + }), +}; + +export const CompactMode: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` +
+
+

Relaxed

+

+ + + +
+ +
+

Compact

+

+ + + +
+
+ `, + }), + play: async (context) => { + const canvasEl = context.canvasElement; + const updateLabel = (containerId: string) => { + const compact = canvasEl.querySelector( + `#${containerId} [data-testid=popup-layout-scroll-region]`, + ); + const label = canvasEl.querySelector(`#${containerId} .example-label`); + const percentVisible = + 100 - + Math.round((100 * (compact.scrollHeight - compact.clientHeight)) / compact.scrollHeight); + label.textContent = `${percentVisible}% above the fold`; + }; + updateLabel("compact-example"); + updateLabel("regular-example"); + }, +}; + +export const PoppedOut: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` +
+ +
+ `, + }), +}; + +export const CenteredContent: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` + + + + +
+ + Before centering a div + One must first center oneself + +
+
+
+
+ `, + }), +}; + +export const Loading: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` + + + + + Content would go here + + + + `, + }), +}; + +export const TransparentHeader: Story = { + render: (args) => ({ + props: args, + template: /* HTML */ ` + + + 🤠 Custom Content + + + + + `, + }), +}; diff --git a/apps/browser/src/platform/popup/layout/popup-page.component.html b/apps/browser/src/platform/popup/layout/popup-page.component.html new file mode 100644 index 00000000000..8eefc14ab55 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-page.component.html @@ -0,0 +1,34 @@ + +
+
+ +
+
+
+ +
+
+ + + +
+ diff --git a/apps/browser/src/platform/popup/layout/popup-page.component.ts b/apps/browser/src/platform/popup/layout/popup-page.component.ts new file mode 100644 index 00000000000..7b4665040fb --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-page.component.ts @@ -0,0 +1,32 @@ +import { CommonModule } from "@angular/common"; +import { booleanAttribute, Component, inject, Input, signal } from "@angular/core"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; + +@Component({ + selector: "popup-page", + templateUrl: "popup-page.component.html", + standalone: true, + host: { + class: "tw-h-full tw-flex tw-flex-col tw-flex-1 tw-overflow-y-hidden", + }, + imports: [CommonModule], +}) +export class PopupPageComponent { + protected i18nService = inject(I18nService); + + @Input() loading = false; + + @Input({ transform: booleanAttribute }) + disablePadding = false; + + protected scrolled = signal(false); + isScrolled = this.scrolled.asReadonly(); + + /** Accessible loading label for the spinner. Defaults to "loading" */ + @Input() loadingText?: string = this.i18nService.t("loading"); + + handleScroll(event: Event) { + this.scrolled.set((event.currentTarget as HTMLElement).scrollTop !== 0); + } +} 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 new file mode 100644 index 00000000000..e53e8905e69 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.html @@ -0,0 +1,38 @@ +
+ +
+
+
+ +
+
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 new file mode 100644 index 00000000000..ced3f6462e9 --- /dev/null +++ b/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.ts @@ -0,0 +1,43 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; + +import { LinkModule } from "@bitwarden/components"; + +@Component({ + selector: "popup-tab-navigation", + templateUrl: "popup-tab-navigation.component.html", + standalone: true, + imports: [CommonModule, LinkModule, RouterModule], + host: { + class: "tw-block tw-h-full tw-w-full tw-flex tw-flex-col", + }, +}) +export class PopupTabNavigationComponent { + navButtons = [ + { + label: "Vault", + page: "/tabs/vault", + iconKey: "lock", + iconKeyActive: "lock-f", + }, + { + label: "Generator", + page: "/tabs/generator", + iconKey: "generate", + iconKeyActive: "generate-f", + }, + { + label: "Send", + page: "/tabs/send", + iconKey: "send", + iconKeyActive: "send-f", + }, + { + label: "Settings", + page: "/tabs/settings", + iconKey: "cog", + iconKeyActive: "cog-f", + }, + ]; +} diff --git a/apps/browser/src/platform/popup/locales.ts b/apps/browser/src/platform/popup/locales.ts index f24f7368db3..5fea00b97b7 100644 --- a/apps/browser/src/platform/popup/locales.ts +++ b/apps/browser/src/platform/popup/locales.ts @@ -7,6 +7,7 @@ import localeBn from "@angular/common/locales/bn"; import localeBs from "@angular/common/locales/bs"; import localeCa from "@angular/common/locales/ca"; import localeCs from "@angular/common/locales/cs"; +import localeCy from "@angular/common/locales/cy"; import localeDa from "@angular/common/locales/da"; import localeDe from "@angular/common/locales/de"; import localeEl from "@angular/common/locales/el"; @@ -19,6 +20,7 @@ import localeFa from "@angular/common/locales/fa"; import localeFi from "@angular/common/locales/fi"; import localeFil from "@angular/common/locales/fil"; import localeFr from "@angular/common/locales/fr"; +import localeGl from "@angular/common/locales/gl"; import localeHe from "@angular/common/locales/he"; import localeHi from "@angular/common/locales/hi"; import localeHr from "@angular/common/locales/hr"; @@ -33,9 +35,13 @@ import localeKo from "@angular/common/locales/ko"; import localeLt from "@angular/common/locales/lt"; import localeLv from "@angular/common/locales/lv"; import localeMl from "@angular/common/locales/ml"; +import localeMr from "@angular/common/locales/mr"; +import localeMy from "@angular/common/locales/my"; import localeNb from "@angular/common/locales/nb"; +import localeNe from "@angular/common/locales/ne"; import localeNl from "@angular/common/locales/nl"; import localeNn from "@angular/common/locales/nn"; +import localeOr from "@angular/common/locales/or"; import localePl from "@angular/common/locales/pl"; import localePtBr from "@angular/common/locales/pt"; import localePtPt from "@angular/common/locales/pt-PT"; @@ -46,6 +52,7 @@ import localeSk from "@angular/common/locales/sk"; import localeSl from "@angular/common/locales/sl"; import localeSr from "@angular/common/locales/sr"; import localeSv from "@angular/common/locales/sv"; +import localeTe from "@angular/common/locales/te"; import localeTh from "@angular/common/locales/th"; import localeTr from "@angular/common/locales/tr"; import localeUk from "@angular/common/locales/uk"; @@ -61,6 +68,7 @@ registerLocaleData(localeBn, "bn"); registerLocaleData(localeBs, "bs"); registerLocaleData(localeCa, "ca"); registerLocaleData(localeCs, "cs"); +registerLocaleData(localeCy, "cy"); registerLocaleData(localeDa, "da"); registerLocaleData(localeDe, "de"); registerLocaleData(localeEl, "el"); @@ -73,6 +81,7 @@ registerLocaleData(localeFa, "fa"); registerLocaleData(localeFi, "fi"); registerLocaleData(localeFil, "fil"); registerLocaleData(localeFr, "fr"); +registerLocaleData(localeGl, "gl"); registerLocaleData(localeHe, "he"); registerLocaleData(localeHi, "hi"); registerLocaleData(localeHr, "hr"); @@ -87,9 +96,13 @@ registerLocaleData(localeKo, "ko"); registerLocaleData(localeLt, "lt"); registerLocaleData(localeLv, "lv"); registerLocaleData(localeMl, "ml"); +registerLocaleData(localeMr, "mr"); +registerLocaleData(localeMy, "my"); registerLocaleData(localeNb, "nb"); +registerLocaleData(localeNe, "ne"); registerLocaleData(localeNl, "nl"); registerLocaleData(localeNn, "nn"); +registerLocaleData(localeOr, "or"); registerLocaleData(localePl, "pl"); registerLocaleData(localePtBr, "pt-BR"); registerLocaleData(localePtPt, "pt-PT"); @@ -100,6 +113,7 @@ registerLocaleData(localeSk, "sk"); registerLocaleData(localeSl, "sl"); registerLocaleData(localeSr, "sr"); registerLocaleData(localeSv, "sv"); +registerLocaleData(localeTe, "te"); registerLocaleData(localeTh, "th"); registerLocaleData(localeTr, "tr"); registerLocaleData(localeUk, "uk"); diff --git a/apps/browser/src/platform/services/browser-file-download.service.ts b/apps/browser/src/platform/popup/services/browser-file-download.service.ts similarity index 80% rename from apps/browser/src/platform/services/browser-file-download.service.ts rename to apps/browser/src/platform/popup/services/browser-file-download.service.ts index 1ade74367f5..e9aaa639c42 100644 --- a/apps/browser/src/platform/services/browser-file-download.service.ts +++ b/apps/browser/src/platform/popup/services/browser-file-download.service.ts @@ -5,8 +5,8 @@ import { FileDownloadRequest } from "@bitwarden/common/platform/abstractions/fil import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SafariApp } from "../../browser/safariApp"; -import { BrowserApi } from "../browser/browser-api"; +import { SafariApp } from "../../../browser/safariApp"; +import { BrowserApi } from "../../browser/browser-api"; @Injectable() export class BrowserFileDownloadService implements FileDownloadService { @@ -19,6 +19,8 @@ export class BrowserFileDownloadService implements FileDownloadService { } else { data = Utils.fromBufferToB64(request.blobData as ArrayBuffer); } + // 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 SafariApp.sendMessageToApp( "downloadFile", JSON.stringify({ @@ -26,7 +28,7 @@ export class BrowserFileDownloadService implements FileDownloadService { blobOptions: request.blobOptions, fileName: request.fileName, }), - true + true, ); } else { const a = window.document.createElement("a"); diff --git a/apps/browser/src/platform/popup/services/browser-router.service.ts b/apps/browser/src/platform/popup/services/browser-router.service.ts new file mode 100644 index 00000000000..dfc816f4ccc --- /dev/null +++ b/apps/browser/src/platform/popup/services/browser-router.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from "@angular/core"; +import { ActivatedRouteSnapshot, NavigationEnd, Router } from "@angular/router"; +import { filter } from "rxjs"; + +@Injectable({ + providedIn: "root", +}) +export class BrowserRouterService { + private previousUrl?: string = undefined; + + constructor(router: Router) { + router.events + .pipe(filter((e) => e instanceof NavigationEnd)) + .subscribe((event: NavigationEnd) => { + const state: ActivatedRouteSnapshot = router.routerState.snapshot.root; + + let child = state.firstChild; + while (child.firstChild) { + child = child.firstChild; + } + + const updateUrl = !child?.data?.doNotSaveUrl ?? true; + + if (updateUrl) { + this.setPreviousUrl(event.url); + } + }); + } + + getPreviousUrl() { + return this.previousUrl; + } + + setPreviousUrl(url: string) { + this.previousUrl = url; + } +} 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 new file mode 100644 index 00000000000..8876ac44d59 --- /dev/null +++ b/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts @@ -0,0 +1,139 @@ +import { Location } from "@angular/common"; +import { Injectable, inject } from "@angular/core"; +import { + ActivatedRouteSnapshot, + CanActivateFn, + NavigationEnd, + Router, + UrlSerializer, +} from "@angular/router"; +import { filter, first, firstValueFrom, map, Observable, of, switchMap, tap } from "rxjs"; + +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { GlobalStateProvider } from "@bitwarden/common/platform/state"; + +import { POPUP_ROUTE_HISTORY_KEY } from "../../../platform/services/popup-view-cache-background.service"; +import BrowserPopupUtils from "../browser-popup-utils"; + +/** + * Preserves route history when opening and closing the popup + * + * Routes marked with `doNotSaveUrl` will not be stored + **/ +@Injectable({ + providedIn: "root", +}) +export class PopupRouterCacheService { + private router = inject(Router); + private state = inject(GlobalStateProvider).get(POPUP_ROUTE_HISTORY_KEY); + private location = inject(Location); + + private hasNavigated = false; + + constructor() { + // init history with existing state + this.history$() + .pipe(first()) + .subscribe( + (history) => + Array.isArray(history) && history.forEach((location) => this.location.go(location)), + ); + + // update state when route change occurs + this.router.events + .pipe( + filter((event) => event instanceof NavigationEnd), + tap(() => { + // `Location.back()` can now be called successfully + this.hasNavigated = true; + }), + filter((_event: NavigationEnd) => { + const state: ActivatedRouteSnapshot = this.router.routerState.snapshot.root; + + let child = state.firstChild; + while (child.firstChild) { + child = child.firstChild; + } + + return !child?.data?.doNotSaveUrl ?? true; + }), + switchMap((event) => this.push(event.url)), + ) + .subscribe(); + } + + history$(): Observable { + return this.state.state$; + } + + async setHistory(state: string[]): Promise { + return this.state.update(() => state); + } + + /** Get the last item from the history stack, or `null` if empty */ + last$(): Observable { + return this.history$().pipe( + map((history) => { + if (!history || history.length === 0) { + return null; + } + return history[history.length - 1]; + }), + ); + } + + /** + * If in browser popup, push new route onto history stack + */ + private async push(url: string) { + if (!BrowserPopupUtils.inPopup(window) || url === (await firstValueFrom(this.last$()))) { + return; + } + await this.state.update((prevState) => (prevState == null ? [url] : prevState.concat(url))); + } + + /** + * Navigate back in history + */ + async back() { + await this.state.update((prevState) => (prevState ? prevState.slice(0, -1) : [])); + + if (this.hasNavigated) { + this.location.back(); + return; + } + + // if no history is present, fallback to vault page + await this.router.navigate([""]); + } +} + +/** + * Redirect to the last visited route. Should be applied to root route. + * + * If `FeatureFlag.PersistPopupView` is disabled, do nothing. + **/ +export const popupRouterCacheGuard = (() => { + const configService = inject(ConfigService); + const popupHistoryService = inject(PopupRouterCacheService); + const urlSerializer = inject(UrlSerializer); + + return configService.getFeatureFlag$(FeatureFlag.PersistPopupView).pipe( + switchMap((featureEnabled) => { + if (!featureEnabled) { + return of(true); + } + + return popupHistoryService.last$().pipe( + map((url: string) => { + if (!url) { + return true; + } + + return urlSerializer.parse(url); + }), + ); + }), + ); +}) satisfies CanActivateFn; 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 new file mode 100644 index 00000000000..465a6e6c69c --- /dev/null +++ b/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts @@ -0,0 +1,123 @@ +import { Component } from "@angular/core"; +import { TestBed } from "@angular/core/testing"; +import { Router, UrlSerializer, UrlTree } from "@angular/router"; +import { RouterTestingModule } from "@angular/router/testing"; +import { mock } from "jest-mock-extended"; +import { firstValueFrom, of } from "rxjs"; + +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { GlobalStateProvider } from "@bitwarden/common/platform/state"; +import { FakeGlobalStateProvider } from "@bitwarden/common/spec"; + +import { PopupRouterCacheService, popupRouterCacheGuard } from "./popup-router-cache.service"; + +const flushPromises = async () => await new Promise(process.nextTick); + +@Component({ template: "" }) +export class EmptyComponent {} + +describe("Popup router cache guard", () => { + const configServiceMock = mock(); + const fakeGlobalStateProvider = new FakeGlobalStateProvider(); + + let testBed: TestBed; + let serializer: UrlSerializer; + let router: Router; + + let service: PopupRouterCacheService; + + beforeEach(async () => { + jest.spyOn(configServiceMock, "getFeatureFlag$").mockReturnValue(of(true)); + + testBed = TestBed.configureTestingModule({ + imports: [ + RouterTestingModule.withRoutes([ + { path: "a", component: EmptyComponent }, + { path: "b", component: EmptyComponent }, + { + path: "c", + component: EmptyComponent, + data: { doNotSaveUrl: true }, + }, + ]), + ], + providers: [ + { provide: ConfigService, useValue: configServiceMock }, + { provide: GlobalStateProvider, useValue: fakeGlobalStateProvider }, + ], + }); + + await testBed.compileComponents(); + + router = testBed.inject(Router); + serializer = testBed.inject(UrlSerializer); + + service = testBed.inject(PopupRouterCacheService); + + await service.setHistory([]); + }); + + it("returns true if the history stack is empty", async () => { + const response = await firstValueFrom( + testBed.runInInjectionContext(() => popupRouterCacheGuard()), + ); + + expect(response).toBe(true); + }); + + it("returns true if the history stack is null", async () => { + await service.setHistory(null); + + const response = await firstValueFrom( + testBed.runInInjectionContext(() => popupRouterCacheGuard()), + ); + + expect(response).toBe(true); + }); + + it("redirects to the latest stored route", async () => { + await router.navigate(["a"]); + await router.navigate(["b"]); + + const response = (await firstValueFrom( + testBed.runInInjectionContext(() => popupRouterCacheGuard()), + )) as UrlTree; + + expect(serializer.serialize(response)).toBe("/b"); + }); + + it("back method redirects to the previous route", async () => { + await router.navigate(["a"]); + await router.navigate(["b"]); + + // wait for router events subscription + await flushPromises(); + + expect(await firstValueFrom(service.history$())).toEqual(["/a", "/b"]); + + await service.back(); + + expect(await firstValueFrom(service.history$())).toEqual(["/a"]); + }); + + it("does not save ignored routes", async () => { + await router.navigate(["a"]); + await router.navigate(["b"]); + await router.navigate(["c"]); + + const response = (await firstValueFrom( + testBed.runInInjectionContext(() => popupRouterCacheGuard()), + )) as UrlTree; + + expect(serializer.serialize(response)).toBe("/b"); + }); + + it("does not save duplicate routes", async () => { + await router.navigate(["a"]); + await router.navigate(["a"]); + + await flushPromises(); + + expect(await firstValueFrom(service.history$())).toEqual(["/a"]); + }); +}); 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 new file mode 100644 index 00000000000..819a2aa3e46 --- /dev/null +++ b/apps/browser/src/platform/popup/view-cache/popup-view-cache.service.ts @@ -0,0 +1,136 @@ +import { + DestroyRef, + effect, + inject, + Injectable, + Injector, + signal, + WritableSignal, +} from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { FormGroup } from "@angular/forms"; +import { NavigationEnd, Router } from "@angular/router"; +import { filter, firstValueFrom, skip } from "rxjs"; +import { Jsonify } from "type-fest"; + +import { + FormCacheOptions, + SignalCacheOptions, + ViewCacheService, +} from "@bitwarden/angular/platform/abstractions/view-cache.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { MessageSender } from "@bitwarden/common/platform/messaging"; +import { GlobalStateProvider } from "@bitwarden/common/platform/state"; + +import { + ClEAR_VIEW_CACHE_COMMAND, + POPUP_VIEW_CACHE_KEY, + SAVE_VIEW_CACHE_COMMAND, +} from "../../services/popup-view-cache-background.service"; + +/** + * Popup implementation of {@link ViewCacheService}. + * + * Persists user changes between popup open and close + */ +@Injectable({ + providedIn: "root", +}) +export class PopupViewCacheService implements ViewCacheService { + private configService = inject(ConfigService); + private globalStateProvider = inject(GlobalStateProvider); + private messageSender = inject(MessageSender); + private router = inject(Router); + + private featureEnabled: boolean; + + private _cache: Record; + private get cache(): Record { + if (!this._cache) { + throw new Error("Dirty View Cache not initialized"); + } + return this._cache; + } + + /** + * Initialize the service. This should only be called once. + */ + async init() { + this.featureEnabled = await this.configService.getFeatureFlag(FeatureFlag.PersistPopupView); + const initialState = this.featureEnabled + ? await firstValueFrom(this.globalStateProvider.get(POPUP_VIEW_CACHE_KEY).state$) + : {}; + this._cache = Object.freeze(initialState ?? {}); + + this.router.events + .pipe( + filter((e) => e instanceof NavigationEnd), + /** Skip the first navigation triggered by `popupRouterCacheGuard` */ + skip(1), + ) + .subscribe(() => this.clearState()); + } + + /** + * @see {@link ViewCacheService.signal} + */ + signal(options: SignalCacheOptions): WritableSignal { + const { + deserializer = (v: Jsonify): T => v as T, + key, + injector = inject(Injector), + initialValue, + } = options; + const cachedValue = this.cache[key] ? deserializer(JSON.parse(this.cache[key])) : initialValue; + const _signal = signal(cachedValue); + + effect( + () => { + this.updateState(key, JSON.stringify(_signal())); + }, + { injector }, + ); + + return _signal; + } + + /** + * @see {@link ViewCacheService.formGroup} + */ + formGroup(options: FormCacheOptions): TFormGroup { + const { control, injector } = options; + + const _signal = this.signal({ + ...options, + initialValue: control.getRawValue(), + }); + + const value = _signal(); + if (value !== undefined && JSON.stringify(value) !== JSON.stringify(control.getRawValue())) { + control.setValue(value); + control.markAsDirty(); + } + + control.valueChanges.pipe(takeUntilDestroyed(injector?.get(DestroyRef))).subscribe(() => { + _signal.set(control.getRawValue()); + }); + + return control; + } + + private updateState(key: string, value: string) { + if (!this.featureEnabled) { + return; + } + + this.messageSender.send(SAVE_VIEW_CACHE_COMMAND, { + key, + value, + }); + } + + private clearState() { + this.messageSender.send(ClEAR_VIEW_CACHE_COMMAND, {}); + } +} 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 new file mode 100644 index 00000000000..fbe94bece8c --- /dev/null +++ b/apps/browser/src/platform/popup/view-cache/popup-view-cache.spec.ts @@ -0,0 +1,224 @@ +import { Component, inject, Injector } from "@angular/core"; +import { TestBed } from "@angular/core/testing"; +import { FormControl, FormGroup } from "@angular/forms"; +import { Router } from "@angular/router"; +import { RouterTestingModule } from "@angular/router/testing"; +import { MockProxy, mock } from "jest-mock-extended"; + +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { MessageSender } from "@bitwarden/common/platform/messaging"; +import { GlobalStateProvider } from "@bitwarden/common/platform/state"; +import { FakeGlobalState, FakeGlobalStateProvider } from "@bitwarden/common/spec"; + +import { + ClEAR_VIEW_CACHE_COMMAND, + POPUP_VIEW_CACHE_KEY, + SAVE_VIEW_CACHE_COMMAND, +} from "../../services/popup-view-cache-background.service"; + +import { PopupViewCacheService } from "./popup-view-cache.service"; + +@Component({ template: "" }) +export class EmptyComponent {} + +@Component({ template: "" }) +export class TestComponent { + private viewCacheService = inject(PopupViewCacheService); + + formGroup = this.viewCacheService.formGroup({ + key: "test-form-cache", + control: new FormGroup({ + name: new FormControl("initial name"), + }), + }); + + signal = this.viewCacheService.signal({ + key: "test-signal", + initialValue: "initial signal", + }); +} + +describe("popup view cache", () => { + const configServiceMock = mock(); + let testBed: TestBed; + let service: PopupViewCacheService; + let fakeGlobalState: FakeGlobalState>; + let messageSenderMock: MockProxy; + let router: Router; + + const initServiceWithState = async (state: Record) => { + await fakeGlobalState.update(() => state); + await service.init(); + }; + + beforeEach(async () => { + jest.spyOn(configServiceMock, "getFeatureFlag").mockResolvedValue(true); + messageSenderMock = mock(); + + const fakeGlobalStateProvider = new FakeGlobalStateProvider(); + fakeGlobalState = fakeGlobalStateProvider.getFake(POPUP_VIEW_CACHE_KEY); + + testBed = TestBed.configureTestingModule({ + imports: [ + RouterTestingModule.withRoutes([ + { path: "a", component: EmptyComponent }, + { path: "b", component: EmptyComponent }, + ]), + ], + providers: [ + { provide: GlobalStateProvider, useValue: fakeGlobalStateProvider }, + { provide: MessageSender, useValue: messageSenderMock }, + { provide: ConfigService, useValue: configServiceMock }, + ], + }); + + await testBed.compileComponents(); + + router = testBed.inject(Router); + service = testBed.inject(PopupViewCacheService); + }); + + it("should initialize signal when ran within an injection context", async () => { + await initServiceWithState({}); + + const signal = TestBed.runInInjectionContext(() => + service.signal({ + key: "foo-123", + initialValue: "foo", + }), + ); + + expect(signal()).toBe("foo"); + }); + + it("should initialize signal when provided an injector", async () => { + await initServiceWithState({}); + + const injector = TestBed.inject(Injector); + + const signal = service.signal({ + key: "foo-123", + initialValue: "foo", + injector, + }); + + expect(signal()).toBe("foo"); + }); + + it("should initialize signal from state", async () => { + await initServiceWithState({ "foo-123": JSON.stringify("bar") }); + + const injector = TestBed.inject(Injector); + + const signal = service.signal({ + key: "foo-123", + initialValue: "foo", + injector, + }); + + expect(signal()).toBe("bar"); + }); + + it("should initialize form from state", async () => { + await initServiceWithState({ "test-form-cache": JSON.stringify({ name: "baz" }) }); + + const fixture = TestBed.createComponent(TestComponent); + const component = fixture.componentRef.instance; + expect(component.formGroup.value.name).toBe("baz"); + expect(component.formGroup.dirty).toBe(true); + }); + + it("should not modify form when empty", async () => { + await initServiceWithState({}); + + const fixture = TestBed.createComponent(TestComponent); + const component = fixture.componentRef.instance; + expect(component.formGroup.value.name).toBe("initial name"); + expect(component.formGroup.dirty).toBe(false); + }); + + it("should utilize deserializer", async () => { + await initServiceWithState({ "foo-123": JSON.stringify("bar") }); + + const injector = TestBed.inject(Injector); + + const signal = service.signal({ + key: "foo-123", + initialValue: "foo", + injector, + deserializer: (jsonValue) => "test", + }); + + expect(signal()).toBe("test"); + }); + + it("should not utilize deserializer when empty", async () => { + await initServiceWithState({}); + + const injector = TestBed.inject(Injector); + + const signal = service.signal({ + key: "foo-123", + initialValue: "foo", + injector, + deserializer: (jsonValue) => "test", + }); + + expect(signal()).toBe("foo"); + }); + + it("should send signal updates to message sender", async () => { + await initServiceWithState({}); + + const fixture = TestBed.createComponent(TestComponent); + const component = fixture.componentRef.instance; + component.signal.set("Foobar"); + fixture.detectChanges(); + + expect(messageSenderMock.send).toHaveBeenCalledWith(SAVE_VIEW_CACHE_COMMAND, { + key: "test-signal", + value: JSON.stringify("Foobar"), + }); + }); + + it("should send form updates to message sender", async () => { + await initServiceWithState({}); + + const fixture = TestBed.createComponent(TestComponent); + const component = fixture.componentRef.instance; + component.formGroup.controls.name.setValue("Foobar"); + fixture.detectChanges(); + + expect(messageSenderMock.send).toHaveBeenCalledWith(SAVE_VIEW_CACHE_COMMAND, { + key: "test-form-cache", + value: JSON.stringify({ name: "Foobar" }), + }); + }); + + it("should clear on 2nd navigation", async () => { + await initServiceWithState({}); + + await router.navigate(["a"]); + expect(messageSenderMock.send).toHaveBeenCalledTimes(0); + + await router.navigate(["b"]); + expect(messageSenderMock.send).toHaveBeenCalledWith(ClEAR_VIEW_CACHE_COMMAND, {}); + }); + + it("should ignore cached values when feature flag is off", async () => { + jest.spyOn(configServiceMock, "getFeatureFlag").mockResolvedValue(false); + + await initServiceWithState({ "foo-123": JSON.stringify("bar") }); + + const injector = TestBed.inject(Injector); + + const signal = service.signal({ + key: "foo-123", + initialValue: "foo", + injector, + }); + + // The cached state is ignored + expect(signal()).toBe("foo"); + }); +}); diff --git a/apps/browser/src/platform/services/abstractions/abstract-chrome-storage-api.service.ts b/apps/browser/src/platform/services/abstractions/abstract-chrome-storage-api.service.ts index 5e9c14fd3c4..47a128bc1bc 100644 --- a/apps/browser/src/platform/services/abstractions/abstract-chrome-storage-api.service.ts +++ b/apps/browser/src/platform/services/abstractions/abstract-chrome-storage-api.service.ts @@ -1,13 +1,87 @@ -import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; +import { filter, mergeMap } from "rxjs"; -export default abstract class AbstractChromeStorageService implements AbstractStorageService { - protected abstract chromeStorageApi: chrome.storage.StorageArea; +import { + AbstractStorageService, + ObservableStorageService, + StorageUpdateType, +} from "@bitwarden/common/platform/abstractions/storage.service"; + +import { fromChromeEvent } from "../../browser/from-chrome-event"; + +export const serializationIndicator = "__json__"; + +export type SerializedValue = { [serializationIndicator]: true; value: string }; + +/** + * Serializes the given object and decorates it to indicate it is serialized. + * + * We have the problem that it is difficult to tell when a value has been serialized, by always + * storing objects decorated with this method, we can easily tell when a value has been serialized and + * deserialize it appropriately. + * @param obj object to decorate and serialize + * @returns a serialized version of the object, decorated to indicate that it is serialized + */ +export const objToStore = (obj: any) => { + if (obj == null) { + return null; + } + + if (obj instanceof Set) { + obj = Array.from(obj); + } + + return { + [serializationIndicator]: true as const, + value: JSON.stringify(obj), + }; +}; + +export default abstract class AbstractChromeStorageService + implements AbstractStorageService, ObservableStorageService +{ + updates$; + + constructor(protected chromeStorageApi: chrome.storage.StorageArea) { + this.updates$ = fromChromeEvent(this.chromeStorageApi.onChanged).pipe( + filter(([changes]) => { + // Our storage services support changing only one key at a time. If more are changed, it's due to + // reseeding storage and we should ignore the changes. + return Object.keys(changes).length === 1; + }), + mergeMap(([changes]) => { + return Object.entries(changes).map(([key, change]) => { + // The `newValue` property isn't on the StorageChange object + // when the change was from a remove. Similarly a check of the `oldValue` + // could be used to tell if the operation was the first creation of this key + // but we currently do not differentiate that. + // Ref: https://developer.chrome.com/docs/extensions/reference/storage/#type-StorageChange + // Ref: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageChange + const updateType: StorageUpdateType = "newValue" in change ? "save" : "remove"; + + return { + key: key, + // For removes this property will not exist but then it will just be + // undefined which is fine. + updateType: updateType, + }; + }); + }), + ); + } + + get valuesRequireDeserialization(): boolean { + return true; + } async get(key: string): Promise { - return new Promise((resolve) => { - this.chromeStorageApi.get(key, (obj: any) => { + return new Promise((resolve, reject) => { + this.chromeStorageApi.get(key, (obj) => { + if (chrome.runtime.lastError) { + return reject(chrome.runtime.lastError); + } + if (obj != null && obj[key] != null) { - resolve(obj[key] as T); + resolve(this.processGetObject(obj[key])); return; } resolve(null); @@ -20,32 +94,52 @@ export default abstract class AbstractChromeStorageService implements AbstractSt } async save(key: string, obj: any): Promise { - if (obj == null) { - // Fix safari not liking null in set - return new Promise((resolve) => { - this.chromeStorageApi.remove(key, () => { - resolve(); - }); - }); - } + obj = objToStore(obj); - if (obj instanceof Set) { - obj = Array.from(obj); + if (obj == null) { + // Safari does not support set of null values + return this.remove(key); } const keyedObj = { [key]: obj }; - return new Promise((resolve) => { + return new Promise((resolve, reject) => { this.chromeStorageApi.set(keyedObj, () => { + if (chrome.runtime.lastError) { + return reject(chrome.runtime.lastError); + } + resolve(); }); }); } async remove(key: string): Promise { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { this.chromeStorageApi.remove(key, () => { + if (chrome.runtime.lastError) { + return reject(chrome.runtime.lastError); + } + resolve(); }); }); } + + /** Backwards compatible resolution of retrieved object with new serialized storage */ + protected processGetObject(obj: T | SerializedValue): T | null { + if (this.isSerialized(obj)) { + obj = JSON.parse(obj.value); + } + return obj as T; + } + + /** Type guard for whether an object is tagged as serialized */ + protected isSerialized(value: T | SerializedValue): value is SerializedValue { + const asSerialized = value as SerializedValue; + return ( + asSerialized != null && + asSerialized[serializationIndicator] && + typeof asSerialized.value === "string" + ); + } } diff --git a/apps/browser/src/platform/services/abstractions/abstract-key-generation.service.ts b/apps/browser/src/platform/services/abstractions/abstract-key-generation.service.ts deleted file mode 100644 index 5c2751dceff..00000000000 --- a/apps/browser/src/platform/services/abstractions/abstract-key-generation.service.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; - -export interface AbstractKeyGenerationService { - makeEphemeralKey(numBytes?: number): Promise; -} diff --git a/apps/browser/src/platform/services/abstractions/browser-state.service.ts b/apps/browser/src/platform/services/abstractions/browser-state.service.ts deleted file mode 100644 index 30b1bb98635..00000000000 --- a/apps/browser/src/platform/services/abstractions/browser-state.service.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { StateService as BaseStateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service"; -import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options"; - -import { Account } from "../../../models/account"; -import { BrowserComponentState } from "../../../models/browserComponentState"; -import { BrowserGroupingsComponentState } from "../../../models/browserGroupingsComponentState"; -import { BrowserSendComponentState } from "../../../models/browserSendComponentState"; - -export abstract class BrowserStateService extends BaseStateServiceAbstraction { - getBrowserGroupingComponentState: ( - options?: StorageOptions - ) => Promise; - setBrowserGroupingComponentState: ( - value: BrowserGroupingsComponentState, - options?: StorageOptions - ) => Promise; - getBrowserVaultItemsComponentState: (options?: StorageOptions) => Promise; - setBrowserVaultItemsComponentState: ( - value: BrowserComponentState, - options?: StorageOptions - ) => Promise; - getBrowserSendComponentState: (options?: StorageOptions) => Promise; - setBrowserSendComponentState: ( - value: BrowserSendComponentState, - options?: StorageOptions - ) => Promise; - getBrowserSendTypeComponentState: (options?: StorageOptions) => Promise; - setBrowserSendTypeComponentState: ( - value: BrowserComponentState, - options?: StorageOptions - ) => Promise; -} diff --git a/apps/browser/src/platform/services/abstractions/browser-task-scheduler.service.ts b/apps/browser/src/platform/services/abstractions/browser-task-scheduler.service.ts new file mode 100644 index 00000000000..58c4eb48897 --- /dev/null +++ b/apps/browser/src/platform/services/abstractions/browser-task-scheduler.service.ts @@ -0,0 +1,33 @@ +import { Observable } from "rxjs"; + +import { TaskSchedulerService, ScheduledTaskName } from "@bitwarden/common/platform/scheduling"; + +export const BrowserTaskSchedulerPortName = "browser-task-scheduler-port"; + +export const BrowserTaskSchedulerPortActions = { + setTimeout: "setTimeout", + setInterval: "setInterval", + clearAlarm: "clearAlarm", +} as const; +export type BrowserTaskSchedulerPortAction = keyof typeof BrowserTaskSchedulerPortActions; + +export type BrowserTaskSchedulerPortMessage = { + action: BrowserTaskSchedulerPortAction; + taskName: ScheduledTaskName; + alarmName?: string; + delayInMs?: number; + intervalInMs?: number; +}; + +export type ActiveAlarm = { + alarmName: string; + startTime: number; + createInfo: chrome.alarms.AlarmCreateInfo; +}; + +export abstract class BrowserTaskSchedulerService extends TaskSchedulerService { + activeAlarms$: Observable; + abstract clearAllScheduledTasks(): Promise; + abstract verifyAlarmsState(): Promise; + abstract clearScheduledAlarm(alarmName: string): Promise; +} diff --git a/apps/browser/src/platform/services/abstractions/chrome-storage-api.service.spec.ts b/apps/browser/src/platform/services/abstractions/chrome-storage-api.service.spec.ts new file mode 100644 index 00000000000..ac8a01375fa --- /dev/null +++ b/apps/browser/src/platform/services/abstractions/chrome-storage-api.service.spec.ts @@ -0,0 +1,143 @@ +import AbstractChromeStorageService, { + objToStore, + serializationIndicator, +} from "./abstract-chrome-storage-api.service"; + +class TestChromeStorageApiService extends AbstractChromeStorageService {} + +describe("objectToStore", () => { + it("converts an object to a tagged string", () => { + const obj = { key: "value" }; + const result = objToStore(obj); + expect(result).toEqual({ + [serializationIndicator]: true, + value: JSON.stringify(obj), + }); + }); + + it("converts a set to an array prior to serialization", () => { + const obj = new Set(["value"]); + const result = objToStore(obj); + expect(result).toEqual({ + [serializationIndicator]: true, + value: JSON.stringify(Array.from(obj)), + }); + }); + + it("does nothing to null", () => { + expect(objToStore(null)).toEqual(null); + }); +}); + +describe("ChromeStorageApiService", () => { + let service: TestChromeStorageApiService; + let store: Record; + + beforeEach(() => { + store = {}; + + service = new TestChromeStorageApiService(chrome.storage.local); + }); + + describe("save", () => { + let setMock: jest.Mock; + + beforeEach(() => { + // setup save + setMock = chrome.storage.local.set as jest.Mock; + setMock.mockImplementation((data, callback) => { + Object.assign(store, data); + callback(); + }); + }); + + afterEach(() => { + chrome.runtime.lastError = undefined; + }); + + it("uses `objToStore` to prepare a value for set", async () => { + const key = "key"; + const value = { key: "value" }; + await service.save(key, value); + expect(setMock).toHaveBeenCalledWith( + { + [key]: objToStore(value), + }, + expect.any(Function), + ); + }); + + it("removes the key when the value is null", async () => { + const removeMock = chrome.storage.local.remove as jest.Mock; + removeMock.mockImplementation((key, callback) => { + delete store[key]; + callback(); + }); + const key = "key"; + await service.save(key, null); + expect(removeMock).toHaveBeenCalledWith(key, expect.any(Function)); + }); + + it("translates chrome.runtime.lastError to promise rejection", async () => { + setMock.mockImplementation((data, callback) => { + chrome.runtime.lastError = new Error("Test Error"); + callback(); + }); + + await expect(async () => await service.save("test", {})).rejects.toThrow("Test Error"); + }); + }); + + describe("get", () => { + let getMock: jest.Mock; + const key = "key"; + + beforeEach(() => { + // setup get + getMock = chrome.storage.local.get as jest.Mock; + getMock.mockImplementation((key, callback) => { + callback({ [key]: store[key] }); + }); + }); + + afterEach(() => { + chrome.runtime.lastError = undefined; + }); + + it("returns a stored value when it is serialized", async () => { + const value = { key: "value" }; + store[key] = objToStore(value); + const result = await service.get(key); + expect(result).toEqual(value); + }); + + it("returns a stored value when it is not serialized", async () => { + const value = "value"; + store[key] = value; + const result = await service.get(key); + expect(result).toEqual(value); + }); + + it("returns null when the key does not exist", async () => { + const result = await service.get("key"); + expect(result).toBeNull(); + }); + + it("returns null when the stored object is null", async () => { + store[key] = null; + + const result = await service.get(key); + expect(result).toBeNull(); + }); + + it("translates chrome.runtime.lastError to promise rejection", async () => { + getMock.mockImplementation((key, callback) => { + chrome.runtime.lastError = new Error("Test Error"); + callback(); + chrome.runtime.lastError = undefined; + }); + + await expect(async () => await service.get("test")).rejects.toThrow("Test Error"); + }); + }); +}); diff --git a/apps/browser/src/platform/services/abstractions/script-injector.service.ts b/apps/browser/src/platform/services/abstractions/script-injector.service.ts new file mode 100644 index 00000000000..b41e5c7617a --- /dev/null +++ b/apps/browser/src/platform/services/abstractions/script-injector.service.ts @@ -0,0 +1,45 @@ +export type CommonScriptInjectionDetails = { + /** + * Script injected into the document. + * Overridden by `mv2Details` and `mv3Details`. + */ + file?: string; + /** + * Identifies the frame targeted for script injection. Defaults to the top level frame (0). + * Can also be set to "all_frames" to inject into all frames in a tab. + */ + frame?: "all_frames" | number; + /** + * When the script executes. Defaults to "document_start". + * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/content_scripts + */ + runAt?: "document_start" | "document_end" | "document_idle"; +}; + +export type Mv2ScriptInjectionDetails = { + file: string; +}; + +export type Mv3ScriptInjectionDetails = { + file: string; + /** + * The world in which the script should be executed. Defaults to "ISOLATED". + * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/ExecutionWorld + */ + world?: chrome.scripting.ExecutionWorld; +}; + +/** + * Configuration for injecting a script into a tab. The `file` property should present as a + * path that is relative to the root directory of the extension build, ie "content/script.js". + */ +export type ScriptInjectionConfig = { + tabId: number; + injectDetails: CommonScriptInjectionDetails; + mv2Details?: Mv2ScriptInjectionDetails; + mv3Details?: Mv3ScriptInjectionDetails; +}; + +export abstract class ScriptInjectorService { + abstract inject(config: ScriptInjectionConfig): Promise; +} diff --git a/apps/browser/src/platform/services/browser-clipboard.service.spec.ts b/apps/browser/src/platform/services/browser-clipboard.service.spec.ts new file mode 100644 index 00000000000..cf0d7c46004 --- /dev/null +++ b/apps/browser/src/platform/services/browser-clipboard.service.spec.ts @@ -0,0 +1,111 @@ +import BrowserClipboardService from "./browser-clipboard.service"; + +describe("BrowserClipboardService", () => { + let windowMock: any; + const consoleWarnSpy = jest.spyOn(console, "warn"); + + beforeEach(() => { + windowMock = { + navigator: { + clipboard: { + writeText: jest.fn(), + readText: jest.fn(), + }, + }, + document: { + body: { + appendChild: jest.fn((element) => document.body.appendChild(element)), + removeChild: jest.fn((element) => document.body.removeChild(element)), + }, + createElement: jest.fn((tagName) => document.createElement(tagName)), + execCommand: jest.fn(), + queryCommandSupported: jest.fn(), + }, + }; + }); + + describe("copy", () => { + it("uses the legacy copy method if the clipboard API is not available", async () => { + const text = "test"; + windowMock.navigator.clipboard = {}; + windowMock.document.queryCommandSupported.mockReturnValue(true); + + await BrowserClipboardService.copy(windowMock as Window, text); + + expect(windowMock.document.execCommand).toHaveBeenCalledWith("copy"); + }); + + it("uses the legacy copy method if the clipboard API throws an error", async () => { + windowMock.document.queryCommandSupported.mockReturnValue(true); + windowMock.navigator.clipboard.writeText.mockRejectedValue(new Error("test")); + + await BrowserClipboardService.copy(windowMock as Window, "test"); + + expect(windowMock.document.execCommand).toHaveBeenCalledWith("copy"); + }); + + it("copies the given text to the clipboard", async () => { + const text = "test"; + + await BrowserClipboardService.copy(windowMock as Window, text); + + expect(windowMock.navigator.clipboard.writeText).toHaveBeenCalledWith(text); + }); + + it("prints an warning message to the console if both the clipboard api and legacy method throw an error", async () => { + windowMock.document.queryCommandSupported.mockReturnValue(true); + windowMock.navigator.clipboard.writeText.mockRejectedValue(new Error("test")); + windowMock.document.execCommand.mockImplementation(() => { + throw new Error("test"); + }); + + await BrowserClipboardService.copy(windowMock as Window, ""); + + expect(consoleWarnSpy).toHaveBeenCalled(); + }); + }); + + describe("read", () => { + it("uses the legacy read method if the clipboard API is not available", async () => { + const testValue = "test"; + windowMock.navigator.clipboard = {}; + windowMock.document.queryCommandSupported.mockReturnValue(true); + windowMock.document.execCommand.mockImplementation(() => { + document.querySelector("textarea").value = testValue; + return true; + }); + + const returnValue = await BrowserClipboardService.read(windowMock as Window); + + expect(windowMock.document.execCommand).toHaveBeenCalledWith("paste"); + expect(returnValue).toBe(testValue); + }); + + it("uses the legacy read method if the clipboard API throws an error", async () => { + windowMock.document.queryCommandSupported.mockReturnValue(true); + windowMock.navigator.clipboard.readText.mockRejectedValue(new Error("test")); + + await BrowserClipboardService.read(windowMock as Window); + + expect(windowMock.document.execCommand).toHaveBeenCalledWith("paste"); + }); + + it("reads the text from the clipboard", async () => { + await BrowserClipboardService.read(windowMock as Window); + + expect(windowMock.navigator.clipboard.readText).toHaveBeenCalled(); + }); + + it("prints a warning message to the console if both the clipboard api and legacy method throw an error", async () => { + windowMock.document.queryCommandSupported.mockReturnValue(true); + windowMock.navigator.clipboard.readText.mockRejectedValue(new Error("test")); + windowMock.document.execCommand.mockImplementation(() => { + throw new Error("test"); + }); + + await BrowserClipboardService.read(windowMock as Window); + + expect(consoleWarnSpy).toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/browser/src/platform/services/browser-clipboard.service.ts b/apps/browser/src/platform/services/browser-clipboard.service.ts new file mode 100644 index 00000000000..8fb5a6d124a --- /dev/null +++ b/apps/browser/src/platform/services/browser-clipboard.service.ts @@ -0,0 +1,130 @@ +import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; + +class BrowserClipboardService { + private static consoleLogService: ConsoleLogService = new ConsoleLogService(false); + + /** + * Copies the given text to the user's clipboard. + * + * @param globalContext - The global window context. + * @param text - The text to copy. + */ + static async copy(globalContext: Window, text: string) { + if (!BrowserClipboardService.isClipboardApiSupported(globalContext, "writeText")) { + this.useLegacyCopyMethod(globalContext, text); + return; + } + + try { + await globalContext.navigator.clipboard.writeText(text); + } catch (error) { + BrowserClipboardService.consoleLogService.debug( + `Error copying to clipboard using the clipboard API, attempting legacy method: ${error}`, + ); + + this.useLegacyCopyMethod(globalContext, text); + } + } + + /** + * Reads the user's clipboard and returns the text. + * + * @param globalContext - The global window context. + */ + static async read(globalContext: Window): Promise { + if (!BrowserClipboardService.isClipboardApiSupported(globalContext, "readText")) { + return this.useLegacyReadMethod(globalContext); + } + + try { + return await globalContext.navigator.clipboard.readText(); + } catch (error) { + BrowserClipboardService.consoleLogService.debug( + `Error reading from clipboard using the clipboard API, attempting legacy method: ${error}`, + ); + + return this.useLegacyReadMethod(globalContext); + } + } + + /** + * Copies the given text to the user's clipboard using the legacy `execCommand` method. This + * method is used as a fallback when the clipboard API is not supported or fails. + * + * @param globalContext - The global window context. + * @param text - The text to copy. + */ + private static useLegacyCopyMethod(globalContext: Window, text: string) { + if (!BrowserClipboardService.isLegacyClipboardMethodSupported(globalContext, "copy")) { + BrowserClipboardService.consoleLogService.warning("Legacy copy method not supported"); + return; + } + + const textareaElement = globalContext.document.createElement("textarea"); + textareaElement.textContent = !text ? " " : text; + textareaElement.style.position = "fixed"; + globalContext.document.body.appendChild(textareaElement); + textareaElement.select(); + + try { + globalContext.document.execCommand("copy"); + } catch (error) { + BrowserClipboardService.consoleLogService.warning(`Error writing to clipboard: ${error}`); + } finally { + globalContext.document.body.removeChild(textareaElement); + } + } + + /** + * Reads the user's clipboard using the legacy `execCommand` method. This method is used as a + * fallback when the clipboard API is not supported or fails. + * + * @param globalContext - The global window context. + */ + private static useLegacyReadMethod(globalContext: Window): string { + if (!BrowserClipboardService.isLegacyClipboardMethodSupported(globalContext, "paste")) { + BrowserClipboardService.consoleLogService.warning("Legacy paste method not supported"); + return ""; + } + + const textareaElement = globalContext.document.createElement("textarea"); + textareaElement.style.position = "fixed"; + globalContext.document.body.appendChild(textareaElement); + textareaElement.focus(); + + try { + return globalContext.document.execCommand("paste") ? textareaElement.value : ""; + } catch (error) { + BrowserClipboardService.consoleLogService.warning(`Error reading from clipboard: ${error}`); + } finally { + globalContext.document.body.removeChild(textareaElement); + } + + return ""; + } + + /** + * Checks if the clipboard API is supported in the current environment. + * + * @param globalContext - The global window context. + * @param method - The clipboard API method to check for support. + */ + private static isClipboardApiSupported(globalContext: Window, method: "writeText" | "readText") { + return "clipboard" in globalContext.navigator && method in globalContext.navigator.clipboard; + } + + /** + * Checks if the legacy clipboard method is supported in the current environment. + * + * @param globalContext - The global window context. + * @param method - The legacy clipboard method to check for support. + */ + private static isLegacyClipboardMethodSupported(globalContext: Window, method: "copy" | "paste") { + return ( + "queryCommandSupported" in globalContext.document && + globalContext.document.queryCommandSupported(method) + ); + } +} + +export default BrowserClipboardService; diff --git a/apps/browser/src/platform/services/browser-config.service.ts b/apps/browser/src/platform/services/browser-config.service.ts deleted file mode 100644 index 39d1fc565eb..00000000000 --- a/apps/browser/src/platform/services/browser-config.service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ReplaySubject } from "rxjs"; - -import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; -import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { ConfigService } from "@bitwarden/common/platform/services/config/config.service"; - -import { browserSession, sessionSync } from "../decorators/session-sync-observable"; - -@browserSession -export class BrowserConfigService extends ConfigService { - @sessionSync({ initializer: ServerConfig.fromJSON }) - protected _serverConfig: ReplaySubject; - - constructor( - stateService: StateService, - configApiService: ConfigApiServiceAbstraction, - authService: AuthService, - environmentService: EnvironmentService, - logService: LogService, - subscribe = false - ) { - super(stateService, configApiService, authService, environmentService, logService, subscribe); - } -} diff --git a/apps/browser/src/platform/services/browser-crypto.service.ts b/apps/browser/src/platform/services/browser-crypto.service.ts deleted file mode 100644 index a6dce0f39e9..00000000000 --- a/apps/browser/src/platform/services/browser-crypto.service.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { KeySuffixOptions } from "@bitwarden/common/enums"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { - SymmetricCryptoKey, - UserKey, -} from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { CryptoService } from "@bitwarden/common/platform/services/crypto.service"; - -export class BrowserCryptoService extends CryptoService { - override async hasUserKeyStored(keySuffix: KeySuffixOptions, userId?: string): Promise { - if (keySuffix === KeySuffixOptions.Biometric) { - return await this.stateService.getBiometricUnlock({ userId: userId }); - } - return super.hasUserKeyStored(keySuffix, userId); - } - - /** - * Browser doesn't store biometric keys, so we retrieve them from the desktop and return - * if we successfully saved it into memory as the User Key - */ - protected override async getKeyFromStorage(keySuffix: KeySuffixOptions): Promise { - if (keySuffix === KeySuffixOptions.Biometric) { - await this.platformUtilService.authenticateBiometric(); - const userKey = await this.stateService.getUserKey(); - if (userKey) { - return new SymmetricCryptoKey(Utils.fromB64ToArray(userKey.keyB64)) as UserKey; - } - } - - return await super.getKeyFromStorage(keySuffix); - } -} diff --git a/apps/browser/src/platform/services/browser-environment.service.ts b/apps/browser/src/platform/services/browser-environment.service.ts index 08a4d811d9d..89f05579c88 100644 --- a/apps/browser/src/platform/services/browser-environment.service.ts +++ b/apps/browser/src/platform/services/browser-environment.service.ts @@ -1,13 +1,22 @@ +import { firstValueFrom } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { Region, RegionConfig } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { EnvironmentService } from "@bitwarden/common/platform/services/environment.service"; +import { DefaultEnvironmentService } from "@bitwarden/common/platform/services/default-environment.service"; +import { StateProvider } from "@bitwarden/common/platform/state"; import { GroupPolicyEnvironment } from "../../admin-console/types/group-policy-environment"; import { devFlagEnabled, devFlagValue } from "../flags"; -export class BrowserEnvironmentService extends EnvironmentService { - constructor(stateService: StateService, private logService: LogService) { - super(stateService); +export class BrowserEnvironmentService extends DefaultEnvironmentService { + constructor( + private logService: LogService, + stateProvider: StateProvider, + accountService: AccountService, + additionalRegionConfigs: RegionConfig[] = [], + ) { + super(stateProvider, accountService, additionalRegionConfigs); } async hasManagedEnvironment(): Promise { @@ -24,16 +33,18 @@ export class BrowserEnvironmentService extends EnvironmentService { return false; } - const env = await this.getManagedEnvironment(); + const managedEnv = await this.getManagedEnvironment(); + const env = await firstValueFrom(this.environment$); + const urls = env.getUrls(); return ( - env.base != this.baseUrl || - env.webVault != this.webVaultUrl || - env.api != this.webVaultUrl || - env.identity != this.identityUrl || - env.icons != this.iconsUrl || - env.notifications != this.notificationsUrl || - env.events != this.eventsUrl + managedEnv.base != urls.base || + managedEnv.webVault != urls.webVault || + managedEnv.api != urls.api || + managedEnv.identity != urls.identity || + managedEnv.icons != urls.icons || + managedEnv.notifications != urls.notifications || + managedEnv.events != urls.events ); } @@ -57,7 +68,7 @@ export class BrowserEnvironmentService extends EnvironmentService { async setUrlsToManagedEnvironment() { const env = await this.getManagedEnvironment(); - await this.setUrls({ + await this.setEnvironment(Region.SelfHosted, { base: env.base, webVault: env.webVault, api: env.api, diff --git a/apps/browser/src/platform/services/browser-i18n.service.ts b/apps/browser/src/platform/services/browser-i18n.service.ts deleted file mode 100644 index 03406c5b706..00000000000 --- a/apps/browser/src/platform/services/browser-i18n.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ReplaySubject } from "rxjs"; - -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; - -import { browserSession, sessionSync } from "../decorators/session-sync-observable"; - -import I18nService from "./i18n.service"; - -@browserSession -export class BrowserI18nService extends I18nService { - @sessionSync({ initializer: (s: string) => s }) - protected _locale: ReplaySubject; - - constructor(systemLanguage: string, private stateService: StateService) { - super(systemLanguage); - } -} diff --git a/apps/browser/src/platform/services/browser-local-storage.service.ts b/apps/browser/src/platform/services/browser-local-storage.service.ts index 8be8127d545..9c315b7f6f4 100644 --- a/apps/browser/src/platform/services/browser-local-storage.service.ts +++ b/apps/browser/src/platform/services/browser-local-storage.service.ts @@ -1,5 +1,104 @@ -import AbstractChromeStorageService from "./abstractions/abstract-chrome-storage-api.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; + +import AbstractChromeStorageService, { + SerializedValue, +} from "./abstractions/abstract-chrome-storage-api.service"; export default class BrowserLocalStorageService extends AbstractChromeStorageService { - protected chromeStorageApi = chrome.storage.local; + constructor(private readonly logService: LogService) { + super(chrome.storage.local); + } + + override async get(key: string): Promise { + return await this.getWithRetries(key, 0); + } + + private async getWithRetries(key: string, retryNum: number): Promise { + // See: https://github.com/EFForg/privacybadger/pull/2980 + const MAX_RETRIES = 5; + const WAIT_TIME = 200; + + const store = await this.getStore(key); + + if (store == null) { + if (retryNum >= MAX_RETRIES) { + throw new Error(`Failed to get a value for key '${key}', see logs for more details.`); + } + + retryNum++; + this.logService.warning(`Retrying attempt to get value for key '${key}' in ${WAIT_TIME}ms`); + await new Promise((resolve) => setTimeout(resolve, WAIT_TIME)); + return await this.getWithRetries(key, retryNum); + } + + // We have a store + return this.processGetObject(store[key] as T | SerializedValue); + } + + private async getStore(key: string) { + if (this.chromeStorageApi == null) { + this.logService.warning( + `chrome.storage.local was not initialized while retrieving key '${key}'.`, + ); + return null; + } + + return new Promise<{ [key: string]: unknown }>((resolve) => { + this.chromeStorageApi.get(key, (store) => { + if (chrome.runtime.lastError) { + this.logService.warning(`Failed to get value for key '${key}'`, chrome.runtime.lastError); + resolve(null); + return; + } + + if (store == null) { + this.logService.warning(`Store was empty while retrieving value for key '${key}'`); + resolve(null); + return; + } + + resolve(store); + }); + }); + } + + async fillBuffer() { + // Write 4MB of data in chrome.storage.local, log files will hold 4MB of data (by default) + // before forcing a compaction. To force a compaction and have it remove previously saved data, + // we want to fill it's buffer so that anything newly marked for deletion is gone. + // https://github.com/google/leveldb/blob/main/doc/impl.md#log-files + // It's important that if Google uses a different buffer length that we match that, as far as I can tell + // Google uses the default value in Chromium: + // https://github.com/chromium/chromium/blob/148774efa6b3a047369af6179a4248566b39d68f/components/value_store/lazy_leveldb.cc#L65-L66 + const fakeData = "0".repeat(1024 * 1024); // 1MB of data + await new Promise((resolve, reject) => { + this.chromeStorageApi.set( + { + fake_data_1: fakeData, + fake_data_2: fakeData, + fake_data_3: fakeData, + fake_data_4: fakeData, + }, + () => { + if (chrome.runtime.lastError) { + return reject(chrome.runtime.lastError); + } + + resolve(); + }, + ); + }); + await new Promise((resolve, reject) => { + this.chromeStorageApi.remove( + ["fake_data_1", "fake_data_2", "fake_data_3", "fake_data_4"], + () => { + if (chrome.runtime.lastError) { + return reject(chrome.runtime.lastError); + } + + resolve(); + }, + ); + }); + } } diff --git a/apps/browser/src/platform/services/browser-memory-storage.service.ts b/apps/browser/src/platform/services/browser-memory-storage.service.ts index cdefbe45812..f824a1df0de 100644 --- a/apps/browser/src/platform/services/browser-memory-storage.service.ts +++ b/apps/browser/src/platform/services/browser-memory-storage.service.ts @@ -1,5 +1,7 @@ import AbstractChromeStorageService from "./abstractions/abstract-chrome-storage-api.service"; export default class BrowserMemoryStorageService extends AbstractChromeStorageService { - protected chromeStorageApi = chrome.storage.session; + constructor() { + super(chrome.storage.session); + } } diff --git a/apps/browser/src/platform/services/browser-messaging-private-mode-background.service.ts b/apps/browser/src/platform/services/browser-messaging-private-mode-background.service.ts deleted file mode 100644 index c2a6f8c5e1f..00000000000 --- a/apps/browser/src/platform/services/browser-messaging-private-mode-background.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; - -export default class BrowserMessagingPrivateModeBackgroundService implements MessagingService { - send(subscriber: string, arg: any = {}) { - const message = Object.assign({}, { command: subscriber }, arg); - (window as any).bitwardenPopupMainMessageListener(message); - } -} diff --git a/apps/browser/src/platform/services/browser-messaging-private-mode-popup.service.ts b/apps/browser/src/platform/services/browser-messaging-private-mode-popup.service.ts deleted file mode 100644 index 5572ba1ba41..00000000000 --- a/apps/browser/src/platform/services/browser-messaging-private-mode-popup.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; - -export default class BrowserMessagingPrivateModePopupService implements MessagingService { - send(subscriber: string, arg: any = {}) { - const message = Object.assign({}, { command: subscriber }, arg); - (window as any).bitwardenBackgroundMessageListener(message); - } -} diff --git a/apps/browser/src/platform/services/browser-messaging.service.ts b/apps/browser/src/platform/services/browser-messaging.service.ts deleted file mode 100644 index 5eff957cb50..00000000000 --- a/apps/browser/src/platform/services/browser-messaging.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; - -import { BrowserApi } from "../browser/browser-api"; - -export default class BrowserMessagingService implements MessagingService { - send(subscriber: string, arg: any = {}) { - return BrowserApi.sendMessage(subscriber, arg); - } -} diff --git a/apps/browser/src/platform/services/browser-platform-utils.service.spec.ts b/apps/browser/src/platform/services/browser-platform-utils.service.spec.ts deleted file mode 100644 index 964200dfcea..00000000000 --- a/apps/browser/src/platform/services/browser-platform-utils.service.spec.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { DeviceType } from "@bitwarden/common/enums"; - -import BrowserPlatformUtilsService from "./browser-platform-utils.service"; - -describe("Browser Utils Service", () => { - describe("getBrowser", () => { - const originalUserAgent = navigator.userAgent; - - // Reset the userAgent. - afterAll(() => { - Object.defineProperty(navigator, "userAgent", { - value: originalUserAgent, - }); - }); - - let browserPlatformUtilsService: BrowserPlatformUtilsService; - beforeEach(() => { - (window as any).matchMedia = jest.fn().mockReturnValueOnce({}); - browserPlatformUtilsService = new BrowserPlatformUtilsService(null, null, null, window); - }); - - afterEach(() => { - window.matchMedia = undefined; - (window as any).chrome = undefined; - (BrowserPlatformUtilsService as any).deviceCache = null; - }); - - it("should detect chrome", () => { - Object.defineProperty(navigator, "userAgent", { - configurable: true, - value: - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", - }); - - (window as any).chrome = {}; - - expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.ChromeExtension); - }); - - it("should detect firefox", () => { - Object.defineProperty(navigator, "userAgent", { - configurable: true, - value: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0", - }); - - expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.FirefoxExtension); - }); - - it("should detect opera", () => { - Object.defineProperty(navigator, "userAgent", { - configurable: true, - value: - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3175.3 Safari/537.36 OPR/49.0.2695.0 (Edition developer)", - }); - - expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.OperaExtension); - }); - - it("should detect edge", () => { - Object.defineProperty(navigator, "userAgent", { - configurable: true, - value: - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.74 Safari/537.36 Edg/79.0.309.43", - }); - - expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.EdgeExtension); - }); - - it("should detect safari", () => { - Object.defineProperty(navigator, "userAgent", { - configurable: true, - value: - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8", - }); - - expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.SafariExtension); - }); - - it("should detect vivaldi", () => { - Object.defineProperty(navigator, "userAgent", { - configurable: true, - value: - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.97 Safari/537.36 Vivaldi/1.94.1008.40", - }); - - expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.VivaldiExtension); - }); - }); -}); - -describe("Safari Height Fix", () => { - const originalUserAgent = navigator.userAgent; - - // Reset the userAgent. - afterAll(() => { - Object.defineProperty(navigator, "userAgent", { - value: originalUserAgent, - }); - }); - - afterEach(() => { - (BrowserPlatformUtilsService as any).deviceCache = null; - }); - - test.each([ - [ - "safari 15.6.1", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15", - true, - ], - [ - "safari 16.0", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15", - true, - ], - - [ - "safari 16.1", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15", - false, - ], - [ - "safari 16.4", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Safari/605.1.15", - false, - ], - [ - "safari 17.0 (future release)", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15", - false, - ], - [ - "chrome", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", - false, - ], - [ - "firefox", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0", - false, - ], - [ - "opera", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3175.3 Safari/537.36 OPR/49.0.2695.0 (Edition developer)", - false, - ], - [ - "edge", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.74 Safari/537.36 Edg/79.0.309.43", - false, - ], - ])("Apply fix for %s", (name, userAgent, expected) => { - Object.defineProperty(navigator, "userAgent", { - configurable: true, - value: userAgent, - }); - expect(BrowserPlatformUtilsService.shouldApplySafariHeightFix(window)).toBe(expected); - }); -}); diff --git a/apps/browser/src/platform/services/browser-platform-utils.service.ts b/apps/browser/src/platform/services/browser-platform-utils.service.ts deleted file mode 100644 index 018b1c623dc..00000000000 --- a/apps/browser/src/platform/services/browser-platform-utils.service.ts +++ /dev/null @@ -1,354 +0,0 @@ -import { ClientType, DeviceType } from "@bitwarden/common/enums"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; - -import { SafariApp } from "../../browser/safariApp"; -import { BrowserApi } from "../browser/browser-api"; - -export default class BrowserPlatformUtilsService implements PlatformUtilsService { - private static deviceCache: DeviceType = null; - - constructor( - private messagingService: MessagingService, - private clipboardWriteCallback: (clipboardValue: string, clearMs: number) => void, - private biometricCallback: () => Promise, - private win: Window & typeof globalThis - ) {} - - static getDevice(win: Window & typeof globalThis): DeviceType { - if (this.deviceCache) { - return this.deviceCache; - } - - if (BrowserPlatformUtilsService.isFirefox()) { - this.deviceCache = DeviceType.FirefoxExtension; - } else if (BrowserPlatformUtilsService.isOpera(win)) { - this.deviceCache = DeviceType.OperaExtension; - } else if (BrowserPlatformUtilsService.isEdge()) { - this.deviceCache = DeviceType.EdgeExtension; - } else if (BrowserPlatformUtilsService.isVivaldi()) { - this.deviceCache = DeviceType.VivaldiExtension; - } else if (BrowserPlatformUtilsService.isChrome(win)) { - this.deviceCache = DeviceType.ChromeExtension; - } else if (BrowserPlatformUtilsService.isSafari(win)) { - this.deviceCache = DeviceType.SafariExtension; - } - - return this.deviceCache; - } - - getDevice(): DeviceType { - return BrowserPlatformUtilsService.getDevice(this.win); - } - - getDeviceString(): string { - const device = DeviceType[this.getDevice()].toLowerCase(); - return device.replace("extension", ""); - } - - getClientType(): ClientType { - return ClientType.Browser; - } - - /** - * @deprecated Do not call this directly, use getDevice() instead - */ - static isFirefox(): boolean { - return ( - navigator.userAgent.indexOf(" Firefox/") !== -1 || - navigator.userAgent.indexOf(" Gecko/") !== -1 - ); - } - - isFirefox(): boolean { - return this.getDevice() === DeviceType.FirefoxExtension; - } - - /** - * @deprecated Do not call this directly, use getDevice() instead - */ - private static isChrome(win: Window & typeof globalThis): boolean { - return win.chrome && navigator.userAgent.indexOf(" Chrome/") !== -1; - } - - isChrome(): boolean { - return this.getDevice() === DeviceType.ChromeExtension; - } - - /** - * @deprecated Do not call this directly, use getDevice() instead - */ - private static isEdge(): boolean { - return navigator.userAgent.indexOf(" Edg/") !== -1; - } - - isEdge(): boolean { - return this.getDevice() === DeviceType.EdgeExtension; - } - - /** - * @deprecated Do not call this directly, use getDevice() instead - */ - private static isOpera(win: Window & typeof globalThis): boolean { - return ( - (!!win.opr && !!win.opr.addons) || !!win.opera || navigator.userAgent.indexOf(" OPR/") >= 0 - ); - } - - isOpera(): boolean { - return this.getDevice() === DeviceType.OperaExtension; - } - - /** - * @deprecated Do not call this directly, use getDevice() instead - */ - private static isVivaldi(): boolean { - return navigator.userAgent.indexOf(" Vivaldi/") !== -1; - } - - isVivaldi(): boolean { - return this.getDevice() === DeviceType.VivaldiExtension; - } - - /** - * @deprecated Do not call this directly, use getDevice() instead - */ - static isSafari(win: Window & typeof globalThis): boolean { - // Opera masquerades as Safari, so make sure we're not there first - return ( - !BrowserPlatformUtilsService.isOpera(win) && navigator.userAgent.indexOf(" Safari/") !== -1 - ); - } - - private static safariVersion(): string { - return navigator.userAgent.match("Version/([0-9.]*)")?.[1]; - } - - /** - * Safari previous to version 16.1 had a bug which caused artifacts on hover in large extension popups. - * https://bugs.webkit.org/show_bug.cgi?id=218704 - */ - static shouldApplySafariHeightFix(win: Window & typeof globalThis): boolean { - if (BrowserPlatformUtilsService.getDevice(win) !== DeviceType.SafariExtension) { - return false; - } - - const version = BrowserPlatformUtilsService.safariVersion(); - const parts = version?.split(".")?.map((v) => Number(v)); - return parts?.[0] < 16 || (parts?.[0] === 16 && parts?.[1] === 0); - } - - isSafari(): boolean { - return this.getDevice() === DeviceType.SafariExtension; - } - - isIE(): boolean { - return false; - } - - isMacAppStore(): boolean { - return false; - } - - async isViewOpen(): Promise { - if (await BrowserApi.isPopupOpen()) { - return true; - } - - if (this.isSafari()) { - return false; - } - - // Opera has "sidebar_panel" as a ViewType but doesn't currently work - if (this.isFirefox() && chrome.extension.getViews({ type: "sidebar" }).length > 0) { - return true; - } - - // Opera sidebar has type of "tab" (will stick around for a while after closing sidebar) - const tabOpen = chrome.extension.getViews({ type: "tab" }).length > 0; - return tabOpen; - } - - lockTimeout(): number { - return null; - } - - launchUri(uri: string, options?: any): void { - BrowserApi.createNewTab(uri, options && options.extensionPage === true); - } - - getApplicationVersion(): Promise { - return Promise.resolve(BrowserApi.getApplicationVersion()); - } - - async getApplicationVersionNumber(): Promise { - return (await this.getApplicationVersion()).split(RegExp("[+|-]"))[0].trim(); - } - - supportsWebAuthn(win: Window): boolean { - return typeof PublicKeyCredential !== "undefined"; - } - - supportsDuo(): boolean { - return true; - } - - showToast( - type: "error" | "success" | "warning" | "info", - title: string, - text: string | string[], - options?: any - ): void { - this.messagingService.send("showToast", { - text: text, - title: title, - type: type, - options: options, - }); - } - - isDev(): boolean { - return process.env.ENV === "development"; - } - - isSelfHost(): boolean { - return false; - } - - copyToClipboard(text: string, options?: any): void { - let win = this.win; - let doc = this.win.document; - if (options && (options.window || options.win)) { - win = options.window || options.win; - doc = win.document; - } else if (options && options.doc) { - doc = options.doc; - } - const clearing = options ? !!options.clearing : false; - const clearMs: number = options && options.clearMs ? options.clearMs : null; - - if (this.isSafari()) { - SafariApp.sendMessageToApp("copyToClipboard", text).then(() => { - if (!clearing && this.clipboardWriteCallback != null) { - this.clipboardWriteCallback(text, clearMs); - } - }); - } else if ( - this.isFirefox() && - (win as any).navigator.clipboard && - (win as any).navigator.clipboard.writeText - ) { - (win as any).navigator.clipboard.writeText(text).then(() => { - if (!clearing && this.clipboardWriteCallback != null) { - this.clipboardWriteCallback(text, clearMs); - } - }); - } else if (doc.queryCommandSupported && doc.queryCommandSupported("copy")) { - if (this.isChrome() && text === "") { - text = "\u0000"; - } - - const textarea = doc.createElement("textarea"); - textarea.textContent = text == null || text === "" ? " " : text; - // Prevent scrolling to bottom of page in MS Edge. - textarea.style.position = "fixed"; - doc.body.appendChild(textarea); - textarea.select(); - - try { - // Security exception may be thrown by some browsers. - if (doc.execCommand("copy") && !clearing && this.clipboardWriteCallback != null) { - this.clipboardWriteCallback(text, clearMs); - } - } catch (e) { - // eslint-disable-next-line - console.warn("Copy to clipboard failed.", e); - } finally { - doc.body.removeChild(textarea); - } - } - } - - async readFromClipboard(options?: any): Promise { - let win = this.win; - let doc = this.win.document; - if (options && (options.window || options.win)) { - win = options.window || options.win; - doc = win.document; - } else if (options && options.doc) { - doc = options.doc; - } - - if (this.isSafari()) { - return await SafariApp.sendMessageToApp("readFromClipboard"); - } else if ( - this.isFirefox() && - (win as any).navigator.clipboard && - (win as any).navigator.clipboard.readText - ) { - return await (win as any).navigator.clipboard.readText(); - } else if (doc.queryCommandSupported && doc.queryCommandSupported("paste")) { - const textarea = doc.createElement("textarea"); - // Prevent scrolling to bottom of page in MS Edge. - textarea.style.position = "fixed"; - doc.body.appendChild(textarea); - textarea.focus(); - try { - // Security exception may be thrown by some browsers. - if (doc.execCommand("paste")) { - return textarea.value; - } - } catch (e) { - // eslint-disable-next-line - console.warn("Read from clipboard failed.", e); - } finally { - doc.body.removeChild(textarea); - } - } - return null; - } - - async supportsBiometric() { - const platformInfo = await BrowserApi.getPlatformInfo(); - if (platformInfo.os === "android") { - return false; - } - - return true; - } - - authenticateBiometric() { - return this.biometricCallback(); - } - - supportsSecureStorage(): boolean { - return false; - } - - async getAutofillKeyboardShortcut(): Promise { - let autofillCommand: string; - // You can not change the command in Safari or obtain it programmatically - if (this.isSafari()) { - autofillCommand = "Cmd+Shift+L"; - } else if (this.isFirefox()) { - autofillCommand = (await browser.commands.getAll()).find( - (c) => c.name === "autofill_login" - ).shortcut; - // Firefox is returning Ctrl instead of Cmd for the modifier key on macOS if - // the command is the default one set on installation. - if ( - (await browser.runtime.getPlatformInfo()).os === "mac" && - autofillCommand === "Ctrl+Shift+L" - ) { - autofillCommand = "Cmd+Shift+L"; - } - } else { - await new Promise((resolve) => - chrome.commands.getAll((c) => - resolve((autofillCommand = c.find((c) => c.name === "autofill_login").shortcut)) - ) - ); - } - return autofillCommand; - } -} diff --git a/apps/browser/src/platform/services/browser-script-injector.service.spec.ts b/apps/browser/src/platform/services/browser-script-injector.service.spec.ts new file mode 100644 index 00000000000..d6ec3dfde96 --- /dev/null +++ b/apps/browser/src/platform/services/browser-script-injector.service.spec.ts @@ -0,0 +1,180 @@ +import { mock } from "jest-mock-extended"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; + +import { BrowserApi } from "../browser/browser-api"; + +import { + CommonScriptInjectionDetails, + Mv3ScriptInjectionDetails, +} from "./abstractions/script-injector.service"; +import { BrowserScriptInjectorService } from "./browser-script-injector.service"; + +describe("ScriptInjectorService", () => { + const tabId = 1; + const combinedManifestVersionFile = "content/autofill-init.js"; + const mv2SpecificFile = "content/autofill-init-mv2.js"; + const mv2Details = { file: mv2SpecificFile }; + const mv3SpecificFile = "content/autofill-init-mv3.js"; + const mv3Details: Mv3ScriptInjectionDetails = { file: mv3SpecificFile, world: "MAIN" }; + const sharedInjectDetails: CommonScriptInjectionDetails = { + runAt: "document_start", + }; + const manifestVersionSpy = jest.spyOn(BrowserApi, "manifestVersion", "get"); + let scriptInjectorService: BrowserScriptInjectorService; + jest.spyOn(BrowserApi, "executeScriptInTab").mockImplementation(); + jest.spyOn(BrowserApi, "isManifestVersion"); + const platformUtilsService = mock(); + const logService = mock(); + + beforeEach(() => { + scriptInjectorService = new BrowserScriptInjectorService(platformUtilsService, logService); + }); + + describe("inject", () => { + describe("injection of a single script that functions in both manifest v2 and v3", () => { + it("injects the script in manifest v2 when given combined injection details", async () => { + manifestVersionSpy.mockReturnValue(2); + + await scriptInjectorService.inject({ + tabId, + injectDetails: { + file: combinedManifestVersionFile, + frame: "all_frames", + ...sharedInjectDetails, + }, + }); + + expect(BrowserApi.executeScriptInTab).toHaveBeenCalledWith(tabId, { + ...sharedInjectDetails, + allFrames: true, + file: combinedManifestVersionFile, + }); + }); + + it("injects the script in manifest v3 when given combined injection details", async () => { + manifestVersionSpy.mockReturnValue(3); + + await scriptInjectorService.inject({ + tabId, + injectDetails: { + file: combinedManifestVersionFile, + frame: 10, + ...sharedInjectDetails, + }, + }); + + expect(BrowserApi.executeScriptInTab).toHaveBeenCalledWith( + tabId, + { ...sharedInjectDetails, frameId: 10, file: combinedManifestVersionFile }, + { world: "ISOLATED" }, + ); + }); + }); + + describe("injection of mv2 specific details", () => { + describe("given the extension is running manifest v2", () => { + it("injects the mv2 script injection details file", async () => { + manifestVersionSpy.mockReturnValue(2); + + await scriptInjectorService.inject({ + mv2Details, + tabId, + injectDetails: sharedInjectDetails, + }); + + expect(BrowserApi.executeScriptInTab).toHaveBeenCalledWith(tabId, { + ...sharedInjectDetails, + frameId: 0, + file: mv2SpecificFile, + }); + }); + }); + + describe("given the extension is running manifest v3", () => { + it("injects the common script injection details file", async () => { + manifestVersionSpy.mockReturnValue(3); + + await scriptInjectorService.inject({ + mv2Details, + tabId, + injectDetails: { ...sharedInjectDetails, file: combinedManifestVersionFile }, + }); + + expect(BrowserApi.executeScriptInTab).toHaveBeenCalledWith( + tabId, + { + ...sharedInjectDetails, + frameId: 0, + file: combinedManifestVersionFile, + }, + { world: "ISOLATED" }, + ); + }); + + it("throws an error if no common script injection details file is specified", async () => { + manifestVersionSpy.mockReturnValue(3); + + await expect( + scriptInjectorService.inject({ + mv2Details, + tabId, + injectDetails: { ...sharedInjectDetails, file: null }, + }), + ).rejects.toThrow("No file specified for script injection"); + }); + }); + }); + + describe("injection of mv3 specific details", () => { + describe("given the extension is running manifest v3", () => { + it("injects the mv3 script injection details file", async () => { + manifestVersionSpy.mockReturnValue(3); + + await scriptInjectorService.inject({ + mv3Details, + tabId, + injectDetails: sharedInjectDetails, + }); + + expect(BrowserApi.executeScriptInTab).toHaveBeenCalledWith( + tabId, + { ...sharedInjectDetails, frameId: 0, file: mv3SpecificFile }, + { world: "MAIN" }, + ); + }); + }); + + describe("given the extension is running manifest v2", () => { + it("injects the common script injection details file", async () => { + manifestVersionSpy.mockReturnValue(2); + + await scriptInjectorService.inject({ + mv3Details, + tabId, + injectDetails: { ...sharedInjectDetails, file: combinedManifestVersionFile }, + }); + + expect(BrowserApi.executeScriptInTab).toHaveBeenCalledWith(tabId, { + ...sharedInjectDetails, + frameId: 0, + file: combinedManifestVersionFile, + }); + }); + + it("throws an error if no common script injection details file is specified", async () => { + manifestVersionSpy.mockReturnValue(2); + + await expect( + scriptInjectorService.inject({ + mv3Details, + tabId, + injectDetails: { ...sharedInjectDetails, file: "" }, + }), + ).rejects.toThrow("No file specified for script injection"); + }); + }); + }); + }); +}); diff --git a/apps/browser/src/platform/services/browser-script-injector.service.ts b/apps/browser/src/platform/services/browser-script-injector.service.ts new file mode 100644 index 00000000000..5b3a10ef2bb --- /dev/null +++ b/apps/browser/src/platform/services/browser-script-injector.service.ts @@ -0,0 +1,105 @@ +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; + +import { BrowserApi } from "../browser/browser-api"; + +import { + CommonScriptInjectionDetails, + ScriptInjectionConfig, + ScriptInjectorService, +} from "./abstractions/script-injector.service"; + +export class BrowserScriptInjectorService extends ScriptInjectorService { + constructor( + private readonly platformUtilsService: PlatformUtilsService, + private readonly logService: LogService, + ) { + super(); + } + + /** + * Facilitates the injection of a script into a tab context. Will adjust + * behavior between manifest v2 and v3 based on the passed configuration. + * + * @param config - The configuration for the script injection. + */ + async inject(config: ScriptInjectionConfig): Promise { + const { tabId, injectDetails, mv3Details } = config; + const file = this.getScriptFile(config); + if (!file) { + throw new Error("No file specified for script injection"); + } + + const injectionDetails = this.buildInjectionDetails(injectDetails, file); + + if (BrowserApi.isManifestVersion(3)) { + try { + await BrowserApi.executeScriptInTab(tabId, injectionDetails, { + world: mv3Details?.world ?? "ISOLATED", + }); + } catch (error) { + // Swallow errors for host permissions, since this is believed to be a Manifest V3 Chrome bug + // @TODO remove when the bugged behaviour is resolved + if ( + error.message !== + "Cannot access contents of the page. Extension manifest must request permission to access the respective host." + ) { + throw error; + } + + if (this.platformUtilsService.isDev()) { + this.logService.warning( + `BrowserApi.executeScriptInTab exception for ${injectDetails.file} in tab ${tabId}: ${error.message}`, + ); + } + } + + return; + } + + await BrowserApi.executeScriptInTab(tabId, injectionDetails); + } + + /** + * Retrieves the script file to inject based on the configuration. + * + * @param config - The configuration for the script injection. + */ + private getScriptFile(config: ScriptInjectionConfig): string { + const { injectDetails, mv2Details, mv3Details } = config; + + if (BrowserApi.isManifestVersion(3)) { + return mv3Details?.file ?? injectDetails?.file; + } + + return mv2Details?.file ?? injectDetails?.file; + } + + /** + * Builds the injection details for the script injection. + * + * @param injectDetails - The details for the script injection. + * @param file - The file to inject. + */ + private buildInjectionDetails( + injectDetails: CommonScriptInjectionDetails, + file: string, + ): chrome.tabs.InjectDetails { + const { frame, runAt } = injectDetails; + const injectionDetails: chrome.tabs.InjectDetails = { file }; + + if (runAt) { + injectionDetails.runAt = runAt; + } + + if (!frame) { + return { ...injectionDetails, frameId: 0 }; + } + + if (frame !== "all_frames") { + return { ...injectionDetails, frameId: frame }; + } + + return { ...injectionDetails, allFrames: true }; + } +} diff --git a/apps/browser/src/platform/services/browser-state.service.spec.ts b/apps/browser/src/platform/services/browser-state.service.spec.ts deleted file mode 100644 index 0712416172c..00000000000 --- a/apps/browser/src/platform/services/browser-state.service.spec.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { mock, MockProxy } from "jest-mock-extended"; - -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { - AbstractMemoryStorageService, - AbstractStorageService, -} from "@bitwarden/common/platform/abstractions/storage.service"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; -import { State } from "@bitwarden/common/platform/models/domain/state"; -import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; -import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; - -import { Account } from "../../models/account"; -import { BrowserComponentState } from "../../models/browserComponentState"; -import { BrowserGroupingsComponentState } from "../../models/browserGroupingsComponentState"; -import { BrowserSendComponentState } from "../../models/browserSendComponentState"; - -import { BrowserStateService } from "./browser-state.service"; - -// disable session syncing to just test class -jest.mock("../decorators/session-sync-observable/"); - -describe("Browser State Service", () => { - let secureStorageService: MockProxy; - let diskStorageService: MockProxy; - let logService: MockProxy; - let stateFactory: MockProxy>; - let useAccountCache: boolean; - - let state: State; - const userId = "userId"; - - let sut: BrowserStateService; - - beforeEach(() => { - secureStorageService = mock(); - diskStorageService = mock(); - logService = mock(); - stateFactory = mock(); - // turn off account cache for tests - useAccountCache = false; - - state = new State(new GlobalState()); - state.accounts[userId] = new Account({ - profile: { userId: userId }, - }); - state.activeUserId = userId; - }); - - describe("state methods", () => { - let memoryStorageService: MockProxy; - - beforeEach(() => { - memoryStorageService = mock(); - const stateGetter = (key: string) => Promise.resolve(state); - memoryStorageService.get.mockImplementation(stateGetter); - - sut = new BrowserStateService( - diskStorageService, - secureStorageService, - memoryStorageService, - logService, - stateFactory, - useAccountCache - ); - }); - - describe("getBrowserGroupingComponentState", () => { - it("should return a BrowserGroupingsComponentState", async () => { - state.accounts[userId].groupings = new BrowserGroupingsComponentState(); - - const actual = await sut.getBrowserGroupingComponentState(); - expect(actual).toBeInstanceOf(BrowserGroupingsComponentState); - }); - }); - - describe("getBrowserVaultItemsComponentState", () => { - it("should return a BrowserComponentState", async () => { - const componentState = new BrowserComponentState(); - componentState.scrollY = 0; - componentState.searchText = "test"; - state.accounts[userId].ciphers = componentState; - - const actual = await sut.getBrowserVaultItemsComponentState(); - expect(actual).toStrictEqual(componentState); - }); - }); - - describe("getBrowserSendComponentState", () => { - it("should return a BrowserSendComponentState", async () => { - const sendState = new BrowserSendComponentState(); - sendState.sends = [new SendView(), new SendView()]; - sendState.typeCounts = new Map([ - [SendType.File, 3], - [SendType.Text, 5], - ]); - state.accounts[userId].send = sendState; - (global as any)["watch"] = state; - - const actual = await sut.getBrowserSendComponentState(); - expect(actual).toBeInstanceOf(BrowserSendComponentState); - expect(actual).toMatchObject(sendState); - }); - }); - - describe("getBrowserSendTypeComponentState", () => { - it("should return a BrowserComponentState", async () => { - const componentState = new BrowserComponentState(); - componentState.scrollY = 0; - componentState.searchText = "test"; - state.accounts[userId].sendType = componentState; - - const actual = await sut.getBrowserSendTypeComponentState(); - expect(actual).toStrictEqual(componentState); - }); - }); - }); -}); diff --git a/apps/browser/src/platform/services/browser-state.service.ts b/apps/browser/src/platform/services/browser-state.service.ts deleted file mode 100644 index ec6851beb8f..00000000000 --- a/apps/browser/src/platform/services/browser-state.service.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { BehaviorSubject } from "rxjs"; - -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { - AbstractStorageService, - AbstractMemoryStorageService, -} from "@bitwarden/common/platform/abstractions/storage.service"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; -import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options"; -import { StateService as BaseStateService } from "@bitwarden/common/platform/services/state.service"; - -import { Account } from "../../models/account"; -import { BrowserComponentState } from "../../models/browserComponentState"; -import { BrowserGroupingsComponentState } from "../../models/browserGroupingsComponentState"; -import { BrowserSendComponentState } from "../../models/browserSendComponentState"; -import { BrowserApi } from "../browser/browser-api"; -import { browserSession, sessionSync } from "../decorators/session-sync-observable"; - -import { BrowserStateService as StateServiceAbstraction } from "./abstractions/browser-state.service"; - -@browserSession -export class BrowserStateService - extends BaseStateService - implements StateServiceAbstraction -{ - @sessionSync({ - initializer: Account.fromJSON as any, // TODO: Remove this any when all any types are removed from Account - initializeAs: "record", - }) - protected accountsSubject: BehaviorSubject<{ [userId: string]: Account }>; - @sessionSync({ initializer: (s: string) => s }) - protected activeAccountSubject: BehaviorSubject; - @sessionSync({ initializer: (b: boolean) => b }) - protected activeAccountUnlockedSubject: BehaviorSubject; - - protected accountDeserializer = Account.fromJSON; - - constructor( - storageService: AbstractStorageService, - secureStorageService: AbstractStorageService, - memoryStorageService: AbstractMemoryStorageService, - logService: LogService, - stateFactory: StateFactory, - useAccountCache = true - ) { - super( - storageService, - secureStorageService, - memoryStorageService, - logService, - stateFactory, - useAccountCache - ); - - // TODO: This is a hack to fix having a disk cache on both the popup and - // the background page that can get out of sync. We need to work out the - // best way to handle caching with multiple instances of the state service. - if (useAccountCache) { - BrowserApi.storageChangeListener((changes, namespace) => { - if (namespace === "local") { - for (const key of Object.keys(changes)) { - if (key !== "accountActivity" && this.accountDiskCache.value[key]) { - this.deleteDiskCache(key); - } - } - } - }); - } - } - - async addAccount(account: Account) { - // Apply browser overrides to default account values - account = new Account(account); - await super.addAccount(account); - } - - async getIsAuthenticated(options?: StorageOptions): Promise { - // Firefox Private Mode can clash with non-Private Mode because they both read from the same onDiskOptions - // Check that there is an account in memory before considering the user authenticated - return ( - (await super.getIsAuthenticated(options)) && - (await this.getAccount(await this.defaultInMemoryOptions())) != null - ); - } - - async getBrowserGroupingComponentState( - options?: StorageOptions - ): Promise { - return ( - await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())) - )?.groupings; - } - - async setBrowserGroupingComponentState( - value: BrowserGroupingsComponentState, - options?: StorageOptions - ): Promise { - const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - account.groupings = value; - await this.saveAccount( - account, - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - } - - async getBrowserVaultItemsComponentState( - options?: StorageOptions - ): Promise { - return ( - await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())) - )?.ciphers; - } - - async setBrowserVaultItemsComponentState( - value: BrowserComponentState, - options?: StorageOptions - ): Promise { - const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - account.ciphers = value; - await this.saveAccount( - account, - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - } - - async getBrowserSendComponentState(options?: StorageOptions): Promise { - return ( - await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())) - )?.send; - } - - async setBrowserSendComponentState( - value: BrowserSendComponentState, - options?: StorageOptions - ): Promise { - const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - account.send = value; - await this.saveAccount( - account, - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - } - - async getBrowserSendTypeComponentState(options?: StorageOptions): Promise { - return ( - await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())) - )?.sendType; - } - - async setBrowserSendTypeComponentState( - value: BrowserComponentState, - options?: StorageOptions - ): Promise { - const account = await this.getAccount( - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - account.sendType = value; - await this.saveAccount( - account, - this.reconcileOptions(options, await this.defaultInMemoryOptions()) - ); - } - - // Overriding the base class to prevent deleting the cache on save. We register a storage listener - // to delete the cache in the constructor above. - protected override async saveAccountToDisk( - account: Account, - options: StorageOptions - ): Promise { - const storageLocation = options.useSecureStorage - ? this.secureStorageService - : this.storageService; - - await storageLocation.save(`${options.userId}`, account, options); - } -} diff --git a/apps/browser/src/platform/services/i18n.service.ts b/apps/browser/src/platform/services/i18n.service.ts index 1badfdb7cb2..a27c3935d75 100644 --- a/apps/browser/src/platform/services/i18n.service.ts +++ b/apps/browser/src/platform/services/i18n.service.ts @@ -1,12 +1,18 @@ import { I18nService as BaseI18nService } from "@bitwarden/common/platform/services/i18n.service"; +import { GlobalStateProvider } from "@bitwarden/common/platform/state"; export default class I18nService extends BaseI18nService { - constructor(systemLanguage: string) { - super(systemLanguage, null, async (formattedLocale: string) => { - // Deprecated - const file = await fetch(this.localesDirectory + formattedLocale + "/messages.json"); - return await file.json(); - }); + constructor(systemLanguage: string, globalStateProvider: GlobalStateProvider) { + super( + systemLanguage, + null, + async (formattedLocale: string) => { + // Deprecated + const file = await fetch(this.localesDirectory + formattedLocale + "/messages.json"); + return await file.json(); + }, + globalStateProvider, + ); // Please leave 'en' where it is, as it's our fallback language in case no translation can be found this.supportedTranslationLocales = [ @@ -19,6 +25,7 @@ export default class I18nService extends BaseI18nService { "bs", "ca", "cs", + "cy", "da", "de", "el", @@ -31,6 +38,7 @@ export default class I18nService extends BaseI18nService { "fi", "fil", "fr", + "gl", "he", "hi", "hr", @@ -45,9 +53,13 @@ export default class I18nService extends BaseI18nService { "lt", "lv", "ml", + "mr", + "my", "nb", + "ne", "nl", "nn", + "or", "pl", "pt-BR", "pt-PT", @@ -58,6 +70,7 @@ export default class I18nService extends BaseI18nService { "sl", "sr", "sv", + "te", "th", "tr", "uk", diff --git a/apps/browser/src/platform/services/key-generation.service.ts b/apps/browser/src/platform/services/key-generation.service.ts deleted file mode 100644 index b2c76e1aee2..00000000000 --- a/apps/browser/src/platform/services/key-generation.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; - -import { AbstractKeyGenerationService } from "./abstractions/abstract-key-generation.service"; - -export class KeyGenerationService implements AbstractKeyGenerationService { - constructor(private cryptoFunctionService: CryptoFunctionService) {} - - async makeEphemeralKey(numBytes = 16): Promise { - const keyMaterial = await this.cryptoFunctionService.randomBytes(numBytes); - const key = await this.cryptoFunctionService.hkdf( - keyMaterial, - "bitwarden-ephemeral", - "ephemeral", - 64, - "sha256" - ); - return new SymmetricCryptoKey(key); - } -} diff --git a/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts b/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts index 49465414721..949ecebde8a 100644 --- a/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts +++ b/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts @@ -1,314 +1,186 @@ -// eslint-disable-next-line no-restricted-imports -import { Arg, Substitute, SubstituteOf } from "@fluffy-spoon/substitute"; +import { mock, MockProxy } from "jest-mock-extended"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { Lazy } from "@bitwarden/common/platform/misc/lazy"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { EncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/encrypt.service.implementation"; +import { FakeStorageService, makeEncString } from "@bitwarden/common/spec"; -import BrowserLocalStorageService from "./browser-local-storage.service"; -import BrowserMemoryStorageService from "./browser-memory-storage.service"; -import { KeyGenerationService } from "./key-generation.service"; import { LocalBackedSessionStorageService } from "./local-backed-session-storage.service"; -describe("Browser Session Storage Service", () => { - let encryptService: SubstituteOf; - let keyGenerationService: SubstituteOf; - - let cache: Map; - const testObj = { a: 1, b: 2 }; - - let localStorage: BrowserLocalStorageService; - let sessionStorage: BrowserMemoryStorageService; - - const key = new SymmetricCryptoKey(Utils.fromUtf8ToArray("00000000000000000000000000000000")); - let getSessionKeySpy: jest.SpyInstance; - const mockEnc = (input: string) => Promise.resolve(new EncString("ENCRYPTED" + input)); +describe("LocalBackedSessionStorage", () => { + const sessionKey = new SymmetricCryptoKey( + Utils.fromUtf8ToArray("00000000000000000000000000000000"), + ); + let localStorage: FakeStorageService; + let encryptService: MockProxy; + let platformUtilsService: MockProxy; + let logService: MockProxy; let sut: LocalBackedSessionStorageService; beforeEach(() => { - encryptService = Substitute.for(); - keyGenerationService = Substitute.for(); + localStorage = new FakeStorageService(); + encryptService = mock(); + platformUtilsService = mock(); + logService = mock(); - sut = new LocalBackedSessionStorageService(encryptService, keyGenerationService); - - cache = sut["cache"]; - localStorage = sut["localStorage"]; - sessionStorage = sut["sessionStorage"]; - getSessionKeySpy = jest.spyOn(sut, "getSessionEncKey"); - getSessionKeySpy.mockResolvedValue(key); - }); - - it("should exist", () => { - expect(sut).toBeInstanceOf(LocalBackedSessionStorageService); + sut = new LocalBackedSessionStorageService( + new Lazy(async () => sessionKey), + localStorage, + encryptService, + platformUtilsService, + logService, + ); }); describe("get", () => { - it("should return from cache", async () => { - cache.set("test", testObj); + it("return the cached value when one is cached", async () => { + sut["cache"]["test"] = "cached"; const result = await sut.get("test"); - expect(result).toStrictEqual(testObj); + expect(result).toEqual("cached"); }); - describe("not in cache", () => { - const session = { test: testObj }; + it("returns a decrypted value when one is stored in local storage", async () => { + const encrypted = makeEncString("encrypted"); + localStorage.internalStore["session_test"] = encrypted.encryptedString; + encryptService.decryptToUtf8.mockResolvedValue(JSON.stringify("decrypted")); + const result = await sut.get("test"); + expect(encryptService.decryptToUtf8).toHaveBeenCalledWith( + encrypted, + sessionKey, + "browser-session-key", + ), + expect(result).toEqual("decrypted"); + }); - beforeEach(() => { - jest.spyOn(sut, "getSessionEncKey").mockResolvedValue(key); - }); + it("caches the decrypted value when one is stored in local storage", async () => { + const encrypted = makeEncString("encrypted"); + localStorage.internalStore["session_test"] = encrypted.encryptedString; + encryptService.decryptToUtf8.mockResolvedValue(JSON.stringify("decrypted")); + await sut.get("test"); + expect(sut["cache"]["test"]).toEqual("decrypted"); + }); - describe("no session retrieved", () => { - let result: any; - let spy: jest.SpyInstance; - beforeEach(async () => { - spy = jest.spyOn(sut, "getLocalSession").mockResolvedValue(null); - result = await sut.get("test"); - }); + it("returns a decrypted value when one is stored in local storage", async () => { + const encrypted = makeEncString("encrypted"); + localStorage.internalStore["session_test"] = encrypted.encryptedString; + encryptService.decryptToUtf8.mockResolvedValue(JSON.stringify("decrypted")); + const result = await sut.get("test"); + expect(encryptService.decryptToUtf8).toHaveBeenCalledWith( + encrypted, + sessionKey, + "browser-session-key", + ), + expect(result).toEqual("decrypted"); + }); - it("should grab from session if not in cache", async () => { - expect(spy).toHaveBeenCalledWith(key); - }); - - it("should return null if session is null", async () => { - expect(result).toBeNull(); - }); - }); - - describe("session retrieved from storage", () => { - beforeEach(() => { - jest.spyOn(sut, "getLocalSession").mockResolvedValue(session); - }); - - it("should return null if session does not have the key", async () => { - const result = await sut.get("DNE"); - expect(result).toBeNull(); - }); - - it("should return the value retrieved from session", async () => { - const result = await sut.get("test"); - expect(result).toEqual(session.test); - }); - - it("should set retrieved values in cache", async () => { - await sut.get("test"); - expect(cache.has("test")).toBe(true); - expect(cache.get("test")).toEqual(session.test); - }); - - it("should use a deserializer if provided", async () => { - const deserializer = jest.fn().mockReturnValue(testObj); - const result = await sut.get("test", { deserializer: deserializer }); - expect(deserializer).toHaveBeenCalledWith(session.test); - expect(result).toEqual(testObj); - }); - }); + it("caches the decrypted value when one is stored in local storage", async () => { + const encrypted = makeEncString("encrypted"); + localStorage.internalStore["session_test"] = encrypted.encryptedString; + encryptService.decryptToUtf8.mockResolvedValue(JSON.stringify("decrypted")); + await sut.get("test"); + expect(sut["cache"]["test"]).toEqual("decrypted"); }); }); describe("has", () => { - it("should be false if `get` returns null", async () => { - const spy = jest.spyOn(sut, "get"); - spy.mockResolvedValue(null); - expect(await sut.has("test")).toBe(false); + it("returns false when the key is not in cache", async () => { + const result = await sut.has("test"); + expect(result).toBe(false); + }); + + it("returns true when the key is in cache", async () => { + sut["cache"]["test"] = "cached"; + const result = await sut.has("test"); + expect(result).toBe(true); + }); + + it("returns true when the key is in local storage", async () => { + localStorage.internalStore["session_test"] = makeEncString("encrypted").encryptedString; + encryptService.decryptToUtf8.mockResolvedValue(JSON.stringify("decrypted")); + const result = await sut.has("test"); + expect(result).toBe(true); + }); + + it.each([null, undefined])("returns false when %s is cached", async (nullish) => { + sut["cache"]["test"] = nullish; + await expect(sut.has("test")).resolves.toBe(false); + }); + + it.each([null, undefined])( + "returns false when null is stored in local storage", + async (nullish) => { + localStorage.internalStore["session_test"] = nullish; + await expect(sut.has("test")).resolves.toBe(false); + expect(encryptService.decryptToUtf8).not.toHaveBeenCalled(); + }, + ); + }); + + describe("save", () => { + const encString = makeEncString("encrypted"); + beforeEach(() => { + encryptService.encrypt.mockResolvedValue(encString); + }); + + it("logs a warning when saving the same value twice and in a dev environment", async () => { + platformUtilsService.isDev.mockReturnValue(true); + sut["cache"]["test"] = "cached"; + await sut.save("test", "cached"); + expect(logService.warning).toHaveBeenCalled(); + }); + + it("does not log when saving the same value twice and not in a dev environment", async () => { + platformUtilsService.isDev.mockReturnValue(false); + sut["cache"]["test"] = "cached"; + await sut.save("test", "cached"); + expect(logService.warning).not.toHaveBeenCalled(); + }); + + it("removes the key when saving a null value", async () => { + const spy = jest.spyOn(sut, "remove"); + await sut.save("test", null); expect(spy).toHaveBeenCalledWith("test"); }); - it("should be true if `get` returns non-null", async () => { - const spy = jest.spyOn(sut, "get"); - spy.mockResolvedValue({}); - expect(await sut.has("test")).toBe(true); - expect(spy).toHaveBeenCalledWith("test"); + it("saves the value to cache", async () => { + await sut.save("test", "value"); + expect(sut["cache"]["test"]).toEqual("value"); + }); + + it("encrypts and saves the value to local storage", async () => { + await sut.save("test", "value"); + expect(encryptService.encrypt).toHaveBeenCalledWith(JSON.stringify("value"), sessionKey); + expect(localStorage.internalStore["session_test"]).toEqual(encString.encryptedString); + }); + + it("emits an update", async () => { + const spy = jest.spyOn(sut["updatesSubject"], "next"); + await sut.save("test", "value"); + expect(spy).toHaveBeenCalledWith({ key: "test", updateType: "save" }); }); }); describe("remove", () => { - it("should save null", async () => { - const spy = jest.spyOn(sut, "save"); - spy.mockResolvedValue(null); + it("nulls the value in cache", async () => { + sut["cache"]["test"] = "cached"; await sut.remove("test"); - expect(spy).toHaveBeenCalledWith("test", null); - }); - }); - - describe("save", () => { - describe("caching", () => { - beforeEach(() => { - jest.spyOn(localStorage, "get").mockResolvedValue(null); - jest.spyOn(sessionStorage, "get").mockResolvedValue(null); - jest.spyOn(localStorage, "save").mockResolvedValue(); - jest.spyOn(sessionStorage, "save").mockResolvedValue(); - }); - - it("should remove key from cache if value is null", async () => { - cache.set("test", {}); - const deleteSpy = jest.spyOn(cache, "delete"); - expect(cache.has("test")).toBe(true); - await sut.save("test", null); - expect(cache.has("test")).toBe(false); - expect(deleteSpy).toHaveBeenCalledWith("test"); - }); - - it("should set cache if value is non-null", async () => { - expect(cache.has("test")).toBe(false); - const setSpy = jest.spyOn(cache, "set"); - await sut.save("test", testObj); - expect(cache.get("test")).toBe(testObj); - expect(setSpy).toHaveBeenCalledWith("test", testObj); - }); + expect(sut["cache"]["test"]).toBeNull(); }); - describe("local storing", () => { - let setSpy: jest.SpyInstance; - - beforeEach(() => { - setSpy = jest.spyOn(sut, "setLocalSession").mockResolvedValue(); - }); - - it("should store a new session", async () => { - jest.spyOn(sut, "getLocalSession").mockResolvedValue(null); - await sut.save("test", testObj); - - expect(setSpy).toHaveBeenCalledWith({ test: testObj }, key); - }); - - it("should update an existing session", async () => { - const existingObj = { test: testObj }; - jest.spyOn(sut, "getLocalSession").mockResolvedValue(existingObj); - await sut.save("test2", testObj); - - expect(setSpy).toHaveBeenCalledWith({ test2: testObj, ...existingObj }, key); - }); - - it("should overwrite an existing item in session", async () => { - const existingObj = { test: {} }; - jest.spyOn(sut, "getLocalSession").mockResolvedValue(existingObj); - await sut.save("test", testObj); - - expect(setSpy).toHaveBeenCalledWith({ test: testObj }, key); - }); - }); - }); - - describe("getSessionKey", () => { - beforeEach(() => { - getSessionKeySpy.mockRestore(); + it("removes the key from local storage", async () => { + localStorage.internalStore["session_test"] = makeEncString("encrypted").encryptedString; + await sut.remove("test"); + expect(localStorage.internalStore["session_test"]).toBeUndefined(); }); - it("should return the stored symmetric crypto key", async () => { - jest.spyOn(sessionStorage, "get").mockResolvedValue({ ...key }); - const result = await sut.getSessionEncKey(); - - expect(result).toStrictEqual(key); - }); - - describe("new key creation", () => { - beforeEach(() => { - jest.spyOn(sessionStorage, "get").mockResolvedValue(null); - keyGenerationService.makeEphemeralKey().resolves(key); - jest.spyOn(sut, "setSessionEncKey").mockResolvedValue(); - }); - - it("should create a symmetric crypto key", async () => { - const result = await sut.getSessionEncKey(); - - expect(result).toStrictEqual(key); - keyGenerationService.received(1).makeEphemeralKey(); - }); - - it("should store a symmetric crypto key if it makes one", async () => { - const spy = jest.spyOn(sut, "setSessionEncKey").mockResolvedValue(); - await sut.getSessionEncKey(); - - expect(spy).toBeCalledWith(key); - }); - }); - }); - - describe("getLocalSession", () => { - it("should return null if session is null", async () => { - const spy = jest.spyOn(localStorage, "get").mockResolvedValue(null); - const result = await sut.getLocalSession(key); - - expect(result).toBeNull(); - expect(spy).toBeCalledWith("session"); - }); - - describe("non-null sessions", () => { - const session = { test: "test" }; - const encSession = new EncString(JSON.stringify(session)); - const decryptedSession = JSON.stringify(session); - - beforeEach(() => { - jest.spyOn(localStorage, "get").mockResolvedValue(encSession.encryptedString); - }); - - it("should decrypt returned sessions", async () => { - encryptService.decryptToUtf8(encSession, key).resolves(decryptedSession); - await sut.getLocalSession(key); - encryptService.received(1).decryptToUtf8(encSession, key); - }); - - it("should parse session", async () => { - encryptService.decryptToUtf8(encSession, key).resolves(decryptedSession); - const result = await sut.getLocalSession(key); - expect(result).toEqual(session); - }); - - it("should remove state if decryption fails", async () => { - encryptService.decryptToUtf8(Arg.any(), Arg.any()).resolves(null); - const setSessionEncKeySpy = jest.spyOn(sut, "setSessionEncKey").mockResolvedValue(); - const removeLocalSessionSpy = jest.spyOn(localStorage, "remove").mockResolvedValue(); - - const result = await sut.getLocalSession(key); - - expect(result).toBeNull(); - expect(setSessionEncKeySpy).toHaveBeenCalledWith(null); - expect(removeLocalSessionSpy).toHaveBeenCalledWith("session"); - }); - }); - }); - - describe("setLocalSession", () => { - const testSession = { test: "a" }; - const testJSON = JSON.stringify(testSession); - - it("should encrypt a stringified session", async () => { - encryptService.encrypt(Arg.any(), Arg.any()).mimicks(mockEnc); - jest.spyOn(localStorage, "save").mockResolvedValue(); - await sut.setLocalSession(testSession, key); - - encryptService.received(1).encrypt(testJSON, key); - }); - - it("should remove local session if null", async () => { - encryptService.encrypt(Arg.any(), Arg.any()).resolves(null); - const spy = jest.spyOn(localStorage, "remove").mockResolvedValue(); - await sut.setLocalSession(null, key); - - expect(spy).toHaveBeenCalledWith("session"); - }); - - it("should save encrypted string", async () => { - encryptService.encrypt(Arg.any(), Arg.any()).mimicks(mockEnc); - const spy = jest.spyOn(localStorage, "save").mockResolvedValue(); - await sut.setLocalSession(testSession, key); - - expect(spy).toHaveBeenCalledWith("session", (await mockEnc(testJSON)).encryptedString); - }); - }); - - describe("setSessionKey", () => { - it("should remove if null", async () => { - const spy = jest.spyOn(sessionStorage, "remove").mockResolvedValue(); - await sut.setSessionEncKey(null); - expect(spy).toHaveBeenCalledWith("localEncryptionKey"); - }); - - it("should save key when not null", async () => { - const spy = jest.spyOn(sessionStorage, "save").mockResolvedValue(); - await sut.setSessionEncKey(key); - expect(spy).toHaveBeenCalledWith("localEncryptionKey", key); + it("emits an update", async () => { + const spy = jest.spyOn(sut["updatesSubject"], "next"); + await sut.remove("test"); + expect(spy).toHaveBeenCalledWith({ key: "test", updateType: "remove" }); }); }); }); diff --git a/apps/browser/src/platform/services/local-backed-session-storage.service.ts b/apps/browser/src/platform/services/local-backed-session-storage.service.ts index 6c44adabccc..e4256d9c0cf 100644 --- a/apps/browser/src/platform/services/local-backed-session-storage.service.ts +++ b/apps/browser/src/platform/services/local-backed-session-storage.service.ts @@ -1,56 +1,78 @@ -import { Jsonify } from "type-fest"; +import { Subject } from "rxjs"; import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; -import { AbstractMemoryStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { + AbstractStorageService, + ObservableStorageService, + StorageUpdate, +} from "@bitwarden/common/platform/abstractions/storage.service"; +import { compareValues } from "@bitwarden/common/platform/misc/compare-values"; +import { Lazy } from "@bitwarden/common/platform/misc/lazy"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; -import { MemoryStorageOptions } from "@bitwarden/common/platform/models/domain/storage-options"; +import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { devFlag } from "../decorators/dev-flag.decorator"; -import { devFlagEnabled } from "../flags"; +import { BrowserApi } from "../browser/browser-api"; +import { MemoryStoragePortMessage } from "../storage/port-messages"; +import { portName } from "../storage/port-name"; -import { AbstractKeyGenerationService } from "./abstractions/abstract-key-generation.service"; -import BrowserLocalStorageService from "./browser-local-storage.service"; -import BrowserMemoryStorageService from "./browser-memory-storage.service"; - -const keys = { - encKey: "localEncryptionKey", - sessionKey: "session", -}; - -export class LocalBackedSessionStorageService extends AbstractMemoryStorageService { - private cache = new Map(); - private localStorage = new BrowserLocalStorageService(); - private sessionStorage = new BrowserMemoryStorageService(); +export class LocalBackedSessionStorageService + extends AbstractStorageService + implements ObservableStorageService +{ + private ports: Set = new Set([]); + private cache: Record = {}; + private updatesSubject = new Subject(); + readonly valuesRequireDeserialization = true; + updates$ = this.updatesSubject.asObservable(); constructor( - private encryptService: EncryptService, - private keyGenerationService: AbstractKeyGenerationService + private readonly sessionKey: Lazy>, + private readonly localStorage: AbstractStorageService, + private readonly encryptService: EncryptService, + private readonly platformUtilsService: PlatformUtilsService, + private readonly logService: LogService, ) { super(); + + BrowserApi.addListener(chrome.runtime.onConnect, (port) => { + if (port.name !== portName(chrome.storage.session)) { + return; + } + + this.ports.add(port); + + const listenerCallback = this.onMessageFromForeground.bind(this); + port.onDisconnect.addListener(() => { + this.ports.delete(port); + port.onMessage.removeListener(listenerCallback); + }); + port.onMessage.addListener(listenerCallback); + // Initialize the new memory storage service with existing data + this.sendMessageTo(port, { + action: "initialization", + data: Array.from(Object.keys(this.cache)), + }); + this.updates$.subscribe((update) => { + this.broadcastMessage({ + action: "subject_update", + data: update, + }); + }); + }); } - async get(key: string, options?: MemoryStorageOptions): Promise { - if (this.cache.has(key)) { - return this.cache.get(key) as T; + async get(key: string, options?: StorageOptions): Promise { + if (this.cache[key] !== undefined) { + return this.cache[key] as T; } - return await this.getBypassCache(key, options); - } + const value = await this.getLocalSessionValue(await this.sessionKey.get(), key); - async getBypassCache(key: string, options?: MemoryStorageOptions): Promise { - const session = await this.getLocalSession(await this.getSessionEncKey()); - if (session == null || !Object.keys(session).includes(key)) { - return null; - } - - let value = session[key]; - if (options?.deserializer != null) { - value = options.deserializer(value as Jsonify); - } - - this.cache.set(key, value); - return this.cache.get(key) as T; + this.cache[key] = value; + return value as T; } async has(key: string): Promise { @@ -58,86 +80,127 @@ export class LocalBackedSessionStorageService extends AbstractMemoryStorageServi } async save(key: string, obj: T): Promise { - if (obj == null) { - this.cache.delete(key); - } else { - this.cache.set(key, obj); + // This is for observation purposes only. At some point, we don't want to write to local session storage if the value is the same. + if (this.platformUtilsService.isDev()) { + const existingValue = this.cache[key] as T; + try { + if (this.compareValues(existingValue, obj)) { + this.logService.warning( + `Possible unnecessary write to local session storage. Key: ${key}`, + ); + this.logService.warning(obj as any); + } + } catch (err) { + this.logService.warning(`Error while comparing values for key: ${key}`); + this.logService.warning(err); + } } - const sessionEncKey = await this.getSessionEncKey(); - const localSession = (await this.getLocalSession(sessionEncKey)) ?? {}; - localSession[key] = obj; - await this.setLocalSession(localSession, sessionEncKey); + if (obj == null) { + return await this.remove(key); + } + + this.cache[key] = obj; + await this.updateLocalSessionValue(key, obj); + this.updatesSubject.next({ key, updateType: "save" }); } async remove(key: string): Promise { - await this.save(key, null); + this.cache[key] = null; + await this.updateLocalSessionValue(key, null); + this.updatesSubject.next({ key, updateType: "remove" }); } - async getLocalSession(encKey: SymmetricCryptoKey): Promise> { - const local = await this.localStorage.get(keys.sessionKey); - + private async getLocalSessionValue(encKey: SymmetricCryptoKey, key: string): Promise { + const local = await this.localStorage.get(this.sessionStorageKey(key)); if (local == null) { return null; } - if (devFlagEnabled("storeSessionDecrypted")) { - return local as any as Record; - } - - const sessionJson = await this.encryptService.decryptToUtf8(new EncString(local), encKey); - if (sessionJson == null) { - // Error with decryption -- session is lost, delete state and key and start over - await this.setSessionEncKey(null); - await this.localStorage.remove(keys.sessionKey); + const valueJson = await this.encryptService.decryptToUtf8( + new EncString(local), + encKey, + "browser-session-key", + ); + if (valueJson == null) { + // error with decryption, value is lost, delete state and start over + await this.localStorage.remove(this.sessionStorageKey(key)); return null; } - return JSON.parse(sessionJson); + + return JSON.parse(valueJson); } - async setLocalSession(session: Record, key: SymmetricCryptoKey) { - if (devFlagEnabled("storeSessionDecrypted")) { - await this.setDecryptedLocalSession(session); - } else { - await this.setEncryptedLocalSession(session, key); + private async updateLocalSessionValue(key: string, value: unknown): Promise { + if (value == null) { + await this.localStorage.remove(this.sessionStorageKey(key)); + return; } + + const valueJson = JSON.stringify(value); + const encValue = await this.encryptService.encrypt(valueJson, await this.sessionKey.get()); + await this.localStorage.save(this.sessionStorageKey(key), encValue.encryptedString); } - @devFlag("storeSessionDecrypted") - async setDecryptedLocalSession(session: Record): Promise { - // Make sure we're storing the jsonified version of the session - const jsonSession = JSON.parse(JSON.stringify(session)); - if (session == null) { - await this.localStorage.remove(keys.sessionKey); - } else { - await this.localStorage.save(keys.sessionKey, jsonSession); + private async onMessageFromForeground( + message: MemoryStoragePortMessage, + port: chrome.runtime.Port, + ) { + if (message.originator === "background") { + return; } - } - async setEncryptedLocalSession(session: Record, key: SymmetricCryptoKey) { - const jsonSession = JSON.stringify(session); - const encSession = await this.encryptService.encrypt(jsonSession, key); + let result: unknown = null; - if (encSession == null) { - return await this.localStorage.remove(keys.sessionKey); + switch (message.action) { + case "get": + case "has": { + result = await this[message.action](message.key); + break; + } + case "save": + await this.save(message.key, JSON.parse((message.data as string) ?? null) as unknown); + break; + case "remove": + await this.remove(message.key); + break; } - await this.localStorage.save(keys.sessionKey, encSession.encryptedString); + + this.sendMessageTo(port, { + id: message.id, + key: message.key, + data: JSON.stringify(result), + }); } - async getSessionEncKey(): Promise { - let storedKey = await this.sessionStorage.get(keys.encKey); - if (storedKey == null || Object.keys(storedKey).length == 0) { - storedKey = await this.keyGenerationService.makeEphemeralKey(); - await this.setSessionEncKey(storedKey); - } - return SymmetricCryptoKey.fromJSON(storedKey); + protected broadcastMessage(data: Omit) { + this.ports.forEach((port) => { + this.sendMessageTo(port, data); + }); } - async setSessionEncKey(input: SymmetricCryptoKey): Promise { - if (input == null) { - await this.sessionStorage.remove(keys.encKey); - } else { - await this.sessionStorage.save(keys.encKey, input); + private sendMessageTo( + port: chrome.runtime.Port, + data: Omit, + ) { + port.postMessage({ + ...data, + originator: "background", + }); + } + + private sessionStorageKey(key: string) { + return `session_${key}`; + } + + private compareValues(value1: T, value2: T): boolean { + try { + return compareValues(value1, value2); + } catch (e) { + this.logService.error( + `error comparing values\n${JSON.stringify(value1)}\n${JSON.stringify(value2)}`, + ); + return true; } } } diff --git a/apps/browser/src/platform/services/platform-utils/background-platform-utils.service.ts b/apps/browser/src/platform/services/platform-utils/background-platform-utils.service.ts new file mode 100644 index 00000000000..da6a8faf3e8 --- /dev/null +++ b/apps/browser/src/platform/services/platform-utils/background-platform-utils.service.ts @@ -0,0 +1,30 @@ +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; + +import { OffscreenDocumentService } from "../../offscreen-document/abstractions/offscreen-document"; + +import { BrowserPlatformUtilsService } from "./browser-platform-utils.service"; + +export class BackgroundPlatformUtilsService extends BrowserPlatformUtilsService { + constructor( + private messagingService: MessagingService, + clipboardWriteCallback: (clipboardValue: string, clearMs: number) => void, + win: Window & typeof globalThis, + offscreenDocumentService: OffscreenDocumentService, + ) { + super(clipboardWriteCallback, win, offscreenDocumentService); + } + + override showToast( + type: "error" | "success" | "warning" | "info", + title: string, + text: string | string[], + options?: any, + ): void { + this.messagingService.send("showToast", { + text: text, + title: title, + type: type, + options: options, + }); + } +} diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts new file mode 100644 index 00000000000..762380071b7 --- /dev/null +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts @@ -0,0 +1,409 @@ +import { MockProxy, mock } from "jest-mock-extended"; + +import { DeviceType } from "@bitwarden/common/enums"; + +import { flushPromises } from "../../../autofill/spec/testing-utils"; +import { SafariApp } from "../../../browser/safariApp"; +import { BrowserApi } from "../../browser/browser-api"; +import { OffscreenDocumentService } from "../../offscreen-document/abstractions/offscreen-document"; +import BrowserClipboardService from "../browser-clipboard.service"; + +import { BrowserPlatformUtilsService } from "./browser-platform-utils.service"; + +class TestBrowserPlatformUtilsService extends BrowserPlatformUtilsService { + constructor( + clipboardSpy: jest.Mock, + win: Window & typeof globalThis, + offscreenDocumentService: OffscreenDocumentService, + ) { + super(clipboardSpy, win, offscreenDocumentService); + } + + showToast( + type: "error" | "success" | "warning" | "info", + title: string, + text: string | string[], + options?: any, + ): void { + throw new Error("Method not implemented."); + } +} + +describe("Browser Utils Service", () => { + let browserPlatformUtilsService: BrowserPlatformUtilsService; + let offscreenDocumentService: MockProxy; + const clipboardWriteCallbackSpy = jest.fn(); + + beforeEach(() => { + offscreenDocumentService = mock(); + (window as any).matchMedia = jest.fn().mockReturnValueOnce({}); + browserPlatformUtilsService = new TestBrowserPlatformUtilsService( + clipboardWriteCallbackSpy, + window, + offscreenDocumentService, + ); + }); + + describe("getBrowser", () => { + const originalUserAgent = navigator.userAgent; + // Reset the userAgent. + afterAll(() => { + Object.defineProperty(navigator, "userAgent", { + value: originalUserAgent, + }); + }); + + beforeEach(() => { + (window as any).matchMedia = jest.fn().mockReturnValueOnce({}); + }); + + afterEach(() => { + window.matchMedia = undefined; + (BrowserPlatformUtilsService as any).deviceCache = null; + }); + + it("should detect chrome", () => { + Object.defineProperty(navigator, "userAgent", { + configurable: true, + value: + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", + }); + + expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.ChromeExtension); + }); + + it("should detect firefox", () => { + Object.defineProperty(navigator, "userAgent", { + configurable: true, + value: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0", + }); + + expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.FirefoxExtension); + }); + + it("should detect opera", () => { + Object.defineProperty(navigator, "userAgent", { + configurable: true, + value: + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3175.3 Safari/537.36 OPR/49.0.2695.0 (Edition developer)", + }); + + expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.OperaExtension); + }); + + it("should detect edge", () => { + Object.defineProperty(navigator, "userAgent", { + configurable: true, + value: + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.74 Safari/537.36 Edg/79.0.309.43", + }); + + expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.EdgeExtension); + }); + + it("should detect safari", () => { + Object.defineProperty(navigator, "userAgent", { + configurable: true, + value: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8", + }); + + expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.SafariExtension); + }); + + it("should detect vivaldi", () => { + Object.defineProperty(navigator, "userAgent", { + configurable: true, + value: + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.97 Safari/537.36 Vivaldi/1.94.1008.40", + }); + + expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.VivaldiExtension); + }); + + it("returns a previously determined device using a cached value", () => { + Object.defineProperty(navigator, "userAgent", { + configurable: true, + value: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0", + }); + jest.spyOn(BrowserPlatformUtilsService, "isFirefox"); + + browserPlatformUtilsService.getDevice(); + + expect(browserPlatformUtilsService.getDevice()).toBe(DeviceType.FirefoxExtension); + expect(BrowserPlatformUtilsService.isFirefox).toHaveBeenCalledTimes(1); + }); + }); + + describe("getDeviceString", () => { + it("returns a string value indicating the device type", () => { + jest + .spyOn(browserPlatformUtilsService, "getDevice") + .mockReturnValue(DeviceType.ChromeExtension); + + expect(browserPlatformUtilsService.getDeviceString()).toBe("chrome"); + }); + }); + + describe("isViewOpen", () => { + it("returns false if a heartbeat response is not received", async () => { + BrowserApi.sendMessageWithResponse = jest.fn().mockResolvedValueOnce(undefined); + + const isViewOpen = await browserPlatformUtilsService.isViewOpen(); + + expect(isViewOpen).toBe(false); + }); + + it("returns true if a heartbeat response is received", async () => { + BrowserApi.sendMessageWithResponse = jest + .fn() + .mockImplementationOnce((subscriber) => + Promise.resolve((subscriber === "checkVaultPopupHeartbeat") as any), + ); + + const isViewOpen = await browserPlatformUtilsService.isViewOpen(); + + expect(isViewOpen).toBe(true); + }); + }); + + describe("copyToClipboard", () => { + const getManifestVersionSpy = jest.spyOn(BrowserApi, "manifestVersion", "get"); + const sendMessageToAppSpy = jest.spyOn(SafariApp, "sendMessageToApp"); + const clipboardServiceCopySpy = jest.spyOn(BrowserClipboardService, "copy"); + let triggerOffscreenCopyToClipboardSpy: jest.SpyInstance; + + beforeEach(() => { + getManifestVersionSpy.mockReturnValue(2); + triggerOffscreenCopyToClipboardSpy = jest.spyOn( + browserPlatformUtilsService as any, + "triggerOffscreenCopyToClipboard", + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("sends a copy to clipboard message to the desktop application if a user is using the safari browser", async () => { + const text = "test"; + const clearMs = 1000; + sendMessageToAppSpy.mockResolvedValueOnce("success"); + jest + .spyOn(browserPlatformUtilsService, "getDevice") + .mockReturnValue(DeviceType.SafariExtension); + + browserPlatformUtilsService.copyToClipboard(text, { clearMs }); + await flushPromises(); + + expect(sendMessageToAppSpy).toHaveBeenCalledWith("copyToClipboard", text); + expect(clipboardWriteCallbackSpy).toHaveBeenCalledWith(text, clearMs); + expect(clipboardServiceCopySpy).not.toHaveBeenCalled(); + expect(triggerOffscreenCopyToClipboardSpy).not.toHaveBeenCalled(); + }); + + it("sets the copied text to a unicode placeholder when the user is using Chrome if the passed text is an empty string", async () => { + const text = ""; + jest + .spyOn(browserPlatformUtilsService, "getDevice") + .mockReturnValue(DeviceType.ChromeExtension); + + browserPlatformUtilsService.copyToClipboard(text); + await flushPromises(); + + expect(clipboardServiceCopySpy).toHaveBeenCalledWith(window, "\u0000"); + }); + + it("copies the passed text using the BrowserClipboardService", async () => { + const text = "test"; + jest + .spyOn(browserPlatformUtilsService, "getDevice") + .mockReturnValue(DeviceType.ChromeExtension); + + browserPlatformUtilsService.copyToClipboard(text, { window: self }); + await flushPromises(); + + expect(clipboardServiceCopySpy).toHaveBeenCalledWith(self, text); + expect(triggerOffscreenCopyToClipboardSpy).not.toHaveBeenCalled(); + }); + + it("copies the passed text using the offscreen document if the extension is using manifest v3", async () => { + const text = "test"; + offscreenDocumentService.offscreenApiSupported.mockReturnValue(true); + getManifestVersionSpy.mockReturnValue(3); + + browserPlatformUtilsService.copyToClipboard(text); + await flushPromises(); + + expect(triggerOffscreenCopyToClipboardSpy).toHaveBeenCalledWith(text); + expect(clipboardServiceCopySpy).not.toHaveBeenCalled(); + expect(offscreenDocumentService.withDocument).toHaveBeenCalledWith( + [chrome.offscreen.Reason.CLIPBOARD], + "Write text to the clipboard.", + expect.any(Function), + ); + + const callback = offscreenDocumentService.withDocument.mock.calls[0][2]; + await callback(); + expect(BrowserApi.sendMessageWithResponse).toHaveBeenCalledWith("offscreenCopyToClipboard", { + text, + }); + }); + + it("skips the clipboardWriteCallback if the clipboard is clearing", async () => { + jest + .spyOn(browserPlatformUtilsService, "getDevice") + .mockReturnValue(DeviceType.ChromeExtension); + + browserPlatformUtilsService.copyToClipboard("test", { window: self, clearing: true }); + await flushPromises(); + + expect(clipboardWriteCallbackSpy).not.toHaveBeenCalled(); + }); + }); + + describe("readFromClipboard", () => { + const getManifestVersionSpy = jest.spyOn(BrowserApi, "manifestVersion", "get"); + const sendMessageToAppSpy = jest.spyOn(SafariApp, "sendMessageToApp"); + const clipboardServiceReadSpy = jest.spyOn(BrowserClipboardService, "read"); + + beforeEach(() => { + getManifestVersionSpy.mockReturnValue(2); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("sends a ready from clipboard message to the desktop application if a user is using the safari browser", async () => { + sendMessageToAppSpy.mockResolvedValueOnce("test"); + jest + .spyOn(browserPlatformUtilsService, "getDevice") + .mockReturnValue(DeviceType.SafariExtension); + + const result = await browserPlatformUtilsService.readFromClipboard(); + + expect(sendMessageToAppSpy).toHaveBeenCalledWith("readFromClipboard"); + expect(clipboardServiceReadSpy).not.toHaveBeenCalled(); + expect(result).toBe("test"); + }); + + it("reads text from the clipboard using the ClipboardService", async () => { + jest + .spyOn(browserPlatformUtilsService, "getDevice") + .mockReturnValue(DeviceType.ChromeExtension); + clipboardServiceReadSpy.mockResolvedValueOnce("test"); + + const result = await browserPlatformUtilsService.readFromClipboard({ window: self }); + + expect(clipboardServiceReadSpy).toHaveBeenCalledWith(self); + expect(sendMessageToAppSpy).not.toHaveBeenCalled(); + expect(result).toBe("test"); + }); + + it("reads the clipboard text using the offscreen document", async () => { + offscreenDocumentService.offscreenApiSupported.mockReturnValue(true); + getManifestVersionSpy.mockReturnValue(3); + offscreenDocumentService.withDocument.mockImplementationOnce((_, __, callback) => + Promise.resolve("test"), + ); + + await browserPlatformUtilsService.readFromClipboard(); + + expect(offscreenDocumentService.withDocument).toHaveBeenCalledWith( + [chrome.offscreen.Reason.CLIPBOARD], + "Read text from the clipboard.", + expect.any(Function), + ); + + const callback = offscreenDocumentService.withDocument.mock.calls[0][2]; + await callback(); + expect(BrowserApi.sendMessageWithResponse).toHaveBeenCalledWith("offscreenReadFromClipboard"); + }); + + it("returns an empty string from the offscreen document if the response is not of type string", async () => { + jest + .spyOn(browserPlatformUtilsService, "getDevice") + .mockReturnValue(DeviceType.ChromeExtension); + getManifestVersionSpy.mockReturnValue(3); + jest.spyOn(BrowserApi, "sendMessageWithResponse").mockResolvedValue(1); + offscreenDocumentService.withDocument.mockImplementationOnce((_, __, callback) => + Promise.resolve(1), + ); + + const result = await browserPlatformUtilsService.readFromClipboard(); + + expect(result).toBe(""); + }); + }); +}); + +describe("Safari Height Fix", () => { + const originalUserAgent = navigator.userAgent; + + // Reset the userAgent. + afterAll(() => { + Object.defineProperty(navigator, "userAgent", { + value: originalUserAgent, + }); + }); + + afterEach(() => { + (BrowserPlatformUtilsService as any).deviceCache = null; + }); + + test.each([ + [ + "safari 15.6.1", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15", + true, + ], + [ + "safari 16.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15", + true, + ], + + [ + "safari 16.1", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15", + false, + ], + [ + "safari 16.4", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Safari/605.1.15", + false, + ], + [ + "safari 17.0 (future release)", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15", + false, + ], + [ + "chrome", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", + false, + ], + [ + "firefox", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0", + false, + ], + [ + "opera", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3175.3 Safari/537.36 OPR/49.0.2695.0 (Edition developer)", + false, + ], + [ + "edge", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.74 Safari/537.36 Edg/79.0.309.43", + false, + ], + ])("Apply fix for %s", (name, userAgent, expected) => { + Object.defineProperty(navigator, "userAgent", { + configurable: true, + value: userAgent, + }); + expect(BrowserPlatformUtilsService.shouldApplySafariHeightFix(window)).toBe(expected); + }); +}); 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 new file mode 100644 index 00000000000..b47488bdd7d --- /dev/null +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts @@ -0,0 +1,341 @@ +import { ExtensionCommand } from "@bitwarden/common/autofill/constants"; +import { ClientType, DeviceType } from "@bitwarden/common/enums"; +import { + ClipboardOptions, + PlatformUtilsService, +} from "@bitwarden/common/platform/abstractions/platform-utils.service"; + +import { SafariApp } from "../../../browser/safariApp"; +import { BrowserApi } from "../../browser/browser-api"; +import { OffscreenDocumentService } from "../../offscreen-document/abstractions/offscreen-document"; +import BrowserClipboardService from "../browser-clipboard.service"; + +export abstract class BrowserPlatformUtilsService implements PlatformUtilsService { + private static deviceCache: DeviceType = null; + + constructor( + private clipboardWriteCallback: (clipboardValue: string, clearMs: number) => void, + private globalContext: Window | ServiceWorkerGlobalScope, + private offscreenDocumentService: OffscreenDocumentService, + ) {} + + static getDevice(globalContext: Window | ServiceWorkerGlobalScope): DeviceType { + if (this.deviceCache) { + return this.deviceCache; + } + + if (BrowserPlatformUtilsService.isFirefox()) { + this.deviceCache = DeviceType.FirefoxExtension; + } else if (BrowserPlatformUtilsService.isOpera(globalContext)) { + this.deviceCache = DeviceType.OperaExtension; + } else if (BrowserPlatformUtilsService.isEdge()) { + this.deviceCache = DeviceType.EdgeExtension; + } else if (BrowserPlatformUtilsService.isVivaldi()) { + this.deviceCache = DeviceType.VivaldiExtension; + } else if (BrowserPlatformUtilsService.isChrome(globalContext)) { + this.deviceCache = DeviceType.ChromeExtension; + } else if (BrowserPlatformUtilsService.isSafari(globalContext)) { + this.deviceCache = DeviceType.SafariExtension; + } + + return this.deviceCache; + } + + getDevice(): DeviceType { + return BrowserPlatformUtilsService.getDevice(this.globalContext); + } + + getDeviceString(): string { + const device = DeviceType[this.getDevice()].toLowerCase(); + return device.replace("extension", ""); + } + + getClientType(): ClientType { + return ClientType.Browser; + } + + /** + * @deprecated Do not call this directly, use getDevice() instead + */ + static isFirefox(): boolean { + return ( + navigator.userAgent.indexOf(" Firefox/") !== -1 || + navigator.userAgent.indexOf(" Gecko/") !== -1 + ); + } + + isFirefox(): boolean { + return this.getDevice() === DeviceType.FirefoxExtension; + } + + /** + * @deprecated Do not call this directly, use getDevice() instead + */ + private static isChrome(globalContext: Window | ServiceWorkerGlobalScope): boolean { + return globalContext.chrome && navigator.userAgent.indexOf(" Chrome/") !== -1; + } + + isChrome(): boolean { + return this.getDevice() === DeviceType.ChromeExtension; + } + + /** + * @deprecated Do not call this directly, use getDevice() instead + */ + private static isEdge(): boolean { + return navigator.userAgent.indexOf(" Edg/") !== -1; + } + + isEdge(): boolean { + return this.getDevice() === DeviceType.EdgeExtension; + } + + /** + * @deprecated Do not call this directly, use getDevice() instead + */ + private static isOpera(globalContext: Window | ServiceWorkerGlobalScope): boolean { + return ( + !!globalContext.opr?.addons || + !!globalContext.opera || + navigator.userAgent.indexOf(" OPR/") >= 0 + ); + } + + isOpera(): boolean { + return this.getDevice() === DeviceType.OperaExtension; + } + + /** + * @deprecated Do not call this directly, use getDevice() instead + */ + private static isVivaldi(): boolean { + return navigator.userAgent.indexOf(" Vivaldi/") !== -1; + } + + isVivaldi(): boolean { + return this.getDevice() === DeviceType.VivaldiExtension; + } + + /** + * @deprecated Do not call this directly, use getDevice() instead + */ + static isSafari(globalContext: Window | ServiceWorkerGlobalScope): boolean { + // Opera masquerades as Safari, so make sure we're not there first + return ( + !BrowserPlatformUtilsService.isOpera(globalContext) && + navigator.userAgent.indexOf(" Safari/") !== -1 + ); + } + + private static safariVersion(): string { + return navigator.userAgent.match("Version/([0-9.]*)")?.[1]; + } + + /** + * Safari previous to version 16.1 had a bug which caused artifacts on hover in large extension popups. + * https://bugs.webkit.org/show_bug.cgi?id=218704 + */ + static shouldApplySafariHeightFix(globalContext: Window | ServiceWorkerGlobalScope): boolean { + if (BrowserPlatformUtilsService.getDevice(globalContext) !== DeviceType.SafariExtension) { + return false; + } + + const version = BrowserPlatformUtilsService.safariVersion(); + const parts = version?.split(".")?.map((v) => Number(v)); + return parts?.[0] < 16 || (parts?.[0] === 16 && parts?.[1] === 0); + } + + isSafari(): boolean { + return this.getDevice() === DeviceType.SafariExtension; + } + + isIE(): boolean { + return false; + } + + isMacAppStore(): boolean { + return false; + } + + /** + * Identifies if the vault popup is currently open. This is done by sending a + * message to the popup and waiting for a response. If a response is received, + * the view is open. + */ + async isViewOpen(): Promise { + if (this.isSafari()) { + // Query views on safari since chrome.runtime.sendMessage does not timeout and will hang. + return BrowserApi.isPopupOpen(); + } + return Boolean(await BrowserApi.sendMessageWithResponse("checkVaultPopupHeartbeat")); + } + + lockTimeout(): number { + return null; + } + + launchUri(uri: string, options?: any): void { + // 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 + BrowserApi.createNewTab(uri, options && options.extensionPage === true); + } + + getApplicationVersion(): Promise { + const manifest = chrome.runtime.getManifest(); + return Promise.resolve(manifest.version_name ?? manifest.version); + } + + getApplicationVersionNumber(): Promise { + const manifest = chrome.runtime.getManifest(); + return Promise.resolve(manifest.version.split(RegExp("[+|-]"))[0].trim()); + } + + supportsWebAuthn(win: Window): boolean { + return typeof PublicKeyCredential !== "undefined"; + } + + supportsDuo(): boolean { + return true; + } + + abstract showToast( + type: "error" | "success" | "warning" | "info", + title: string, + text: string | string[], + options?: any, + ): void; + + isDev(): boolean { + return process.env.ENV === "development"; + } + + isSelfHost(): boolean { + return false; + } + + /** + * Copies the passed text to the clipboard. For Safari, this will use + * the native messaging API to send the text to the Bitwarden app. If + * the extension is using manifest v3, the offscreen document API will + * be used to copy the text to the clipboard. Otherwise, the browser's + * clipboard API will be used. + * + * @param text - The text to copy to the clipboard. + * @param options - Options for the clipboard operation. + */ + copyToClipboard(text: string, options?: ClipboardOptions): void { + const windowContext = options?.window || (this.globalContext as Window); + const clearing = Boolean(options?.clearing); + const clearMs: number = options?.clearMs || null; + const handleClipboardWriteCallback = () => { + if (!clearing && this.clipboardWriteCallback != null) { + this.clipboardWriteCallback(text, clearMs); + } + }; + + if (this.isSafari()) { + void SafariApp.sendMessageToApp("copyToClipboard", text).then(handleClipboardWriteCallback); + + return; + } + + if (this.isChrome() && text === "") { + text = "\u0000"; + } + + if (BrowserApi.isManifestVersion(3) && this.offscreenDocumentService.offscreenApiSupported()) { + void this.triggerOffscreenCopyToClipboard(text).then(handleClipboardWriteCallback); + + return; + } + + void BrowserClipboardService.copy(windowContext, text).then(handleClipboardWriteCallback); + } + + /** + * Reads the text from the clipboard. For Safari, this will use the + * native messaging API to request the text from the Bitwarden app. If + * the extension is using manifest v3, the offscreen document API will + * be used to read the text from the clipboard. Otherwise, the browser's + * clipboard API will be used. + * + * @param options - Options for the clipboard operation. + */ + async readFromClipboard(options?: ClipboardOptions): Promise { + const windowContext = options?.window || (this.globalContext as Window); + + if (this.isSafari()) { + return await SafariApp.sendMessageToApp("readFromClipboard"); + } + + if (BrowserApi.isManifestVersion(3) && this.offscreenDocumentService.offscreenApiSupported()) { + return await this.triggerOffscreenReadFromClipboard(); + } + + return await BrowserClipboardService.read(windowContext); + } + + supportsSecureStorage(): boolean { + return false; + } + + async getAutofillKeyboardShortcut(): Promise { + let autofillCommand: string; + // You can not change the command in Safari or obtain it programmatically + if (this.isSafari()) { + autofillCommand = "Cmd+Shift+L"; + } else if (this.isFirefox()) { + autofillCommand = (await browser.commands.getAll()).find( + (c) => c.name === ExtensionCommand.AutofillLogin, + ).shortcut; + // Firefox is returning Ctrl instead of Cmd for the modifier key on macOS if + // the command is the default one set on installation. + if ( + (await browser.runtime.getPlatformInfo()).os === "mac" && + autofillCommand === "Ctrl+Shift+L" + ) { + autofillCommand = "Cmd+Shift+L"; + } + } else { + await new Promise((resolve) => + chrome.commands.getAll((c) => + resolve( + (autofillCommand = c.find((c) => c.name === ExtensionCommand.AutofillLogin).shortcut), + ), + ), + ); + } + return autofillCommand; + } + + /** + * Triggers the offscreen document API to copy the text to the clipboard. + */ + private async triggerOffscreenCopyToClipboard(text: string) { + await this.offscreenDocumentService.withDocument( + [chrome.offscreen.Reason.CLIPBOARD], + "Write text to the clipboard.", + async () => { + await BrowserApi.sendMessageWithResponse("offscreenCopyToClipboard", { text }); + }, + ); + } + + /** + * Triggers the offscreen document API to read the text from the clipboard. + */ + private async triggerOffscreenReadFromClipboard() { + const response = await this.offscreenDocumentService.withDocument( + [chrome.offscreen.Reason.CLIPBOARD], + "Read text from the clipboard.", + async () => { + return await BrowserApi.sendMessageWithResponse("offscreenReadFromClipboard"); + }, + ); + if (typeof response === "string") { + return response; + } + + return ""; + } +} diff --git a/apps/browser/src/platform/services/platform-utils/foreground-platform-utils.service.ts b/apps/browser/src/platform/services/platform-utils/foreground-platform-utils.service.ts new file mode 100644 index 00000000000..5b4b7288d19 --- /dev/null +++ b/apps/browser/src/platform/services/platform-utils/foreground-platform-utils.service.ts @@ -0,0 +1,25 @@ +import { ToastService } from "@bitwarden/components"; + +import { OffscreenDocumentService } from "../../offscreen-document/abstractions/offscreen-document"; + +import { BrowserPlatformUtilsService } from "./browser-platform-utils.service"; + +export class ForegroundPlatformUtilsService extends BrowserPlatformUtilsService { + constructor( + private toastService: ToastService, + clipboardWriteCallback: (clipboardValue: string, clearMs: number) => void, + win: Window & typeof globalThis, + offscreenDocumentService: OffscreenDocumentService, + ) { + super(clipboardWriteCallback, win, offscreenDocumentService); + } + + override showToast( + type: "error" | "success" | "warning" | "info", + title: string, + text: string | string[], + options?: any, + ): void { + this.toastService._showToast({ type, title, text, options }); + } +} diff --git a/apps/browser/src/platform/services/popup-view-cache-background.service.ts b/apps/browser/src/platform/services/popup-view-cache-background.service.ts new file mode 100644 index 00000000000..35c55633c0c --- /dev/null +++ b/apps/browser/src/platform/services/popup-view-cache-background.service.ts @@ -0,0 +1,109 @@ +import { switchMap, merge, delay, filter, concatMap, map, first, of } from "rxjs"; + +import { CommandDefinition, MessageListener } from "@bitwarden/common/platform/messaging"; +import { + POPUP_VIEW_MEMORY, + KeyDefinition, + GlobalStateProvider, +} from "@bitwarden/common/platform/state"; + +import { BrowserApi } from "../browser/browser-api"; +import { fromChromeEvent } from "../browser/from-chrome-event"; + +const popupClosedPortName = "new_popup"; + +/** We cannot use `UserKeyDefinition` because we must be able to store state when there is no active user. */ +export const POPUP_VIEW_CACHE_KEY = KeyDefinition.record( + POPUP_VIEW_MEMORY, + "popup-view-cache", + { + deserializer: (jsonValue) => jsonValue, + }, +); + +export const POPUP_ROUTE_HISTORY_KEY = new KeyDefinition( + POPUP_VIEW_MEMORY, + "popup-route-history", + { + deserializer: (jsonValue) => jsonValue, + }, +); + +export const SAVE_VIEW_CACHE_COMMAND = new CommandDefinition<{ + key: string; + value: string; +}>("save-view-cache"); + +export const ClEAR_VIEW_CACHE_COMMAND = new CommandDefinition("clear-view-cache"); + +export class PopupViewCacheBackgroundService { + private popupViewCacheState = this.globalStateProvider.get(POPUP_VIEW_CACHE_KEY); + private popupRouteHistoryState = this.globalStateProvider.get(POPUP_ROUTE_HISTORY_KEY); + + constructor( + private messageListener: MessageListener, + private globalStateProvider: GlobalStateProvider, + ) {} + + startObservingTabChanges() { + this.messageListener + .messages$(SAVE_VIEW_CACHE_COMMAND) + .pipe( + concatMap(async ({ key, value }) => + this.popupViewCacheState.update((state) => ({ + ...state, + [key]: value, + })), + ), + ) + .subscribe(); + + merge( + // on tab changed, excluding extension tabs + fromChromeEvent(chrome.tabs.onActivated).pipe( + switchMap((tabs) => BrowserApi.getTab(tabs[0].tabId)), + switchMap((tab) => { + // FireFox sets the `url` to "about:blank" and won't populate the `url` until the `onUpdated` event + if (tab.url !== "about:blank") { + return of(tab); + } + + return fromChromeEvent(chrome.tabs.onUpdated).pipe( + first(), + switchMap(([tabId]) => BrowserApi.getTab(tabId)), + ); + }), + map((tab) => tab.url || tab.pendingUrl), + filter((url) => !url.startsWith(chrome.runtime.getURL(""))), + ), + + // on popup closed, with 2 minute delay that is cancelled by re-opening the popup + fromChromeEvent(chrome.runtime.onConnect).pipe( + filter(([port]) => port.name === popupClosedPortName), + switchMap(([port]) => fromChromeEvent(port.onDisconnect).pipe(delay(1000 * 60 * 2))), + ), + ) + .pipe(switchMap(() => this.clearState())) + .subscribe(); + } + + async clearState() { + return Promise.all([ + this.popupViewCacheState.update(() => ({}), { shouldUpdate: this.objNotEmpty }), + this.popupRouteHistoryState.update(() => [], { shouldUpdate: this.objNotEmpty }), + ]); + } + + private objNotEmpty(obj: object): boolean { + return Object.keys(obj ?? {}).length !== 0; + } +} + +/** + * Communicates to {@link PopupViewCacheBackgroundService} that the extension popup has been closed. + * + * Call in the foreground. + **/ +export const initPopupClosedListener = () => { + chrome.runtime.connect({ name: popupClosedPortName }); +}; diff --git a/apps/browser/src/platform/services/sdk/browser-sdk-client-factory.ts b/apps/browser/src/platform/services/sdk/browser-sdk-client-factory.ts new file mode 100644 index 00000000000..f9cfde73aff --- /dev/null +++ b/apps/browser/src/platform/services/sdk/browser-sdk-client-factory.ts @@ -0,0 +1,94 @@ +import { SdkClientFactory } from "@bitwarden/common/platform/abstractions/sdk/sdk-client-factory"; +import type { BitwardenClient } from "@bitwarden/sdk-internal"; + +import { BrowserApi } from "../../browser/browser-api"; + +// https://stackoverflow.com/a/47880734 +const supported = (() => { + try { + if (typeof WebAssembly === "object" && typeof WebAssembly.instantiate === "function") { + const module = new WebAssembly.Module( + Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00), + ); + if (module instanceof WebAssembly.Module) { + return new WebAssembly.Instance(module) instanceof WebAssembly.Instance; + } + } + } catch (e) { + // ignore + } + return false; +})(); + +// Due to using webpack as bundler, sync imports will return an async module. Since we do support +// top level awaits, we define a promise we can await in the `load` function. +let loadingPromise: Promise | undefined; + +// Manifest v3 does not support dynamic imports in the service worker. +if (BrowserApi.isManifestVersion(3)) { + if (supported) { + // eslint-disable-next-line no-console + console.debug("WebAssembly is supported in this environment"); + loadingPromise = import("./wasm"); + } else { + // eslint-disable-next-line no-console + console.debug("WebAssembly is not supported in this environment"); + loadingPromise = import("./fallback"); + } +} + +// Manifest v2 expects dynamic imports to prevent timing issues. +async function load() { + if (BrowserApi.isManifestVersion(3)) { + // Ensure we have loaded the module + await loadingPromise; + return; + } + + if (supported) { + // eslint-disable-next-line no-console + console.debug("WebAssembly is supported in this environment"); + await import("./wasm"); + } else { + // eslint-disable-next-line no-console + console.debug("WebAssembly is not supported in this environment"); + await import("./fallback"); + } +} + +/** + * SDK client factory with a js fallback for when WASM is not supported. + * + * Works both in popup and service worker. + */ +export class BrowserSdkClientFactory implements SdkClientFactory { + async createSdkClient( + ...args: ConstructorParameters + ): Promise { + try { + await loadWithTimeout(); + } catch (error) { + throw new Error(`Failed to load: ${error.message}`); + } + + return Promise.resolve((globalThis as any).init_sdk(...args)); + } +} + +const loadWithTimeout = async () => { + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + reject(new Error("Operation timed out after 1 second")); + }, 1000); + + load() + .then(() => { + clearTimeout(timer); + resolve(); + }) + .catch((error) => { + clearTimeout(timer); + reject(error); + }); + }); +}; diff --git a/apps/browser/src/platform/services/sdk/fallback.ts b/apps/browser/src/platform/services/sdk/fallback.ts new file mode 100644 index 00000000000..82d292fc9ee --- /dev/null +++ b/apps/browser/src/platform/services/sdk/fallback.ts @@ -0,0 +1,8 @@ +import * as sdk from "@bitwarden/sdk-internal"; +import * as wasm from "@bitwarden/sdk-internal/bitwarden_wasm_internal_bg.wasm.js"; + +(globalThis as any).init_sdk = (...args: ConstructorParameters) => { + (sdk as any).init(wasm); + + return new sdk.BitwardenClient(...args); +}; diff --git a/apps/browser/src/platform/services/sdk/wasm.ts b/apps/browser/src/platform/services/sdk/wasm.ts new file mode 100644 index 00000000000..1977a171e23 --- /dev/null +++ b/apps/browser/src/platform/services/sdk/wasm.ts @@ -0,0 +1,8 @@ +import * as sdk from "@bitwarden/sdk-internal"; +import * as wasm from "@bitwarden/sdk-internal/bitwarden_wasm_internal_bg.wasm"; + +(globalThis as any).init_sdk = (...args: ConstructorParameters) => { + (sdk as any).init(wasm); + + return new sdk.BitwardenClient(...args); +}; diff --git a/apps/browser/src/platform/services/task-scheduler/background-task-scheduler.service.spec.ts b/apps/browser/src/platform/services/task-scheduler/background-task-scheduler.service.spec.ts new file mode 100644 index 00000000000..ded57a5e85d --- /dev/null +++ b/apps/browser/src/platform/services/task-scheduler/background-task-scheduler.service.spec.ts @@ -0,0 +1,129 @@ +import { mock, MockProxy } from "jest-mock-extended"; +import { Observable } from "rxjs"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { ScheduledTaskNames } from "@bitwarden/common/platform/scheduling"; +import { GlobalState, StateProvider } from "@bitwarden/common/platform/state"; + +import { createPortSpyMock } from "../../../autofill/spec/autofill-mocks"; +import { + flushPromises, + sendPortMessage, + triggerPortOnDisconnectEvent, + triggerRuntimeOnConnectEvent, +} from "../../../autofill/spec/testing-utils"; +import { + BrowserTaskSchedulerPortActions, + BrowserTaskSchedulerPortName, +} from "../abstractions/browser-task-scheduler.service"; + +import { BackgroundTaskSchedulerService } from "./background-task-scheduler.service"; + +describe("BackgroundTaskSchedulerService", () => { + let logService: MockProxy; + let stateProvider: MockProxy; + let globalStateMock: MockProxy>; + let portMock: chrome.runtime.Port; + let backgroundTaskSchedulerService: BackgroundTaskSchedulerService; + + beforeEach(() => { + logService = mock(); + globalStateMock = mock>({ + state$: mock>(), + update: jest.fn((callback) => callback([], {} as any)), + }); + stateProvider = mock({ + getGlobal: jest.fn(() => globalStateMock), + }); + portMock = createPortSpyMock(BrowserTaskSchedulerPortName); + backgroundTaskSchedulerService = new BackgroundTaskSchedulerService(logService, stateProvider); + jest.spyOn(globalThis, "setTimeout"); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("ports on connect", () => { + it("ignores port connections that do not have the correct task scheduler port name", () => { + const portMockWithDifferentName = createPortSpyMock("different-name"); + triggerRuntimeOnConnectEvent(portMockWithDifferentName); + + expect(portMockWithDifferentName.onMessage.addListener).not.toHaveBeenCalled(); + expect(portMockWithDifferentName.onDisconnect.addListener).not.toHaveBeenCalled(); + }); + + it("sets up onMessage and onDisconnect listeners for connected ports", () => { + triggerRuntimeOnConnectEvent(portMock); + + expect(portMock.onMessage.addListener).toHaveBeenCalled(); + expect(portMock.onDisconnect.addListener).toHaveBeenCalled(); + }); + }); + + describe("ports on disconnect", () => { + it("removes the port from the set of connected ports", () => { + triggerRuntimeOnConnectEvent(portMock); + expect(backgroundTaskSchedulerService["ports"].size).toBe(1); + + triggerPortOnDisconnectEvent(portMock); + expect(backgroundTaskSchedulerService["ports"].size).toBe(0); + expect(portMock.onMessage.removeListener).toHaveBeenCalled(); + expect(portMock.onDisconnect.removeListener).toHaveBeenCalled(); + }); + }); + + describe("port message handlers", () => { + beforeEach(() => { + triggerRuntimeOnConnectEvent(portMock); + backgroundTaskSchedulerService.registerTaskHandler( + ScheduledTaskNames.loginStrategySessionTimeout, + jest.fn(), + ); + }); + + it("sets a setTimeout backup alarm", async () => { + sendPortMessage(portMock, { + action: BrowserTaskSchedulerPortActions.setTimeout, + taskName: ScheduledTaskNames.loginStrategySessionTimeout, + delayInMs: 1000, + }); + await flushPromises(); + + expect(globalThis.setTimeout).toHaveBeenCalled(); + expect(chrome.alarms.create).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + { delayInMinutes: 0.5 }, + expect.any(Function), + ); + }); + + it("sets a setInterval backup alarm", async () => { + sendPortMessage(portMock, { + action: BrowserTaskSchedulerPortActions.setInterval, + taskName: ScheduledTaskNames.loginStrategySessionTimeout, + intervalInMs: 600000, + }); + await flushPromises(); + + expect(chrome.alarms.create).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + { delayInMinutes: 10, periodInMinutes: 10 }, + expect.any(Function), + ); + }); + + it("clears a scheduled alarm", async () => { + sendPortMessage(portMock, { + action: BrowserTaskSchedulerPortActions.clearAlarm, + alarmName: ScheduledTaskNames.loginStrategySessionTimeout, + }); + await flushPromises(); + + expect(chrome.alarms.clear).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + expect.any(Function), + ); + }); + }); +}); diff --git a/apps/browser/src/platform/services/task-scheduler/background-task-scheduler.service.ts b/apps/browser/src/platform/services/task-scheduler/background-task-scheduler.service.ts new file mode 100644 index 00000000000..23b580988f8 --- /dev/null +++ b/apps/browser/src/platform/services/task-scheduler/background-task-scheduler.service.ts @@ -0,0 +1,75 @@ +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { StateProvider } from "@bitwarden/common/platform/state"; + +import { BrowserApi } from "../../browser/browser-api"; +import { + BrowserTaskSchedulerPortActions, + BrowserTaskSchedulerPortMessage, + BrowserTaskSchedulerPortName, +} from "../abstractions/browser-task-scheduler.service"; + +import { BrowserTaskSchedulerServiceImplementation } from "./browser-task-scheduler.service"; + +export class BackgroundTaskSchedulerService extends BrowserTaskSchedulerServiceImplementation { + private ports: Set = new Set(); + + constructor(logService: LogService, stateProvider: StateProvider) { + super(logService, stateProvider); + + BrowserApi.addListener(chrome.runtime.onConnect, this.handlePortOnConnect); + } + + /** + * Handles a port connection made from the foreground task scheduler. + * + * @param port - The port that was connected. + */ + private handlePortOnConnect = (port: chrome.runtime.Port) => { + if (port.name !== BrowserTaskSchedulerPortName) { + return; + } + + this.ports.add(port); + port.onMessage.addListener(this.handlePortMessage); + port.onDisconnect.addListener(this.handlePortOnDisconnect); + }; + + /** + * Handles a port disconnection. + * + * @param port - The port that was disconnected. + */ + private handlePortOnDisconnect = (port: chrome.runtime.Port) => { + port.onMessage.removeListener(this.handlePortMessage); + port.onDisconnect.removeListener(this.handlePortOnDisconnect); + this.ports.delete(port); + }; + + /** + * Handles a message from a port. + * + * @param message - The message that was received. + * @param port - The port that sent the message. + */ + private handlePortMessage = ( + message: BrowserTaskSchedulerPortMessage, + port: chrome.runtime.Port, + ) => { + const isTaskSchedulerPort = port.name === BrowserTaskSchedulerPortName; + const { action, taskName, alarmName, delayInMs, intervalInMs } = message; + + if (isTaskSchedulerPort && action === BrowserTaskSchedulerPortActions.setTimeout) { + super.setTimeout(taskName, delayInMs); + return; + } + + if (isTaskSchedulerPort && action === BrowserTaskSchedulerPortActions.setInterval) { + super.setInterval(taskName, intervalInMs); + return; + } + + if (isTaskSchedulerPort && action === BrowserTaskSchedulerPortActions.clearAlarm) { + super.clearScheduledAlarm(alarmName).catch((error) => this.logService.error(error)); + } + }; +} diff --git a/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.spec.ts b/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.spec.ts new file mode 100644 index 00000000000..d72ba942051 --- /dev/null +++ b/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.spec.ts @@ -0,0 +1,463 @@ +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject, Observable } from "rxjs"; + +import { ScheduledTaskNames } from "@bitwarden/common/platform/scheduling"; +import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; +import { GlobalState, StateProvider } from "@bitwarden/common/platform/state"; + +import { flushPromises, triggerOnAlarmEvent } from "../../../autofill/spec/testing-utils"; +import { + ActiveAlarm, + BrowserTaskSchedulerService, +} from "../abstractions/browser-task-scheduler.service"; + +import { BrowserTaskSchedulerServiceImplementation } from "./browser-task-scheduler.service"; + +jest.mock("rxjs", () => { + const actualModule = jest.requireActual("rxjs"); + return { + ...actualModule, + firstValueFrom: jest.fn((state$: BehaviorSubject) => state$.value), + }; +}); + +function setupGlobalBrowserMock(overrides: Partial = {}) { + globalThis.browser.alarms = { + create: jest.fn(), + clear: jest.fn(), + get: jest.fn(), + getAll: jest.fn(), + clearAll: jest.fn(), + onAlarm: { + addListener: jest.fn(), + removeListener: jest.fn(), + hasListener: jest.fn(), + }, + ...overrides, + }; +} + +describe("BrowserTaskSchedulerService", () => { + const callback = jest.fn(); + const delayInMinutes = 2; + let activeAlarmsMock$: BehaviorSubject; + let logService: MockProxy; + let stateProvider: MockProxy; + let globalStateMock: MockProxy>; + let browserTaskSchedulerService: BrowserTaskSchedulerService; + let activeAlarms: ActiveAlarm[] = []; + const eventUploadsIntervalCreateInfo = { periodInMinutes: 5, delayInMinutes: 5 }; + const scheduleNextSyncIntervalCreateInfo = { periodInMinutes: 5, delayInMinutes: 5 }; + + beforeEach(() => { + jest.useFakeTimers(); + activeAlarms = [ + mock({ + alarmName: ScheduledTaskNames.eventUploadsInterval, + createInfo: eventUploadsIntervalCreateInfo, + }), + mock({ + alarmName: ScheduledTaskNames.scheduleNextSyncInterval, + createInfo: scheduleNextSyncIntervalCreateInfo, + }), + mock({ + alarmName: ScheduledTaskNames.fido2ClientAbortTimeout, + startTime: Date.now() - 60001, + createInfo: { delayInMinutes: 1, periodInMinutes: undefined }, + }), + ]; + activeAlarmsMock$ = new BehaviorSubject(activeAlarms); + logService = mock(); + globalStateMock = mock>({ + state$: mock>(), + update: jest.fn((callback) => callback([], {} as any)), + }); + stateProvider = mock({ + getGlobal: jest.fn(() => globalStateMock), + }); + browserTaskSchedulerService = new BrowserTaskSchedulerServiceImplementation( + logService, + stateProvider, + ); + browserTaskSchedulerService.activeAlarms$ = activeAlarmsMock$; + browserTaskSchedulerService.registerTaskHandler( + ScheduledTaskNames.loginStrategySessionTimeout, + callback, + ); + // @ts-expect-error mocking global browser object + // eslint-disable-next-line no-global-assign + globalThis.browser = {}; + chrome.alarms.get = jest.fn().mockImplementation((_name, callback) => callback(undefined)); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.clearAllTimers(); + jest.useRealTimers(); + + // eslint-disable-next-line no-global-assign + globalThis.browser = undefined; + }); + + describe("setTimeout", () => { + it("triggers an error when setting a timeout for a task that is not registered", async () => { + expect(() => + browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.notificationsReconnectTimeout, + 1000, + ), + ).toThrow( + `Task handler for ${ScheduledTaskNames.notificationsReconnectTimeout} not registered. Unable to schedule task.`, + ); + }); + + it("creates a timeout alarm", async () => { + browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.loginStrategySessionTimeout, + delayInMinutes * 60 * 1000, + ); + await flushPromises(); + + expect(chrome.alarms.create).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + { delayInMinutes }, + expect.any(Function), + ); + }); + + it("skips creating a duplicate timeout alarm", async () => { + const mockAlarm = mock(); + chrome.alarms.get = jest.fn().mockImplementation((_name, callback) => callback(mockAlarm)); + + browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.loginStrategySessionTimeout, + delayInMinutes * 60 * 1000, + ); + + expect(chrome.alarms.create).not.toHaveBeenCalled(); + }); + + describe("when the task is scheduled to be triggered in less than the minimum possible delay", () => { + const delayInMs = 25000; + + it("sets a timeout using the global setTimeout API", async () => { + jest.spyOn(globalThis, "setTimeout"); + + browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.loginStrategySessionTimeout, + delayInMs, + ); + await flushPromises(); + + expect(globalThis.setTimeout).toHaveBeenCalledWith(expect.any(Function), delayInMs); + }); + + it("sets a fallback alarm", async () => { + const delayInMs = 15000; + browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.loginStrategySessionTimeout, + delayInMs, + ); + await flushPromises(); + + expect(chrome.alarms.create).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + { delayInMinutes: 0.5 }, + expect.any(Function), + ); + }); + + it("sets the fallback for a minimum of 1 minute if the environment not for Chrome", async () => { + setupGlobalBrowserMock(); + + browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.loginStrategySessionTimeout, + delayInMs, + ); + await flushPromises(); + + expect(browser.alarms.create).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + { delayInMinutes: 1 }, + ); + }); + + it("clears the fallback alarm when the setTimeout is triggered", async () => { + jest.useFakeTimers(); + + browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.loginStrategySessionTimeout, + delayInMs, + ); + jest.advanceTimersByTime(delayInMs); + await flushPromises(); + + expect(chrome.alarms.clear).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + expect.any(Function), + ); + }); + }); + + it("returns a subscription that can be used to clear the timeout", () => { + jest.spyOn(globalThis, "clearTimeout"); + + const timeoutSubscription = browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.loginStrategySessionTimeout, + 10000, + ); + + timeoutSubscription.unsubscribe(); + + expect(chrome.alarms.clear).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + expect.any(Function), + ); + expect(globalThis.clearTimeout).toHaveBeenCalled(); + }); + + it("clears alarms in non-chrome environments", () => { + setupGlobalBrowserMock(); + + const timeoutSubscription = browserTaskSchedulerService.setTimeout( + ScheduledTaskNames.loginStrategySessionTimeout, + 10000, + ); + timeoutSubscription.unsubscribe(); + + expect(browser.alarms.clear).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + ); + }); + }); + + describe("setInterval", () => { + it("triggers an error when setting an interval for a task that is not registered", async () => { + expect(() => { + browserTaskSchedulerService.setInterval( + ScheduledTaskNames.notificationsReconnectTimeout, + 1000, + ); + }).toThrow( + `Task handler for ${ScheduledTaskNames.notificationsReconnectTimeout} not registered. Unable to schedule task.`, + ); + }); + + describe("setting an interval that is less than 1 minute", () => { + const intervalInMs = 10000; + + it("sets up stepped alarms that trigger behavior after the first minute of setInterval execution", async () => { + browserTaskSchedulerService.setInterval( + ScheduledTaskNames.loginStrategySessionTimeout, + intervalInMs, + ); + await flushPromises(); + + expect(chrome.alarms.create).toHaveBeenCalledWith( + `${ScheduledTaskNames.loginStrategySessionTimeout}__0`, + { periodInMinutes: 0.6666666666666666, delayInMinutes: 0.5 }, + expect.any(Function), + ); + expect(chrome.alarms.create).toHaveBeenCalledWith( + `${ScheduledTaskNames.loginStrategySessionTimeout}__1`, + { periodInMinutes: 0.6666666666666666, delayInMinutes: 0.6666666666666666 }, + expect.any(Function), + ); + expect(chrome.alarms.create).toHaveBeenCalledWith( + `${ScheduledTaskNames.loginStrategySessionTimeout}__2`, + { periodInMinutes: 0.6666666666666666, delayInMinutes: 0.8333333333333333 }, + expect.any(Function), + ); + expect(chrome.alarms.create).toHaveBeenCalledWith( + `${ScheduledTaskNames.loginStrategySessionTimeout}__3`, + { periodInMinutes: 0.6666666666666666, delayInMinutes: 1 }, + expect.any(Function), + ); + }); + + it("sets an interval using the global setInterval API", async () => { + jest.spyOn(globalThis, "setInterval"); + + browserTaskSchedulerService.setInterval( + ScheduledTaskNames.loginStrategySessionTimeout, + intervalInMs, + ); + await flushPromises(); + + expect(globalThis.setInterval).toHaveBeenCalledWith(expect.any(Function), intervalInMs); + }); + + it("clears the global setInterval instance once the interval has elapsed the minimum required delay for an alarm", async () => { + jest.useFakeTimers(); + jest.spyOn(globalThis, "clearInterval"); + + browserTaskSchedulerService.setInterval( + ScheduledTaskNames.loginStrategySessionTimeout, + intervalInMs, + ); + await flushPromises(); + jest.advanceTimersByTime(50000); + + expect(globalThis.clearInterval).toHaveBeenCalledWith(expect.any(Number)); + }); + }); + + it("creates an interval alarm", async () => { + const periodInMinutes = 2; + const initialDelayInMs = 1000; + + browserTaskSchedulerService.setInterval( + ScheduledTaskNames.loginStrategySessionTimeout, + periodInMinutes * 60 * 1000, + initialDelayInMs, + ); + await flushPromises(); + + expect(chrome.alarms.create).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + { periodInMinutes, delayInMinutes: 0.5 }, + expect.any(Function), + ); + }); + + it("defaults the alarm's delay in minutes to the interval in minutes if the delay is not specified", async () => { + const periodInMinutes = 2; + browserTaskSchedulerService.setInterval( + ScheduledTaskNames.loginStrategySessionTimeout, + periodInMinutes * 60 * 1000, + ); + await flushPromises(); + + expect(chrome.alarms.create).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + { periodInMinutes, delayInMinutes: periodInMinutes }, + expect.any(Function), + ); + }); + + it("returns a subscription that can be used to clear an interval alarm", () => { + jest.spyOn(globalThis, "clearInterval"); + + const intervalSubscription = browserTaskSchedulerService.setInterval( + ScheduledTaskNames.loginStrategySessionTimeout, + 600000, + ); + + intervalSubscription.unsubscribe(); + + expect(chrome.alarms.clear).toHaveBeenCalledWith( + ScheduledTaskNames.loginStrategySessionTimeout, + expect.any(Function), + ); + expect(globalThis.clearInterval).not.toHaveBeenCalled(); + }); + + it("returns a subscription that can be used to clear all stepped interval alarms", () => { + jest.spyOn(globalThis, "clearInterval"); + + const intervalSubscription = browserTaskSchedulerService.setInterval( + ScheduledTaskNames.loginStrategySessionTimeout, + 10000, + ); + + intervalSubscription.unsubscribe(); + + expect(chrome.alarms.clear).toHaveBeenCalledWith( + `${ScheduledTaskNames.loginStrategySessionTimeout}__0`, + expect.any(Function), + ); + expect(chrome.alarms.clear).toHaveBeenCalledWith( + `${ScheduledTaskNames.loginStrategySessionTimeout}__1`, + expect.any(Function), + ); + expect(chrome.alarms.clear).toHaveBeenCalledWith( + `${ScheduledTaskNames.loginStrategySessionTimeout}__2`, + expect.any(Function), + ); + expect(chrome.alarms.clear).toHaveBeenCalledWith( + `${ScheduledTaskNames.loginStrategySessionTimeout}__3`, + expect.any(Function), + ); + expect(globalThis.clearInterval).toHaveBeenCalled(); + }); + }); + + describe("verifyAlarmsState", () => { + it("skips recovering a scheduled task if an existing alarm for the task is present", async () => { + chrome.alarms.get = jest + .fn() + .mockImplementation((_name, callback) => callback(mock())); + + await browserTaskSchedulerService.verifyAlarmsState(); + + expect(chrome.alarms.create).not.toHaveBeenCalled(); + expect(callback).not.toHaveBeenCalled(); + }); + + describe("extension alarm is not set", () => { + it("triggers the task when the task should have triggered", async () => { + const fido2Callback = jest.fn(); + browserTaskSchedulerService.registerTaskHandler( + ScheduledTaskNames.fido2ClientAbortTimeout, + fido2Callback, + ); + + await browserTaskSchedulerService.verifyAlarmsState(); + + expect(fido2Callback).toHaveBeenCalled(); + }); + + it("schedules an alarm for the task when it has not yet triggered ", async () => { + const syncCallback = jest.fn(); + browserTaskSchedulerService.registerTaskHandler( + ScheduledTaskNames.scheduleNextSyncInterval, + syncCallback, + ); + + await browserTaskSchedulerService.verifyAlarmsState(); + + expect(chrome.alarms.create).toHaveBeenCalledWith( + ScheduledTaskNames.scheduleNextSyncInterval, + scheduleNextSyncIntervalCreateInfo, + expect.any(Function), + ); + }); + }); + }); + + describe("triggering a task", () => { + it("triggers a task when an onAlarm event is triggered", () => { + const alarm = mock({ + name: ScheduledTaskNames.loginStrategySessionTimeout, + }); + + triggerOnAlarmEvent(alarm); + + expect(callback).toHaveBeenCalled(); + }); + }); + + describe("clearAllScheduledTasks", () => { + it("clears all scheduled tasks and extension alarms", async () => { + // @ts-expect-error mocking global state update method + globalStateMock.update = jest.fn((callback) => { + const stateValue = callback([], {} as any); + activeAlarmsMock$.next(stateValue); + return stateValue; + }); + + await browserTaskSchedulerService.clearAllScheduledTasks(); + + expect(chrome.alarms.clearAll).toHaveBeenCalled(); + expect(activeAlarmsMock$.value).toEqual([]); + }); + + it("clears all extension alarms within a non Chrome environment", async () => { + setupGlobalBrowserMock(); + + await browserTaskSchedulerService.clearAllScheduledTasks(); + + expect(browser.alarms.clearAll).toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.ts b/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.ts new file mode 100644 index 00000000000..187742f5891 --- /dev/null +++ b/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.ts @@ -0,0 +1,427 @@ +import { firstValueFrom, map, Observable, Subscription } from "rxjs"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { + DefaultTaskSchedulerService, + ScheduledTaskName, +} from "@bitwarden/common/platform/scheduling"; +import { + TASK_SCHEDULER_DISK, + GlobalState, + KeyDefinition, + StateProvider, +} from "@bitwarden/common/platform/state"; + +import { BrowserApi } from "../../browser/browser-api"; +import { + ActiveAlarm, + BrowserTaskSchedulerService, +} from "../abstractions/browser-task-scheduler.service"; + +const ACTIVE_ALARMS = new KeyDefinition(TASK_SCHEDULER_DISK, "activeAlarms", { + deserializer: (value: ActiveAlarm[]) => value ?? [], +}); + +export class BrowserTaskSchedulerServiceImplementation + extends DefaultTaskSchedulerService + implements BrowserTaskSchedulerService +{ + private activeAlarmsState: GlobalState; + readonly activeAlarms$: Observable; + + constructor( + logService: LogService, + private stateProvider: StateProvider, + ) { + super(logService); + + this.activeAlarmsState = this.stateProvider.getGlobal(ACTIVE_ALARMS); + this.activeAlarms$ = this.activeAlarmsState.state$.pipe( + map((activeAlarms) => activeAlarms ?? []), + ); + + this.setupOnAlarmListener(); + } + + /** + * Sets a timeout to execute a callback after a delay. If the delay is less + * than 1 minute, it will use the global setTimeout. Otherwise, it will + * create a browser extension alarm to handle the delay. + * + * @param taskName - The name of the task, used in defining the alarm. + * @param delayInMs - The delay in milliseconds. + */ + setTimeout(taskName: ScheduledTaskName, delayInMs: number): Subscription { + let timeoutHandle: number | NodeJS.Timeout; + this.validateRegisteredTask(taskName); + + const delayInMinutes = delayInMs / 1000 / 60; + this.scheduleAlarm(taskName, { + delayInMinutes: this.getUpperBoundDelayInMinutes(delayInMinutes), + }).catch((error) => this.logService.error("Failed to schedule alarm", error)); + + // If the delay is less than a minute, we want to attempt to trigger the task through a setTimeout. + // The alarm previously scheduled will be used as a backup in case the setTimeout fails. + if (delayInMinutes < this.getUpperBoundDelayInMinutes(delayInMinutes)) { + timeoutHandle = globalThis.setTimeout(async () => { + await this.clearScheduledAlarm(taskName); + await this.triggerTask(taskName); + }, delayInMs); + } + + return new Subscription(() => { + if (timeoutHandle) { + globalThis.clearTimeout(timeoutHandle); + } + this.clearScheduledAlarm(taskName).catch((error) => + this.logService.error("Failed to clear alarm", error), + ); + }); + } + + /** + * Sets an interval to execute a callback at each interval. If the interval is + * less than 1 minute, it will use the global setInterval. Otherwise, it will + * create a browser extension alarm to handle the interval. + * + * @param taskName - The name of the task, used in defining the alarm. + * @param intervalInMs - The interval in milliseconds. + * @param initialDelayInMs - The initial delay in milliseconds. + */ + setInterval( + taskName: ScheduledTaskName, + intervalInMs: number, + initialDelayInMs?: number, + ): Subscription { + this.validateRegisteredTask(taskName); + + const intervalInMinutes = intervalInMs / 1000 / 60; + const initialDelayInMinutes = initialDelayInMs + ? initialDelayInMs / 1000 / 60 + : intervalInMinutes; + + if (intervalInMinutes < this.getUpperBoundDelayInMinutes(intervalInMinutes)) { + return this.setupSteppedIntervalAlarms(taskName, intervalInMs); + } + + this.scheduleAlarm(taskName, { + periodInMinutes: this.getUpperBoundDelayInMinutes(intervalInMinutes), + delayInMinutes: this.getUpperBoundDelayInMinutes(initialDelayInMinutes), + }).catch((error) => this.logService.error("Failed to schedule alarm", error)); + + return new Subscription(() => + this.clearScheduledAlarm(taskName).catch((error) => + this.logService.error("Failed to clear alarm", error), + ), + ); + } + + /** + * Used in cases where the interval is less than 1 minute. This method will set up a setInterval + * to initialize expected recurring behavior, then create a series of alarms to handle the + * expected scheduled task through the alarms api. This is necessary because the alarms + * api does not support intervals less than 1 minute. + * + * @param taskName - The name of the task + * @param intervalInMs - The interval in milliseconds. + */ + private setupSteppedIntervalAlarms( + taskName: ScheduledTaskName, + intervalInMs: number, + ): Subscription { + const alarmMinDelayInMinutes = this.getAlarmMinDelayInMinutes(); + const intervalInMinutes = intervalInMs / 1000 / 60; + const numberOfAlarmsToCreate = Math.ceil(Math.ceil(1 / intervalInMinutes) / 2) + 1; + const steppedAlarmPeriodInMinutes = alarmMinDelayInMinutes + intervalInMinutes; + const steppedAlarmNames: string[] = []; + for (let alarmIndex = 0; alarmIndex < numberOfAlarmsToCreate; alarmIndex++) { + const steppedAlarmName = `${taskName}__${alarmIndex}`; + steppedAlarmNames.push(steppedAlarmName); + + const delayInMinutes = this.getUpperBoundDelayInMinutes( + alarmMinDelayInMinutes + intervalInMinutes * alarmIndex, + ); + + this.clearScheduledAlarm(steppedAlarmName) + .then(() => + this.scheduleAlarm(steppedAlarmName, { + periodInMinutes: steppedAlarmPeriodInMinutes, + delayInMinutes, + }).catch((error) => this.logService.error("Failed to schedule alarm", error)), + ) + .catch((error) => this.logService.error("Failed to clear alarm", error)); + } + + let elapsedMs = 0; + const intervalHandle: number | NodeJS.Timeout = globalThis.setInterval(async () => { + elapsedMs += intervalInMs; + const elapsedMinutes = elapsedMs / 1000 / 60; + + if (elapsedMinutes >= alarmMinDelayInMinutes) { + globalThis.clearInterval(intervalHandle); + return; + } + + await this.triggerTask(taskName, intervalInMinutes); + }, intervalInMs); + + return new Subscription(() => { + if (intervalHandle) { + globalThis.clearInterval(intervalHandle); + } + steppedAlarmNames.forEach((alarmName) => + this.clearScheduledAlarm(alarmName).catch((error) => + this.logService.error("Failed to clear alarm", error), + ), + ); + }); + } + + /** + * Clears all scheduled tasks by clearing all browser extension + * alarms and resetting the active alarms state. + */ + async clearAllScheduledTasks(): Promise { + await this.clearAllAlarms(); + await this.updateActiveAlarms([]); + } + + /** + * Verifies the state of the active alarms by checking if + * any alarms have been missed or need to be created. + */ + async verifyAlarmsState(): Promise { + const currentTime = Date.now(); + const activeAlarms = await this.getActiveAlarms(); + + for (const alarm of activeAlarms) { + const { alarmName, startTime, createInfo } = alarm; + const existingAlarm = await this.getAlarm(alarmName); + if (existingAlarm) { + continue; + } + + const shouldAlarmHaveBeenTriggered = createInfo.when && createInfo.when < currentTime; + const hasSetTimeoutAlarmExceededDelay = + !createInfo.periodInMinutes && + createInfo.delayInMinutes && + startTime + createInfo.delayInMinutes * 60 * 1000 < currentTime; + if (shouldAlarmHaveBeenTriggered || hasSetTimeoutAlarmExceededDelay) { + await this.triggerTask(alarmName); + continue; + } + + this.scheduleAlarm(alarmName, createInfo).catch((error) => + this.logService.error("Failed to schedule alarm", error), + ); + } + } + + /** + * Creates a browser extension alarm with the given name and create info. + * + * @param alarmName - The name of the alarm. + * @param createInfo - The alarm create info. + */ + private async scheduleAlarm( + alarmName: string, + createInfo: chrome.alarms.AlarmCreateInfo, + ): Promise { + const existingAlarm = await this.getAlarm(alarmName); + if (existingAlarm) { + this.logService.debug(`Alarm ${alarmName} already exists. Skipping creation.`); + return; + } + + await this.createAlarm(alarmName, createInfo); + await this.setActiveAlarm(alarmName, createInfo); + } + + /** + * Gets the active alarms from state. + */ + private async getActiveAlarms(): Promise { + return await firstValueFrom(this.activeAlarms$); + } + + /** + * Sets an active alarm in state. + * + * @param alarmName - The name of the active alarm to set. + * @param createInfo - The creation info of the active alarm. + */ + private async setActiveAlarm( + alarmName: string, + createInfo: chrome.alarms.AlarmCreateInfo, + ): Promise { + const activeAlarms = await this.getActiveAlarms(); + const filteredAlarms = activeAlarms.filter((alarm) => alarm.alarmName !== alarmName); + filteredAlarms.push({ + alarmName, + startTime: Date.now(), + createInfo, + }); + await this.updateActiveAlarms(filteredAlarms); + } + + /** + * Deletes an active alarm from state. + * + * @param alarmName - The name of the active alarm to delete. + */ + private async deleteActiveAlarm(alarmName: string): Promise { + const activeAlarms = await this.getActiveAlarms(); + const filteredAlarms = activeAlarms.filter((alarm) => alarm.alarmName !== alarmName); + await this.updateActiveAlarms(filteredAlarms || []); + } + + /** + * Clears a scheduled alarm by its name and deletes it from the active alarms state. + * + * @param alarmName - The name of the alarm to clear. + */ + async clearScheduledAlarm(alarmName: string): Promise { + const wasCleared = await this.clearAlarm(alarmName); + if (wasCleared) { + await this.deleteActiveAlarm(alarmName); + } + } + + /** + * Updates the active alarms state with the given alarms. + * + * @param alarms - The alarms to update the state with. + */ + private async updateActiveAlarms(alarms: ActiveAlarm[]): Promise { + await this.activeAlarmsState.update(() => alarms); + } + + /** + * Sets up the on alarm listener to handle alarms. + */ + private setupOnAlarmListener(): void { + BrowserApi.addListener(chrome.alarms.onAlarm, this.handleOnAlarm); + } + + /** + * Handles on alarm events, triggering the alarm if a handler exists. + * + * @param alarm - The alarm to handle. + */ + private handleOnAlarm = async (alarm: chrome.alarms.Alarm): Promise => { + const { name, periodInMinutes } = alarm; + await this.triggerTask(name, periodInMinutes); + }; + + /** + * Triggers an alarm by calling its handler and + * deleting it if it is a one-time alarm. + * + * @param alarmName - The name of the alarm to trigger. + * @param periodInMinutes - The period in minutes of an interval alarm. + */ + protected async triggerTask(alarmName: string, periodInMinutes?: number): Promise { + const taskName = this.getTaskFromAlarmName(alarmName); + const handler = this.taskHandlers.get(taskName); + if (!periodInMinutes) { + await this.deleteActiveAlarm(alarmName); + } + + if (handler) { + handler(); + } + } + + /** + * Parses and returns the task name from an alarm name. + * + * @param alarmName - The alarm name to parse. + */ + protected getTaskFromAlarmName(alarmName: string): ScheduledTaskName { + return alarmName.split("__")[0] as ScheduledTaskName; + } + + /** + * Clears a new alarm with the given name and create info. Returns a promise + * that indicates when the alarm has been cleared successfully. + * + * @param alarmName - The name of the alarm to create. + */ + private async clearAlarm(alarmName: string): Promise { + if (this.isNonChromeEnvironment()) { + return browser.alarms.clear(alarmName); + } + + return new Promise((resolve) => chrome.alarms.clear(alarmName, resolve)); + } + + /** + * Clears all alarms that have been set by the extension. Returns a promise + * that indicates when all alarms have been cleared successfully. + */ + private clearAllAlarms(): Promise { + if (this.isNonChromeEnvironment()) { + return browser.alarms.clearAll(); + } + + return new Promise((resolve) => chrome.alarms.clearAll(resolve)); + } + + /** + * Creates a new alarm with the given name and create info. + * + * @param alarmName - The name of the alarm to create. + * @param createInfo - The creation info for the alarm. + */ + private async createAlarm( + alarmName: string, + createInfo: chrome.alarms.AlarmCreateInfo, + ): Promise { + if (this.isNonChromeEnvironment()) { + return browser.alarms.create(alarmName, createInfo); + } + + return new Promise((resolve) => chrome.alarms.create(alarmName, createInfo, resolve)); + } + + /** + * Gets the alarm with the given name. + * + * @param alarmName - The name of the alarm to get. + */ + private getAlarm(alarmName: string): Promise { + if (this.isNonChromeEnvironment()) { + return browser.alarms.get(alarmName); + } + + return new Promise((resolve) => chrome.alarms.get(alarmName, resolve)); + } + + /** + * Checks if the environment is a non-Chrome environment. This is used to determine + * if the browser alarms API should be used in place of the chrome alarms API. This + * is necessary because the `chrome` polyfill that Mozilla implements does not allow + * passing the callback parameter in the same way most `chrome.alarm` api calls allow. + */ + private isNonChromeEnvironment(): boolean { + return typeof browser !== "undefined" && !!browser.alarms; + } + + /** + * Gets the minimum delay in minutes for an alarm. This is used to ensure that the + * delay is at least 1 minute in non-Chrome environments. In Chrome environments, the + * delay can be as low as 0.5 minutes. + */ + private getAlarmMinDelayInMinutes(): number { + return this.isNonChromeEnvironment() ? 1 : 0.5; + } + + /** + * Gets the upper bound delay in minutes for a given delay in minutes. + * + * @param delayInMinutes - The delay in minutes. + */ + private getUpperBoundDelayInMinutes(delayInMinutes: number): number { + return Math.max(this.getAlarmMinDelayInMinutes(), delayInMinutes); + } +} diff --git a/apps/browser/src/platform/services/task-scheduler/foreground-task-scheduler.service.spec.ts b/apps/browser/src/platform/services/task-scheduler/foreground-task-scheduler.service.spec.ts new file mode 100644 index 00000000000..e0ee49c5fa1 --- /dev/null +++ b/apps/browser/src/platform/services/task-scheduler/foreground-task-scheduler.service.spec.ts @@ -0,0 +1,79 @@ +import { mock, MockProxy } from "jest-mock-extended"; +import { Observable } from "rxjs"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { ScheduledTaskNames } from "@bitwarden/common/platform/scheduling"; +import { GlobalState, StateProvider } from "@bitwarden/common/platform/state"; + +import { createPortSpyMock } from "../../../autofill/spec/autofill-mocks"; +import { flushPromises } from "../../../autofill/spec/testing-utils"; +import { + BrowserTaskSchedulerPortActions, + BrowserTaskSchedulerPortName, +} from "../abstractions/browser-task-scheduler.service"; + +import { ForegroundTaskSchedulerService } from "./foreground-task-scheduler.service"; + +describe("ForegroundTaskSchedulerService", () => { + let logService: MockProxy; + let stateProvider: MockProxy; + let globalStateMock: MockProxy>; + let portMock: chrome.runtime.Port; + let foregroundTaskSchedulerService: ForegroundTaskSchedulerService; + + beforeEach(() => { + logService = mock(); + globalStateMock = mock>({ + state$: mock>(), + update: jest.fn((callback) => callback([], {} as any)), + }); + stateProvider = mock({ + getGlobal: jest.fn(() => globalStateMock), + }); + portMock = createPortSpyMock(BrowserTaskSchedulerPortName); + foregroundTaskSchedulerService = new ForegroundTaskSchedulerService(logService, stateProvider); + foregroundTaskSchedulerService["port"] = portMock; + foregroundTaskSchedulerService.registerTaskHandler( + ScheduledTaskNames.loginStrategySessionTimeout, + jest.fn(), + ); + jest.spyOn(globalThis, "setTimeout"); + jest.spyOn(globalThis, "setInterval"); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("sets a timeout for a task and sends a message to the background to set up a backup timeout alarm", async () => { + foregroundTaskSchedulerService.setTimeout(ScheduledTaskNames.loginStrategySessionTimeout, 1000); + await flushPromises(); + + expect(globalThis.setTimeout).toHaveBeenCalledWith(expect.any(Function), 1000); + expect(chrome.alarms.create).toHaveBeenCalledWith( + "loginStrategySessionTimeout", + { delayInMinutes: 0.5 }, + expect.any(Function), + ); + expect(portMock.postMessage).toHaveBeenCalledWith({ + action: BrowserTaskSchedulerPortActions.setTimeout, + taskName: ScheduledTaskNames.loginStrategySessionTimeout, + delayInMs: 1000, + }); + }); + + it("sets an interval for a task and sends a message to the background to set up a backup interval alarm", async () => { + foregroundTaskSchedulerService.setInterval( + ScheduledTaskNames.loginStrategySessionTimeout, + 1000, + ); + await flushPromises(); + + expect(globalThis.setInterval).toHaveBeenCalledWith(expect.any(Function), 1000); + expect(portMock.postMessage).toHaveBeenCalledWith({ + action: BrowserTaskSchedulerPortActions.setInterval, + taskName: ScheduledTaskNames.loginStrategySessionTimeout, + intervalInMs: 1000, + }); + }); +}); diff --git a/apps/browser/src/platform/services/task-scheduler/foreground-task-scheduler.service.ts b/apps/browser/src/platform/services/task-scheduler/foreground-task-scheduler.service.ts new file mode 100644 index 00000000000..af4d56aa62a --- /dev/null +++ b/apps/browser/src/platform/services/task-scheduler/foreground-task-scheduler.service.ts @@ -0,0 +1,71 @@ +import { Subscription } from "rxjs"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { ScheduledTaskName } from "@bitwarden/common/platform/scheduling"; +import { StateProvider } from "@bitwarden/common/platform/state"; + +import { + BrowserTaskSchedulerPortActions, + BrowserTaskSchedulerPortMessage, + BrowserTaskSchedulerPortName, +} from "../abstractions/browser-task-scheduler.service"; + +import { BrowserTaskSchedulerServiceImplementation } from "./browser-task-scheduler.service"; + +export class ForegroundTaskSchedulerService extends BrowserTaskSchedulerServiceImplementation { + private port: chrome.runtime.Port; + + constructor(logService: LogService, stateProvider: StateProvider) { + super(logService, stateProvider); + + this.port = chrome.runtime.connect({ name: BrowserTaskSchedulerPortName }); + } + + /** + * Sends a port message to the background to set up a fallback timeout. Also sets a timeout locally. + * This is done to ensure that the timeout triggers even if the popup is closed. + * + * @param taskName - The name of the task. + * @param delayInMs - The delay in milliseconds. + */ + setTimeout(taskName: ScheduledTaskName, delayInMs: number): Subscription { + this.sendPortMessage({ + action: BrowserTaskSchedulerPortActions.setTimeout, + taskName, + delayInMs, + }); + + return super.setTimeout(taskName, delayInMs); + } + + /** + * Sends a port message to the background to set up a fallback interval. Also sets an interval locally. + * This is done to ensure that the interval triggers even if the popup is closed. + * + * @param taskName - The name of the task. + * @param intervalInMs - The interval in milliseconds. + * @param initialDelayInMs - The initial delay in milliseconds. + */ + setInterval( + taskName: ScheduledTaskName, + intervalInMs: number, + initialDelayInMs?: number, + ): Subscription { + this.sendPortMessage({ + action: BrowserTaskSchedulerPortActions.setInterval, + taskName, + intervalInMs, + }); + + return super.setInterval(taskName, intervalInMs, initialDelayInMs); + } + + /** + * Sends a message to the background task scheduler. + * + * @param message - The message to send. + */ + private sendPortMessage(message: BrowserTaskSchedulerPortMessage) { + this.port.postMessage(message); + } +} diff --git a/apps/browser/src/platform/state/port-message.d.ts b/apps/browser/src/platform/state/port-message.d.ts new file mode 100644 index 00000000000..3aa23aac399 --- /dev/null +++ b/apps/browser/src/platform/state/port-message.d.ts @@ -0,0 +1,7 @@ +type DerivedStateActions = "nextState" | "resolve"; +type DerivedStateMessage = { + id: string; + action: DerivedStateActions; + data?: string; // Json stringified TTo + originator: "foreground" | "background"; +}; diff --git a/apps/browser/src/platform/storage/background-memory-storage.service.ts b/apps/browser/src/platform/storage/background-memory-storage.service.ts new file mode 100644 index 00000000000..a1d333affa3 --- /dev/null +++ b/apps/browser/src/platform/storage/background-memory-storage.service.ts @@ -0,0 +1,88 @@ +// eslint-disable-next-line import/no-restricted-paths -- Implementation for memory storage specifically for browser backgrounds +import { MemoryStorageService } from "@bitwarden/common/platform/state/storage/memory-storage.service"; + +import { BrowserApi } from "../browser/browser-api"; + +import { MemoryStoragePortMessage } from "./port-messages"; +import { portName } from "./port-name"; + +export class BackgroundMemoryStorageService extends MemoryStorageService { + private _ports: chrome.runtime.Port[] = []; + + constructor() { + super(); + + BrowserApi.addListener(chrome.runtime.onConnect, (port) => { + if (port.name !== portName(chrome.storage.session)) { + return; + } + + this._ports.push(port); + + const listenerCallback = this.onMessageFromForeground.bind(this); + port.onDisconnect.addListener(() => { + this._ports.splice(this._ports.indexOf(port), 1); + port.onMessage.removeListener(listenerCallback); + }); + port.onMessage.addListener(listenerCallback); + // Initialize the new memory storage service with existing data + this.sendMessageTo(port, { + action: "initialization", + data: Array.from(Object.keys(this.store)), + }); + }); + this.updates$.subscribe((update) => { + this.broadcastMessage({ + action: "subject_update", + data: update, + }); + }); + } + + private async onMessageFromForeground( + message: MemoryStoragePortMessage, + port: chrome.runtime.Port, + ) { + if (message.originator === "background") { + return; + } + + let result: unknown = null; + + switch (message.action) { + case "get": + case "has": { + result = await this[message.action](message.key); + break; + } + case "save": + await this.save(message.key, JSON.parse((message.data as string) ?? null) as unknown); + break; + case "remove": + await this.remove(message.key); + break; + } + + this.sendMessageTo(port, { + id: message.id, + key: message.key, + data: JSON.stringify(result), + }); + } + + private broadcastMessage(data: Omit) { + this._ports.forEach((port) => { + this.sendMessageTo(port, data); + }); + } + + private sendMessageTo( + port: chrome.runtime.Port, + data: Omit, + ) { + port.postMessage({ + ...data, + originator: "background", + }); + } +} diff --git a/apps/browser/src/platform/storage/browser-storage-service.provider.ts b/apps/browser/src/platform/storage/browser-storage-service.provider.ts new file mode 100644 index 00000000000..5854669138a --- /dev/null +++ b/apps/browser/src/platform/storage/browser-storage-service.provider.ts @@ -0,0 +1,38 @@ +import { + AbstractStorageService, + ObservableStorageService, +} from "@bitwarden/common/platform/abstractions/storage.service"; +import { + PossibleLocation, + StorageServiceProvider, +} from "@bitwarden/common/platform/services/storage-service.provider"; +// eslint-disable-next-line import/no-restricted-paths +import { ClientLocations } from "@bitwarden/common/platform/state/state-definition"; + +export class BrowserStorageServiceProvider extends StorageServiceProvider { + constructor( + diskStorageService: AbstractStorageService & ObservableStorageService, + limitedMemoryStorageService: AbstractStorageService & ObservableStorageService, + private largeObjectMemoryStorageService: AbstractStorageService & ObservableStorageService, + private readonly diskBackupLocalStorage: AbstractStorageService & ObservableStorageService, + ) { + super(diskStorageService, limitedMemoryStorageService); + } + + override get( + defaultLocation: PossibleLocation, + overrides: Partial, + ): [location: PossibleLocation, service: AbstractStorageService & ObservableStorageService] { + const location = overrides["browser"] ?? defaultLocation; + switch (location) { + case "memory-large-object": + return ["memory-large-object", this.largeObjectMemoryStorageService]; + case "disk-backup-local-storage": + return ["disk-backup-local-storage", this.diskBackupLocalStorage]; + default: + // Pass in computed location to super because they could have + // override default "disk" with web "memory". + return super.get(location, overrides); + } + } +} diff --git a/apps/browser/src/platform/storage/foreground-memory-storage.service.ts b/apps/browser/src/platform/storage/foreground-memory-storage.service.ts new file mode 100644 index 00000000000..bd6a52c82fe --- /dev/null +++ b/apps/browser/src/platform/storage/foreground-memory-storage.service.ts @@ -0,0 +1,114 @@ +import { Observable, Subject, filter, firstValueFrom, map } from "rxjs"; + +import { + AbstractStorageService, + StorageUpdate, +} from "@bitwarden/common/platform/abstractions/storage.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; + +import { fromChromeEvent } from "../browser/from-chrome-event"; + +import { MemoryStoragePortMessage } from "./port-messages"; +import { portName } from "./port-name"; + +export class ForegroundMemoryStorageService extends AbstractStorageService { + private _port: chrome.runtime.Port; + private _backgroundResponses$: Observable; + private updatesSubject = new Subject(); + + get valuesRequireDeserialization(): boolean { + return true; + } + updates$; + + constructor(private partitionName?: string) { + super(); + + this.updates$ = this.updatesSubject.asObservable(); + + let name = portName(chrome.storage.session); + if (this.partitionName) { + name = `${name}_${this.partitionName}`; + } + this._port = chrome.runtime.connect({ name }); + this._backgroundResponses$ = fromChromeEvent(this._port.onMessage).pipe( + map(([message]) => message), + filter((message) => message.originator === "background"), + ); + + this._backgroundResponses$ + .pipe( + filter( + (message) => message.action === "subject_update" || message.action === "initialization", + ), + ) + .subscribe((message) => { + switch (message.action) { + case "initialization": + this.handleInitialize(message.data as string[]); // Map entries as array + break; + case "subject_update": + this.handleSubjectUpdate(message.data as StorageUpdate); + break; + default: + throw new Error(`Unknown action: ${message.action}`); + } + }); + } + + async get(key: string): Promise { + return await this.delegateToBackground("get", key); + } + async has(key: string): Promise { + return await this.delegateToBackground("has", key); + } + async save(key: string, obj: T): Promise { + await this.delegateToBackground("save", key, obj); + } + async remove(key: string): Promise { + await this.delegateToBackground("remove", key); + } + + private async delegateToBackground( + action: MemoryStoragePortMessage["action"], + key: string, + data?: T, + ): Promise { + const id = Utils.newGuid(); + // listen for response before request + const response = firstValueFrom( + this._backgroundResponses$.pipe( + filter((message) => message.id === id), + map((message) => JSON.parse((message.data as string) ?? null) as T), + ), + ); + + this.sendMessage({ + id: id, + key: key, + action: action, + data: JSON.stringify(data), + }); + + const result = await response; + return result; + } + + private sendMessage(data: Omit) { + this._port.postMessage({ + ...data, + originator: "foreground", + }); + } + + private handleInitialize(data: string[]) { + // TODO: this isn't a save, but we don't have a better indicator for this + data.forEach((key) => { + this.updatesSubject.next({ key, updateType: "save" }); + }); + } + + private handleSubjectUpdate(data: StorageUpdate) { + this.updatesSubject.next(data); + } +} diff --git a/apps/browser/src/platform/storage/memory-storage-service-interactions.spec.ts b/apps/browser/src/platform/storage/memory-storage-service-interactions.spec.ts new file mode 100644 index 00000000000..c462f24269c --- /dev/null +++ b/apps/browser/src/platform/storage/memory-storage-service-interactions.spec.ts @@ -0,0 +1,78 @@ +/** + * need to update test environment so structuredClone works appropriately + * @jest-environment ../../libs/shared/test.environment.ts + */ + +import { trackEmissions } from "@bitwarden/common/../spec/utils"; + +import { mockPorts } from "../../../spec/mock-port.spec-util"; + +import { BackgroundMemoryStorageService } from "./background-memory-storage.service"; +import { ForegroundMemoryStorageService } from "./foreground-memory-storage.service"; + +describe("foreground background memory storage interaction", () => { + let foreground: ForegroundMemoryStorageService; + let background: BackgroundMemoryStorageService; + + beforeEach(() => { + mockPorts(); + + background = new BackgroundMemoryStorageService(); + foreground = new ForegroundMemoryStorageService(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test.each(["has", "get"])( + "background should respond with the correct value for %s", + async (action: "get" | "has") => { + const key = "key"; + const value = "value"; + background[action] = jest.fn().mockResolvedValue(value); + + const result = await foreground[action](key); + expect(result).toEqual(value); + }, + ); + + test("background should call save from foreground", async () => { + const key = "key"; + const value = "value"; + const actionSpy = jest.spyOn(background, "save"); + await foreground.save(key, value); + + expect(actionSpy).toHaveBeenCalledWith(key, value); + }); + + test("background should call remove from foreground", async () => { + const key = "key"; + const actionSpy = jest.spyOn(background, "remove"); + await foreground.remove(key); + + expect(actionSpy).toHaveBeenCalledWith(key); + }); + + test("background updates push to foreground", async () => { + const key = "key"; + const value = "value"; + const updateType = "save"; + const emissions = trackEmissions(foreground.updates$); + await background.save(key, value); + + expect(emissions).toEqual([{ key, updateType }]); + }); + + test("background should message only the requesting foreground", async () => { + const secondForeground = new ForegroundMemoryStorageService(); + const secondPort = secondForeground["_port"]; + const secondPost = secondPort.postMessage as jest.Mock; + secondPost.mockClear(); + + const key = "key"; + await foreground.get(key); + + expect(secondPost).not.toHaveBeenCalled(); + }); +}); diff --git a/apps/browser/src/platform/storage/mock-ports.spec-util.ts b/apps/browser/src/platform/storage/mock-ports.spec-util.ts new file mode 100644 index 00000000000..b5f7825d8e9 --- /dev/null +++ b/apps/browser/src/platform/storage/mock-ports.spec-util.ts @@ -0,0 +1,29 @@ +import { mockDeep } from "jest-mock-extended"; + +/** + * Mocks a chrome.runtime.Port set up to send messages through `postMessage` to `onMessage.addListener` callbacks. + * @param name - The name of the port. + * @param immediateOnConnectExecution - Whether to immediately execute the onConnect callbacks against the new port. + * Defaults to false. If true, the creator of the port will not have had a chance to set up listeners yet. + * @returns a mock chrome.runtime.Port + */ +export function mockPorts() { + // notify listeners of a new port + (chrome.runtime.connect as jest.Mock).mockImplementation((portInfo) => { + const port = mockDeep(); + port.name = portInfo.name; + + // set message broadcast + (port.postMessage as jest.Mock).mockImplementation((message) => { + (port.onMessage.addListener as jest.Mock).mock.calls.forEach(([callbackFn]) => { + callbackFn(message, port); + }); + }); + + (chrome.runtime.onConnect.addListener as jest.Mock).mock.calls.forEach(([callbackFn]) => { + callbackFn(port); + }); + + return port; + }); +} diff --git a/apps/browser/src/platform/storage/offscreen-storage.service.ts b/apps/browser/src/platform/storage/offscreen-storage.service.ts new file mode 100644 index 00000000000..34d3bd7a9ac --- /dev/null +++ b/apps/browser/src/platform/storage/offscreen-storage.service.ts @@ -0,0 +1,55 @@ +import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; +import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options"; + +import { BrowserApi } from "../browser/browser-api"; +import { OffscreenDocumentService } from "../offscreen-document/abstractions/offscreen-document"; + +export class OffscreenStorageService implements AbstractStorageService { + constructor(private readonly offscreenDocumentService: OffscreenDocumentService) {} + + get valuesRequireDeserialization(): boolean { + return true; + } + + async get(key: string, options?: StorageOptions): Promise { + return await this.offscreenDocumentService.withDocument( + [chrome.offscreen.Reason.LOCAL_STORAGE], + "backup storage of user data", + async () => { + const response = await BrowserApi.sendMessageWithResponse("localStorageGet", { + key, + }); + if (response != null) { + return JSON.parse(response); + } + + return response; + }, + ); + } + async has(key: string, options?: StorageOptions): Promise { + return (await this.get(key, options)) != null; + } + + async save(key: string, obj: T, options?: StorageOptions): Promise { + await this.offscreenDocumentService.withDocument( + [chrome.offscreen.Reason.LOCAL_STORAGE], + "backup storage of user data", + async () => + await BrowserApi.sendMessageWithResponse("localStorageSave", { + key, + value: JSON.stringify(obj), + }), + ); + } + async remove(key: string, options?: StorageOptions): Promise { + await this.offscreenDocumentService.withDocument( + [chrome.offscreen.Reason.LOCAL_STORAGE], + "backup storage of user data", + async () => + await BrowserApi.sendMessageWithResponse("localStorageRemove", { + key, + }), + ); + } +} diff --git a/apps/browser/src/platform/storage/port-messages.d.ts b/apps/browser/src/platform/storage/port-messages.d.ts new file mode 100644 index 00000000000..60817c98a4c --- /dev/null +++ b/apps/browser/src/platform/storage/port-messages.d.ts @@ -0,0 +1,20 @@ +import { + AbstractStorageService, + StorageUpdate, +} from "@bitwarden/common/platform/abstractions/storage.service"; + +type MemoryStoragePortMessage = { + id?: string; + key?: string; + /** + * We allow sending a string[] array since it is JSON safe and StorageUpdate since it's + * a simple object with just two properties that are strings. Everything else is expected to + * be JSON-ified. + */ + data: string | string[] | StorageUpdate; + originator: "foreground" | "background"; + action?: + | keyof Pick + | "subject_update" + | "initialization"; +}; diff --git a/apps/browser/src/platform/storage/port-name.ts b/apps/browser/src/platform/storage/port-name.ts new file mode 100644 index 00000000000..a0ece6a410a --- /dev/null +++ b/apps/browser/src/platform/storage/port-name.ts @@ -0,0 +1,12 @@ +export function portName(storageLocation: chrome.storage.StorageArea) { + switch (storageLocation) { + case chrome.storage.local: + return "local"; + case chrome.storage.sync: + return "sync"; + case chrome.storage.session: + return "session"; + default: + throw new Error("Unknown storage location"); + } +} diff --git a/apps/browser/src/platform/sync/foreground-sync.service.spec.ts b/apps/browser/src/platform/sync/foreground-sync.service.spec.ts new file mode 100644 index 00000000000..e1e921cc3a3 --- /dev/null +++ b/apps/browser/src/platform/sync/foreground-sync.service.spec.ts @@ -0,0 +1,136 @@ +import { mock } from "jest-mock-extended"; +import { Subject } from "rxjs"; + +import { CollectionService } from "@bitwarden/admin-console/common"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { MessageListener, MessageSender } from "@bitwarden/common/platform/messaging"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { FakeStateProvider, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { InternalSendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { UserId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; +import { InternalFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; + +import { DO_FULL_SYNC, ForegroundSyncService, FullSyncMessage } from "./foreground-sync.service"; +import { FullSyncFinishedMessage } from "./sync-service.listener"; + +describe("ForegroundSyncService", () => { + const userId = Utils.newGuid() as UserId; + const stateService = mock(); + const folderService = mock(); + const folderApiService = mock(); + const messageSender = mock(); + const logService = mock(); + const cipherService = mock(); + const collectionService = mock(); + const apiService = mock(); + const accountService = mock(); + const authService = mock(); + const sendService = mock(); + const sendApiService = mock(); + const messageListener = mock(); + const stateProvider = new FakeStateProvider(mockAccountServiceWith(userId)); + + const sut = new ForegroundSyncService( + stateService, + folderService, + folderApiService, + messageSender, + logService, + cipherService, + collectionService, + apiService, + accountService, + authService, + sendService, + sendApiService, + messageListener, + stateProvider, + ); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe("fullSync", () => { + const getAndAssertRequestId = (doFullSyncMessage: Omit) => { + expect(messageSender.send).toHaveBeenCalledWith( + DO_FULL_SYNC, + // We don't know the request id since that is created internally + expect.objectContaining(doFullSyncMessage), + ); + + const message = messageSender.send.mock.calls[0][1]; + + if (!("requestId" in message) || typeof message.requestId !== "string") { + throw new Error("requestId property of type string was expected on the sent message."); + } + + return message.requestId; + }; + + it("correctly relays a successful fullSync", async () => { + const messages = new Subject(); + messageListener.messages$.mockReturnValue(messages); + const fullSyncPromise = sut.fullSync(true, false); + expect(sut.syncInProgress).toBe(true); + + const requestId = getAndAssertRequestId({ forceSync: true, allowThrowOnError: false }); + + // Pretend the sync has finished + messages.next({ successfully: true, errorMessage: null, requestId: requestId }); + + const result = await fullSyncPromise; + + expect(sut.syncInProgress).toBe(false); + expect(result).toBe(true); + }); + + it("correctly relays an unsuccessful fullSync but does not throw if allowThrowOnError = false", async () => { + const messages = new Subject(); + messageListener.messages$.mockReturnValue(messages); + const fullSyncPromise = sut.fullSync(false, false); + expect(sut.syncInProgress).toBe(true); + + const requestId = getAndAssertRequestId({ forceSync: false, allowThrowOnError: false }); + + // Pretend the sync has finished + messages.next({ + successfully: false, + errorMessage: "Error while syncing", + requestId: requestId, + }); + + const result = await fullSyncPromise; + + expect(sut.syncInProgress).toBe(false); + expect(result).toBe(false); + }); + + it("correctly relays an unsuccessful fullSync but and will throw if allowThrowOnError = true", async () => { + const messages = new Subject(); + messageListener.messages$.mockReturnValue(messages); + const fullSyncPromise = sut.fullSync(true, true); + expect(sut.syncInProgress).toBe(true); + + const requestId = getAndAssertRequestId({ forceSync: true, allowThrowOnError: true }); + + // Pretend the sync has finished + messages.next({ + successfully: false, + errorMessage: "Error while syncing", + requestId: requestId, + }); + + await expect(fullSyncPromise).rejects.toThrow("Error while syncing"); + + expect(sut.syncInProgress).toBe(false); + }); + }); +}); diff --git a/apps/browser/src/platform/sync/foreground-sync.service.ts b/apps/browser/src/platform/sync/foreground-sync.service.ts new file mode 100644 index 00000000000..a6ed7281851 --- /dev/null +++ b/apps/browser/src/platform/sync/foreground-sync.service.ts @@ -0,0 +1,94 @@ +import { filter, firstValueFrom, of, timeout } from "rxjs"; + +import { CollectionService } from "@bitwarden/admin-console/common"; +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { + CommandDefinition, + MessageListener, + MessageSender, +} from "@bitwarden/common/platform/messaging"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { StateProvider } from "@bitwarden/common/platform/state"; +import { CoreSyncService } from "@bitwarden/common/platform/sync/internal"; +import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { InternalSendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; +import { InternalFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; + +import { FULL_SYNC_FINISHED } from "./sync-service.listener"; + +export type FullSyncMessage = { forceSync: boolean; allowThrowOnError: boolean; requestId: string }; + +export const DO_FULL_SYNC = new CommandDefinition("doFullSync"); + +export class ForegroundSyncService extends CoreSyncService { + constructor( + stateService: StateService, + folderService: InternalFolderService, + folderApiService: FolderApiServiceAbstraction, + messageSender: MessageSender, + logService: LogService, + cipherService: CipherService, + collectionService: CollectionService, + apiService: ApiService, + accountService: AccountService, + authService: AuthService, + sendService: InternalSendService, + sendApiService: SendApiService, + private readonly messageListener: MessageListener, + stateProvider: StateProvider, + ) { + super( + stateService, + folderService, + folderApiService, + messageSender, + logService, + cipherService, + collectionService, + apiService, + accountService, + authService, + sendService, + sendApiService, + stateProvider, + ); + } + + async fullSync(forceSync: boolean, allowThrowOnError: boolean = false): Promise { + this.syncInProgress = true; + try { + const requestId = Utils.newGuid(); + const syncCompletedPromise = firstValueFrom( + this.messageListener.messages$(FULL_SYNC_FINISHED).pipe( + filter((m) => m.requestId === requestId), + timeout({ + first: 30_000, + // If we haven't heard back in 30 seconds, just pretend we heard back about an unsuccesful sync. + with: () => { + this.logService.warning( + "ForegroundSyncService did not receive a message back in a reasonable time.", + ); + return of({ successfully: false, errorMessage: "Sync timed out." }); + }, + }), + ), + ); + this.messageSender.send(DO_FULL_SYNC, { forceSync, allowThrowOnError, requestId }); + const result = await syncCompletedPromise; + + if (allowThrowOnError && result.errorMessage != null) { + throw new Error(result.errorMessage); + } + + return result.successfully; + } finally { + this.syncInProgress = false; + } + } +} diff --git a/apps/browser/src/platform/sync/sync-service.listener.spec.ts b/apps/browser/src/platform/sync/sync-service.listener.spec.ts new file mode 100644 index 00000000000..51f97e9f879 --- /dev/null +++ b/apps/browser/src/platform/sync/sync-service.listener.spec.ts @@ -0,0 +1,60 @@ +import { mock } from "jest-mock-extended"; +import { Subject, firstValueFrom } from "rxjs"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { MessageListener, MessageSender } from "@bitwarden/common/platform/messaging"; +import { tagAsExternal } from "@bitwarden/common/platform/messaging/helpers"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; + +import { FullSyncMessage } from "./foreground-sync.service"; +import { FULL_SYNC_FINISHED, SyncServiceListener } from "./sync-service.listener"; + +describe("SyncServiceListener", () => { + const syncService = mock(); + const messageListener = mock(); + const messageSender = mock(); + const logService = mock(); + + const messages = new Subject(); + messageListener.messages$.mockReturnValue(messages.asObservable().pipe(tagAsExternal())); + const sut = new SyncServiceListener(syncService, messageListener, messageSender, logService); + + describe("listener$", () => { + it.each([true, false])( + "calls full sync and relays outcome when sync is [successfully = %s]", + async (value) => { + const listener = sut.listener$(); + const emissionPromise = firstValueFrom(listener); + + syncService.fullSync.mockResolvedValueOnce(value); + messages.next({ forceSync: true, allowThrowOnError: false, requestId: "1" }); + + await emissionPromise; + + expect(syncService.fullSync).toHaveBeenCalledWith(true, false); + expect(messageSender.send).toHaveBeenCalledWith(FULL_SYNC_FINISHED, { + successfully: value, + errorMessage: null, + requestId: "1", + }); + }, + ); + + it("calls full sync and relays error message through messaging", async () => { + const listener = sut.listener$(); + const emissionPromise = firstValueFrom(listener); + + syncService.fullSync.mockRejectedValueOnce(new Error("SyncError")); + messages.next({ forceSync: true, allowThrowOnError: false, requestId: "1" }); + + await emissionPromise; + + expect(syncService.fullSync).toHaveBeenCalledWith(true, false); + expect(messageSender.send).toHaveBeenCalledWith(FULL_SYNC_FINISHED, { + successfully: false, + errorMessage: "SyncError", + requestId: "1", + }); + }); + }); +}); diff --git a/apps/browser/src/platform/sync/sync-service.listener.ts b/apps/browser/src/platform/sync/sync-service.listener.ts new file mode 100644 index 00000000000..079edbf4c71 --- /dev/null +++ b/apps/browser/src/platform/sync/sync-service.listener.ts @@ -0,0 +1,58 @@ +import { Observable, concatMap, filter } from "rxjs"; + +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { + CommandDefinition, + MessageListener, + MessageSender, + isExternalMessage, +} from "@bitwarden/common/platform/messaging"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; + +import { DO_FULL_SYNC } from "./foreground-sync.service"; + +export type FullSyncFinishedMessage = { + successfully: boolean; + errorMessage: string; + requestId: string; +}; + +export const FULL_SYNC_FINISHED = new CommandDefinition( + "fullSyncFinished", +); + +export class SyncServiceListener { + constructor( + private readonly syncService: SyncService, + private readonly messageListener: MessageListener, + private readonly messageSender: MessageSender, + private readonly logService: LogService, + ) {} + + listener$(): Observable { + return this.messageListener.messages$(DO_FULL_SYNC).pipe( + filter((message) => isExternalMessage(message)), + concatMap(async ({ forceSync, allowThrowOnError, requestId }) => { + await this.doFullSync(forceSync, allowThrowOnError, requestId); + }), + ); + } + + private async doFullSync(forceSync: boolean, allowThrowOnError: boolean, requestId: string) { + try { + const result = await this.syncService.fullSync(forceSync, allowThrowOnError); + this.messageSender.send(FULL_SYNC_FINISHED, { + successfully: result, + errorMessage: null, + requestId, + }); + } catch (err) { + this.logService.warning("Error while doing full sync in SyncServiceListener", err); + this.messageSender.send(FULL_SYNC_FINISHED, { + successfully: false, + errorMessage: err?.message ?? "Unknown Sync Error", + requestId, + }); + } + } +} diff --git a/apps/browser/src/platform/utils/from-chrome-runtime-messaging.ts b/apps/browser/src/platform/utils/from-chrome-runtime-messaging.ts new file mode 100644 index 00000000000..ebc01ad86fa --- /dev/null +++ b/apps/browser/src/platform/utils/from-chrome-runtime-messaging.ts @@ -0,0 +1,27 @@ +import { map, share } from "rxjs"; + +import { Message } from "@bitwarden/common/platform/messaging"; +import { tagAsExternal } from "@bitwarden/common/platform/messaging/internal"; + +import { fromChromeEvent } from "../browser/from-chrome-event"; + +/** + * Creates an observable that listens to messages through `chrome.runtime.onMessage`. + * @returns An observable stream of messages. + */ +export const fromChromeRuntimeMessaging = () => { + return fromChromeEvent(chrome.runtime.onMessage).pipe( + map(([message, sender]) => { + message ??= {}; + + // Force the sender onto the message as long as we won't overwrite anything + if (!("webExtSender" in message)) { + message.webExtSender = sender; + } + + return message; + }), + tagAsExternal>>(), + share(), + ); +}; diff --git a/apps/browser/src/popup/app-routing.animations.ts b/apps/browser/src/popup/app-routing.animations.ts index 2304944acb0..061067c717e 100644 --- a/apps/browser/src/popup/app-routing.animations.ts +++ b/apps/browser/src/popup/app-routing.animations.ts @@ -5,7 +5,7 @@ const queryShown = query( [style({ position: "fixed", width: "100%", height: "100%" })], { optional: true, - } + }, ); // ref: https://github.com/angular/angular/issues/15477 @@ -20,7 +20,7 @@ export function queryTranslate( axis: string, from: number, to: number, - zIndex = 1000 + zIndex = 1000, ) { return query( ":" + direction, @@ -32,7 +32,7 @@ export function queryTranslate( }), animate(speed + " ease-in-out", style({ transform: "translate" + axis + "(" + to + "%)" })), ], - { optional: true } + { optional: true }, ); } @@ -132,6 +132,9 @@ export const routerTransition = trigger("routerTransition", [ transition("login-with-device => tabs, login-with-device => 2fa", inSlideLeft), transition("login-with-device => login", outSlideRight), + transition("admin-approval-requested => tabs, admin-approval-requested => 2fa", inSlideLeft), + transition("admin-approval-requested => login", outSlideRight), + transition(tabsToCiphers, inSlideLeft), transition(ciphersToTabs, outSlideRight), @@ -144,7 +147,7 @@ export const routerTransition = trigger("routerTransition", [ transition("view-cipher => edit-cipher, view-cipher => cipher-password-history", inSlideUp), transition( "edit-cipher => view-cipher, cipher-password-history => view-cipher, edit-cipher => tabs", - outSlideDown + outSlideDown, ), transition("view-cipher => clone-cipher", inSlideUp), @@ -161,11 +164,11 @@ export const routerTransition = trigger("routerTransition", [ transition( "add-cipher => generator, edit-cipher => generator, clone-cipher => generator", - inSlideUp + inSlideUp, ), transition( "generator => add-cipher, generator => edit-cipher, generator => clone-cipher", - outSlideDown + outSlideDown, ), transition("edit-cipher => attachments, edit-cipher => collections", inSlideLeft), @@ -174,31 +177,48 @@ export const routerTransition = trigger("routerTransition", [ transition("clone-cipher => attachments, clone-cipher => collections", inSlideLeft), transition("attachments => clone-cipher, collections => clone-cipher", outSlideRight), - transition("tabs => export", inSlideLeft), - transition("export => tabs", outSlideRight), + transition("tabs => account-security", inSlideLeft), + transition("account-security => tabs", outSlideRight), - transition("tabs => folders", inSlideLeft), - transition("folders => tabs", outSlideRight), + transition("tabs => assign-collections", inSlideLeft), + transition("assign-collections => tabs", outSlideRight), + + // Vault settings + transition("tabs => vault-settings", inSlideLeft), + transition("vault-settings => tabs", outSlideRight), + + transition("vault-settings => import", inSlideLeft), + transition("import => vault-settings", outSlideRight), + + transition("vault-settings => export", inSlideLeft), + transition("export => vault-settings", outSlideRight), + + transition("vault-settings => folders", inSlideLeft), + transition("folders => vault-settings", outSlideRight), transition("folders => edit-folder, folders => add-folder", inSlideUp), transition("edit-folder => folders, add-folder => folders", outSlideDown), - transition("tabs => sync", inSlideLeft), - transition("sync => tabs", outSlideRight), + transition("vault-settings => sync", inSlideLeft), + transition("sync => vault-settings", outSlideRight), - transition("tabs => excluded-domains", inSlideLeft), - transition("excluded-domains => tabs", outSlideRight), + transition("vault-settings => trash", inSlideLeft), + transition("trash => vault-settings", outSlideRight), - transition("tabs => options", inSlideLeft), - transition("options => tabs", outSlideRight), + transition("trash => view-cipher", inSlideLeft), + transition("view-cipher => trash", outSlideRight), + + // Appearance settings + transition("tabs => appearance", inSlideLeft), + transition("appearance => tabs", outSlideRight), transition("tabs => premium", inSlideLeft), transition("premium => tabs", outSlideRight), transition("tabs => lock", inSlideDown), - transition("tabs => help-and-feedback", inSlideLeft), - transition("help-and-feedback => tabs", outSlideRight), + transition("tabs => about", inSlideLeft), + transition("about => tabs", outSlideRight), transition("tabs => send-type", inSlideLeft), transition("send-type => tabs", outSlideRight), @@ -209,6 +229,18 @@ export const routerTransition = trigger("routerTransition", [ transition("tabs => edit-send, send-type => edit-send", inSlideUp), transition("edit-send => tabs, edit-send => send-type", outSlideDown), + // Notification settings + transition("tabs => notifications", inSlideLeft), + transition("notifications => tabs", outSlideRight), + + transition("notifications => excluded-domains", inSlideLeft), + transition("excluded-domains => notifications", outSlideRight), + transition("tabs => autofill", inSlideLeft), transition("autofill => tabs", outSlideRight), + + transition("* => account-switcher", inSlideUp), + transition("account-switcher => *", outSlideDown), + + transition("lock => *", outSlideDown), ]); diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 8ef51913f6d..ba8ab1e7aaf 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -2,35 +2,101 @@ import { Injectable, NgModule } from "@angular/core"; import { ActivatedRouteSnapshot, RouteReuseStrategy, RouterModule, Routes } from "@angular/router"; import { - redirectGuard, - AuthGuard, + EnvironmentSelectorComponent, + EnvironmentSelectorRouteData, + ExtensionDefaultOverlayPosition, +} from "@bitwarden/angular/auth/components/environment-selector.component"; +import { unauthUiRefreshRedirect } from "@bitwarden/angular/auth/functions/unauth-ui-refresh-redirect"; +import { unauthUiRefreshSwap } from "@bitwarden/angular/auth/functions/unauth-ui-refresh-route-swap"; +import { + authGuard, lockGuard, + redirectGuard, tdeDecryptionRequiredGuard, - UnauthGuard, + unauthGuardFn, } from "@bitwarden/angular/auth/guards"; -import { canAccessFeature } from "@bitwarden/angular/guard/feature-flag.guard"; +import { canAccessFeature } from "@bitwarden/angular/platform/guard/feature-flag.guard"; +import { extensionRefreshRedirect } from "@bitwarden/angular/utils/extension-refresh-redirect"; +import { extensionRefreshSwap } from "@bitwarden/angular/utils/extension-refresh-swap"; +import { + AnonLayoutWrapperComponent, + AnonLayoutWrapperData, + DevicesIcon, + LoginComponent, + LoginSecondaryContentComponent, + LockIcon, + LockV2Component, + LoginViaAuthRequestComponent, + PasswordHintComponent, + RegistrationFinishComponent, + RegistrationLockAltIcon, + RegistrationStartComponent, + RegistrationStartSecondaryComponent, + RegistrationStartSecondaryComponentData, + RegistrationUserAddIcon, + SetPasswordJitComponent, + UserLockIcon, + VaultIcon, +} from "@bitwarden/auth/angular"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { twofactorRefactorSwap } from "../../../../libs/angular/src/utils/two-factor-component-refactor-route-swap"; +import { fido2AuthGuard } from "../auth/guards/fido2-auth.guard"; +import { AccountSwitcherComponent } from "../auth/popup/account-switching/account-switcher.component"; import { EnvironmentComponent } from "../auth/popup/environment.component"; +import { + ExtensionAnonLayoutWrapperComponent, + ExtensionAnonLayoutWrapperData, +} from "../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component"; import { HintComponent } from "../auth/popup/hint.component"; import { HomeComponent } from "../auth/popup/home.component"; import { LockComponent } from "../auth/popup/lock.component"; import { LoginDecryptionOptionsComponent } from "../auth/popup/login-decryption-options/login-decryption-options.component"; -import { LoginWithDeviceComponent } from "../auth/popup/login-with-device.component"; -import { LoginComponent } from "../auth/popup/login.component"; +import { LoginComponentV1 } from "../auth/popup/login-v1.component"; +import { LoginViaAuthRequestComponentV1 } from "../auth/popup/login-via-auth-request-v1.component"; import { RegisterComponent } from "../auth/popup/register.component"; import { RemovePasswordComponent } from "../auth/popup/remove-password.component"; import { SetPasswordComponent } from "../auth/popup/set-password.component"; +import { AccountSecurityComponent as AccountSecurityV1Component } from "../auth/popup/settings/account-security-v1.component"; +import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; import { SsoComponent } from "../auth/popup/sso.component"; +import { TwoFactorAuthComponent } from "../auth/popup/two-factor-auth.component"; import { TwoFactorOptionsComponent } from "../auth/popup/two-factor-options.component"; import { TwoFactorComponent } from "../auth/popup/two-factor.component"; import { UpdateTempPasswordComponent } from "../auth/popup/update-temp-password.component"; +import { Fido2V1Component } from "../autofill/popup/fido2/fido2-v1.component"; +import { Fido2Component } from "../autofill/popup/fido2/fido2.component"; +import { AutofillV1Component } from "../autofill/popup/settings/autofill-v1.component"; +import { AutofillComponent } from "../autofill/popup/settings/autofill.component"; +import { ExcludedDomainsV1Component } from "../autofill/popup/settings/excluded-domains-v1.component"; +import { ExcludedDomainsComponent } from "../autofill/popup/settings/excluded-domains.component"; +import { NotificationsSettingsV1Component } from "../autofill/popup/settings/notifications-v1.component"; +import { NotificationsSettingsComponent } from "../autofill/popup/settings/notifications.component"; +import { PremiumV2Component } from "../billing/popup/settings/premium-v2.component"; +import { PremiumComponent } from "../billing/popup/settings/premium.component"; +import BrowserPopupUtils from "../platform/popup/browser-popup-utils"; +import { popupRouterCacheGuard } from "../platform/popup/view-cache/popup-router-cache.service"; +import { CredentialGeneratorHistoryComponent } from "../tools/popup/generator/credential-generator-history.component"; +import { CredentialGeneratorComponent } from "../tools/popup/generator/credential-generator.component"; import { GeneratorComponent } from "../tools/popup/generator/generator.component"; import { PasswordGeneratorHistoryComponent } from "../tools/popup/generator/password-generator-history.component"; import { SendAddEditComponent } from "../tools/popup/send/send-add-edit.component"; import { SendGroupingsComponent } from "../tools/popup/send/send-groupings.component"; import { SendTypeComponent } from "../tools/popup/send/send-type.component"; -import { ExportComponent } from "../tools/popup/settings/export.component"; +import { SendAddEditComponent as SendAddEditV2Component } from "../tools/popup/send-v2/add-edit/send-add-edit.component"; +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 { AboutPageComponent } from "../tools/popup/settings/about-page/about-page.component"; +import { MoreFromBitwardenPageV2Component } from "../tools/popup/settings/about-page/more-from-bitwarden-page-v2.component"; +import { MoreFromBitwardenPageComponent } from "../tools/popup/settings/about-page/more-from-bitwarden-page.component"; +import { ExportBrowserV2Component } from "../tools/popup/settings/export/export-browser-v2.component"; +import { ExportBrowserComponent } from "../tools/popup/settings/export/export-browser.component"; +import { ImportBrowserV2Component } from "../tools/popup/settings/import/import-browser-v2.component"; +import { ImportBrowserComponent } from "../tools/popup/settings/import/import-browser.component"; +import { SettingsV2Component } from "../tools/popup/settings/settings-v2.component"; +import { SettingsComponent } from "../tools/popup/settings/settings.component"; +import { clearVaultStateGuard } from "../vault/guards/clear-vault-state.guard"; import { AddEditComponent } from "../vault/popup/components/vault/add-edit.component"; import { AttachmentsComponent } from "../vault/popup/components/vault/attachments.component"; import { CollectionsComponent } from "../vault/popup/components/vault/collections.component"; @@ -39,26 +105,55 @@ import { PasswordHistoryComponent } from "../vault/popup/components/vault/passwo import { ShareComponent } from "../vault/popup/components/vault/share.component"; import { VaultFilterComponent } from "../vault/popup/components/vault/vault-filter.component"; import { VaultItemsComponent } from "../vault/popup/components/vault/vault-items.component"; +import { VaultV2Component } from "../vault/popup/components/vault/vault-v2.component"; import { ViewComponent } from "../vault/popup/components/vault/view.component"; +import { AddEditV2Component } from "../vault/popup/components/vault-v2/add-edit/add-edit-v2.component"; +import { AssignCollections } from "../vault/popup/components/vault-v2/assign-collections/assign-collections.component"; +import { AttachmentsV2Component } from "../vault/popup/components/vault-v2/attachments/attachments-v2.component"; +import { PasswordHistoryV2Component } from "../vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component"; +import { ViewV2Component } from "../vault/popup/components/vault-v2/view-v2/view-v2.component"; +import { AppearanceV2Component } from "../vault/popup/settings/appearance-v2.component"; +import { AppearanceComponent } from "../vault/popup/settings/appearance.component"; import { FolderAddEditComponent } from "../vault/popup/settings/folder-add-edit.component"; +import { FoldersV2Component } from "../vault/popup/settings/folders-v2.component"; +import { FoldersComponent } from "../vault/popup/settings/folders.component"; +import { SyncComponent } from "../vault/popup/settings/sync.component"; +import { TrashComponent } from "../vault/popup/settings/trash.component"; +import { VaultSettingsV2Component } from "../vault/popup/settings/vault-settings-v2.component"; +import { VaultSettingsComponent } from "../vault/popup/settings/vault-settings.component"; -import { DebounceNavigationService } from "./services/debounceNavigationService"; -import { AutofillComponent } from "./settings/autofill.component"; -import { ExcludedDomainsComponent } from "./settings/excluded-domains.component"; -import { FoldersComponent } from "./settings/folders.component"; -import { HelpAndFeedbackComponent } from "./settings/help-and-feedback.component"; -import { OptionsComponent } from "./settings/options.component"; -import { PremiumComponent } from "./settings/premium.component"; -import { SettingsComponent } from "./settings/settings.component"; -import { SyncComponent } from "./settings/sync.component"; +import { debounceNavigationGuard } from "./services/debounce-navigation.service"; +import { TabsV2Component } from "./tabs-v2.component"; import { TabsComponent } from "./tabs.component"; +/** + * Data properties acceptable for use in extension route objects + */ +export interface RouteDataProperties { + /** + * A state string which identifies the current route for the sake of transition animation logic. + * The state string is passed into [@routerTransition] in the app.component. + */ + state: string; + /** + * A boolean to indicate that the URL should not be saved in memory in the BrowserRouterSvc. + */ + doNotSaveUrl?: boolean; +} + +const unauthRouteOverrides = { + homepage: () => { + return BrowserPopupUtils.inPopout(window) ? "/tabs/vault" : "/tabs/current"; + }, +}; + const routes: Routes = [ { path: "", pathMatch: "full", children: [], // Children lets us have an empty component. canActivate: [ + popupRouterCacheGuard, redirectGuard({ loggedIn: "/tabs/current", loggedOut: "/home", locked: "/lock" }), ], }, @@ -70,244 +165,479 @@ const routes: Routes = [ { path: "home", component: HomeComponent, - canActivate: [UnauthGuard], - data: { state: "home" }, - }, - { - path: "login", - component: LoginComponent, - canActivate: [UnauthGuard], - data: { state: "login" }, - }, - { - path: "login-with-device", - component: LoginWithDeviceComponent, - canActivate: [], - data: { state: "login-with-device" }, - }, - { - path: "admin-approval-requested", - component: LoginWithDeviceComponent, - canActivate: [], - data: { state: "login-with-device" }, + canActivate: [unauthGuardFn(unauthRouteOverrides), unauthUiRefreshRedirect("/login")], + data: { state: "home" } satisfies RouteDataProperties, }, + ...extensionRefreshSwap(Fido2V1Component, Fido2Component, { + path: "fido2", + canActivate: [fido2AuthGuard], + data: { state: "fido2" } satisfies RouteDataProperties, + }), { path: "lock", component: LockComponent, canActivate: [lockGuard()], - data: { state: "lock" }, - }, - { - path: "2fa", - component: TwoFactorComponent, - canActivate: [UnauthGuard], - data: { state: "2fa" }, + canMatch: [extensionRefreshRedirect("/lockV2")], + data: { state: "lock", doNotSaveUrl: true } satisfies RouteDataProperties, }, + ...twofactorRefactorSwap( + TwoFactorComponent, + AnonLayoutWrapperComponent, + { + path: "2fa", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { state: "2fa" } satisfies RouteDataProperties, + }, + { + path: "2fa", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { state: "2fa" } satisfies RouteDataProperties, + children: [ + { + path: "", + component: TwoFactorAuthComponent, + }, + ], + }, + ), { path: "2fa-options", component: TwoFactorOptionsComponent, - canActivate: [UnauthGuard], - data: { state: "2fa-options" }, + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { state: "2fa-options" } satisfies RouteDataProperties, }, { path: "login-initiated", component: LoginDecryptionOptionsComponent, - canActivate: [ - tdeDecryptionRequiredGuard(), - canAccessFeature(FeatureFlag.TrustedDeviceEncryption), - ], + canActivate: [tdeDecryptionRequiredGuard()], + data: { state: "login-initiated" } satisfies RouteDataProperties, }, { path: "sso", component: SsoComponent, - canActivate: [UnauthGuard], - data: { state: "sso" }, + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { state: "sso" } satisfies RouteDataProperties, }, { path: "set-password", component: SetPasswordComponent, - data: { state: "set-password" }, + data: { state: "set-password" } satisfies RouteDataProperties, }, { path: "remove-password", component: RemovePasswordComponent, - canActivate: [AuthGuard], - data: { state: "remove-password" }, + canActivate: [authGuard], + data: { state: "remove-password" } satisfies RouteDataProperties, }, { path: "register", component: RegisterComponent, - canActivate: [UnauthGuard], - data: { state: "register" }, - }, - { - path: "hint", - component: HintComponent, - canActivate: [UnauthGuard], - data: { state: "hint" }, + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { state: "register" } satisfies RouteDataProperties, }, { path: "environment", component: EnvironmentComponent, - canActivate: [UnauthGuard], - data: { state: "environment" }, + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { state: "environment" } satisfies RouteDataProperties, }, { path: "ciphers", component: VaultItemsComponent, - canActivate: [AuthGuard], - data: { state: "ciphers" }, + canActivate: [authGuard], + data: { state: "ciphers" } satisfies RouteDataProperties, }, - { + ...extensionRefreshSwap(ViewComponent, ViewV2Component, { path: "view-cipher", - component: ViewComponent, - canActivate: [AuthGuard], - data: { state: "view-cipher" }, - }, - { + canActivate: [authGuard], + data: { state: "view-cipher" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(PasswordHistoryComponent, PasswordHistoryV2Component, { path: "cipher-password-history", - component: PasswordHistoryComponent, - canActivate: [AuthGuard], - data: { state: "cipher-password-history" }, - }, - { + canActivate: [authGuard], + data: { state: "cipher-password-history" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(AddEditComponent, AddEditV2Component, { path: "add-cipher", - component: AddEditComponent, - canActivate: [AuthGuard, DebounceNavigationService], - data: { state: "add-cipher" }, + canActivate: [authGuard, debounceNavigationGuard()], + data: { state: "add-cipher" } satisfies RouteDataProperties, runGuardsAndResolvers: "always", - }, - { + }), + ...extensionRefreshSwap(AddEditComponent, AddEditV2Component, { path: "edit-cipher", - component: AddEditComponent, - canActivate: [AuthGuard, DebounceNavigationService], - data: { state: "edit-cipher" }, + canActivate: [authGuard, debounceNavigationGuard()], + data: { state: "edit-cipher" } satisfies RouteDataProperties, runGuardsAndResolvers: "always", - }, + }), { path: "share-cipher", component: ShareComponent, - canActivate: [AuthGuard], - data: { state: "share-cipher" }, + canActivate: [authGuard], + data: { state: "share-cipher" } satisfies RouteDataProperties, }, { path: "collections", component: CollectionsComponent, - canActivate: [AuthGuard], - data: { state: "collections" }, + canActivate: [authGuard], + data: { state: "collections" } satisfies RouteDataProperties, }, - { + ...extensionRefreshSwap(AttachmentsComponent, AttachmentsV2Component, { path: "attachments", - component: AttachmentsComponent, - canActivate: [AuthGuard], - data: { state: "attachments" }, - }, + canActivate: [authGuard], + data: { state: "attachments" } satisfies RouteDataProperties, + }), { path: "generator", component: GeneratorComponent, - canActivate: [AuthGuard], - data: { state: "generator" }, + canActivate: [authGuard], + data: { state: "generator" } satisfies RouteDataProperties, }, - { + ...extensionRefreshSwap(PasswordGeneratorHistoryComponent, CredentialGeneratorHistoryComponent, { path: "generator-history", - component: PasswordGeneratorHistoryComponent, - canActivate: [AuthGuard], - data: { state: "generator-history" }, - }, - { + canActivate: [authGuard], + data: { state: "generator-history" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(ImportBrowserComponent, ImportBrowserV2Component, { + path: "import", + canActivate: [authGuard], + data: { state: "import" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(ExportBrowserComponent, ExportBrowserV2Component, { path: "export", - component: ExportComponent, - canActivate: [AuthGuard], - data: { state: "export" }, - }, - { + canActivate: [authGuard], + data: { state: "export" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(AutofillV1Component, AutofillComponent, { path: "autofill", - component: AutofillComponent, - canActivate: [AuthGuard], - data: { state: "autofill" }, - }, - { + canActivate: [authGuard], + data: { state: "autofill" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(AccountSecurityV1Component, AccountSecurityComponent, { + path: "account-security", + canActivate: [authGuard], + data: { state: "account-security" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(NotificationsSettingsV1Component, NotificationsSettingsComponent, { + path: "notifications", + canActivate: [authGuard], + data: { state: "notifications" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(VaultSettingsComponent, VaultSettingsV2Component, { + path: "vault-settings", + canActivate: [authGuard], + data: { state: "vault-settings" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(FoldersComponent, FoldersV2Component, { path: "folders", - component: FoldersComponent, - canActivate: [AuthGuard], - data: { state: "folders" }, - }, + canActivate: [authGuard], + data: { state: "folders" } satisfies RouteDataProperties, + }), { path: "add-folder", component: FolderAddEditComponent, - canActivate: [AuthGuard], - data: { state: "add-folder" }, + canActivate: [authGuard], + data: { state: "add-folder" } satisfies RouteDataProperties, }, { path: "edit-folder", component: FolderAddEditComponent, - canActivate: [AuthGuard], - data: { state: "edit-folder" }, + canActivate: [authGuard], + data: { state: "edit-folder" } satisfies RouteDataProperties, }, { path: "sync", component: SyncComponent, - canActivate: [AuthGuard], - data: { state: "sync" }, + canActivate: [authGuard], + data: { state: "sync" } satisfies RouteDataProperties, }, - { + ...extensionRefreshSwap(ExcludedDomainsV1Component, ExcludedDomainsComponent, { path: "excluded-domains", - component: ExcludedDomainsComponent, - canActivate: [AuthGuard], - data: { state: "excluded-domains" }, - }, - { + canActivate: [authGuard], + data: { state: "excluded-domains" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(PremiumComponent, PremiumV2Component, { path: "premium", component: PremiumComponent, - canActivate: [AuthGuard], - data: { state: "premium" }, - }, - { - path: "options", - component: OptionsComponent, - canActivate: [AuthGuard], - data: { state: "options" }, - }, - { + canActivate: [authGuard], + data: { state: "premium" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(AppearanceComponent, AppearanceV2Component, { + path: "appearance", + canActivate: [authGuard], + data: { state: "appearance" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(AddEditComponent, AddEditV2Component, { path: "clone-cipher", - component: AddEditComponent, - canActivate: [AuthGuard], - data: { state: "clone-cipher" }, - }, + canActivate: [authGuard], + data: { state: "clone-cipher" } satisfies RouteDataProperties, + }), { path: "send-type", component: SendTypeComponent, - canActivate: [AuthGuard], - data: { state: "send-type" }, + canActivate: [authGuard], + data: { state: "send-type" } satisfies RouteDataProperties, }, - { + ...extensionRefreshSwap(SendAddEditComponent, SendAddEditV2Component, { path: "add-send", - component: SendAddEditComponent, - canActivate: [AuthGuard], - data: { state: "add-send" }, - }, - { + canActivate: [authGuard], + data: { state: "add-send" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(SendAddEditComponent, SendAddEditV2Component, { path: "edit-send", - component: SendAddEditComponent, - canActivate: [AuthGuard], - data: { state: "edit-send" }, + canActivate: [authGuard], + data: { state: "edit-send" } satisfies RouteDataProperties, + }), + { + path: "send-created", + component: SendCreatedComponent, + canActivate: [authGuard], + data: { state: "send" } satisfies RouteDataProperties, }, { path: "update-temp-password", component: UpdateTempPasswordComponent, - canActivate: [AuthGuard], - data: { state: "update-temp-password" }, + canActivate: [authGuard], + data: { state: "update-temp-password" } satisfies RouteDataProperties, + }, + ...unauthUiRefreshSwap( + LoginViaAuthRequestComponentV1, + ExtensionAnonLayoutWrapperComponent, + { + path: "login-with-device", + data: { state: "login-with-device" } satisfies RouteDataProperties, + }, + { + path: "login-with-device", + data: { + pageIcon: DevicesIcon, + pageTitle: { + key: "loginInitiated", + }, + pageSubtitle: { + key: "aNotificationWasSentToYourDevice", + }, + showLogo: false, + showBackButton: true, + state: "login-with-device", + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { path: "", component: LoginViaAuthRequestComponent }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + }, + ], + }, + ), + ...unauthUiRefreshSwap( + LoginViaAuthRequestComponentV1, + ExtensionAnonLayoutWrapperComponent, + { + path: "admin-approval-requested", + data: { state: "admin-approval-requested" } satisfies RouteDataProperties, + }, + { + path: "admin-approval-requested", + data: { + pageIcon: DevicesIcon, + pageTitle: { + key: "adminApprovalRequested", + }, + pageSubtitle: { + key: "adminApprovalRequestSentToAdmins", + }, + showLogo: false, + showBackButton: true, + state: "admin-approval-requested", + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [{ path: "", component: LoginViaAuthRequestComponent }], + }, + ), + ...unauthUiRefreshSwap( + HintComponent, + ExtensionAnonLayoutWrapperComponent, + { + path: "hint", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { + state: "hint", + } satisfies RouteDataProperties, + }, + { + path: "", + children: [ + { + path: "hint", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { + pageTitle: { + key: "requestPasswordHint", + }, + pageSubtitle: { + key: "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou", + }, + pageIcon: UserLockIcon, + showBackButton: true, + state: "hint", + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { path: "", component: PasswordHintComponent }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + data: { + overlayPosition: ExtensionDefaultOverlayPosition, + } satisfies EnvironmentSelectorRouteData, + }, + ], + }, + ], + }, + ), + ...unauthUiRefreshSwap( + LoginComponentV1, + ExtensionAnonLayoutWrapperComponent, + { + path: "login", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { state: "login" }, + }, + { + path: "", + children: [ + { + path: "login", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { + pageIcon: VaultIcon, + pageTitle: { + key: "logInToBitwarden", + }, + state: "login", + showAcctSwitcher: true, + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { path: "", component: LoginComponent }, + { path: "", component: LoginSecondaryContentComponent, outlet: "secondary" }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + data: { + overlayPosition: ExtensionDefaultOverlayPosition, + } satisfies EnvironmentSelectorRouteData, + }, + ], + }, + ], + }, + ), + { + path: "", + component: ExtensionAnonLayoutWrapperComponent, + children: [ + { + path: "signup", + canActivate: [canAccessFeature(FeatureFlag.EmailVerification), unauthGuardFn()], + data: { + state: "signup", + pageIcon: RegistrationUserAddIcon, + pageTitle: { + key: "createAccount", + }, + showBackButton: true, + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { + path: "", + component: RegistrationStartComponent, + }, + { + path: "", + component: RegistrationStartSecondaryComponent, + outlet: "secondary", + data: { + loginRoute: "/home", + } satisfies RegistrationStartSecondaryComponentData, + }, + ], + }, + { + path: "finish-signup", + canActivate: [canAccessFeature(FeatureFlag.EmailVerification), unauthGuardFn()], + data: { + pageIcon: RegistrationLockAltIcon, + state: "finish-signup", + showBackButton: true, + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { + path: "", + component: RegistrationFinishComponent, + }, + ], + }, + { + path: "lockV2", + canActivate: [canAccessFeature(FeatureFlag.ExtensionRefresh), lockGuard()], + data: { + pageIcon: LockIcon, + pageTitle: { + key: "yourVaultIsLockedV2", + }, + showReadonlyHostname: true, + showAcctSwitcher: true, + } satisfies ExtensionAnonLayoutWrapperData, + children: [ + { + path: "", + component: LockV2Component, + }, + ], + }, + ], }, { - path: "help-and-feedback", - component: HelpAndFeedbackComponent, - canActivate: [AuthGuard], - data: { state: "help-and-feedback" }, + path: "", + component: AnonLayoutWrapperComponent, + children: [ + { + path: "set-password-jit", + canActivate: [canAccessFeature(FeatureFlag.EmailVerification)], + component: SetPasswordJitComponent, + data: { + pageTitle: { + key: "joinOrganization", + }, + pageSubtitle: { + key: "finishJoiningThisOrganizationBySettingAMasterPassword", + }, + state: "set-password-jit", + } satisfies RouteDataProperties & AnonLayoutWrapperData, + }, + ], }, { + path: "assign-collections", + component: AssignCollections, + canActivate: [canAccessFeature(FeatureFlag.ExtensionRefresh, true, "/")], + data: { state: "assign-collections" } satisfies RouteDataProperties, + }, + ...extensionRefreshSwap(AboutPageComponent, AboutPageV2Component, { + path: "about", + canActivate: [authGuard], + data: { state: "about" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(MoreFromBitwardenPageComponent, MoreFromBitwardenPageV2Component, { + path: "more-from-bitwarden", + canActivate: [authGuard], + data: { state: "moreFromBitwarden" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(TabsComponent, TabsV2Component, { path: "tabs", - component: TabsComponent, - data: { state: "tabs" }, + data: { state: "tabs" } satisfies RouteDataProperties, children: [ { path: "", @@ -317,35 +647,44 @@ const routes: Routes = [ { path: "current", component: CurrentTabComponent, - canActivate: [AuthGuard], - data: { state: "tabs_current" }, + canActivate: [authGuard], + canMatch: [extensionRefreshRedirect("/tabs/vault")], + data: { state: "tabs_current" } satisfies RouteDataProperties, runGuardsAndResolvers: "always", }, - { + ...extensionRefreshSwap(VaultFilterComponent, VaultV2Component, { path: "vault", - component: VaultFilterComponent, - canActivate: [AuthGuard], - data: { state: "tabs_vault" }, - }, - { + canActivate: [authGuard], + canDeactivate: [clearVaultStateGuard], + data: { state: "tabs_vault" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(GeneratorComponent, CredentialGeneratorComponent, { path: "generator", - component: GeneratorComponent, - canActivate: [AuthGuard], - data: { state: "tabs_generator" }, - }, - { + canActivate: [authGuard], + data: { state: "tabs_generator" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(SettingsComponent, SettingsV2Component, { path: "settings", - component: SettingsComponent, - canActivate: [AuthGuard], - data: { state: "tabs_settings" }, - }, - { + canActivate: [authGuard], + data: { state: "tabs_settings" } satisfies RouteDataProperties, + }), + ...extensionRefreshSwap(SendGroupingsComponent, SendV2Component, { path: "send", - component: SendGroupingsComponent, - canActivate: [AuthGuard], - data: { state: "tabs_send" }, - }, + canActivate: [authGuard], + data: { state: "tabs_send" } satisfies RouteDataProperties, + }), ], + }), + { + path: "account-switcher", + component: AccountSwitcherComponent, + data: { state: "account-switcher", doNotSaveUrl: true } satisfies RouteDataProperties, + }, + { + path: "trash", + component: TrashComponent, + canActivate: [authGuard], + data: { state: "trash" } satisfies RouteDataProperties, }, ]; diff --git a/apps/browser/src/popup/app.component.ts b/apps/browser/src/popup/app.component.ts index 93f824a7dd1..c23da5ca7ce 100644 --- a/apps/browser/src/popup/app.component.ts +++ b/apps/browser/src/popup/app.component.ts @@ -1,25 +1,34 @@ -import { - ChangeDetectorRef, - Component, - NgZone, - OnDestroy, - OnInit, - SecurityContext, -} from "@angular/core"; -import { DomSanitizer } from "@angular/platform-browser"; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit, inject } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { NavigationEnd, Router, RouterOutlet } from "@angular/router"; -import { IndividualConfig, ToastrService } from "ngx-toastr"; -import { filter, concatMap, Subject, takeUntil, firstValueFrom } from "rxjs"; +import { Subject, takeUntil, firstValueFrom, concatMap, filter, tap } from "rxjs"; +import { LogoutReason } from "@bitwarden/auth/common"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { AnimationControlService } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { DialogService, SimpleDialogOptions } from "@bitwarden/components"; +import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { MessageListener } from "@bitwarden/common/platform/messaging"; +import { UserId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { + DialogService, + SimpleDialogOptions, + ToastOptions, + ToastService, +} from "@bitwarden/components"; -import { BrowserApi } from "../platform/browser/browser-api"; -import { BrowserStateService } from "../platform/services/abstractions/browser-state.service"; +import { flagEnabled } from "../platform/flags"; +import { PopupCompactModeService } from "../platform/popup/layout/popup-compact-mode.service"; +import { PopupViewCacheService } from "../platform/popup/view-cache/popup-view-cache.service"; +import { initPopupClosedListener } from "../platform/services/popup-view-cache-background.service"; +import { BrowserSendStateService } from "../tools/popup/services/browser-send-state.service"; +import { VaultBrowserStateService } from "../vault/services/vault-browser-state.service"; import { routerTransition } from "./app-routing.animations"; import { DesktopSyncVerificationDialogComponent } from "./components/desktop-sync-verification-dialog.component"; @@ -33,42 +42,79 @@ import { DesktopSyncVerificationDialogComponent } from "./components/desktop-syn
`, }) export class AppComponent implements OnInit, OnDestroy { - private lastActivity: number = null; - private activeUserId: string; + private viewCacheService = inject(PopupViewCacheService); + private compactModeService = inject(PopupCompactModeService); + + private lastActivity: Date; + private activeUserId: UserId; + private recordActivitySubject = new Subject(); + private routerAnimations = false; private destroy$ = new Subject(); constructor( - private toastrService: ToastrService, - private broadcasterService: BroadcasterService, private authService: AuthService, private i18nService: I18nService, private router: Router, - private stateService: BrowserStateService, - private messagingService: MessagingService, + private stateService: StateService, + private browserSendStateService: BrowserSendStateService, + private vaultBrowserStateService: VaultBrowserStateService, + private cipherService: CipherService, private changeDetectorRef: ChangeDetectorRef, private ngZone: NgZone, - private sanitizer: DomSanitizer, private platformUtilsService: PlatformUtilsService, - private dialogService: DialogService - ) {} + private dialogService: DialogService, + private messageListener: MessageListener, + private toastService: ToastService, + private accountService: AccountService, + private animationControlService: AnimationControlService, + private logService: LogService, + private sdkService: SdkService, + ) { + if (flagEnabled("sdk")) { + // Warn if the SDK for some reason can't be initialized + this.sdkService.supported$.pipe(takeUntilDestroyed()).subscribe({ + next: (supported) => { + if (!supported) { + this.logService.debug("SDK is not supported"); + this.sdkService + .failedToInitialize("popup", undefined) + .catch((e) => this.logService.error(e)); + } else { + this.logService.debug("SDK is supported"); + } + }, + error: (e: unknown) => { + this.sdkService + .failedToInitialize("popup", e as Error) + .catch((e) => this.logService.error(e)); + this.logService.error(e); + }, + }); + } + } async ngOnInit() { + initPopupClosedListener(); + await this.viewCacheService.init(); + + this.compactModeService.init(); + // 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 await this.clearComponentStates(); - this.stateService.activeAccount$.pipe(takeUntil(this.destroy$)).subscribe((userId) => { - this.activeUserId = userId; + this.accountService.activeAccount$.pipe(takeUntil(this.destroy$)).subscribe((account) => { + this.activeUserId = account?.id; }); - this.stateService.activeAccountUnlocked$ + this.authService.activeAccountStatus$ .pipe( - filter((unlocked) => unlocked), + filter((status) => status === AuthenticationStatus.Unlocked), concatMap(async () => { await this.recordActivity(); }), - takeUntil(this.destroy$) + takeUntil(this.destroy$), ) .subscribe(); @@ -80,60 +126,62 @@ export class AppComponent implements OnInit, OnDestroy { window.onkeypress = () => this.recordActivity(); }); - (window as any).bitwardenPopupMainMessageListener = async ( - msg: any, - sender: any, - sendResponse: any - ) => { - if (msg.command === "doneLoggingOut") { - this.authService.logOut(async () => { - if (msg.expired) { - this.showToast({ - type: "warning", - title: this.i18nService.t("loggedOut"), - text: this.i18nService.t("loginExpired"), + this.messageListener.allMessages$ + .pipe( + tap((msg: any) => { + if (msg.command === "doneLoggingOut") { + // TODO: PM-8544 - why do we call logout in the popup after receiving the doneLoggingOut message? Hasn't this already completeted logout? + this.authService.logOut(async () => { + if (msg.logoutReason) { + await this.displayLogoutReason(msg.logoutReason); + } }); - } - - if (this.activeUserId === null) { + this.changeDetectorRef.detectChanges(); + } else if (msg.command === "authBlocked" || msg.command === "goHome") { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.router.navigate(["home"]); + } else if ( + msg.command === "locked" && + (msg.userId == null || msg.userId == this.activeUserId) + ) { + // 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(["lock"]); + } else if (msg.command === "showDialog") { + // 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.showDialog(msg); + } else if (msg.command === "showNativeMessagingFinterprintDialog") { + // TODO: Should be refactored to live in another service. + // 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.showNativeMessagingFingerprintDialog(msg); + } else if (msg.command === "showToast") { + this.toastService._showToast(msg); + } else if (msg.command === "reloadProcess") { + if (this.platformUtilsService.isSafari()) { + window.setTimeout(() => { + window.location.reload(); + }, 2000); + } + } else if (msg.command === "reloadPopup") { + // 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(["/"]); + } else if (msg.command === "convertAccountToKeyConnector") { + // 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"]); } - }); - this.changeDetectorRef.detectChanges(); - } else if (msg.command === "authBlocked") { - this.router.navigate(["home"]); - } else if (msg.command === "locked") { - if (msg.userId == null || msg.userId === (await this.stateService.getUserId())) { - this.router.navigate(["lock"]); - } - } else if (msg.command === "showDialog") { - await this.ngZone.run(() => this.showDialog(msg)); - } else if (msg.command === "showNativeMessagingFinterprintDialog") { - // TODO: Should be refactored to live in another service. - await this.ngZone.run(() => this.showNativeMessagingFingerprintDialog(msg)); - } else if (msg.command === "showToast") { - this.showToast(msg); - } else if (msg.command === "reloadProcess") { - const forceWindowReload = - this.platformUtilsService.isSafari() || - this.platformUtilsService.isFirefox() || - this.platformUtilsService.isOpera(); - // Wait to make sure background has reloaded first. - window.setTimeout( - () => BrowserApi.reloadExtension(forceWindowReload ? window : null), - 2000 - ); - } else if (msg.command === "reloadPopup") { - this.router.navigate(["/"]); - } else if (msg.command === "convertAccountToKeyConnector") { - this.router.navigate(["/remove-password"]); - } else { - msg.webExtSender = sender; - this.broadcasterService.send(msg); - } - }; - - BrowserApi.messageListener("app.component", (window as any).bitwardenPopupMainMessageListener); + }), + takeUntil(this.destroy$), + ) + .subscribe(); // eslint-disable-next-line rxjs/no-async-subscribe this.router.events.pipe(takeUntil(this.destroy$)).subscribe(async (event) => { @@ -147,7 +195,7 @@ export class AppComponent implements OnInit, OnDestroy { await this.clearComponentStates(); } if (url.startsWith("/tabs/")) { - await this.stateService.setAddEditCipherInfo(null); + await this.cipherService.setAddEditCipherInfo(null); } (window as any).previousPopupUrl = url; @@ -159,6 +207,12 @@ export class AppComponent implements OnInit, OnDestroy { } } }); + + this.animationControlService.enableRoutingAnimation$ + .pipe(takeUntil(this.destroy$)) + .subscribe((state) => { + this.routerAnimations = state; + }); } ngOnDestroy(): void { @@ -167,7 +221,9 @@ export class AppComponent implements OnInit, OnDestroy { } getState(outlet: RouterOutlet) { - if (outlet.activatedRouteData.state === "ciphers") { + if (!this.routerAnimations) { + return; + } else if (outlet.activatedRouteData.state === "ciphers") { const routeDirection = (window as any).routeDirection != null ? (window as any).routeDirection : ""; return ( @@ -188,41 +244,17 @@ export class AppComponent implements OnInit, OnDestroy { return; } - const now = new Date().getTime(); - if (this.lastActivity != null && now - this.lastActivity < 250) { + const now = new Date(); + if (this.lastActivity != null && now.getTime() - this.lastActivity.getTime() < 250) { return; } this.lastActivity = now; - await this.stateService.setLastActive(now, { userId: this.activeUserId }); + await this.accountService.setAccountActivity(this.activeUserId, now); } private showToast(msg: any) { - let message = ""; - - const options: Partial = {}; - - if (typeof msg.text === "string") { - message = msg.text; - } else if (msg.text.length === 1) { - message = msg.text[0]; - } else { - msg.text.forEach( - (t: string) => - (message += "

" + this.sanitizer.sanitize(SecurityContext.HTML, t) + "

") - ); - options.enableHtml = true; - } - if (msg.options != null) { - if (msg.options.trustedHtml === true) { - options.enableHtml = true; - } - if (msg.options.timeout != null && msg.options.timeout > 0) { - options.timeOut = msg.options.timeout; - } - } - - this.toastrService.show(message, msg.title, options, "toast-" + msg.type); + this.platformUtilsService.showToast(msg.type, msg.title, msg.text, msg.options); } private async showDialog(msg: SimpleDialogOptions) { @@ -243,10 +275,34 @@ export class AppComponent implements OnInit, OnDestroy { } await Promise.all([ - this.stateService.setBrowserGroupingComponentState(null), - this.stateService.setBrowserVaultItemsComponentState(null), - this.stateService.setBrowserSendComponentState(null), - this.stateService.setBrowserSendTypeComponentState(null), + this.vaultBrowserStateService.setBrowserGroupingsComponentState(null), + this.vaultBrowserStateService.setBrowserVaultItemsComponentState(null), + this.browserSendStateService.setBrowserSendComponentState(null), + this.browserSendStateService.setBrowserSendTypeComponentState(null), ]); } + + // Displaying toasts isn't super useful on the popup due to the reloads we do. + // However, it is visible for a moment on the FF sidebar logout. + private async displayLogoutReason(logoutReason: LogoutReason) { + let toastOptions: ToastOptions | null = null; + switch (logoutReason) { + case "invalidSecurityStamp": + case "sessionExpired": { + toastOptions = { + variant: "warning", + title: this.i18nService.t("loggedOut"), + message: this.i18nService.t("loginExpired"), + }; + break; + } + } + + if (toastOptions == null) { + // We don't have anything to show for this particular reason + return; + } + + this.toastService.showToast(toastOptions); + } } diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index 32eb7670f3c..d6e46de6ba0 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -11,35 +11,61 @@ import { BrowserModule } from "@angular/platform-browser"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components/environment-selector.component"; -import { BitwardenToastModule } from "@bitwarden/angular/components/toastr.component"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { ColorPasswordCountPipe } from "@bitwarden/angular/pipes/color-password-count.pipe"; import { ColorPasswordPipe } from "@bitwarden/angular/pipes/color-password.pipe"; +import { UserVerificationDialogComponent } from "@bitwarden/auth/angular"; +import { AvatarModule, ButtonModule, FormFieldModule, ToastModule } from "@bitwarden/components"; +import { AccountComponent } from "../auth/popup/account-switching/account.component"; +import { CurrentAccountComponent } from "../auth/popup/account-switching/current-account.component"; import { EnvironmentComponent } from "../auth/popup/environment.component"; +import { ExtensionAnonLayoutWrapperComponent } from "../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component"; import { HintComponent } from "../auth/popup/hint.component"; import { HomeComponent } from "../auth/popup/home.component"; import { LockComponent } from "../auth/popup/lock.component"; import { LoginDecryptionOptionsComponent } from "../auth/popup/login-decryption-options/login-decryption-options.component"; -import { LoginWithDeviceComponent } from "../auth/popup/login-with-device.component"; -import { LoginComponent } from "../auth/popup/login.component"; +import { LoginComponentV1 } from "../auth/popup/login-v1.component"; +import { LoginViaAuthRequestComponentV1 } from "../auth/popup/login-via-auth-request-v1.component"; import { RegisterComponent } from "../auth/popup/register.component"; import { RemovePasswordComponent } from "../auth/popup/remove-password.component"; import { SetPasswordComponent } from "../auth/popup/set-password.component"; +import { AccountSecurityComponent as AccountSecurityComponentV1 } from "../auth/popup/settings/account-security-v1.component"; +import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; +import { VaultTimeoutInputComponent } from "../auth/popup/settings/vault-timeout-input.component"; import { SsoComponent } from "../auth/popup/sso.component"; import { TwoFactorOptionsComponent } from "../auth/popup/two-factor-options.component"; import { TwoFactorComponent } from "../auth/popup/two-factor.component"; import { UpdateTempPasswordComponent } from "../auth/popup/update-temp-password.component"; +import { Fido2CipherRowV1Component } from "../autofill/popup/fido2/fido2-cipher-row-v1.component"; +import { Fido2CipherRowComponent } from "../autofill/popup/fido2/fido2-cipher-row.component"; +import { Fido2UseBrowserLinkV1Component } from "../autofill/popup/fido2/fido2-use-browser-link-v1.component"; +import { Fido2UseBrowserLinkComponent } from "../autofill/popup/fido2/fido2-use-browser-link.component"; +import { Fido2V1Component } from "../autofill/popup/fido2/fido2-v1.component"; +import { Fido2Component } from "../autofill/popup/fido2/fido2.component"; +import { AutofillV1Component } from "../autofill/popup/settings/autofill-v1.component"; +import { AutofillComponent } from "../autofill/popup/settings/autofill.component"; +import { ExcludedDomainsV1Component } from "../autofill/popup/settings/excluded-domains-v1.component"; +import { ExcludedDomainsComponent } from "../autofill/popup/settings/excluded-domains.component"; +import { NotificationsSettingsV1Component } from "../autofill/popup/settings/notifications-v1.component"; +import { NotificationsSettingsComponent } from "../autofill/popup/settings/notifications.component"; +import { PremiumComponent } from "../billing/popup/settings/premium.component"; +import { PopOutComponent } from "../platform/popup/components/pop-out.component"; +import { HeaderComponent } from "../platform/popup/header.component"; +import { PopupFooterComponent } from "../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../platform/popup/layout/popup-page.component"; +import { PopupTabNavigationComponent } from "../platform/popup/layout/popup-tab-navigation.component"; +import { FilePopoutCalloutComponent } from "../tools/popup/components/file-popout-callout.component"; import { GeneratorComponent } from "../tools/popup/generator/generator.component"; import { PasswordGeneratorHistoryComponent } from "../tools/popup/generator/password-generator-history.component"; import { SendListComponent } from "../tools/popup/send/components/send-list.component"; import { SendAddEditComponent } from "../tools/popup/send/send-add-edit.component"; import { SendGroupingsComponent } from "../tools/popup/send/send-groupings.component"; import { SendTypeComponent } from "../tools/popup/send/send-type.component"; -import { ExportComponent } from "../tools/popup/settings/export.component"; +import { SettingsComponent } from "../tools/popup/settings/settings.component"; import { ActionButtonsComponent } from "../vault/popup/components/action-buttons.component"; import { CipherRowComponent } from "../vault/popup/components/cipher-row.component"; -import { PasswordRepromptComponent } from "../vault/popup/components/password-reprompt.component"; import { AddEditCustomFieldsComponent } from "../vault/popup/components/vault/add-edit-custom-fields.component"; import { AddEditComponent } from "../vault/popup/components/vault/add-edit.component"; import { AttachmentsComponent } from "../vault/popup/components/vault/attachments.component"; @@ -52,24 +78,17 @@ import { VaultItemsComponent } from "../vault/popup/components/vault/vault-items import { VaultSelectComponent } from "../vault/popup/components/vault/vault-select.component"; import { ViewCustomFieldsComponent } from "../vault/popup/components/vault/view-custom-fields.component"; import { ViewComponent } from "../vault/popup/components/vault/view.component"; +import { AppearanceComponent } from "../vault/popup/settings/appearance.component"; import { FolderAddEditComponent } from "../vault/popup/settings/folder-add-edit.component"; +import { FoldersComponent } from "../vault/popup/settings/folders.component"; +import { SyncComponent } from "../vault/popup/settings/sync.component"; +import { VaultSettingsComponent } from "../vault/popup/settings/vault-settings.component"; import { AppRoutingModule } from "./app-routing.module"; import { AppComponent } from "./app.component"; -import { PopOutComponent } from "./components/pop-out.component"; -import { PrivateModeWarningComponent } from "./components/private-mode-warning.component"; -import { SetPinComponent } from "./components/set-pin.component"; import { UserVerificationComponent } from "./components/user-verification.component"; import { ServicesModule } from "./services/services.module"; -import { AutofillComponent } from "./settings/autofill.component"; -import { ExcludedDomainsComponent } from "./settings/excluded-domains.component"; -import { FoldersComponent } from "./settings/folders.component"; -import { HelpAndFeedbackComponent } from "./settings/help-and-feedback.component"; -import { OptionsComponent } from "./settings/options.component"; -import { PremiumComponent } from "./settings/premium.component"; -import { SettingsComponent } from "./settings/settings.component"; -import { SyncComponent } from "./settings/sync.component"; -import { VaultTimeoutInputComponent } from "./settings/vault-timeout-input.component"; +import { TabsV2Component } from "./tabs-v2.component"; import { TabsComponent } from "./tabs.component"; // Register the locales for the application @@ -79,11 +98,13 @@ import "../platform/popup/locales"; imports: [ A11yModule, AppRoutingModule, - BitwardenToastModule.forRoot({ + AutofillComponent, + AccountSecurityComponent, + ToastModule.forRoot({ maxOpened: 2, autoDismiss: true, closeButton: true, - positionClass: "toast-bottom-full-width", + positionClass: "toast-top-full-width", }), BrowserAnimationsModule, BrowserModule, @@ -96,6 +117,25 @@ import "../platform/popup/locales"; ScrollingModule, ServicesModule, DialogModule, + ExcludedDomainsComponent, + Fido2CipherRowComponent, + Fido2Component, + Fido2UseBrowserLinkComponent, + FilePopoutCalloutComponent, + AvatarModule, + AccountComponent, + ButtonModule, + NotificationsSettingsComponent, + PopOutComponent, + PopupPageComponent, + PopupTabNavigationComponent, + PopupFooterComponent, + PopupHeaderComponent, + HeaderComponent, + UserVerificationDialogComponent, + CurrentAccountComponent, + FormFieldModule, + ExtensionAnonLayoutWrapperComponent, ], declarations: [ ActionButtonsComponent, @@ -110,50 +150,52 @@ import "../platform/popup/locales"; ColorPasswordCountPipe, CurrentTabComponent, EnvironmentComponent, - ExcludedDomainsComponent, - ExportComponent, + ExcludedDomainsV1Component, + Fido2CipherRowV1Component, + Fido2UseBrowserLinkV1Component, FolderAddEditComponent, FoldersComponent, VaultFilterComponent, HintComponent, HomeComponent, LockComponent, - LoginComponent, - LoginWithDeviceComponent, + LoginViaAuthRequestComponentV1, + LoginComponentV1, LoginDecryptionOptionsComponent, - OptionsComponent, + NotificationsSettingsV1Component, + AppearanceComponent, GeneratorComponent, PasswordGeneratorHistoryComponent, PasswordHistoryComponent, - PasswordRepromptComponent, - PopOutComponent, PremiumComponent, - PrivateModeWarningComponent, RegisterComponent, SendAddEditComponent, SendGroupingsComponent, SendListComponent, SendTypeComponent, SetPasswordComponent, - SetPinComponent, SettingsComponent, + VaultSettingsComponent, ShareComponent, SsoComponent, SyncComponent, TabsComponent, + TabsV2Component, TwoFactorComponent, TwoFactorOptionsComponent, UpdateTempPasswordComponent, UserVerificationComponent, + AccountSecurityComponentV1, VaultTimeoutInputComponent, ViewComponent, ViewCustomFieldsComponent, RemovePasswordComponent, VaultSelectComponent, - HelpAndFeedbackComponent, - AutofillComponent, + Fido2V1Component, + AutofillV1Component, EnvironmentSelectorComponent, ], + exports: [], providers: [CurrencyPipe, DatePipe], bootstrap: [AppComponent], }) diff --git a/apps/browser/src/popup/components/pop-out.component.html b/apps/browser/src/popup/components/pop-out.component.html deleted file mode 100644 index 73bf76941dc..00000000000 --- a/apps/browser/src/popup/components/pop-out.component.html +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/apps/browser/src/popup/components/pop-out.component.ts b/apps/browser/src/popup/components/pop-out.component.ts deleted file mode 100644 index b8675ec4d4c..00000000000 --- a/apps/browser/src/popup/components/pop-out.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Component, Input, OnInit } from "@angular/core"; - -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; - -import { PopupUtilsService } from "../services/popup-utils.service"; - -@Component({ - selector: "app-pop-out", - templateUrl: "pop-out.component.html", -}) -export class PopOutComponent implements OnInit { - @Input() show = true; - - constructor( - private platformUtilsService: PlatformUtilsService, - private popupUtilsService: PopupUtilsService - ) {} - - ngOnInit() { - if (this.show) { - if ( - (this.popupUtilsService.inSidebar(window) && this.platformUtilsService.isFirefox()) || - this.popupUtilsService.inPopout(window) - ) { - this.show = false; - } - } - } - - expand() { - this.popupUtilsService.popOut(window); - } -} diff --git a/apps/browser/src/popup/components/private-mode-warning.component.html b/apps/browser/src/popup/components/private-mode-warning.component.html deleted file mode 100644 index 5acbb1acd08..00000000000 --- a/apps/browser/src/popup/components/private-mode-warning.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - {{ "privateModeWarning" | i18n }} - {{ - "learnMore" | i18n - }} - diff --git a/apps/browser/src/popup/components/private-mode-warning.component.ts b/apps/browser/src/popup/components/private-mode-warning.component.ts deleted file mode 100644 index 4d5587d65f1..00000000000 --- a/apps/browser/src/popup/components/private-mode-warning.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component, OnInit } from "@angular/core"; - -import { PopupUtilsService } from "../services/popup-utils.service"; - -@Component({ - selector: "app-private-mode-warning", - templateUrl: "private-mode-warning.component.html", -}) -export class PrivateModeWarningComponent implements OnInit { - showWarning = false; - - constructor(private popupUtilsService: PopupUtilsService) {} - - ngOnInit() { - this.showWarning = this.popupUtilsService.inPrivateMode(); - } -} diff --git a/apps/browser/src/popup/components/set-pin.component.html b/apps/browser/src/popup/components/set-pin.component.html deleted file mode 100644 index 54a3fab10d5..00000000000 --- a/apps/browser/src/popup/components/set-pin.component.html +++ /dev/null @@ -1,64 +0,0 @@ - diff --git a/apps/browser/src/popup/components/set-pin.component.ts b/apps/browser/src/popup/components/set-pin.component.ts deleted file mode 100644 index 47b8fd72128..00000000000 --- a/apps/browser/src/popup/components/set-pin.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from "@angular/core"; - -import { SetPinComponent as BaseSetPinComponent } from "@bitwarden/angular/components/set-pin.component"; - -@Component({ - templateUrl: "set-pin.component.html", -}) -export class SetPinComponent extends BaseSetPinComponent {} diff --git a/apps/browser/src/popup/components/user-verification.component.ts b/apps/browser/src/popup/components/user-verification.component.ts index 87b514c416e..6befc8973b0 100644 --- a/apps/browser/src/popup/components/user-verification.component.ts +++ b/apps/browser/src/popup/components/user-verification.component.ts @@ -3,7 +3,10 @@ import { Component } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { UserVerificationComponent as BaseComponent } from "@bitwarden/angular/auth/components/user-verification.component"; - +/** + * @deprecated Jan 24, 2024: Use new libs/auth UserVerificationDialogComponent or UserVerificationFormInputComponent instead. + * Each client specific component should eventually be converted over to use one of these new components. + */ @Component({ selector: "app-user-verification", templateUrl: "user-verification.component.html", diff --git a/apps/browser/src/popup/images/bwi-passkey.png b/apps/browser/src/popup/images/bwi-passkey.png new file mode 100644 index 00000000000..702be33446e Binary files /dev/null and b/apps/browser/src/popup/images/bwi-passkey.png differ diff --git a/apps/browser/src/popup/images/loading.svg b/apps/browser/src/popup/images/loading.svg index 70763105168..3f2033303db 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/images/two-factor/0.png b/apps/browser/src/popup/images/two-factor/0.png new file mode 100644 index 00000000000..307ff4fd60f Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/0.png differ diff --git a/apps/browser/src/popup/images/two-factor/1-w.png b/apps/browser/src/popup/images/two-factor/1-w.png new file mode 100644 index 00000000000..a4e39b3f466 Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/1-w.png differ diff --git a/apps/browser/src/popup/images/two-factor/1.png b/apps/browser/src/popup/images/two-factor/1.png new file mode 100644 index 00000000000..37fb7bc4327 Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/1.png differ diff --git a/apps/browser/src/popup/images/two-factor/2.png b/apps/browser/src/popup/images/two-factor/2.png new file mode 100644 index 00000000000..d069bdab992 Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/2.png differ diff --git a/apps/browser/src/popup/images/two-factor/3.png b/apps/browser/src/popup/images/two-factor/3.png new file mode 100644 index 00000000000..c543343f53b Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/3.png differ diff --git a/apps/browser/src/popup/images/two-factor/4.png b/apps/browser/src/popup/images/two-factor/4.png new file mode 100644 index 00000000000..058671ea37e Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/4.png differ diff --git a/apps/browser/src/popup/images/two-factor/6.png b/apps/browser/src/popup/images/two-factor/6.png new file mode 100644 index 00000000000..d069bdab992 Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/6.png differ diff --git a/apps/browser/src/popup/images/two-factor/7-w.png b/apps/browser/src/popup/images/two-factor/7-w.png new file mode 100644 index 00000000000..89fdd8a2a08 Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/7-w.png differ diff --git a/apps/browser/src/popup/images/two-factor/7.png b/apps/browser/src/popup/images/two-factor/7.png new file mode 100644 index 00000000000..2a38bdcd3e5 Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/7.png differ diff --git a/apps/browser/src/popup/images/two-factor/rc-w.png b/apps/browser/src/popup/images/two-factor/rc-w.png new file mode 100644 index 00000000000..e83b8db1324 Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/rc-w.png differ diff --git a/apps/browser/src/popup/images/two-factor/rc.png b/apps/browser/src/popup/images/two-factor/rc.png new file mode 100644 index 00000000000..4bebdf936cc Binary files /dev/null and b/apps/browser/src/popup/images/two-factor/rc.png differ diff --git a/apps/browser/src/popup/index.ejs b/apps/browser/src/popup/index.ejs new file mode 100644 index 00000000000..20b79b6f067 --- /dev/null +++ b/apps/browser/src/popup/index.ejs @@ -0,0 +1,14 @@ + + + + + + Bitwarden + + + + +
+
+ + diff --git a/apps/browser/src/popup/index.html b/apps/browser/src/popup/index.html deleted file mode 100644 index 17f50e0a0eb..00000000000 --- a/apps/browser/src/popup/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Bitwarden - - - - -
-
- - diff --git a/apps/browser/src/popup/main.ts b/apps/browser/src/popup/main.ts index ef69e0342fc..c98e30e6bca 100644 --- a/apps/browser/src/popup/main.ts +++ b/apps/browser/src/popup/main.ts @@ -1,7 +1,7 @@ import { enableProdMode } from "@angular/core"; import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; -import BrowserPlatformUtilsService from "../platform/services/browser-platform-utils.service"; +import { BrowserPlatformUtilsService } from "../platform/services/platform-utils/browser-platform-utils.service"; require("./scss/popup.scss"); require("./scss/tailwind.css"); @@ -19,6 +19,8 @@ if (process.env.ENV === "production") { } function init() { + // 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 platformBrowserDynamic().bootstrapModule(AppModule, { preserveWhitespaces: true }); } diff --git a/apps/browser/src/popup/polyfills.ts b/apps/browser/src/popup/polyfills.ts index 14c0f595a39..f76b9e632fc 100644 --- a/apps/browser/src/popup/polyfills.ts +++ b/apps/browser/src/popup/polyfills.ts @@ -1,4 +1,2 @@ import "core-js/stable"; import "zone.js"; - -import "../platform/polyfills/zone-patch-chrome-runtime"; diff --git a/apps/browser/src/popup/scss/base.scss b/apps/browser/src/popup/scss/base.scss index 3b401d356f5..89b8816567d 100644 --- a/apps/browser/src/popup/scss/base.scss +++ b/apps/browser/src/popup/scss/base.scss @@ -7,9 +7,7 @@ } html { - &.cdk-global-scrollblock { - position: unset; - } + overflow: hidden; } html, @@ -21,8 +19,10 @@ body { } body { - width: 375px !important; + width: 380px !important; height: 600px !important; + position: relative; + min-height: 100vh; overflow: hidden; color: $text-color; background-color: $background-color; @@ -72,7 +72,7 @@ img { border: none; } -a { +a:not(popup-page a, popup-tab-navigation a) { text-decoration: none; @include themify($themes) { @@ -87,9 +87,9 @@ a { } } -input, -select, -textarea { +input:not(bit-form-field input, bit-search input), +select:not(bit-form-field select), +textarea:not(bit-form-field textarea) { @include themify($themes) { color: themed("textColor"); background-color: themed("inputBackgroundColor"); @@ -99,7 +99,7 @@ textarea { input, select, textarea, -button { +button:not(bit-chip-select button) { font-size: $font-size-base; font-family: $font-family-sans-serif; } @@ -175,16 +175,28 @@ cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb, } } -header { - min-height: 44px; - max-height: 44px; +header:not(bit-callout header, bit-dialog header, popup-page header) { + height: 44px; display: flex; - border-bottom: 1px solid #000000; - @include themify($themes) { - color: themed("headerColor"); - background-color: themed("headerBackgroundColor"); - border-bottom-color: themed("headerBorderColor"); + &:not(.no-theme) { + border-bottom: 1px solid #000000; + + @include themify($themes) { + color: themed("headerColor"); + background-color: themed("headerBackgroundColor"); + border-bottom-color: themed("headerBorderColor"); + } + } + + .header-content { + display: flex; + flex: 1 1 auto; + } + + .header-content > .right, + .header-content > .right > .right { + height: 100%; } .left, @@ -218,7 +230,7 @@ header { } app-pop-out > button, - div > button, + div > button:not(app-current-account button):not(.home-acc-switcher-btn), div > a { border: none; padding: 0 10px; @@ -230,13 +242,8 @@ header { height: 100%; white-space: pre; - @include themify($themes) { - color: themed("headerColor"); - background-color: themed("headerBackgroundColor"); - } - - &:hover, - &:focus { + &:not(.home-acc-switcher-btn):hover, + &:not(.home-acc-switcher-btn):focus { @include themify($themes) { background-color: themed("headerBackgroundHoverColor"); color: themed("headerColor"); @@ -283,7 +290,7 @@ header { } } - input { + input:not(bit-form-field input) { width: 100%; margin: 0; border: none; @@ -445,7 +452,7 @@ app-root { } } -main { +main:not(popup-page main) { position: absolute; top: 44px; bottom: 0; diff --git a/apps/browser/src/popup/scss/box.scss b/apps/browser/src/popup/scss/box.scss index c026c780889..179673279e6 100644 --- a/apps/browser/src/popup/scss/box.scss +++ b/apps/browser/src/popup/scss/box.scss @@ -341,7 +341,8 @@ } } - .img-right { + .img-right, + .txt-right { float: right; margin-left: 10px; } @@ -767,3 +768,24 @@ form { } } } + +.account-switcher-row { + @include themify($themes) { + color: themed("textColor"); + background-color: themed("boxBackgroundColor"); + } + + &:hover, + &:focus, + &.active { + @include themify($themes) { + background-color: themed("listItemBackgroundHoverColor"); + } + } + + &-details { + @include themify($themes) { + color: themed("mutedColor"); + } + } +} diff --git a/apps/browser/src/popup/scss/environment.scss b/apps/browser/src/popup/scss/environment.scss index f6adba86c2e..0fb8e0ddaba 100644 --- a/apps/browser/src/popup/scss/environment.scss +++ b/apps/browser/src/popup/scss/environment.scss @@ -65,7 +65,9 @@ html.browser_safari { } padding: 5px; width: 100%; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), + box-shadow: + 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); border-radius: $border-radius; } diff --git a/apps/browser/src/popup/scss/misc.scss b/apps/browser/src/popup/scss/misc.scss index c106931c1fc..f61d593c43f 100644 --- a/apps/browser/src/popup/scss/misc.scss +++ b/apps/browser/src/popup/scss/misc.scss @@ -287,102 +287,6 @@ app-vault-icon, cursor: move; } -.callout { - padding: 10px; - margin: 10px; - border: 1px solid #000000; - border-left-width: 5px; - border-radius: 3px; - @include themify($themes) { - border-color: themed("calloutBorderColor"); - background-color: themed("calloutBackgroundColor"); - } - - .callout-heading { - margin-top: 0; - } - - h3.callout-heading { - font-weight: bold; - text-transform: uppercase; - } - - &.callout-primary { - @include themify($themes) { - border-left-color: themed("primaryColor"); - } - - .callout-heading { - @include themify($themes) { - color: themed("primaryColor"); - } - } - } - - &.callout-info { - @include themify($themes) { - border-left-color: themed("infoColor"); - } - - .callout-heading { - @include themify($themes) { - color: themed("infoColor"); - } - } - } - - &.callout-danger { - @include themify($themes) { - border-left-color: themed("dangerColor"); - } - - .callout-heading { - @include themify($themes) { - color: themed("dangerColor"); - } - } - } - - &.callout-success { - @include themify($themes) { - border-left-color: themed("successColor"); - } - - .callout-heading { - @include themify($themes) { - color: themed("successColor"); - } - } - } - - &.callout-warning { - @include themify($themes) { - border-left-color: themed("warningColor"); - } - - .callout-heading { - @include themify($themes) { - color: themed("warningColor"); - } - } - } - - &.clickable { - &:hover, - &:focus, - &.active { - @include themify($themes) { - background-color: themed("boxBackgroundHoverColor"); - } - } - } - - .enforced-policy-options ul { - padding-left: 30px; - margin: 0; - } -} - input[type="password"]::-ms-reveal { display: none; } @@ -402,7 +306,7 @@ input[type="password"]::-ms-reveal { // contrast against the background, so its inversion is also still readable) // and suppress user selection for most elements (to make it more app-like) -::selection { +:not(bit-form-field input)::selection { @include themify($themes) { color: themed("backgroundColor"); background-color: themed("primaryAccentColor"); @@ -424,6 +328,10 @@ img, .modal-title, .overlay-container { user-select: none; + + &.user-select { + user-select: auto; + } } app-about .modal-body > *, @@ -454,3 +362,14 @@ html.force_redraw { .rounded-circle { border-radius: 50% !important; } + +/* override for vault icon in browser (pre extension refresh) */ +app-vault-icon:not(app-vault-list-items-container app-vault-icon) > div { + display: flex; + justify-content: center; + align-items: center; + float: left; + height: 36px; + width: 34px; + margin-left: -5px; +} diff --git a/apps/browser/src/popup/scss/pages.scss b/apps/browser/src/popup/scss/pages.scss index e104570e563..2fd903fedc7 100644 --- a/apps/browser/src/popup/scss/pages.scss +++ b/apps/browser/src/popup/scss/pages.scss @@ -111,11 +111,6 @@ app-home { } } -.app-private-mode-warning { - display: block; - padding-top: 1rem; -} - body.body-sm, body.body-xs { app-home { @@ -175,3 +170,215 @@ app-vault-attachments { } } } + +.useBrowserlink { + margin-left: 5px; + margin-top: 20px; + + span { + font-weight: 700; + font-size: $font-size-small; + } +} + +.fido2-browser-selector-dropdown { + @include themify($themes) { + background-color: themed("boxBackgroundColor"); + } + padding: 8px; + width: 100%; + box-shadow: + 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 3px 1px -2px rgba(0, 0, 0, 0.12), + 0 1px 5px 0 rgba(0, 0, 0, 0.2); + border-radius: $border-radius; +} + +.fido2-browser-selector-dropdown-item { + @include themify($themes) { + color: themed("textColor") !important; + } + width: 100%; + text-align: left; + padding: 0px 15px 0px 5px; + margin-bottom: 5px; + border-radius: 3px; + border: 1px solid transparent; + transition: all 0.2s ease-in-out; + + &:hover { + @include themify($themes) { + background-color: themed("listItemBackgroundHoverColor") !important; + } + } + + &:last-child { + margin-bottom: 0; + } +} + +app-fido2-v1 { + .auth-wrapper { + display: flex; + flex-direction: column; + padding: 12px 24px 12px 24px; + + .auth-header { + display: flex; + justify-content: space-between; + align-items: center; + + .left { + padding-right: 10px; + + .logo { + display: inline-flex; + align-items: center; + + i.bwi { + font-size: 35px; + margin-right: 3px; + @include themify($themes) { + color: themed("primaryColor"); + } + } + + span { + font-size: 45px; + font-weight: 300; + margin-top: -3px; + @include themify($themes) { + color: themed("primaryColor"); + } + } + } + } + + .search { + padding: 7px 10px; + width: 100%; + text-align: left; + position: relative; + display: flex; + + .bwi { + position: absolute; + top: 15px; + left: 20px; + + @include themify($themes) { + color: themed("labelColor"); + } + } + + input { + width: 100%; + margin: 0; + border: none; + padding: 5px 10px 5px 30px; + border-radius: $border-radius; + + &:focus { + border-radius: $border-radius; + outline: none; + } + + &[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; + appearance: none; + background-repeat: no-repeat; + mask-image: none; + -webkit-mask-image: none; + } + } + } + } + + .auth-flow { + display: flex; + align-items: flex-start; + flex-direction: column; + margin-top: 32px; + + .subtitle { + font-family: "DM Sans"; + font-size: 24px; + font-style: normal; + font-weight: 600; + line-height: 32px; + } + + .box.list { + overflow-y: auto; + } + + .box-content { + max-height: 140px; + } + + @media screen and (min-height: 501px) and (max-height: 600px) { + .box-content { + max-height: 200px; + } + } + + @media screen and (min-height: 601px) { + .box-content { + max-height: 260px; + } + } + + .box-content-row { + display: flex; + justify-content: center; + align-items: center; + margin: 0px; + padding: 0px; + margin-bottom: 12px; + + button { + min-height: 44px; + } + + .row-main { + border-radius: 6px; + padding: 5px 0px 5px 12px; + + &:focus { + @include themify($themes) { + padding: 3px 0px 3px 10px; + border: 2px solid themed("headerInputBackgroundFocusColor"); + } + } + + &.row-selected { + @include themify($themes) { + outline: none; + padding-left: 7px; + border-left: 5px solid themed("primaryColor"); + background-color: themed("headerBackgroundHoverColor"); + color: themed("headerColor"); + } + } + } + + .row-main-content { + display: flex; + flex-direction: column; + justify-content: center; + + .detail { + min-height: 15px; + display: block; + } + } + } + + .btn { + width: 100%; + font-size: 16px; + font-weight: 600; + } + } + } +} diff --git a/apps/browser/src/popup/scss/plugins.scss b/apps/browser/src/popup/scss/plugins.scss index e1e386d62d4..b8ac8697b7f 100644 --- a/apps/browser/src/popup/scss/plugins.scss +++ b/apps/browser/src/popup/scss/plugins.scss @@ -1,98 +1,31 @@ -@import "~ngx-toastr/toastr"; - @import "variables.scss"; -@import "buttons.scss"; -// Toaster - -.toast-container { - .toast-close-button { - @include themify($themes) { - color: themed("toastTextColor"); - } - font-size: 18px; - margin-right: 4px; - } - - .ngx-toastr { - @include themify($themes) { - color: themed("toastTextColor"); - } - align-items: center; - background-image: none !important; - border-radius: $border-radius; - box-shadow: 0 0 8px rgba(0, 0, 0, 0.35); - display: flex; - padding: 15px; - - .toast-close-button { - position: absolute; - right: 5px; - top: 0; - } - - &:hover { - box-shadow: 0 0 10px rgba(0, 0, 0, 0.6); - } - - .icon i::before { - float: left; - font-style: normal; - font-family: $icomoon-font-family; - font-size: 25px; - line-height: 20px; - padding-right: 15px; - } - - .toast-message { - p { - margin-bottom: 0.5rem; - - &:last-child { - margin-bottom: 0; - } - } - } - - &.toast-danger, - &.toast-error { - @include themify($themes) { - background-color: themed("dangerColor"); - } - - .icon i::before { - content: map_get($icons, "error"); - } - } - - &.toast-warning { - @include themify($themes) { - background-color: themed("warningColor"); - } - - .icon i::before { - content: map_get($icons, "exclamation-triangle"); - } - } - - &.toast-info { - @include themify($themes) { - background-color: themed("infoColor"); - } - - .icon i:before { - content: map_get($icons, "info-circle"); - } - } - - &.toast-success { - @include themify($themes) { - background-color: themed("successColor"); - } - - .icon i:before { - content: map_get($icons, "check"); - } - } +@each $mfaType in $mfaTypes { + .mfaType#{$mfaType} { + content: url("../images/two-factor/" + $mfaType + ".png"); + max-width: 100px; + } +} + +.mfaType1 { + @include themify($themes) { + content: url("../images/two-factor/1" + themed("mfaLogoSuffix")); + max-width: 100px; + max-height: 45px; + } +} + +.mfaType7 { + @include themify($themes) { + content: url("../images/two-factor/7" + themed("mfaLogoSuffix")); + max-width: 100px; + } +} + +.recovery-code-img { + @include themify($themes) { + content: url("../images/two-factor/rc" + themed("mfaLogoSuffix")); + max-width: 100px; + max-height: 45px; } } diff --git a/apps/browser/src/popup/scss/popup.scss b/apps/browser/src/popup/scss/popup.scss index 0d7e4281386..8dc2c206f87 100644 --- a/apps/browser/src/popup/scss/popup.scss +++ b/apps/browser/src/popup/scss/popup.scss @@ -8,8 +8,8 @@ @import "buttons.scss"; @import "misc.scss"; @import "modal.scss"; -@import "plugins.scss"; @import "environment.scss"; @import "pages.scss"; +@import "plugins.scss"; @import "@angular/cdk/overlay-prebuilt.css"; @import "../../../../../libs/components/src/multi-select/scss/bw.theme"; diff --git a/apps/browser/src/popup/scss/tailwind.css b/apps/browser/src/popup/scss/tailwind.css index 7e12c1d6770..0d2a88a9667 100644 --- a/apps/browser/src/popup/scss/tailwind.css +++ b/apps/browser/src/popup/scss/tailwind.css @@ -3,3 +3,24 @@ @tailwind utilities; @import "../../../../../libs/components/src/tw-theme.css"; + +@layer components { + /** Safari Support */ + html.browser_safari .tw-styled-scrollbar::-webkit-scrollbar { + @apply tw-overflow-auto; + } + html.browser_safari .tw-styled-scrollbar::-webkit-scrollbar-thumb { + @apply tw-bg-secondary-500 tw-rounded-lg tw-border-4 tw-border-solid tw-border-transparent tw-bg-clip-content; + } + html.browser_safari .tw-styled-scrollbar::-webkit-scrollbar-track { + @apply tw-bg-background-alt; + } + html.browser_safari .tw-styled-scrollbar::-webkit-scrollbar-thumb:hover { + @apply tw-bg-secondary-600; + } + + /* FireFox & Chrome support */ + html:not(.browser_safari) .tw-styled-scrollbar { + scrollbar-color: rgb(var(--color-secondary-500)) rgb(var(--color-background-alt)); + } +} diff --git a/apps/browser/src/popup/scss/variables.scss b/apps/browser/src/popup/scss/variables.scss index d8891cf620b..cfd61cd6a2b 100644 --- a/apps/browser/src/popup/scss/variables.scss +++ b/apps/browser/src/popup/scss/variables.scss @@ -2,9 +2,9 @@ $dark-icon-themes: "theme_dark", "theme_solarizedDark", "theme_nord"; -$font-family-sans-serif: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; +$font-family-sans-serif: "DM Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; $font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; -$font-size-base: 14px; +$font-size-base: 16px; $font-size-large: 18px; $font-size-xlarge: 22px; $font-size-xxlarge: 28px; @@ -19,6 +19,8 @@ $border-radius: 6px; $line-height-base: 1.42857143; $icon-hover-color: lighten($text-color, 50%); +$mfaTypes: 0, 2, 3, 4, 6; + $gray: #555; $gray-light: #777; $text-muted: $gray-light; @@ -111,6 +113,7 @@ $themes: ( infoColor: $brand-info, warningColor: $brand-warning, logoSuffix: "dark", + mfaLogoSuffix: ".png", passwordNumberColor: #007fde, passwordSpecialColor: #c40800, passwordCountText: #212529, @@ -174,6 +177,7 @@ $themes: ( infoColor: #a4b0c6, warningColor: #ffeb66, logoSuffix: "white", + mfaLogoSuffix: "-w.png", passwordNumberColor: #6f9df1, passwordSpecialColor: #ff8d85, passwordCountText: #ffffff, @@ -236,6 +240,7 @@ $themes: ( infoColor: $nord9, warningColor: $nord12, logoSuffix: "white", + mfaLogoSuffix: "-w.png", passwordNumberColor: $nord8, passwordSpecialColor: $nord12, passwordCountText: $nord5, @@ -298,6 +303,7 @@ $themes: ( infoColor: $solarizedDarkGreen, warningColor: $solarizedDarkYellow, logoSuffix: "white", + mfaLogoSuffix: "-w.png", passwordNumberColor: $solarizedDarkCyan, passwordSpecialColor: $solarizedDarkYellow, passwordCountText: $solarizedDarkBase2, diff --git a/apps/browser/src/popup/services/debounce-navigation.service.ts b/apps/browser/src/popup/services/debounce-navigation.service.ts new file mode 100644 index 00000000000..b40738f0a80 --- /dev/null +++ b/apps/browser/src/popup/services/debounce-navigation.service.ts @@ -0,0 +1,63 @@ +import { inject, Injectable, OnDestroy } from "@angular/core"; +import { CanActivateFn, NavigationEnd, NavigationStart, Router } from "@angular/router"; +import { Subscription } from "rxjs"; +import { filter, pairwise } from "rxjs/operators"; + +/** + * CanActivate guard that cancels duplicate navigation events, which can otherwise reinitialize some components + * unexpectedly. + * Specifically, this is used to avoid data loss when navigating from the password generator component back to the + * add/edit cipher component in browser. + * For more information, see https://github.com/bitwarden/clients/pull/1935 + */ +export function debounceNavigationGuard(): CanActivateFn { + return async () => { + const debounceNavigationService = inject(DebounceNavigationService); + return debounceNavigationService.canActivate(); + }; +} + +@Injectable() +export class DebounceNavigationService implements OnDestroy { + navigationStartSub: Subscription; + navigationSuccessSub: Subscription; + + private lastNavigation: NavigationStart; + private thisNavigation: NavigationStart; + private lastNavigationSuccessId: number; + + constructor(private router: Router) { + this.navigationStartSub = this.router.events + .pipe( + filter((event) => event instanceof NavigationStart), + pairwise(), + ) + .subscribe( + (events: [NavigationStart, NavigationStart]) => + ([this.lastNavigation, this.thisNavigation] = events), + ); + + this.navigationSuccessSub = this.router.events + .pipe(filter((event) => event instanceof NavigationEnd)) + .subscribe((event: NavigationEnd) => (this.lastNavigationSuccessId = event.id)); + } + + async canActivate() { + return !( + this.thisNavigation?.navigationTrigger === "hashchange" && + this.lastNavigation.navigationTrigger === "popstate" && + this.lastNavigationSuccessId === this.lastNavigation.id && + this.lastNavigation.url === this.thisNavigation?.url + ); + } + + ngOnDestroy() { + if (this.navigationStartSub != null) { + this.navigationStartSub.unsubscribe(); + } + + if (this.navigationSuccessSub != null) { + this.navigationSuccessSub.unsubscribe(); + } + } +} diff --git a/apps/browser/src/popup/services/debounceNavigationService.ts b/apps/browser/src/popup/services/debounceNavigationService.ts deleted file mode 100644 index bf1e2e83ca5..00000000000 --- a/apps/browser/src/popup/services/debounceNavigationService.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Injectable, OnDestroy } from "@angular/core"; -import { CanActivate, NavigationEnd, NavigationStart, Router } from "@angular/router"; -import { Subscription } from "rxjs"; -import { filter, pairwise } from "rxjs/operators"; - -@Injectable() -export class DebounceNavigationService implements CanActivate, OnDestroy { - navigationStartSub: Subscription; - navigationSuccessSub: Subscription; - - private lastNavigation: NavigationStart; - private thisNavigation: NavigationStart; - private lastNavigationSuccessId: number; - - constructor(private router: Router) { - this.navigationStartSub = this.router.events - .pipe( - filter((event) => event instanceof NavigationStart), - pairwise() - ) - .subscribe( - (events: [NavigationStart, NavigationStart]) => - ([this.lastNavigation, this.thisNavigation] = events) - ); - - this.navigationSuccessSub = this.router.events - .pipe(filter((event) => event instanceof NavigationEnd)) - .subscribe((event: NavigationEnd) => (this.lastNavigationSuccessId = event.id)); - } - - async canActivate() { - return !( - this.thisNavigation?.navigationTrigger === "hashchange" && - this.lastNavigation.navigationTrigger === "popstate" && - this.lastNavigationSuccessId === this.lastNavigation.id && - this.lastNavigation.url === this.thisNavigation?.url - ); - } - - ngOnDestroy() { - if (this.navigationStartSub != null) { - this.navigationStartSub.unsubscribe(); - } - - if (this.navigationSuccessSub != null) { - this.navigationSuccessSub.unsubscribe(); - } - } -} diff --git a/apps/browser/src/popup/services/init.service.ts b/apps/browser/src/popup/services/init.service.ts index c9a1ffb720e..9e6471eaf28 100644 --- a/apps/browser/src/popup/services/init.service.ts +++ b/apps/browser/src/popup/services/init.service.ts @@ -1,32 +1,34 @@ -import { Injectable } from "@angular/core"; +import { DOCUMENT } from "@angular/common"; +import { Inject, Injectable } from "@angular/core"; -import { AbstractThemingService } from "@bitwarden/angular/services/theming/theming.service.abstraction"; +import { AbstractThemingService } from "@bitwarden/angular/platform/services/theming/theming.service.abstraction"; +import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService as LogServiceAbstraction } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ConfigService } from "@bitwarden/common/platform/services/config/config.service"; - -import { BrowserStateService as StateServiceAbstraction } from "../../platform/services/abstractions/browser-state.service"; - -import { PopupUtilsService } from "./popup-utils.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { BrowserApi } from "../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; @Injectable() export class InitService { constructor( private platformUtilsService: PlatformUtilsService, private i18nService: I18nService, - private popupUtilsService: PopupUtilsService, - private stateService: StateServiceAbstraction, + private stateService: StateService, + private twoFactorService: TwoFactorService, private logService: LogServiceAbstraction, private themingService: AbstractThemingService, - private configService: ConfigService + @Inject(DOCUMENT) private document: Document, ) {} init() { return async () => { - await this.stateService.init(); + await this.stateService.init({ runMigrations: false }); // Browser background is responsible for migrations + await this.i18nService.init(); + this.twoFactorService.init(); - if (!this.popupUtilsService.inPopup(window)) { + if (!BrowserPopupUtils.inPopup(window)) { window.document.body.classList.add("body-full"); } else if (window.screen.availHeight < 600) { window.document.body.classList.add("body-xs"); @@ -35,7 +37,7 @@ export class InitService { } const htmlEl = window.document.documentElement; - await this.themingService.monitorThemeChanges(); + this.themingService.applyThemeChangesTo(this.document); htmlEl.classList.add("locale_" + this.i18nService.translationLocale); // Workaround for slow performance on external monitors on Chrome + MacOS @@ -43,7 +45,7 @@ export class InitService { if ( this.platformUtilsService.isChrome() && navigator.platform.indexOf("Mac") > -1 && - this.popupUtilsService.inPopup(window) && + BrowserPopupUtils.inPopup(window) && (window.screenLeft < 0 || window.screenTop < 0 || window.screenLeft > window.screen.width || @@ -53,7 +55,25 @@ export class InitService { this.logService.info("Force redraw is on"); } - this.configService.init(); + this.setupVaultPopupHeartbeat(); }; } + + /** + * Sets up a runtime message listener to indicate to the background + * script that the extension popup is open in some manner. + */ + private setupVaultPopupHeartbeat() { + const respondToHeartbeat = ( + message: { command: string }, + _sender: chrome.runtime.MessageSender, + sendResponse: (response?: any) => void, + ) => { + if (message?.command === "checkVaultPopupHeartbeat") { + sendResponse(true); + } + }; + + BrowserApi.messageListener("vaultPopupHeartbeat", respondToHeartbeat); + } } diff --git a/apps/browser/src/popup/services/popup-close-warning.service.ts b/apps/browser/src/popup/services/popup-close-warning.service.ts new file mode 100644 index 00000000000..01e91ecad70 --- /dev/null +++ b/apps/browser/src/popup/services/popup-close-warning.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from "@angular/core"; +import { fromEvent, Subscription } from "rxjs"; + +@Injectable() +export class PopupCloseWarningService { + private unloadSubscription: Subscription; + + /** + * Enables a pop-up warning before the user exits the window/tab, or navigates away. + * This warns the user that they may lose unsaved data if they leave the page. + * (Note: navigating within the Angular app will not trigger it because it's an SPA.) + * Make sure you call `PopupCloseWarningService.disable` when it is no longer relevant. + */ + enable() { + this.disable(); + + this.unloadSubscription = fromEvent(window, "beforeunload").subscribe( + (e: BeforeUnloadEvent) => { + // Recommended method but not widely supported + e.preventDefault(); + + // Modern browsers do not display this message, it just needs to be a non-nullish value + // Exact wording is determined by the browser + const confirmationMessage = ""; + + // Older methods with better support + e.returnValue = confirmationMessage; + return confirmationMessage; + }, + ); + } + + /** + * Disables the warning enabled by PopupCloseWarningService.enable. + */ + disable() { + this.unloadSubscription?.unsubscribe(); + } +} diff --git a/apps/browser/src/popup/services/popup-search.service.ts b/apps/browser/src/popup/services/popup-search.service.ts deleted file mode 100644 index 43fbed055e8..00000000000 --- a/apps/browser/src/popup/services/popup-search.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; -import { SearchService } from "@bitwarden/common/services/search.service"; - -export class PopupSearchService extends SearchService { - constructor( - private mainSearchService: SearchService, - consoleLogService: ConsoleLogService, - i18nService: I18nService - ) { - super(consoleLogService, i18nService); - } - - clearIndex() { - throw new Error("Not available."); - } - - indexCiphers(): Promise { - throw new Error("Not available."); - } - - getIndexForSearch() { - return this.mainSearchService.getIndexForSearch(); - } -} diff --git a/apps/browser/src/popup/services/popup-utils.service.ts b/apps/browser/src/popup/services/popup-utils.service.ts deleted file mode 100644 index 1ab80a4564d..00000000000 --- a/apps/browser/src/popup/services/popup-utils.service.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { Injectable } from "@angular/core"; -import { fromEvent, Subscription } from "rxjs"; - -import { BrowserApi } from "../../platform/browser/browser-api"; - -@Injectable() -export class PopupUtilsService { - private unloadSubscription: Subscription; - - constructor(private privateMode: boolean = false) {} - - inSidebar(win: Window): boolean { - return win.location.search !== "" && win.location.search.indexOf("uilocation=sidebar") > -1; - } - - inTab(win: Window): boolean { - return win.location.search !== "" && win.location.search.indexOf("uilocation=tab") > -1; - } - - inPopout(win: Window): boolean { - return win.location.search !== "" && win.location.search.indexOf("uilocation=popout") > -1; - } - - inPopup(win: Window): boolean { - return ( - win.location.search === "" || - win.location.search.indexOf("uilocation=") === -1 || - win.location.search.indexOf("uilocation=popup") > -1 - ); - } - - inPrivateMode(): boolean { - return this.privateMode; - } - - getContentScrollY(win: Window, scrollingContainer = "main"): number { - const content = win.document.getElementsByTagName(scrollingContainer)[0]; - return content.scrollTop; - } - - setContentScrollY(win: Window, scrollY: number, scrollingContainer = "main"): void { - if (scrollY != null) { - const content = win.document.getElementsByTagName(scrollingContainer)[0]; - content.scrollTop = scrollY; - } - } - - popOut(win: Window, href: string = null): void { - if (href === null) { - href = win.location.href; - } - - if (typeof chrome !== "undefined" && chrome.windows && chrome.windows.create) { - if (href.indexOf("?uilocation=") > -1) { - href = href - .replace("uilocation=popup", "uilocation=popout") - .replace("uilocation=tab", "uilocation=popout") - .replace("uilocation=sidebar", "uilocation=popout"); - } else { - const hrefParts = href.split("#"); - href = - hrefParts[0] + "?uilocation=popout" + (hrefParts.length > 0 ? "#" + hrefParts[1] : ""); - } - - const bodyRect = document.querySelector("body").getBoundingClientRect(); - chrome.windows.create({ - url: href, - type: "popup", - width: Math.round(bodyRect.width ? bodyRect.width + 60 : 375), - height: Math.round(bodyRect.height || 600), - }); - - if (this.inPopup(win)) { - BrowserApi.closePopup(win); - } - } else if (typeof chrome !== "undefined" && chrome.tabs && chrome.tabs.create) { - href = href - .replace("uilocation=popup", "uilocation=tab") - .replace("uilocation=popout", "uilocation=tab") - .replace("uilocation=sidebar", "uilocation=tab"); - chrome.tabs.create({ - url: href, - }); - } - } - - /** - * Enables a pop-up warning before the user exits the window/tab, or navigates away. - * This warns the user that they may lose unsaved data if they leave the page. - * (Note: navigating within the Angular app will not trigger it because it's an SPA.) - * Make sure you call `disableTabCloseWarning` when it is no longer relevant. - */ - enableCloseTabWarning() { - this.disableCloseTabWarning(); - - this.unloadSubscription = fromEvent(window, "beforeunload").subscribe( - (e: BeforeUnloadEvent) => { - // Recommended method but not widely supported - e.preventDefault(); - - // Modern browsers do not display this message, it just needs to be a non-nullish value - // Exact wording is determined by the browser - const confirmationMessage = ""; - - // Older methods with better support - e.returnValue = confirmationMessage; - return confirmationMessage; - } - ); - } - - /** - * Disables the warning enabled by enableCloseTabWarning. - */ - disableCloseTabWarning() { - this.unloadSubscription?.unsubscribe(); - } -} diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 0ba396af92f..9a1acb54ab7 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -1,513 +1,602 @@ -import { APP_INITIALIZER, LOCALE_ID, NgModule } from "@angular/core"; +import { APP_INITIALIZER, NgModule, NgZone } from "@angular/core"; +import { Subject, merge, of } from "rxjs"; -import { UnauthGuard as BaseUnauthGuardService } from "@bitwarden/angular/auth/guards"; -import { MEMORY_STORAGE, SECURE_STORAGE } from "@bitwarden/angular/services/injection-tokens"; +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 { + CLIENT_TYPE, + DEFAULT_VAULT_TIMEOUT, + INTRAPROCESS_MESSAGING_SUBJECT, + MEMORY_STORAGE, + OBSERVABLE_DISK_STORAGE, + OBSERVABLE_MEMORY_STORAGE, + SECURE_STORAGE, + SYSTEM_THEME_OBSERVABLE, + SafeInjectionToken, + ENV_ADDITIONAL_REGIONS, +} from "@bitwarden/angular/services/injection-tokens"; import { JslibServicesModule } from "@bitwarden/angular/services/jslib-services.module"; -import { ThemingService } from "@bitwarden/angular/services/theming/theming.service"; -import { AbstractThemingService } from "@bitwarden/angular/services/theming/theming.service.abstraction"; +import { + AnonLayoutWrapperDataService, + LoginComponentService, + LockComponentService, +} from "@bitwarden/auth/angular"; +import { LockService, LoginEmailService, PinServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AuditService } from "@bitwarden/common/abstractions/audit.service"; -import { DevicesServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices.service.abstraction"; -import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; -import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service"; -import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; -import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; -import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; -import { TotpService } from "@bitwarden/common/abstractions/totp.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { - InternalPolicyService, - PolicyService, -} from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service"; -import { PolicyApiService } from "@bitwarden/common/admin-console/services/policy/policy-api.service"; -import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; -import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { LoginService as LoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/login.service"; -import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; -import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; + AccountService, + AccountService as AccountServiceAbstraction, +} from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { AuthService } from "@bitwarden/common/auth/services/auth.service"; -import { LoginService } from "@bitwarden/common/auth/services/login.service"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { ConfigApiServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config-api.service.abstraction"; +import { + AutofillSettingsService, + AutofillSettingsServiceAbstraction, +} from "@bitwarden/common/autofill/services/autofill-settings.service"; +import { + DefaultDomainSettingsService, + DomainSettingsService, +} from "@bitwarden/common/autofill/services/domain-settings.service"; +import { + UserNotificationSettingsService, + UserNotificationSettingsServiceAbstraction, +} from "@bitwarden/common/autofill/services/user-notification-settings.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { ClientType } from "@bitwarden/common/enums"; +import { + AnimationControlService, + DefaultAnimationControlService, +} from "@bitwarden/common/platform/abstractions/animation-control.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; -import { FileUploadService } from "@bitwarden/common/platform/abstractions/file-upload/file-upload.service"; import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { - LogService, - LogService as LogServiceAbstraction, -} from "@bitwarden/common/platform/abstractions/log.service"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { MessagingService as MessagingServiceAbstraction } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SdkClientFactory } from "@bitwarden/common/platform/abstractions/sdk/sdk-client-factory"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { - StateService as BaseStateServiceAbstraction, - StateService, -} from "@bitwarden/common/platform/abstractions/state.service"; -import { - AbstractMemoryStorageService, AbstractStorageService, + ObservableStorageService, } from "@bitwarden/common/platform/abstractions/storage.service"; -import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; -import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; -import { ConfigService } from "@bitwarden/common/platform/services/config/config.service"; +import { Message, MessageListener, MessageSender } from "@bitwarden/common/platform/messaging"; +// eslint-disable-next-line no-restricted-imports -- Used for dependency injection +import { SubjectMessageSender } from "@bitwarden/common/platform/messaging/internal"; +import { flagEnabled } from "@bitwarden/common/platform/misc/flags"; +import { TaskSchedulerService } from "@bitwarden/common/platform/scheduling"; import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; import { ContainerService } from "@bitwarden/common/platform/services/container.service"; -import { SearchService } from "@bitwarden/common/services/search.service"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; -import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username"; -import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; -import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service"; -import { SendApiService as SendApiServiceAbstraction } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { NoopSdkClientFactory } from "@bitwarden/common/platform/services/sdk/noop-sdk-client-factory"; +import { StorageServiceProvider } from "@bitwarden/common/platform/services/storage-service.provider"; +import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service"; import { - InternalSendService as InternalSendServiceAbstraction, - SendService, -} from "@bitwarden/common/tools/send/services/send.service.abstraction"; + DerivedStateProvider, + GlobalStateProvider, + StateProvider, +} from "@bitwarden/common/platform/state"; +// eslint-disable-next-line import/no-restricted-paths -- Used for dependency injection +import { InlineDerivedStateProvider } from "@bitwarden/common/platform/state/implementations/inline-derived-state"; +import { PrimarySecondaryStorageService } from "@bitwarden/common/platform/storage/primary-secondary-storage.service"; +import { WindowStorageService } from "@bitwarden/common/platform/storage/window-storage.service"; +import { SyncService } from "@bitwarden/common/platform/sync"; +import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { InternalSendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; -import { CipherFileUploadService } from "@bitwarden/common/vault/abstractions/file-upload/cipher-file-upload.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; import { - FolderService, + FolderService as FolderServiceAbstraction, InternalFolderService, } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; -import { PasswordRepromptService as PasswordRepromptServiceAbstraction } from "@bitwarden/common/vault/abstractions/password-reprompt.service"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { FolderApiService } from "@bitwarden/common/vault/services/folder/folder-api.service"; -import { DialogService } from "@bitwarden/components"; -import { VaultExportServiceAbstraction } from "@bitwarden/exporter/vault-export"; +import { TotpService as TotpServiceAbstraction } from "@bitwarden/common/vault/abstractions/totp.service"; +import { TotpService } from "@bitwarden/common/vault/services/totp.service"; +import { CompactModeService, DialogService, ToastService } from "@bitwarden/components"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; +import { + KdfConfigService, + KeyService, + BiometricStateService, + BiometricsService, +} from "@bitwarden/key-management"; +import { PasswordRepromptService } from "@bitwarden/vault"; -import { BrowserOrganizationService } from "../../admin-console/services/browser-organization.service"; -import { BrowserPolicyService } from "../../admin-console/services/browser-policy.service"; -import { UnauthGuardService } from "../../auth/popup/services"; -import { AutofillService } from "../../autofill/services/abstractions/autofill.service"; -import MainBackground from "../../background/main.background"; -import { Account } from "../../models/account"; +import { ForegroundLockService } from "../../auth/popup/accounts/foreground-lock.service"; +import { ExtensionAnonLayoutWrapperDataService } from "../../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; +import { ExtensionLoginComponentService } from "../../auth/popup/login/extension-login-component.service"; +import { AutofillService as AutofillServiceAbstraction } from "../../autofill/services/abstractions/autofill.service"; +import AutofillService from "../../autofill/services/autofill.service"; +import { InlineMenuFieldQualificationService } from "../../autofill/services/inline-menu-field-qualification.service"; +import { ForegroundBrowserBiometricsService } from "../../key-management/biometrics/foreground-browser-biometrics"; +import { BrowserKeyService } from "../../key-management/browser-key.service"; import { BrowserApi } from "../../platform/browser/browser-api"; -import { BrowserStateService as StateServiceAbstraction } from "../../platform/services/abstractions/browser-state.service"; -import { BrowserConfigService } from "../../platform/services/browser-config.service"; +import { runInsideAngular } from "../../platform/browser/run-inside-angular.operator"; +/* eslint-disable no-restricted-imports */ +import { ChromeMessageSender } from "../../platform/messaging/chrome-message.sender"; +/* eslint-enable no-restricted-imports */ +import { OffscreenDocumentService } from "../../platform/offscreen-document/abstractions/offscreen-document"; +import { DefaultOffscreenDocumentService } from "../../platform/offscreen-document/offscreen-document.service"; +import { PopupCompactModeService } from "../../platform/popup/layout/popup-compact-mode.service"; +import { BrowserFileDownloadService } from "../../platform/popup/services/browser-file-download.service"; +import { PopupViewCacheService } from "../../platform/popup/view-cache/popup-view-cache.service"; +import { ScriptInjectorService } from "../../platform/services/abstractions/script-injector.service"; import { BrowserEnvironmentService } from "../../platform/services/browser-environment.service"; -import { BrowserFileDownloadService } from "../../platform/services/browser-file-download.service"; -import { BrowserI18nService } from "../../platform/services/browser-i18n.service"; -import BrowserMessagingPrivateModePopupService from "../../platform/services/browser-messaging-private-mode-popup.service"; -import BrowserMessagingService from "../../platform/services/browser-messaging.service"; -import { BrowserStateService } from "../../platform/services/browser-state.service"; -import { BrowserSendService } from "../../services/browser-send.service"; -import { BrowserSettingsService } from "../../services/browser-settings.service"; -import { PasswordRepromptService } from "../../vault/popup/services/password-reprompt.service"; -import { BrowserFolderService } from "../../vault/services/browser-folder.service"; +import BrowserLocalStorageService from "../../platform/services/browser-local-storage.service"; +import BrowserMemoryStorageService from "../../platform/services/browser-memory-storage.service"; +import { BrowserScriptInjectorService } from "../../platform/services/browser-script-injector.service"; +import I18nService from "../../platform/services/i18n.service"; +import { ForegroundPlatformUtilsService } from "../../platform/services/platform-utils/foreground-platform-utils.service"; +import { BrowserSdkClientFactory } from "../../platform/services/sdk/browser-sdk-client-factory"; +import { ForegroundTaskSchedulerService } from "../../platform/services/task-scheduler/foreground-task-scheduler.service"; +import { BrowserStorageServiceProvider } from "../../platform/storage/browser-storage-service.provider"; +import { ForegroundMemoryStorageService } from "../../platform/storage/foreground-memory-storage.service"; +import { ForegroundSyncService } from "../../platform/sync/foreground-sync.service"; +import { fromChromeRuntimeMessaging } from "../../platform/utils/from-chrome-runtime-messaging"; +import { ExtensionLockComponentService } from "../../services/extension-lock-component.service"; +import { ForegroundVaultTimeoutService } from "../../services/vault-timeout/foreground-vault-timeout.service"; +import { BrowserSendStateService } from "../../tools/popup/services/browser-send-state.service"; +import { FilePopoutUtilsService } from "../../tools/popup/services/file-popout-utils.service"; +import { Fido2UserVerificationService } from "../../vault/services/fido2-user-verification.service"; +import { VaultBrowserStateService } from "../../vault/services/vault-browser-state.service"; import { VaultFilterService } from "../../vault/services/vault-filter.service"; -import { DebounceNavigationService } from "./debounceNavigationService"; +import { DebounceNavigationService } from "./debounce-navigation.service"; import { InitService } from "./init.service"; -import { PopupSearchService } from "./popup-search.service"; -import { PopupUtilsService } from "./popup-utils.service"; +import { PopupCloseWarningService } from "./popup-close-warning.service"; -const needsBackgroundInit = BrowserApi.getBackgroundPage() == null; -const isPrivateMode = needsBackgroundInit && BrowserApi.manifestVersion !== 3; -const mainBackground: MainBackground = needsBackgroundInit - ? createLocalBgService() - : BrowserApi.getBackgroundPage().bitwardenMain; +const OBSERVABLE_LARGE_OBJECT_MEMORY_STORAGE = new SafeInjectionToken< + AbstractStorageService & ObservableStorageService +>("OBSERVABLE_LARGE_OBJECT_MEMORY_STORAGE"); -function createLocalBgService() { - const localBgService = new MainBackground(isPrivateMode); - localBgService.bootstrap(); - return localBgService; -} +const DISK_BACKUP_LOCAL_STORAGE = new SafeInjectionToken< + AbstractStorageService & ObservableStorageService +>("DISK_BACKUP_LOCAL_STORAGE"); -function getBgService(service: keyof MainBackground) { - return (): T => { - return mainBackground ? (mainBackground[service] as any as T) : null; - }; -} +/** + * Provider definitions used in the ngModule. + * Add your provider definition here using the safeProvider function as a wrapper. This will give you type safety. + * If you need help please ask for it, do NOT change the type of this array. + */ +const safeProviders: SafeProvider[] = [ + safeProvider(InitService), + safeProvider(DebounceNavigationService), + safeProvider(DialogService), + safeProvider(PopupCloseWarningService), + safeProvider(InlineMenuFieldQualificationService), + safeProvider({ + provide: DEFAULT_VAULT_TIMEOUT, + useValue: VaultTimeoutStringType.OnRestart, + }), + safeProvider({ + provide: APP_INITIALIZER as SafeInjectionToken<() => Promise>, + useFactory: (initService: InitService) => initService.init(), + deps: [InitService], + multi: true, + }), + safeProvider({ + provide: CryptoFunctionService, + useFactory: () => new WebCryptoFunctionService(window), + deps: [], + }), + safeProvider({ + provide: LogService, + useFactory: () => { + const isDev = process.env.ENV === "development"; + return new ConsoleLogService(isDev); + }, + deps: [], + }), + safeProvider({ + provide: EnvironmentService, + useExisting: BrowserEnvironmentService, + }), + safeProvider({ + provide: BrowserEnvironmentService, + useClass: BrowserEnvironmentService, + deps: [LogService, StateProvider, AccountServiceAbstraction, ENV_ADDITIONAL_REGIONS], + }), + safeProvider({ + provide: I18nServiceAbstraction, + useFactory: (globalStateProvider: GlobalStateProvider) => { + return new I18nService(BrowserApi.getUILanguage(), globalStateProvider); + }, + deps: [GlobalStateProvider], + }), + safeProvider({ + provide: KeyService, + useFactory: ( + pinService: PinServiceAbstraction, + masterPasswordService: InternalMasterPasswordServiceAbstraction, + keyGenerationService: KeyGenerationService, + cryptoFunctionService: CryptoFunctionService, + encryptService: EncryptService, + platformUtilsService: PlatformUtilsService, + logService: LogService, + stateService: StateService, + accountService: AccountServiceAbstraction, + stateProvider: StateProvider, + biometricStateService: BiometricStateService, + biometricsService: BiometricsService, + kdfConfigService: KdfConfigService, + ) => { + const keyService = new BrowserKeyService( + pinService, + masterPasswordService, + keyGenerationService, + cryptoFunctionService, + encryptService, + platformUtilsService, + logService, + stateService, + accountService, + stateProvider, + biometricStateService, + biometricsService, + kdfConfigService, + ); + new ContainerService(keyService, encryptService).attachToGlobal(self); + return keyService; + }, + deps: [ + PinServiceAbstraction, + InternalMasterPasswordServiceAbstraction, + KeyGenerationService, + CryptoFunctionService, + EncryptService, + PlatformUtilsService, + LogService, + StateService, + AccountServiceAbstraction, + StateProvider, + BiometricStateService, + BiometricsService, + KdfConfigService, + ], + }), + safeProvider({ + provide: TotpServiceAbstraction, + useClass: TotpService, + deps: [CryptoFunctionService, LogService], + }), + safeProvider({ + provide: OffscreenDocumentService, + useClass: DefaultOffscreenDocumentService, + deps: [LogService], + }), + safeProvider({ + provide: PlatformUtilsService, + useFactory: ( + toastService: ToastService, + offscreenDocumentService: OffscreenDocumentService, + ) => { + return new ForegroundPlatformUtilsService( + toastService, + (clipboardValue: string, clearMs: number) => { + void BrowserApi.sendMessage("clearClipboard", { clipboardValue, clearMs }); + }, + window, + offscreenDocumentService, + ); + }, + deps: [ToastService, OffscreenDocumentService], + }), + safeProvider({ + provide: BiometricsService, + useFactory: () => { + return new ForegroundBrowserBiometricsService(); + }, + deps: [], + }), + safeProvider({ + provide: SyncService, + useClass: ForegroundSyncService, + deps: [ + StateService, + InternalFolderService, + FolderApiServiceAbstraction, + MessageSender, + LogService, + CipherService, + CollectionService, + ApiService, + AccountServiceAbstraction, + AuthService, + InternalSendService, + SendApiService, + MessageListener, + StateProvider, + ], + }), + safeProvider({ + provide: DomainSettingsService, + useClass: DefaultDomainSettingsService, + deps: [StateProvider], + }), + safeProvider({ + provide: AbstractStorageService, + useClass: BrowserLocalStorageService, + deps: [LogService], + }), + safeProvider({ + provide: AutofillServiceAbstraction, + useExisting: AutofillService, + }), + safeProvider({ + provide: ViewCacheService, + useExisting: PopupViewCacheService, + deps: [], + }), + safeProvider({ + provide: AutofillService, + deps: [ + CipherService, + AutofillSettingsServiceAbstraction, + TotpServiceAbstraction, + EventCollectionServiceAbstraction, + LogService, + DomainSettingsService, + UserVerificationService, + BillingAccountProfileStateService, + ScriptInjectorService, + AccountServiceAbstraction, + AuthService, + ConfigService, + UserNotificationSettingsServiceAbstraction, + MessageListener, + ], + }), + safeProvider({ + provide: ScriptInjectorService, + useClass: BrowserScriptInjectorService, + deps: [PlatformUtilsService, LogService], + }), + safeProvider({ + provide: VaultTimeoutService, + useClass: ForegroundVaultTimeoutService, + deps: [MessagingServiceAbstraction], + }), + safeProvider({ + provide: VaultFilterService, + useClass: VaultFilterService, + deps: [ + OrganizationService, + FolderServiceAbstraction, + CipherService, + CollectionService, + PolicyService, + StateProvider, + AccountServiceAbstraction, + ], + }), + safeProvider({ + provide: SECURE_STORAGE, + useExisting: AbstractStorageService, // Secure storage is not available in the browser, so we use normal storage instead and warn users when it is used. + }), + safeProvider({ + provide: MEMORY_STORAGE, + useFactory: (memoryStorage: AbstractStorageService) => memoryStorage, + deps: [OBSERVABLE_MEMORY_STORAGE], + }), + safeProvider({ + provide: OBSERVABLE_MEMORY_STORAGE, + useFactory: () => { + if (BrowserApi.isManifestVersion(2)) { + return new ForegroundMemoryStorageService(); + } + + return new BrowserMemoryStorageService(); + }, + deps: [], + }), + safeProvider({ + provide: OBSERVABLE_LARGE_OBJECT_MEMORY_STORAGE, + useFactory: ( + regularMemoryStorageService: AbstractStorageService & ObservableStorageService, + ) => { + if (BrowserApi.isManifestVersion(2)) { + return regularMemoryStorageService; + } + + return new ForegroundMemoryStorageService(); + }, + deps: [OBSERVABLE_MEMORY_STORAGE], + }), + safeProvider({ + provide: OBSERVABLE_DISK_STORAGE, + useExisting: AbstractStorageService, + }), + safeProvider({ + provide: VaultBrowserStateService, + useFactory: (stateProvider: StateProvider) => { + return new VaultBrowserStateService(stateProvider); + }, + deps: [StateProvider], + }), + safeProvider({ + provide: FileDownloadService, + useClass: BrowserFileDownloadService, + deps: [], + }), + safeProvider({ + provide: SYSTEM_THEME_OBSERVABLE, + useFactory: (platformUtilsService: PlatformUtilsService) => { + // Safari doesn't properly handle the (prefers-color-scheme) media query in the popup window, it always returns light. + // This means we have to use the background page instead, which comes with limitations like not dynamically + // changing the extension theme when the system theme is changed. We also have issues with memory leaks when + // holding the reference to the background page. + const backgroundWindow = BrowserApi.getBackgroundPage(); + if (platformUtilsService.isSafari() && backgroundWindow) { + return of(AngularThemingService.getSystemThemeFromWindow(backgroundWindow)); + } else { + return AngularThemingService.createSystemThemeFromWindow(window); + } + }, + deps: [PlatformUtilsService], + }), + safeProvider({ + provide: FilePopoutUtilsService, + useFactory: (platformUtilsService: PlatformUtilsService) => { + return new FilePopoutUtilsService(platformUtilsService); + }, + deps: [PlatformUtilsService], + }), + safeProvider({ + provide: DerivedStateProvider, + useClass: InlineDerivedStateProvider, + deps: [], + }), + safeProvider({ + provide: AutofillSettingsServiceAbstraction, + useClass: AutofillSettingsService, + deps: [StateProvider, PolicyService], + }), + safeProvider({ + provide: UserNotificationSettingsServiceAbstraction, + useClass: UserNotificationSettingsService, + deps: [StateProvider], + }), + safeProvider({ + provide: BrowserSendStateService, + useClass: BrowserSendStateService, + deps: [StateProvider], + }), + safeProvider({ + provide: MessageListener, + useFactory: (subject: Subject>>, ngZone: NgZone) => + new MessageListener( + merge( + subject.asObservable(), // For messages in the same context + fromChromeRuntimeMessaging().pipe(runInsideAngular(ngZone)), // For messages in the same context + ), + ), + deps: [INTRAPROCESS_MESSAGING_SUBJECT, NgZone], + }), + safeProvider({ + provide: MessageSender, + useFactory: (subject: Subject>>, logService: LogService) => + MessageSender.combine( + new SubjectMessageSender(subject), // For sending messages in the same context + new ChromeMessageSender(logService), // For sending messages to different contexts + ), + deps: [INTRAPROCESS_MESSAGING_SUBJECT, LogService], + }), + safeProvider({ + provide: INTRAPROCESS_MESSAGING_SUBJECT, + useFactory: () => new Subject>>(), + deps: [], + }), + safeProvider({ + provide: MessageSender, + useFactory: (subject: Subject>>, logService: LogService) => + MessageSender.combine( + new SubjectMessageSender(subject), // For sending messages in the same context + new ChromeMessageSender(logService), // For sending messages to different contexts + ), + deps: [INTRAPROCESS_MESSAGING_SUBJECT, LogService], + }), + safeProvider({ + provide: DISK_BACKUP_LOCAL_STORAGE, + useFactory: (diskStorage: AbstractStorageService & ObservableStorageService) => + new PrimarySecondaryStorageService(diskStorage, new WindowStorageService(self.localStorage)), + deps: [OBSERVABLE_DISK_STORAGE], + }), + safeProvider({ + provide: StorageServiceProvider, + useClass: BrowserStorageServiceProvider, + deps: [ + OBSERVABLE_DISK_STORAGE, + OBSERVABLE_MEMORY_STORAGE, + OBSERVABLE_LARGE_OBJECT_MEMORY_STORAGE, + DISK_BACKUP_LOCAL_STORAGE, + ], + }), + safeProvider({ + provide: CLIENT_TYPE, + useValue: ClientType.Browser, + }), + safeProvider({ + provide: LockComponentService, + useClass: ExtensionLockComponentService, + deps: [], + }), + safeProvider({ + provide: Fido2UserVerificationService, + useClass: Fido2UserVerificationService, + deps: [PasswordRepromptService, UserVerificationService, DialogService], + }), + safeProvider({ + provide: AnimationControlService, + useClass: DefaultAnimationControlService, + deps: [GlobalStateProvider], + }), + safeProvider({ + provide: TaskSchedulerService, + useExisting: ForegroundTaskSchedulerService, + }), + safeProvider({ + provide: ForegroundTaskSchedulerService, + useClass: ForegroundTaskSchedulerService, + deps: [LogService, StateProvider], + }), + safeProvider({ + provide: AnonLayoutWrapperDataService, + useExisting: ExtensionAnonLayoutWrapperDataService, + deps: [], + }), + safeProvider({ + provide: LoginComponentService, + useClass: ExtensionLoginComponentService, + deps: [ + CryptoFunctionService, + EnvironmentService, + PasswordGenerationServiceAbstraction, + PlatformUtilsService, + SsoLoginServiceAbstraction, + ExtensionAnonLayoutWrapperDataService, + ], + }), + safeProvider({ + provide: LockService, + useClass: ForegroundLockService, + deps: [MessageSender, MessageListener], + }), + safeProvider({ + provide: SdkClientFactory, + useClass: flagEnabled("sdk") ? BrowserSdkClientFactory : NoopSdkClientFactory, + deps: [], + }), + safeProvider({ + provide: LoginEmailService, + useClass: LoginEmailService, + deps: [AccountService, AuthService, StateProvider], + }), + safeProvider({ + provide: ExtensionAnonLayoutWrapperDataService, + useClass: ExtensionAnonLayoutWrapperDataService, + deps: [], + }), + safeProvider({ + provide: CompactModeService, + useExisting: PopupCompactModeService, + deps: [], + }), +]; @NgModule({ imports: [JslibServicesModule], declarations: [], - providers: [ - InitService, - DebounceNavigationService, - DialogService, - { - provide: LOCALE_ID, - useFactory: () => getBgService("i18nService")().translationLocale, - deps: [], - }, - { - provide: APP_INITIALIZER, - useFactory: (initService: InitService) => initService.init(), - deps: [InitService], - multi: true, - }, - { provide: BaseUnauthGuardService, useClass: UnauthGuardService }, - { provide: PopupUtilsService, useFactory: () => new PopupUtilsService(isPrivateMode) }, - { - provide: MessagingService, - useFactory: () => { - return needsBackgroundInit - ? new BrowserMessagingPrivateModePopupService() - : new BrowserMessagingService(); - }, - }, - { - provide: TwoFactorService, - useFactory: getBgService("twoFactorService"), - deps: [], - }, - { - provide: AuthServiceAbstraction, - useFactory: getBgService("authService"), - deps: [], - }, - { - provide: SearchServiceAbstraction, - useFactory: (logService: ConsoleLogService, i18nService: I18nServiceAbstraction) => { - return new PopupSearchService( - getBgService("searchService")(), - logService, - i18nService - ); - }, - deps: [LogServiceAbstraction, I18nServiceAbstraction], - }, - { provide: AuditService, useFactory: getBgService("auditService"), deps: [] }, - { - provide: CipherFileUploadService, - useFactory: getBgService("cipherFileUploadService"), - deps: [], - }, - { provide: CipherService, useFactory: getBgService("cipherService"), deps: [] }, - { - provide: CryptoFunctionService, - useFactory: getBgService("cryptoFunctionService"), - deps: [], - }, - { - provide: FileUploadService, - useFactory: getBgService("fileUploadService"), - }, - { - provide: FolderService, - useFactory: ( - cryptoService: CryptoService, - i18nService: I18nServiceAbstraction, - cipherService: CipherService, - stateService: StateServiceAbstraction - ) => { - return new BrowserFolderService(cryptoService, i18nService, cipherService, stateService); - }, - deps: [CryptoService, I18nServiceAbstraction, CipherService, StateServiceAbstraction], - }, - { - provide: InternalFolderService, - useExisting: FolderService, - }, - { - provide: FolderApiServiceAbstraction, - useFactory: (folderService: InternalFolderService, apiService: ApiService) => { - return new FolderApiService(folderService, apiService); - }, - deps: [InternalFolderService, ApiService], - }, - { - provide: CollectionService, - useFactory: getBgService("collectionService"), - deps: [], - }, - { - provide: LogServiceAbstraction, - useFactory: getBgService("logService"), - deps: [], - }, - { - provide: BrowserEnvironmentService, - useExisting: EnvironmentService, - }, - { - provide: EnvironmentService, - useFactory: getBgService("environmentService"), - deps: [], - }, - { provide: TotpService, useFactory: getBgService("totpService"), deps: [] }, - { provide: TokenService, useFactory: getBgService("tokenService"), deps: [] }, - { - provide: I18nServiceAbstraction, - useFactory: (stateService: BrowserStateService) => { - return new BrowserI18nService(BrowserApi.getUILanguage(window), stateService); - }, - deps: [StateService], - }, - { - provide: CryptoService, - useFactory: (encryptService: EncryptService) => { - const cryptoService = getBgService("cryptoService")(); - new ContainerService(cryptoService, encryptService).attachToGlobal(self); - return cryptoService; - }, - deps: [EncryptService], - }, - { - provide: AuthRequestCryptoServiceAbstraction, - useFactory: getBgService("authRequestCryptoService"), - deps: [], - }, - { - provide: DeviceTrustCryptoServiceAbstraction, - useFactory: getBgService("deviceTrustCryptoService"), - deps: [], - }, - { - provide: DevicesServiceAbstraction, - useFactory: getBgService("devicesService"), - deps: [], - }, - { - provide: EventUploadService, - useFactory: getBgService("eventUploadService"), - deps: [], - }, - { - provide: EventCollectionService, - useFactory: getBgService("eventCollectionService"), - deps: [], - }, - { - provide: PolicyService, - useFactory: ( - stateService: StateServiceAbstraction, - organizationService: OrganizationService - ) => { - return new BrowserPolicyService(stateService, organizationService); - }, - deps: [StateServiceAbstraction, OrganizationService], - }, - { - provide: PolicyApiServiceAbstraction, - useFactory: ( - policyService: InternalPolicyService, - apiService: ApiService, - stateService: StateService - ) => { - return new PolicyApiService(policyService, apiService, stateService); - }, - deps: [InternalPolicyService, ApiService, StateService], - }, - { - provide: PlatformUtilsService, - useFactory: getBgService("platformUtilsService"), - deps: [], - }, - { - provide: PasswordStrengthServiceAbstraction, - useFactory: getBgService("passwordStrengthService"), - deps: [], - }, - { - provide: PasswordGenerationServiceAbstraction, - useFactory: getBgService("passwordGenerationService"), - deps: [], - }, - { provide: ApiService, useFactory: getBgService("apiService"), deps: [] }, - { - provide: SendService, - useFactory: ( - cryptoService: CryptoService, - i18nService: I18nServiceAbstraction, - cryptoFunctionService: CryptoFunctionService, - stateServiceAbstraction: StateServiceAbstraction - ) => { - return new BrowserSendService( - cryptoService, - i18nService, - cryptoFunctionService, - stateServiceAbstraction - ); - }, - deps: [CryptoService, I18nServiceAbstraction, CryptoFunctionService, StateServiceAbstraction], - }, - { - provide: InternalSendServiceAbstraction, - useExisting: SendService, - }, - { - provide: SendApiServiceAbstraction, - useFactory: ( - apiService: ApiService, - fileUploadService: FileUploadService, - sendService: InternalSendServiceAbstraction - ) => { - return new SendApiService(apiService, fileUploadService, sendService); - }, - deps: [ApiService, FileUploadService, InternalSendServiceAbstraction], - }, - { provide: SyncService, useFactory: getBgService("syncService"), deps: [] }, - { - provide: SettingsService, - useFactory: (stateService: StateServiceAbstraction) => { - return new BrowserSettingsService(stateService); - }, - deps: [StateServiceAbstraction], - }, - { - provide: AbstractStorageService, - useFactory: getBgService("storageService"), - deps: [], - }, - { provide: AppIdService, useFactory: getBgService("appIdService"), deps: [] }, - { - provide: AutofillService, - useFactory: getBgService("autofillService"), - deps: [], - }, - { - provide: VaultExportServiceAbstraction, - useFactory: getBgService("exportService"), - deps: [], - }, - { - provide: KeyConnectorService, - useFactory: getBgService("keyConnectorService"), - deps: [], - }, - { - provide: UserVerificationService, - useFactory: getBgService("userVerificationService"), - deps: [], - }, - { - provide: VaultTimeoutSettingsService, - useFactory: getBgService("vaultTimeoutSettingsService"), - deps: [], - }, - { - provide: VaultTimeoutService, - useFactory: getBgService("vaultTimeoutService"), - deps: [], - }, - { - provide: NotificationsService, - useFactory: getBgService("notificationsService"), - deps: [], - }, - { - provide: LogServiceAbstraction, - useFactory: getBgService("logService"), - deps: [], - }, - { provide: PasswordRepromptServiceAbstraction, useClass: PasswordRepromptService }, - { - provide: OrganizationService, - useFactory: (stateService: StateServiceAbstraction) => { - return new BrowserOrganizationService(stateService); - }, - deps: [StateServiceAbstraction], - }, - { - provide: VaultFilterService, - useFactory: ( - stateService: StateServiceAbstraction, - organizationService: OrganizationService, - folderService: FolderService, - policyService: PolicyService - ) => { - return new VaultFilterService( - stateService, - organizationService, - folderService, - getBgService("cipherService")(), - getBgService("collectionService")(), - policyService - ); - }, - deps: [StateServiceAbstraction, OrganizationService, FolderService, PolicyService], - }, - { - provide: ProviderService, - useFactory: getBgService("providerService"), - deps: [], - }, - { - provide: SECURE_STORAGE, - useFactory: getBgService("secureStorageService"), - deps: [], - }, - { - provide: MEMORY_STORAGE, - useFactory: getBgService("memoryStorageService"), - }, - { - provide: StateServiceAbstraction, - useFactory: ( - storageService: AbstractStorageService, - secureStorageService: AbstractStorageService, - memoryStorageService: AbstractMemoryStorageService, - logService: LogServiceAbstraction - ) => { - return new BrowserStateService( - storageService, - secureStorageService, - memoryStorageService, - logService, - new StateFactory(GlobalState, Account) - ); - }, - deps: [AbstractStorageService, SECURE_STORAGE, MEMORY_STORAGE, LogServiceAbstraction], - }, - { - provide: UsernameGenerationServiceAbstraction, - useFactory: getBgService("usernameGenerationService"), - deps: [], - }, - { - provide: BaseStateServiceAbstraction, - useExisting: StateServiceAbstraction, - deps: [], - }, - { - provide: FileDownloadService, - useClass: BrowserFileDownloadService, - }, - { - provide: LoginServiceAbstraction, - useClass: LoginService, - deps: [StateServiceAbstraction], - }, - { - provide: AbstractThemingService, - useFactory: ( - stateService: StateServiceAbstraction, - platformUtilsService: PlatformUtilsService - ) => { - return new ThemingService( - stateService, - // Safari doesn't properly handle the (prefers-color-scheme) media query in the popup window, it always returns light. - // In Safari we have to use the background page instead, which comes with limitations like not dynamically changing the extension theme when the system theme is changed. - platformUtilsService.isSafari() ? getBgService("backgroundWindow")() : window, - document - ); - }, - deps: [StateServiceAbstraction, PlatformUtilsService], - }, - { - provide: ConfigService, - useClass: BrowserConfigService, - deps: [ - StateServiceAbstraction, - ConfigApiServiceAbstraction, - AuthServiceAbstraction, - EnvironmentService, - LogService, - ], - }, - ], + // Do not register your dependency here! Add it to the typesafeProviders array using the helper function + providers: safeProviders, }) export class ServicesModule {} diff --git a/apps/browser/src/popup/settings/about.component.html b/apps/browser/src/popup/settings/about.component.html deleted file mode 100644 index b68f592492f..00000000000 --- a/apps/browser/src/popup/settings/about.component.html +++ /dev/null @@ -1,46 +0,0 @@ - -
- -
-
Bitwarden
-
-

© Bitwarden Inc. 2015-{{ year }}

-

{{ "version" | i18n }}: {{ version }}

- -

- {{ "serverVersion" | i18n }}: {{ this.serverConfig?.version }} - - ({{ "lastSeenOn" | i18n : (serverConfig.utcDate | date : "mediumDate") }}) - -

- - - -

- {{ "serverVersion" | i18n }} ({{ "thirdParty" | i18n }}): - {{ this.serverConfig?.version }} - - ({{ "lastSeenOn" | i18n : (serverConfig.utcDate | date : "mediumDate") }}) - -

-
- {{ "thirdPartyServerMessage" | i18n : serverConfig.server?.name }} -
-
- -

- {{ "serverVersion" | i18n }} ({{ "selfHostedServer" | i18n }}): - {{ this.serverConfig?.version }} - - ({{ "lastSeenOn" | i18n : (serverConfig.utcDate | date : "mediumDate") }}) - -

-
-
-
-
- -
-
diff --git a/apps/browser/src/popup/settings/about.component.ts b/apps/browser/src/popup/settings/about.component.ts deleted file mode 100644 index c0c9012f341..00000000000 --- a/apps/browser/src/popup/settings/about.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { CommonModule } from "@angular/common"; -import { Component } from "@angular/core"; -import { Observable } from "rxjs"; - -import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; -import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { ButtonModule, DialogModule } from "@bitwarden/components"; - -import { BrowserApi } from "../../platform/browser/browser-api"; - -@Component({ - templateUrl: "about.component.html", - standalone: true, - imports: [CommonModule, JslibModule, DialogModule, ButtonModule], -}) -export class AboutComponent { - protected serverConfig$: Observable = this.configService.serverConfig$; - - protected year = new Date().getFullYear(); - protected version = BrowserApi.getApplicationVersion(); - protected isCloud = this.environmentService.isCloud(); - - constructor( - private configService: ConfigServiceAbstraction, - private environmentService: EnvironmentService - ) {} -} diff --git a/apps/browser/src/popup/settings/autofill.component.html b/apps/browser/src/popup/settings/autofill.component.html deleted file mode 100644 index 21ad160d067..00000000000 --- a/apps/browser/src/popup/settings/autofill.component.html +++ /dev/null @@ -1,100 +0,0 @@ -
-
- -
-

- {{ "autofill" | i18n }} -

-
-
-
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
- -
- -
-
diff --git a/apps/browser/src/popup/settings/autofill.component.ts b/apps/browser/src/popup/settings/autofill.component.ts deleted file mode 100644 index 477c0592664..00000000000 --- a/apps/browser/src/popup/settings/autofill.component.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Component, OnInit } from "@angular/core"; - -import { UriMatchType } from "@bitwarden/common/enums"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; - -import { BrowserApi } from "../../platform/browser/browser-api"; - -@Component({ - selector: "app-autofill", - templateUrl: "autofill.component.html", -}) -export class AutofillComponent implements OnInit { - enableAutoFillOnPageLoad = false; - autoFillOnPageLoadDefault = false; - autoFillOnPageLoadOptions: any[]; - defaultUriMatch = UriMatchType.Domain; - uriMatchOptions: any[]; - autofillKeyboardHelperText: string; - - constructor( - private stateService: StateService, - private i18nService: I18nService, - private platformUtilsService: PlatformUtilsService - ) { - this.autoFillOnPageLoadOptions = [ - { name: i18nService.t("autoFillOnPageLoadYes"), value: true }, - { name: i18nService.t("autoFillOnPageLoadNo"), value: false }, - ]; - this.uriMatchOptions = [ - { name: i18nService.t("baseDomain"), value: UriMatchType.Domain }, - { name: i18nService.t("host"), value: UriMatchType.Host }, - { name: i18nService.t("startsWith"), value: UriMatchType.StartsWith }, - { name: i18nService.t("regEx"), value: UriMatchType.RegularExpression }, - { name: i18nService.t("exact"), value: UriMatchType.Exact }, - { name: i18nService.t("never"), value: UriMatchType.Never }, - ]; - } - - async ngOnInit() { - this.enableAutoFillOnPageLoad = await this.stateService.getEnableAutoFillOnPageLoad(); - - this.autoFillOnPageLoadDefault = - (await this.stateService.getAutoFillOnPageLoadDefault()) ?? true; - - const defaultUriMatch = await this.stateService.getDefaultUriMatch(); - this.defaultUriMatch = defaultUriMatch == null ? UriMatchType.Domain : defaultUriMatch; - - const command = await this.platformUtilsService.getAutofillKeyboardShortcut(); - await this.setAutofillKeyboardHelperText(command); - } - - async updateAutoFillOnPageLoad() { - await this.stateService.setEnableAutoFillOnPageLoad(this.enableAutoFillOnPageLoad); - } - - async updateAutoFillOnPageLoadDefault() { - await this.stateService.setAutoFillOnPageLoadDefault(this.autoFillOnPageLoadDefault); - } - - async saveDefaultUriMatch() { - await this.stateService.setDefaultUriMatch(this.defaultUriMatch); - } - - private async setAutofillKeyboardHelperText(command: string) { - if (command) { - this.autofillKeyboardHelperText = this.i18nService.t("autofillShortcutText", command); - } else { - this.autofillKeyboardHelperText = this.i18nService.t("autofillShortcutNotSet"); - } - } - - async commandSettings() { - if (this.platformUtilsService.isChrome()) { - BrowserApi.createNewTab("chrome://extensions/shortcuts"); - } else if (this.platformUtilsService.isOpera()) { - BrowserApi.createNewTab("opera://extensions/shortcuts"); - } else if (this.platformUtilsService.isEdge()) { - BrowserApi.createNewTab("edge://extensions/shortcuts"); - } else if (this.platformUtilsService.isVivaldi()) { - BrowserApi.createNewTab("vivaldi://extensions/shortcuts"); - } else { - BrowserApi.createNewTab("https://bitwarden.com/help/keyboard-shortcuts"); - } - } -} diff --git a/apps/browser/src/popup/settings/excluded-domains.component.html b/apps/browser/src/popup/settings/excluded-domains.component.html deleted file mode 100644 index 87a3f0a042b..00000000000 --- a/apps/browser/src/popup/settings/excluded-domains.component.html +++ /dev/null @@ -1,87 +0,0 @@ -
-
-
- -
-

- {{ "excludedDomains" | i18n }} -

-
- -
-
-
-
-
- -
- -
- - - - -
-
- -
-
-
- -
- -
-
-
diff --git a/apps/browser/src/popup/settings/excluded-domains.component.ts b/apps/browser/src/popup/settings/excluded-domains.component.ts deleted file mode 100644 index 7adedd72240..00000000000 --- a/apps/browser/src/popup/settings/excluded-domains.component.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { Component, NgZone, OnDestroy, OnInit } from "@angular/core"; -import { Router } from "@angular/router"; - -import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; - -import { BrowserApi } from "../../platform/browser/browser-api"; - -interface ExcludedDomain { - uri: string; - showCurrentUris: boolean; -} - -const BroadcasterSubscriptionId = "excludedDomains"; - -@Component({ - selector: "app-excluded-domains", - templateUrl: "excluded-domains.component.html", -}) -export class ExcludedDomainsComponent implements OnInit, OnDestroy { - excludedDomains: ExcludedDomain[] = []; - existingExcludedDomains: ExcludedDomain[] = []; - currentUris: string[]; - loadCurrentUrisTimeout: number; - - constructor( - private stateService: StateService, - private i18nService: I18nService, - private router: Router, - private broadcasterService: BroadcasterService, - private ngZone: NgZone, - private platformUtilsService: PlatformUtilsService - ) {} - - async ngOnInit() { - const savedDomains = await this.stateService.getNeverDomains(); - if (savedDomains) { - for (const uri of Object.keys(savedDomains)) { - this.excludedDomains.push({ uri: uri, showCurrentUris: false }); - this.existingExcludedDomains.push({ uri: uri, showCurrentUris: false }); - } - } - - await this.loadCurrentUris(); - - this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message: any) => { - this.ngZone.run(async () => { - switch (message.command) { - case "tabChanged": - case "windowChanged": - if (this.loadCurrentUrisTimeout != null) { - window.clearTimeout(this.loadCurrentUrisTimeout); - } - this.loadCurrentUrisTimeout = window.setTimeout( - async () => await this.loadCurrentUris(), - 500 - ); - break; - default: - break; - } - }); - }); - } - - ngOnDestroy() { - this.broadcasterService.unsubscribe(BroadcasterSubscriptionId); - } - - async addUri() { - this.excludedDomains.push({ uri: "", showCurrentUris: false }); - } - - async removeUri(i: number) { - this.excludedDomains.splice(i, 1); - } - - async submit() { - const savedDomains: { [name: string]: null } = {}; - const newExcludedDomains = this.getNewlyAddedDomains(this.excludedDomains); - for (const domain of this.excludedDomains) { - const resp = newExcludedDomains.filter((e) => e.uri === domain.uri); - if (resp.length === 0) { - savedDomains[domain.uri] = null; - } else { - if (domain.uri && domain.uri !== "") { - const validDomain = Utils.getHostname(domain.uri); - if (!validDomain) { - this.platformUtilsService.showToast( - "error", - null, - this.i18nService.t("excludedDomainsInvalidDomain", domain.uri) - ); - return; - } - savedDomains[validDomain] = null; - } - } - } - - await this.stateService.setNeverDomains(savedDomains); - this.router.navigate(["/tabs/settings"]); - } - - trackByFunction(index: number, item: any) { - return index; - } - - getNewlyAddedDomains(domain: ExcludedDomain[]): ExcludedDomain[] { - const result = this.excludedDomains.filter( - (newDomain) => - !this.existingExcludedDomains.some((oldDomain) => newDomain.uri === oldDomain.uri) - ); - return result; - } - - toggleUriInput(domain: ExcludedDomain) { - domain.showCurrentUris = !domain.showCurrentUris; - } - - async loadCurrentUris() { - const tabs = await BrowserApi.tabsQuery({ windowType: "normal" }); - if (tabs) { - const uriSet = new Set(tabs.map((tab) => Utils.getHostname(tab.url))); - uriSet.delete(null); - this.currentUris = Array.from(uriSet); - } - } -} diff --git a/apps/browser/src/popup/settings/folders.component.html b/apps/browser/src/popup/settings/folders.component.html deleted file mode 100644 index 5052501d572..00000000000 --- a/apps/browser/src/popup/settings/folders.component.html +++ /dev/null @@ -1,34 +0,0 @@ -
-
- -
-

- {{ "folders" | i18n }} -

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

{{ "noFolders" | i18n }}

-
-
diff --git a/apps/browser/src/popup/settings/folders.component.ts b/apps/browser/src/popup/settings/folders.component.ts deleted file mode 100644 index cae5d6f5106..00000000000 --- a/apps/browser/src/popup/settings/folders.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component } from "@angular/core"; -import { Router } from "@angular/router"; -import { map, Observable } from "rxjs"; - -import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; -import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; - -@Component({ - selector: "app-folders", - templateUrl: "folders.component.html", -}) -export class FoldersComponent { - folders$: Observable; - - constructor(private folderService: FolderService, private router: Router) { - this.folders$ = this.folderService.folderViews$.pipe( - map((folders) => { - if (folders.length > 0) { - folders = folders.slice(0, folders.length - 1); - } - - return folders; - }) - ); - } - - folderSelected(folder: FolderView) { - this.router.navigate(["/edit-folder"], { queryParams: { folderId: folder.id } }); - } - - addFolder() { - this.router.navigate(["/add-folder"]); - } -} diff --git a/apps/browser/src/popup/settings/help-and-feedback.component.html b/apps/browser/src/popup/settings/help-and-feedback.component.html deleted file mode 100644 index f2cbfa93555..00000000000 --- a/apps/browser/src/popup/settings/help-and-feedback.component.html +++ /dev/null @@ -1,54 +0,0 @@ -
-
- -
-

- {{ "helpFeedback" | i18n }} -

-
-
-
-
-
- - - -
-
-
diff --git a/apps/browser/src/popup/settings/help-and-feedback.component.ts b/apps/browser/src/popup/settings/help-and-feedback.component.ts deleted file mode 100644 index 0ff9887353c..00000000000 --- a/apps/browser/src/popup/settings/help-and-feedback.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component } from "@angular/core"; - -import { BrowserApi } from "../../platform/browser/browser-api"; - -@Component({ - selector: "app-help-and-feedback", - templateUrl: "help-and-feedback.component.html", -}) -export class HelpAndFeedbackComponent { - launchHelp() { - BrowserApi.createNewTab("https://bitwarden.com/help/"); - } - launchContactForm() { - BrowserApi.createNewTab("https://bitwarden.com/contact/"); - } - - launchForums() { - BrowserApi.createNewTab("https://bitwarden.com/getinvolved/"); - } -} diff --git a/apps/browser/src/popup/settings/options.component.html b/apps/browser/src/popup/settings/options.component.html deleted file mode 100644 index a356be5f735..00000000000 --- a/apps/browser/src/popup/settings/options.component.html +++ /dev/null @@ -1,212 +0,0 @@ -
-
- -
-

- {{ "options" | i18n }} -

-
-
-
-
-

- -

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

- -

-
- -
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
-
- - -
-
- -
-
-
diff --git a/apps/browser/src/popup/settings/options.component.ts b/apps/browser/src/popup/settings/options.component.ts deleted file mode 100644 index b020816158c..00000000000 --- a/apps/browser/src/popup/settings/options.component.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { Component, OnInit } from "@angular/core"; - -import { AbstractThemingService } from "@bitwarden/angular/services/theming/theming.service.abstraction"; -import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; -import { TotpService } from "@bitwarden/common/abstractions/totp.service"; -import { ThemeType, UriMatchType } from "@bitwarden/common/enums"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; - -@Component({ - selector: "app-options", - templateUrl: "options.component.html", -}) -export class OptionsComponent implements OnInit { - enableFavicon = false; - enableBadgeCounter = false; - enableAutoFillOnPageLoad = false; - autoFillOnPageLoadDefault = false; - autoFillOnPageLoadOptions: any[]; - enableAutoTotpCopy = false; // TODO: Does it matter if this is set to false or true? - enableContextMenuItem = false; - enableAddLoginNotification = false; - enableChangedPasswordNotification = false; - showCardsCurrentTab = false; - showIdentitiesCurrentTab = false; - showClearClipboard = true; - theme: ThemeType; - themeOptions: any[]; - defaultUriMatch = UriMatchType.Domain; - uriMatchOptions: any[]; - clearClipboard: number; - clearClipboardOptions: any[]; - showGeneral = true; - showAutofill = true; - showDisplay = true; - - constructor( - private messagingService: MessagingService, - private stateService: StateService, - private totpService: TotpService, - i18nService: I18nService, - private themingService: AbstractThemingService, - private settingsService: SettingsService - ) { - this.themeOptions = [ - { name: i18nService.t("default"), value: ThemeType.System }, - { name: i18nService.t("light"), value: ThemeType.Light }, - { name: i18nService.t("dark"), value: ThemeType.Dark }, - { name: "Nord", value: ThemeType.Nord }, - { name: i18nService.t("solarizedDark"), value: ThemeType.SolarizedDark }, - ]; - this.uriMatchOptions = [ - { name: i18nService.t("baseDomain"), value: UriMatchType.Domain }, - { name: i18nService.t("host"), value: UriMatchType.Host }, - { name: i18nService.t("startsWith"), value: UriMatchType.StartsWith }, - { name: i18nService.t("regEx"), value: UriMatchType.RegularExpression }, - { name: i18nService.t("exact"), value: UriMatchType.Exact }, - { name: i18nService.t("never"), value: UriMatchType.Never }, - ]; - this.clearClipboardOptions = [ - { name: i18nService.t("never"), value: null }, - { name: i18nService.t("tenSeconds"), value: 10 }, - { name: i18nService.t("twentySeconds"), value: 20 }, - { name: i18nService.t("thirtySeconds"), value: 30 }, - { name: i18nService.t("oneMinute"), value: 60 }, - { name: i18nService.t("twoMinutes"), value: 120 }, - { name: i18nService.t("fiveMinutes"), value: 300 }, - ]; - this.autoFillOnPageLoadOptions = [ - { name: i18nService.t("autoFillOnPageLoadYes"), value: true }, - { name: i18nService.t("autoFillOnPageLoadNo"), value: false }, - ]; - } - - async ngOnInit() { - this.enableAutoFillOnPageLoad = await this.stateService.getEnableAutoFillOnPageLoad(); - - this.autoFillOnPageLoadDefault = - (await this.stateService.getAutoFillOnPageLoadDefault()) ?? true; - - this.enableAddLoginNotification = !(await this.stateService.getDisableAddLoginNotification()); - - this.enableChangedPasswordNotification = - !(await this.stateService.getDisableChangedPasswordNotification()); - - this.enableContextMenuItem = !(await this.stateService.getDisableContextMenuItem()); - - this.showCardsCurrentTab = !(await this.stateService.getDontShowCardsCurrentTab()); - this.showIdentitiesCurrentTab = !(await this.stateService.getDontShowIdentitiesCurrentTab()); - - this.enableAutoTotpCopy = !(await this.stateService.getDisableAutoTotpCopy()); - - this.enableFavicon = !this.settingsService.getDisableFavicon(); - - this.enableBadgeCounter = !(await this.stateService.getDisableBadgeCounter()); - - this.theme = await this.stateService.getTheme(); - - const defaultUriMatch = await this.stateService.getDefaultUriMatch(); - this.defaultUriMatch = defaultUriMatch == null ? UriMatchType.Domain : defaultUriMatch; - - this.clearClipboard = await this.stateService.getClearClipboard(); - } - - async updateAddLoginNotification() { - await this.stateService.setDisableAddLoginNotification(!this.enableAddLoginNotification); - } - - async updateChangedPasswordNotification() { - await this.stateService.setDisableChangedPasswordNotification( - !this.enableChangedPasswordNotification - ); - } - - async updateContextMenuItem() { - await this.stateService.setDisableContextMenuItem(!this.enableContextMenuItem); - this.messagingService.send("bgUpdateContextMenu"); - } - - async updateAutoTotpCopy() { - await this.stateService.setDisableAutoTotpCopy(!this.enableAutoTotpCopy); - } - - async updateAutoFillOnPageLoad() { - await this.stateService.setEnableAutoFillOnPageLoad(this.enableAutoFillOnPageLoad); - } - - async updateAutoFillOnPageLoadDefault() { - await this.stateService.setAutoFillOnPageLoadDefault(this.autoFillOnPageLoadDefault); - } - - async updateFavicon() { - await this.settingsService.setDisableFavicon(!this.enableFavicon); - } - - async updateBadgeCounter() { - await this.stateService.setDisableBadgeCounter(!this.enableBadgeCounter); - this.messagingService.send("bgUpdateContextMenu"); - } - - async updateShowCardsCurrentTab() { - await this.stateService.setDontShowCardsCurrentTab(!this.showCardsCurrentTab); - } - - async updateShowIdentitiesCurrentTab() { - await this.stateService.setDontShowIdentitiesCurrentTab(!this.showIdentitiesCurrentTab); - } - - async saveTheme() { - await this.themingService.updateConfiguredTheme(this.theme); - } - - async saveDefaultUriMatch() { - await this.stateService.setDefaultUriMatch(this.defaultUriMatch); - } - - async saveClearClipboard() { - await this.stateService.setClearClipboard(this.clearClipboard); - } -} diff --git a/apps/browser/src/popup/settings/premium.component.html b/apps/browser/src/popup/settings/premium.component.html deleted file mode 100644 index 2727ee405b9..00000000000 --- a/apps/browser/src/popup/settings/premium.component.html +++ /dev/null @@ -1,72 +0,0 @@ -
-
- -
-

- {{ "premiumMembership" | i18n }} -

-
-
-
-
- -

{{ "premiumNotCurrentMember" | i18n }}

-

{{ "premiumSignUpAndGet" | i18n }}

-
    -
  • - - {{ "ppremiumSignUpStorage" | i18n }} -
  • -
  • - - {{ "premiumSignUpTwoStepOptions" | i18n }} -
  • -
  • - - {{ "ppremiumSignUpReports" | i18n }} -
  • -
  • - - {{ "ppremiumSignUpTotp" | i18n }} -
  • -
  • - - {{ "ppremiumSignUpSupport" | i18n }} -
  • -
  • - - {{ "ppremiumSignUpFuture" | i18n }} -
  • -
-

{{ priceString }}

- - -
- -

{{ "premiumCurrentMember" | i18n }}

-

{{ "premiumCurrentMemberThanks" | i18n }}

- -
-
-
diff --git a/apps/browser/src/popup/settings/premium.component.ts b/apps/browser/src/popup/settings/premium.component.ts deleted file mode 100644 index e57d53f3c40..00000000000 --- a/apps/browser/src/popup/settings/premium.component.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CurrencyPipe, Location } from "@angular/common"; -import { Component } from "@angular/core"; - -import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { DialogService } from "@bitwarden/components"; - -@Component({ - selector: "app-premium", - templateUrl: "premium.component.html", -}) -export class PremiumComponent extends BasePremiumComponent { - priceString: string; - - constructor( - i18nService: I18nService, - platformUtilsService: PlatformUtilsService, - apiService: ApiService, - stateService: StateService, - logService: LogService, - private location: Location, - private currencyPipe: CurrencyPipe, - dialogService: DialogService, - environmentService: EnvironmentService - ) { - super( - i18nService, - platformUtilsService, - apiService, - logService, - stateService, - dialogService, - environmentService - ); - - // Support old price string. Can be removed in future once all translations are properly updated. - const thePrice = this.currencyPipe.transform(this.price, "$"); - // Safari extension crashes due to $1 appearing in the price string ($10.00). Escape the $ to fix. - const formattedPrice = this.platformUtilsService.isSafari() - ? thePrice.replace("$", "$$$") - : thePrice; - this.priceString = i18nService.t("premiumPrice", formattedPrice); - if (this.priceString.indexOf("%price%") > -1) { - this.priceString = this.priceString.replace("%price%", thePrice); - } - } - - goBack() { - this.location.back(); - } -} diff --git a/apps/browser/src/popup/settings/settings.component.html b/apps/browser/src/popup/settings/settings.component.html deleted file mode 100644 index 6591d11cc19..00000000000 --- a/apps/browser/src/popup/settings/settings.component.html +++ /dev/null @@ -1,258 +0,0 @@ -
-
- -
-

- {{ "settings" | i18n }} -

-
-
-
-
-

{{ "manage" | i18n }}

-
- - - - -
-
-
-

{{ "security" | i18n }}

-
- - - {{ - "vaultTimeoutPolicyWithActionInEffect" - | i18n : policy.timeout.hours : policy.timeout.minutes : (policy.action | i18n) - }} - - - {{ "vaultTimeoutPolicyInEffect" | i18n : policy.timeout.hours : policy.timeout.minutes }} - - - {{ "vaultTimeoutActionPolicyInEffect" | i18n : (policy.action | i18n) }} - - - - -
- - -
- -
- - -
-
- - -
-
- - -
- - -
-
-
-

{{ "account" | i18n }}

-
- - - - -
-
-
-

{{ "tools" | i18n }}

-
- - - -
-
-
-

{{ "other" | i18n }}

-
- - - - - -
- -
-
diff --git a/apps/browser/src/popup/settings/settings.component.ts b/apps/browser/src/popup/settings/settings.component.ts deleted file mode 100644 index c2699ce498e..00000000000 --- a/apps/browser/src/popup/settings/settings.component.ts +++ /dev/null @@ -1,509 +0,0 @@ -import { ChangeDetectorRef, Component, OnInit } from "@angular/core"; -import { FormBuilder } from "@angular/forms"; -import { Router } from "@angular/router"; -import { - BehaviorSubject, - combineLatest, - concatMap, - distinctUntilChanged, - filter, - firstValueFrom, - map, - Observable, - pairwise, - Subject, - switchMap, - takeUntil, -} from "rxjs"; - -import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { FingerprintDialogComponent } from "@bitwarden/auth"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; -import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { PolicyType } from "@bitwarden/common/admin-console/enums"; -import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { DeviceType } from "@bitwarden/common/enums"; -import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { DialogService } from "@bitwarden/components"; - -import { BiometricErrors, BiometricErrorTypes } from "../../models/biometricErrors"; -import { BrowserApi } from "../../platform/browser/browser-api"; -import { SetPinComponent } from "../components/set-pin.component"; -import { PopupUtilsService } from "../services/popup-utils.service"; - -import { AboutComponent } from "./about.component"; -import { AwaitDesktopDialogComponent } from "./await-desktop-dialog.component"; - -const RateUrls = { - [DeviceType.ChromeExtension]: - "https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", - [DeviceType.FirefoxExtension]: - "https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews", - [DeviceType.OperaExtension]: - "https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container", - [DeviceType.EdgeExtension]: - "https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh", - [DeviceType.VivaldiExtension]: - "https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", - [DeviceType.SafariExtension]: "https://apps.apple.com/app/bitwarden/id1352778147", -}; - -@Component({ - selector: "app-settings", - templateUrl: "settings.component.html", -}) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class SettingsComponent implements OnInit { - protected readonly VaultTimeoutAction = VaultTimeoutAction; - - availableVaultTimeoutActions: VaultTimeoutAction[] = []; - vaultTimeoutOptions: any[]; - vaultTimeoutPolicyCallout: Observable<{ - timeout: { hours: number; minutes: number }; - action: VaultTimeoutAction; - }>; - supportsBiometric: boolean; - showChangeMasterPass = true; - - form = this.formBuilder.group({ - vaultTimeout: [null as number | null], - vaultTimeoutAction: [VaultTimeoutAction.Lock], - pin: [null as boolean | null], - biometric: false, - enableAutoBiometricsPrompt: true, - }); - - private refreshTimeoutSettings$ = new BehaviorSubject(undefined); - private destroy$ = new Subject(); - - constructor( - private policyService: PolicyService, - private formBuilder: FormBuilder, - private platformUtilsService: PlatformUtilsService, - private i18nService: I18nService, - private vaultTimeoutService: VaultTimeoutService, - private vaultTimeoutSettingsService: VaultTimeoutSettingsService, - public messagingService: MessagingService, - private router: Router, - private environmentService: EnvironmentService, - private cryptoService: CryptoService, - private stateService: StateService, - private popupUtilsService: PopupUtilsService, - private modalService: ModalService, - private userVerificationService: UserVerificationService, - private dialogService: DialogService, - private changeDetectorRef: ChangeDetectorRef - ) {} - - async ngOnInit() { - const maximumVaultTimeoutPolicy = this.policyService.get$(PolicyType.MaximumVaultTimeout); - this.vaultTimeoutPolicyCallout = maximumVaultTimeoutPolicy.pipe( - filter((policy) => policy != null), - map((policy) => { - let timeout; - if (policy.data?.minutes) { - timeout = { - hours: Math.floor(policy.data?.minutes / 60), - minutes: policy.data?.minutes % 60, - }; - } - return { timeout: timeout, action: policy.data?.action }; - }) - ); - - const showOnLocked = - !this.platformUtilsService.isFirefox() && !this.platformUtilsService.isSafari(); - - this.vaultTimeoutOptions = [ - { name: this.i18nService.t("immediately"), value: 0 }, - { name: this.i18nService.t("oneMinute"), value: 1 }, - { name: this.i18nService.t("fiveMinutes"), value: 5 }, - { name: this.i18nService.t("fifteenMinutes"), value: 15 }, - { name: this.i18nService.t("thirtyMinutes"), value: 30 }, - { name: this.i18nService.t("oneHour"), value: 60 }, - { name: this.i18nService.t("fourHours"), value: 240 }, - // { name: i18nService.t('onIdle'), value: -4 }, - // { name: i18nService.t('onSleep'), value: -3 }, - ]; - - if (showOnLocked) { - this.vaultTimeoutOptions.push({ name: this.i18nService.t("onLocked"), value: -2 }); - } - - this.vaultTimeoutOptions.push({ name: this.i18nService.t("onRestart"), value: -1 }); - this.vaultTimeoutOptions.push({ name: this.i18nService.t("never"), value: null }); - - let timeout = await this.vaultTimeoutSettingsService.getVaultTimeout(); - if (timeout === -2 && !showOnLocked) { - timeout = -1; - } - const pinStatus = await this.vaultTimeoutSettingsService.isPinLockSet(); - - this.form.controls.vaultTimeout.valueChanges - .pipe( - pairwise(), - concatMap(async ([previousValue, newValue]) => { - await this.saveVaultTimeout(previousValue, newValue); - }), - takeUntil(this.destroy$) - ) - .subscribe(); - - this.form.controls.vaultTimeoutAction.valueChanges - .pipe( - pairwise(), - concatMap(async ([previousValue, newValue]) => { - await this.saveVaultTimeoutAction(previousValue, newValue); - }), - takeUntil(this.destroy$) - ) - .subscribe(); - - const initialValues = { - vaultTimeout: timeout, - vaultTimeoutAction: await firstValueFrom( - this.vaultTimeoutSettingsService.vaultTimeoutAction$() - ), - pin: pinStatus !== "DISABLED", - biometric: await this.vaultTimeoutSettingsService.isBiometricLockSet(), - enableAutoBiometricsPrompt: !(await this.stateService.getDisableAutoBiometricsPrompt()), - }; - this.form.patchValue(initialValues); // Emit event to initialize `pairwise` operator - - this.supportsBiometric = await this.platformUtilsService.supportsBiometric(); - this.showChangeMasterPass = await this.userVerificationService.hasMasterPassword(); - - this.form.controls.pin.valueChanges - .pipe( - concatMap(async (value) => { - await this.updatePin(value); - this.refreshTimeoutSettings$.next(); - }), - takeUntil(this.destroy$) - ) - .subscribe(); - - this.form.controls.biometric.valueChanges - .pipe( - distinctUntilChanged(), - concatMap(async (enabled) => { - await this.updateBiometric(enabled); - if (enabled) { - this.form.controls.enableAutoBiometricsPrompt.enable(); - } else { - this.form.controls.enableAutoBiometricsPrompt.disable(); - } - this.refreshTimeoutSettings$.next(); - }), - takeUntil(this.destroy$) - ) - .subscribe(); - - this.refreshTimeoutSettings$ - .pipe( - switchMap(() => - combineLatest([ - this.vaultTimeoutSettingsService.availableVaultTimeoutActions$(), - this.vaultTimeoutSettingsService.vaultTimeoutAction$(), - ]) - ), - takeUntil(this.destroy$) - ) - .subscribe(([availableActions, action]) => { - this.availableVaultTimeoutActions = availableActions; - this.form.controls.vaultTimeoutAction.setValue(action, { emitEvent: false }); - // NOTE: The UI doesn't properly update without detect changes. - // I've even tried using an async pipe, but it still doesn't work. I'm not sure why. - // Using an async pipe means that we can't call `detectChanges` AFTER the data has change - // meaning that we are forced to use regular class variables instead of observables. - this.changeDetectorRef.detectChanges(); - }); - - this.refreshTimeoutSettings$ - .pipe( - switchMap(() => - combineLatest([ - this.vaultTimeoutSettingsService.availableVaultTimeoutActions$(), - maximumVaultTimeoutPolicy, - ]) - ), - takeUntil(this.destroy$) - ) - .subscribe(([availableActions, policy]) => { - if (policy?.data?.action || availableActions.length <= 1) { - this.form.controls.vaultTimeoutAction.disable({ emitEvent: false }); - } else { - this.form.controls.vaultTimeoutAction.enable({ emitEvent: false }); - } - }); - } - - async saveVaultTimeout(previousValue: number, newValue: number) { - if (newValue == null) { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "warning" }, - content: { key: "neverLockWarning" }, - type: "warning", - }); - - if (!confirmed) { - this.form.controls.vaultTimeout.setValue(previousValue, { emitEvent: false }); - return; - } - } - - // The minTimeoutError does not apply to browser because it supports Immediately - // So only check for the policyError - if (this.form.controls.vaultTimeout.hasError("policyError")) { - this.platformUtilsService.showToast( - "error", - null, - this.i18nService.t("vaultTimeoutTooLarge") - ); - return; - } - - await this.vaultTimeoutSettingsService.setVaultTimeoutOptions( - newValue, - this.form.value.vaultTimeoutAction - ); - if (newValue == null) { - this.messagingService.send("bgReseedStorage"); - } - } - - async saveVaultTimeoutAction(previousValue: VaultTimeoutAction, newValue: VaultTimeoutAction) { - if (newValue === VaultTimeoutAction.LogOut) { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "vaultTimeoutLogOutConfirmationTitle" }, - content: { key: "vaultTimeoutLogOutConfirmation" }, - type: "warning", - }); - - if (!confirmed) { - this.form.controls.vaultTimeoutAction.setValue(previousValue, { - emitEvent: false, - }); - return; - } - } - - if (this.form.controls.vaultTimeout.hasError("policyError")) { - this.platformUtilsService.showToast( - "error", - null, - this.i18nService.t("vaultTimeoutTooLarge") - ); - return; - } - - await this.vaultTimeoutSettingsService.setVaultTimeoutOptions( - this.form.value.vaultTimeout, - newValue - ); - this.refreshTimeoutSettings$.next(); - } - - async updatePin(value: boolean) { - if (value) { - const ref = this.modalService.open(SetPinComponent, { allowMultipleModals: true }); - - if (ref == null) { - this.form.controls.pin.setValue(false, { emitEvent: false }); - return; - } - - this.form.controls.pin.setValue(await ref.onClosedPromise(), { emitEvent: false }); - } else { - await this.vaultTimeoutSettingsService.clear(); - } - } - - async updateBiometric(enabled: boolean) { - if (enabled && this.supportsBiometric) { - let granted; - try { - granted = await BrowserApi.requestPermission({ permissions: ["nativeMessaging"] }); - } catch (e) { - // eslint-disable-next-line - console.error(e); - - if (this.platformUtilsService.isFirefox() && this.popupUtilsService.inSidebar(window)) { - await this.dialogService.openSimpleDialog({ - title: { key: "nativeMessaginPermissionSidebarTitle" }, - content: { key: "nativeMessaginPermissionSidebarDesc" }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "info", - }); - - this.form.controls.biometric.setValue(false); - return; - } - } - - if (!granted) { - await this.dialogService.openSimpleDialog({ - title: { key: "nativeMessaginPermissionErrorTitle" }, - content: { key: "nativeMessaginPermissionErrorDesc" }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", - }); - - this.form.controls.biometric.setValue(false); - return; - } - - const awaitDesktopDialogRef = AwaitDesktopDialogComponent.open(this.dialogService); - const awaitDesktopDialogClosed = firstValueFrom(awaitDesktopDialogRef.closed); - - await this.stateService.setBiometricAwaitingAcceptance(true); - await this.cryptoService.refreshAdditionalKeys(); - - await Promise.race([ - awaitDesktopDialogClosed.then(async (result) => { - if (result) { - this.form.controls.biometric.setValue(false); - await this.stateService.setBiometricAwaitingAcceptance(null); - } - }), - this.platformUtilsService - .authenticateBiometric() - .then((result) => { - this.form.controls.biometric.setValue(result); - if (!result) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorEnableBiometricTitle"), - this.i18nService.t("errorEnableBiometricDesc") - ); - } - }) - .catch((e) => { - // Handle connection errors - this.form.controls.biometric.setValue(false); - - const error = BiometricErrors[e as BiometricErrorTypes]; - - this.dialogService.openSimpleDialog({ - title: { key: error.title }, - content: { key: error.description }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", - }); - }) - .finally(() => { - awaitDesktopDialogRef.close(false); - }), - ]); - } else { - await this.stateService.setBiometricUnlock(null); - await this.stateService.setBiometricFingerprintValidated(false); - } - } - - async updateAutoBiometricsPrompt() { - await this.stateService.setDisableAutoBiometricsPrompt( - !this.form.value.enableAutoBiometricsPrompt - ); - } - - async lock() { - await this.vaultTimeoutService.lock(); - } - - async logOut() { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "logOut" }, - content: { key: "logOutConfirmation" }, - type: "info", - }); - - if (confirmed) { - this.messagingService.send("logout"); - } - } - - async changePassword() { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "changeMasterPassword" }, - content: { key: "changeMasterPasswordConfirmation" }, - type: "info", - }); - if (confirmed) { - BrowserApi.createNewTab( - "https://bitwarden.com/help/master-password/#change-your-master-password" - ); - } - } - - async twoStep() { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "twoStepLogin" }, - content: { key: "twoStepLoginConfirmation" }, - type: "info", - }); - if (confirmed) { - BrowserApi.createNewTab("https://bitwarden.com/help/setup-two-step-login/"); - } - } - - async share() { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "learnOrg" }, - content: { key: "learnOrgConfirmation" }, - type: "info", - }); - if (confirmed) { - BrowserApi.createNewTab("https://bitwarden.com/help/about-organizations/"); - } - } - - async webVault() { - const url = this.environmentService.getWebVaultUrl(); - BrowserApi.createNewTab(url); - } - - import() { - BrowserApi.createNewTab("https://bitwarden.com/help/import-data/"); - } - - export() { - this.router.navigate(["/export"]); - } - - about() { - this.dialogService.open(AboutComponent); - } - - async fingerprint() { - const fingerprint = await this.cryptoService.getFingerprint( - await this.stateService.getUserId() - ); - - const dialogRef = FingerprintDialogComponent.open(this.dialogService, { - fingerprint, - }); - - return firstValueFrom(dialogRef.closed); - } - - rate() { - const deviceType = this.platformUtilsService.getDevice(); - BrowserApi.createNewTab((RateUrls as any)[deviceType]); - } - - ngOnDestroy() { - this.destroy$.next(); - this.destroy$.complete(); - } -} diff --git a/apps/browser/src/popup/settings/vault-timeout-input.component.ts b/apps/browser/src/popup/settings/vault-timeout-input.component.ts deleted file mode 100644 index 75c3c9e9e0e..00000000000 --- a/apps/browser/src/popup/settings/vault-timeout-input.component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component } from "@angular/core"; -import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from "@angular/forms"; - -import { VaultTimeoutInputComponent as VaultTimeoutInputComponentBase } from "@bitwarden/angular/components/settings/vault-timeout-input.component"; - -@Component({ - selector: "app-vault-timeout-input", - templateUrl: "vault-timeout-input.component.html", - providers: [ - { - provide: NG_VALUE_ACCESSOR, - multi: true, - useExisting: VaultTimeoutInputComponent, - }, - { - provide: NG_VALIDATORS, - multi: true, - useExisting: VaultTimeoutInputComponent, - }, - ], -}) -export class VaultTimeoutInputComponent extends VaultTimeoutInputComponentBase {} diff --git a/apps/browser/src/popup/tabs-v2.component.ts b/apps/browser/src/popup/tabs-v2.component.ts new file mode 100644 index 00000000000..4cdb8fc029d --- /dev/null +++ b/apps/browser/src/popup/tabs-v2.component.ts @@ -0,0 +1,11 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "app-tabs-v2", + template: ` + + + + `, +}) +export class TabsV2Component {} diff --git a/apps/browser/src/popup/tabs.component.ts b/apps/browser/src/popup/tabs.component.ts index 856529a0a3b..7546c9ca13b 100644 --- a/apps/browser/src/popup/tabs.component.ts +++ b/apps/browser/src/popup/tabs.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from "@angular/core"; -import { PopupUtilsService } from "./services/popup-utils.service"; +import BrowserPopupUtils from "../platform/popup/browser-popup-utils"; @Component({ selector: "app-tabs", @@ -9,9 +9,7 @@ import { PopupUtilsService } from "./services/popup-utils.service"; export class TabsComponent implements OnInit { showCurrentTab = true; - constructor(private popupUtilsService: PopupUtilsService) {} - ngOnInit() { - this.showCurrentTab = !this.popupUtilsService.inPopout(window); + this.showCurrentTab = !BrowserPopupUtils.inPopout(window); } } diff --git a/apps/browser/src/safari/desktop.xcodeproj/project.pbxproj b/apps/browser/src/safari/desktop.xcodeproj/project.pbxproj index 04536042880..7642e7d1859 100644 --- a/apps/browser/src/safari/desktop.xcodeproj/project.pbxproj +++ b/apps/browser/src/safari/desktop.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 03100CAF291891F4008E14EF /* encrypt-worker.js in Resources */ = {isa = PBXBuildFile; fileRef = 03100CAE291891F4008E14EF /* encrypt-worker.js */; }; + 55BC93932CB4268A008CA4C6 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 55BC93922CB4268A008CA4C6 /* assets */; }; 55E0374D2577FA6B00979016 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55E0374C2577FA6B00979016 /* AppDelegate.swift */; }; 55E037502577FA6B00979016 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 55E0374E2577FA6B00979016 /* Main.storyboard */; }; 55E037522577FA6B00979016 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55E037512577FA6B00979016 /* ViewController.swift */; }; @@ -24,6 +25,7 @@ 55E0377F2577FA6F00979016 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = 55E037762577FA6F00979016 /* manifest.json */; }; 55E037802577FA6F00979016 /* background.html in Resources */ = {isa = PBXBuildFile; fileRef = 55E037772577FA6F00979016 /* background.html */; }; 55E037812577FA6F00979016 /* _locales in Resources */ = {isa = PBXBuildFile; fileRef = 55E037782577FA6F00979016 /* _locales */; }; + 55E037822577FA6F00979016 /* overlay in Resources */ = {isa = PBXBuildFile; fileRef = 55E037832577FA6F00979016 /* overlay */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -53,6 +55,7 @@ /* Begin PBXFileReference section */ 03100CAE291891F4008E14EF /* encrypt-worker.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = "encrypt-worker.js"; path = "../../../build/encrypt-worker.js"; sourceTree = ""; }; 5508DD7926051B5900A85C58 /* libswiftAppKit.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libswiftAppKit.tbd; path = usr/lib/swift/libswiftAppKit.tbd; sourceTree = SDKROOT; }; + 55BC93922CB4268A008CA4C6 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = ../../../build/assets; sourceTree = ""; }; 55E037482577FA6B00979016 /* desktop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = desktop.app; sourceTree = BUILT_PRODUCTS_DIR; }; 55E0374B2577FA6B00979016 /* desktop.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = desktop.entitlements; sourceTree = ""; }; 55E0374C2577FA6B00979016 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -74,6 +77,7 @@ 55E037762577FA6F00979016 /* manifest.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = manifest.json; path = ../../../build/manifest.json; sourceTree = ""; }; 55E037772577FA6F00979016 /* background.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = background.html; path = ../../../build/background.html; sourceTree = ""; }; 55E037782577FA6F00979016 /* _locales */ = {isa = PBXFileReference; lastKnownFileType = folder; name = _locales; path = ../../../build/_locales; sourceTree = ""; }; + 55E037832577FA6F00979016 /* overlay */ = {isa = PBXFileReference; lastKnownFileType = folder; name = overlay; path = ../../../build/overlay; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -150,6 +154,7 @@ 55E0376F2577FA6F00979016 /* Resources */ = { isa = PBXGroup; children = ( + 55BC93922CB4268A008CA4C6 /* assets */, 03100CAE291891F4008E14EF /* encrypt-worker.js */, 55E037702577FA6F00979016 /* popup */, 55E037712577FA6F00979016 /* background.js */, @@ -160,6 +165,7 @@ 55E037762577FA6F00979016 /* manifest.json */, 55E037772577FA6F00979016 /* background.html */, 55E037782577FA6F00979016 /* _locales */, + 55E037832577FA6F00979016 /* overlay */, ); name = Resources; path = safari; @@ -267,9 +273,11 @@ 55E0377A2577FA6F00979016 /* background.js in Resources */, 55E037792577FA6F00979016 /* popup in Resources */, 03100CAF291891F4008E14EF /* encrypt-worker.js in Resources */, + 55BC93932CB4268A008CA4C6 /* assets in Resources */, 55E0377C2577FA6F00979016 /* notification in Resources */, 55E0377E2577FA6F00979016 /* vendor.js in Resources */, 55E0377D2577FA6F00979016 /* content in Resources */, + 55E037822577FA6F00979016 /* overlay in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/apps/browser/src/safari/desktop/Info.plist b/apps/browser/src/safari/desktop/Info.plist index d63a00505f7..69ea518a0ae 100644 --- a/apps/browser/src/safari/desktop/Info.plist +++ b/apps/browser/src/safari/desktop/Info.plist @@ -25,7 +25,7 @@ LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright - Copyright Š 2015-2023 Bitwarden Inc. All rights reserved. + Copyright Š 2015-2024 Bitwarden Inc. All rights reserved. NSMainStoryboardFile Main NSPrincipalClass diff --git a/apps/browser/src/safari/mv3/fake-background.html b/apps/browser/src/safari/mv3/fake-background.html new file mode 100644 index 00000000000..afc33653c0a --- /dev/null +++ b/apps/browser/src/safari/mv3/fake-background.html @@ -0,0 +1,4 @@ + diff --git a/apps/browser/src/safari/mv3/fake-vendor.js b/apps/browser/src/safari/mv3/fake-vendor.js new file mode 100644 index 00000000000..a915519c38f --- /dev/null +++ b/apps/browser/src/safari/mv3/fake-vendor.js @@ -0,0 +1,2 @@ +// Empty file set for the Safari build process for mv3 to ensure backwards compatibility with mv2. +// Will be removed once we fully migrate Safari to mv3. diff --git a/apps/browser/src/safari/safari/Info.plist b/apps/browser/src/safari/safari/Info.plist index 0ea632c7d24..b79ed132ea9 100644 --- a/apps/browser/src/safari/safari/Info.plist +++ b/apps/browser/src/safari/safari/Info.plist @@ -30,7 +30,7 @@ $(PRODUCT_MODULE_NAME).SafariWebExtensionHandler NSHumanReadableCopyright - Copyright Š 2015-2023 Bitwarden Inc. All rights reserved. + Copyright Š 2015-2024 Bitwarden Inc. All rights reserved. NSHumanReadableDescription A secure and free password manager for all of your devices. SFSafariAppExtensionBundleIdentifiersToReplace diff --git a/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift b/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift index 95369453409..1768ce6b15f 100644 --- a/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift +++ b/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift @@ -88,12 +88,9 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { return case "biometricUnlock": - var error: NSError? let laContext = LAContext() - laContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) - - if let e = error, e.code != kLAErrorBiometryLockout { + if(!laContext.isBiometricsAvailable()){ response.userInfo = [ SFExtensionMessageKey: [ "message": [ @@ -133,12 +130,6 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { status = SecKeychainFindGenericPassword(nil, UInt32(ServiceNameBiometric.utf8.count), ServiceNameBiometric, UInt32(fallbackName.utf8.count), fallbackName, &passwordLength, &passwordPtr, nil) } - // TODO: Remove after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3473) - if status != errSecSuccess { - let secondaryFallbackName = "_masterkey_biometric" - status = SecKeychainFindGenericPassword(nil, UInt32(ServiceNameBiometric.utf8.count), ServiceNameBiometric, UInt32(secondaryFallbackName.utf8.count), secondaryFallbackName, &passwordLength, &passwordPtr, nil) - } - if status == errSecSuccess { let result = NSString(bytes: passwordPtr!, length: Int(passwordLength), encoding: String.Encoding.utf8.rawValue) as String? SecKeychainItemFreeContent(nil, passwordPtr) @@ -168,6 +159,20 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { } return + case "biometricUnlockAvailable": + let laContext = LAContext() + var isAvailable = laContext.isBiometricsAvailable(); + + response.userInfo = [ + SFExtensionMessageKey: [ + "message": [ + "command": "biometricUnlockAvailable", + "response": isAvailable ? "available" : "not available", + "timestamp": Int64(NSDate().timeIntervalSince1970 * 1000), + ], + ], + ] + break default: return } @@ -200,6 +205,20 @@ func jsonDeserialize(json: String?) -> T? { } } +extension LAContext { + func isBiometricsAvailable() -> Bool { + var error: NSError? + + self.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) + + if let e = error, e.code != kLAErrorBiometryLockout { + return false; + } else { + return true; + } + } +} + class DownloadFileMessage: Decodable, Encodable { var fileName: String var blobData: String? diff --git a/apps/browser/src/services/browser-send.service.ts b/apps/browser/src/services/browser-send.service.ts deleted file mode 100644 index 8a197444a98..00000000000 --- a/apps/browser/src/services/browser-send.service.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BehaviorSubject } from "rxjs"; - -import { Send } from "@bitwarden/common/tools/send/models/domain/send"; -import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; -import { SendService } from "@bitwarden/common/tools/send/services/send.service"; - -import { browserSession, sessionSync } from "../platform/decorators/session-sync-observable"; - -@browserSession -export class BrowserSendService extends SendService { - @sessionSync({ initializer: Send.fromJSON, initializeAs: "array" }) - protected _sends: BehaviorSubject; - @sessionSync({ initializer: SendView.fromJSON, initializeAs: "array" }) - protected _sendViews: BehaviorSubject; -} diff --git a/apps/browser/src/services/browser-settings.service.ts b/apps/browser/src/services/browser-settings.service.ts deleted file mode 100644 index 89378bcc745..00000000000 --- a/apps/browser/src/services/browser-settings.service.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BehaviorSubject } from "rxjs"; - -import { AccountSettingsSettings } from "@bitwarden/common/platform/models/domain/account"; -import { SettingsService } from "@bitwarden/common/services/settings.service"; - -import { browserSession, sessionSync } from "../platform/decorators/session-sync-observable"; - -@browserSession -export class BrowserSettingsService extends SettingsService { - @sessionSync({ initializer: (obj: string[][]) => obj }) - protected _settings: BehaviorSubject; - - @sessionSync({ initializer: (b: boolean) => b }) - protected _disableFavicon: BehaviorSubject; -} diff --git a/apps/browser/src/services/extension-lock-component.service.spec.ts b/apps/browser/src/services/extension-lock-component.service.spec.ts new file mode 100644 index 00000000000..a8a019662ef --- /dev/null +++ b/apps/browser/src/services/extension-lock-component.service.spec.ts @@ -0,0 +1,322 @@ +import { TestBed } from "@angular/core/testing"; +import { mock, MockProxy } from "jest-mock-extended"; +import { firstValueFrom, of } from "rxjs"; + +import { BiometricsDisableReason, UnlockOptions } from "@bitwarden/auth/angular"; +import { + PinServiceAbstraction, + UserDecryptionOptionsServiceAbstraction, +} from "@bitwarden/auth/common"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { UserId } from "@bitwarden/common/types/guid"; +import { KeyService, BiometricsService } from "@bitwarden/key-management"; + +import { BrowserRouterService } from "../platform/popup/services/browser-router.service"; + +import { ExtensionLockComponentService } from "./extension-lock-component.service"; + +describe("ExtensionLockComponentService", () => { + let service: ExtensionLockComponentService; + + let userDecryptionOptionsService: MockProxy; + let platformUtilsService: MockProxy; + let biometricsService: MockProxy; + let pinService: MockProxy; + let vaultTimeoutSettingsService: MockProxy; + let keyService: MockProxy; + let routerService: MockProxy; + + beforeEach(() => { + userDecryptionOptionsService = mock(); + platformUtilsService = mock(); + biometricsService = mock(); + pinService = mock(); + vaultTimeoutSettingsService = mock(); + keyService = mock(); + routerService = mock(); + + TestBed.configureTestingModule({ + providers: [ + ExtensionLockComponentService, + { + provide: UserDecryptionOptionsServiceAbstraction, + useValue: userDecryptionOptionsService, + }, + { + provide: PlatformUtilsService, + useValue: platformUtilsService, + }, + { + provide: BiometricsService, + useValue: biometricsService, + }, + { + provide: PinServiceAbstraction, + useValue: pinService, + }, + { + provide: VaultTimeoutSettingsService, + useValue: vaultTimeoutSettingsService, + }, + { + provide: KeyService, + useValue: keyService, + }, + { + provide: BrowserRouterService, + useValue: routerService, + }, + ], + }); + + service = TestBed.inject(ExtensionLockComponentService); + }); + + it("instantiates", () => { + expect(service).not.toBeFalsy(); + }); + + describe("getPreviousUrl", () => { + it("returns the previous URL", () => { + routerService.getPreviousUrl.mockReturnValue("previousUrl"); + expect(service.getPreviousUrl()).toBe("previousUrl"); + }); + }); + + describe("getBiometricsError", () => { + it("returns a biometric error description when given a valid error type", () => { + expect( + service.getBiometricsError({ + message: "startDesktop", + }), + ).toBe("startDesktopDesc"); + }); + + it("returns null when given an invalid error type", () => { + expect( + service.getBiometricsError({ + message: "invalidError", + }), + ).toBeNull(); + }); + + it("returns null when given a null input", () => { + expect(service.getBiometricsError(null)).toBeNull(); + }); + }); + + describe("isWindowVisible", () => { + it("throws an error", async () => { + await expect(service.isWindowVisible()).rejects.toThrow("Method not implemented."); + }); + }); + + describe("getBiometricsUnlockBtnText", () => { + it("returns the biometric unlock button text", () => { + expect(service.getBiometricsUnlockBtnText()).toBe("unlockWithBiometrics"); + }); + }); + + describe("getAvailableUnlockOptions$", () => { + interface MockInputs { + hasMasterPassword: boolean; + osSupportsBiometric: boolean; + biometricLockSet: boolean; + hasBiometricEncryptedUserKeyStored: boolean; + platformSupportsSecureStorage: boolean; + pinDecryptionAvailable: boolean; + } + + const table: [MockInputs, UnlockOptions][] = [ + [ + // MP + PIN + Biometrics available + { + hasMasterPassword: true, + osSupportsBiometric: true, + biometricLockSet: true, + hasBiometricEncryptedUserKeyStored: true, + platformSupportsSecureStorage: true, + pinDecryptionAvailable: true, + }, + { + masterPassword: { + enabled: true, + }, + pin: { + enabled: true, + }, + biometrics: { + enabled: true, + disableReason: null, + }, + }, + ], + [ + // PIN + Biometrics available + { + hasMasterPassword: false, + osSupportsBiometric: true, + biometricLockSet: true, + hasBiometricEncryptedUserKeyStored: true, + platformSupportsSecureStorage: true, + pinDecryptionAvailable: true, + }, + { + masterPassword: { + enabled: false, + }, + pin: { + enabled: true, + }, + biometrics: { + enabled: true, + disableReason: null, + }, + }, + ], + [ + // Biometrics available: user key stored with no secure storage + { + hasMasterPassword: false, + osSupportsBiometric: true, + biometricLockSet: true, + hasBiometricEncryptedUserKeyStored: true, + platformSupportsSecureStorage: false, + pinDecryptionAvailable: false, + }, + { + masterPassword: { + enabled: false, + }, + pin: { + enabled: false, + }, + biometrics: { + enabled: true, + disableReason: null, + }, + }, + ], + [ + // Biometrics available: no user key stored with no secure storage + { + hasMasterPassword: false, + osSupportsBiometric: true, + biometricLockSet: true, + hasBiometricEncryptedUserKeyStored: false, + platformSupportsSecureStorage: false, + pinDecryptionAvailable: false, + }, + { + masterPassword: { + enabled: false, + }, + pin: { + enabled: false, + }, + biometrics: { + enabled: true, + disableReason: null, + }, + }, + ], + [ + // Biometrics not available: biometric lock not set + { + hasMasterPassword: false, + osSupportsBiometric: true, + biometricLockSet: false, + hasBiometricEncryptedUserKeyStored: true, + platformSupportsSecureStorage: true, + pinDecryptionAvailable: false, + }, + { + masterPassword: { + enabled: false, + }, + pin: { + enabled: false, + }, + biometrics: { + enabled: false, + disableReason: BiometricsDisableReason.EncryptedKeysUnavailable, + }, + }, + ], + [ + // Biometrics not available: user key not stored + { + hasMasterPassword: false, + osSupportsBiometric: true, + biometricLockSet: true, + hasBiometricEncryptedUserKeyStored: false, + platformSupportsSecureStorage: true, + pinDecryptionAvailable: false, + }, + { + masterPassword: { + enabled: false, + }, + pin: { + enabled: false, + }, + biometrics: { + enabled: false, + disableReason: BiometricsDisableReason.EncryptedKeysUnavailable, + }, + }, + ], + [ + // Biometrics not available: OS doesn't support + { + hasMasterPassword: false, + osSupportsBiometric: false, + biometricLockSet: true, + hasBiometricEncryptedUserKeyStored: true, + platformSupportsSecureStorage: true, + pinDecryptionAvailable: false, + }, + { + masterPassword: { + enabled: false, + }, + pin: { + enabled: false, + }, + biometrics: { + enabled: false, + disableReason: BiometricsDisableReason.NotSupportedOnOperatingSystem, + }, + }, + ], + ]; + + test.each(table)("returns unlock options", async (mockInputs, expectedOutput) => { + const userId = "userId" as UserId; + const userDecryptionOptions = { + hasMasterPassword: mockInputs.hasMasterPassword, + }; + + // MP + userDecryptionOptionsService.userDecryptionOptionsById$.mockReturnValue( + of(userDecryptionOptions), + ); + + // Biometrics + biometricsService.supportsBiometric.mockResolvedValue(mockInputs.osSupportsBiometric); + vaultTimeoutSettingsService.isBiometricLockSet.mockResolvedValue(mockInputs.biometricLockSet); + keyService.hasUserKeyStored.mockResolvedValue(mockInputs.hasBiometricEncryptedUserKeyStored); + platformUtilsService.supportsSecureStorage.mockReturnValue( + mockInputs.platformSupportsSecureStorage, + ); + + // PIN + pinService.isPinDecryptionAvailable.mockResolvedValue(mockInputs.pinDecryptionAvailable); + + const unlockOptions = await firstValueFrom(service.getAvailableUnlockOptions$(userId)); + + expect(unlockOptions).toEqual(expectedOutput); + }); + }); +}); diff --git a/apps/browser/src/services/extension-lock-component.service.ts b/apps/browser/src/services/extension-lock-component.service.ts new file mode 100644 index 00000000000..28fe21ede69 --- /dev/null +++ b/apps/browser/src/services/extension-lock-component.service.ts @@ -0,0 +1,116 @@ +import { inject } from "@angular/core"; +import { combineLatest, defer, map, Observable } from "rxjs"; + +import { + BiometricsDisableReason, + LockComponentService, + UnlockOptions, +} from "@bitwarden/auth/angular"; +import { + PinServiceAbstraction, + UserDecryptionOptionsServiceAbstraction, +} from "@bitwarden/auth/common"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { KeySuffixOptions } from "@bitwarden/common/platform/enums"; +import { UserId } from "@bitwarden/common/types/guid"; +import { KeyService, BiometricsService } from "@bitwarden/key-management"; + +import { BiometricErrors, BiometricErrorTypes } from "../models/biometricErrors"; +import { BrowserRouterService } from "../platform/popup/services/browser-router.service"; + +export class ExtensionLockComponentService implements LockComponentService { + private readonly userDecryptionOptionsService = inject(UserDecryptionOptionsServiceAbstraction); + private readonly platformUtilsService = inject(PlatformUtilsService); + private readonly biometricsService = inject(BiometricsService); + private readonly pinService = inject(PinServiceAbstraction); + private readonly vaultTimeoutSettingsService = inject(VaultTimeoutSettingsService); + private readonly keyService = inject(KeyService); + private readonly routerService = inject(BrowserRouterService); + + getPreviousUrl(): string | null { + return this.routerService.getPreviousUrl(); + } + + getBiometricsError(error: any): string | null { + const biometricsError = BiometricErrors[error?.message as BiometricErrorTypes]; + + if (!biometricsError) { + return null; + } + + return biometricsError.description; + } + + async isWindowVisible(): Promise { + throw new Error("Method not implemented."); + } + + getBiometricsUnlockBtnText(): string { + return "unlockWithBiometrics"; + } + + private async isBiometricLockSet(userId: UserId): Promise { + const biometricLockSet = await this.vaultTimeoutSettingsService.isBiometricLockSet(userId); + const hasBiometricEncryptedUserKeyStored = await this.keyService.hasUserKeyStored( + KeySuffixOptions.Biometric, + userId, + ); + const platformSupportsSecureStorage = this.platformUtilsService.supportsSecureStorage(); + + return ( + biometricLockSet && (hasBiometricEncryptedUserKeyStored || !platformSupportsSecureStorage) + ); + } + + private getBiometricsDisabledReason( + osSupportsBiometric: boolean, + biometricLockSet: boolean, + ): BiometricsDisableReason | null { + if (!osSupportsBiometric) { + return BiometricsDisableReason.NotSupportedOnOperatingSystem; + } else if (!biometricLockSet) { + return BiometricsDisableReason.EncryptedKeysUnavailable; + } + + return null; + } + + getAvailableUnlockOptions$(userId: UserId): Observable { + return combineLatest([ + // Note: defer is preferable b/c it delays the execution of the function until the observable is subscribed to + defer(() => this.biometricsService.supportsBiometric()), + defer(() => this.isBiometricLockSet(userId)), + this.userDecryptionOptionsService.userDecryptionOptionsById$(userId), + defer(() => this.pinService.isPinDecryptionAvailable(userId)), + ]).pipe( + map( + ([ + supportsBiometric, + isBiometricsLockSet, + userDecryptionOptions, + pinDecryptionAvailable, + ]) => { + const disableReason = this.getBiometricsDisabledReason( + supportsBiometric, + isBiometricsLockSet, + ); + + const unlockOpts: UnlockOptions = { + masterPassword: { + enabled: userDecryptionOptions.hasMasterPassword, + }, + pin: { + enabled: pinDecryptionAvailable, + }, + biometrics: { + enabled: supportsBiometric && isBiometricsLockSet, + disableReason: disableReason, + }, + }; + return unlockOpts; + }, + ), + ); + } +} diff --git a/apps/browser/src/services/vault-timeout/foreground-vault-timeout.service.ts b/apps/browser/src/services/vault-timeout/foreground-vault-timeout.service.ts new file mode 100644 index 00000000000..462e2149e88 --- /dev/null +++ b/apps/browser/src/services/vault-timeout/foreground-vault-timeout.service.ts @@ -0,0 +1,18 @@ +import { VaultTimeoutService as BaseVaultTimeoutService } from "@bitwarden/common/src/abstractions/vault-timeout/vault-timeout.service"; +import { MessagingService } from "@bitwarden/common/src/platform/abstractions/messaging.service"; +import { UserId } from "@bitwarden/common/src/types/guid"; + +export class ForegroundVaultTimeoutService implements BaseVaultTimeoutService { + constructor(protected messagingService: MessagingService) {} + + // should only ever run in background + async checkVaultTimeout(): Promise {} + + async lock(userId?: UserId): Promise { + this.messagingService.send("lockVault", { userId }); + } + + async logOut(userId?: string): Promise { + this.messagingService.send("logout", { userId }); + } +} diff --git a/apps/browser/src/services/vault-timeout/vault-timeout.service.ts b/apps/browser/src/services/vault-timeout/vault-timeout.service.ts index 228c63f0b81..e0b9db5422b 100644 --- a/apps/browser/src/services/vault-timeout/vault-timeout.service.ts +++ b/apps/browser/src/services/vault-timeout/vault-timeout.service.ts @@ -4,12 +4,13 @@ import { SafariApp } from "../../browser/safariApp"; export default class VaultTimeoutService extends BaseVaultTimeoutService { startCheck() { - this.checkVaultTimeout(); if (this.platformUtilsService.isSafari()) { - this.checkSafari(); - } else { - setInterval(() => this.checkVaultTimeout(), 10 * 1000); // check every 10 seconds + this.checkVaultTimeout().catch((error) => this.logService.error(error)); + this.checkSafari().catch((error) => this.logService.error(error)); + return; } + + super.startCheck(); } // This is a work-around to safari adding an arbitrary delay to setTimeout and @@ -20,6 +21,8 @@ export default class VaultTimeoutService extends BaseVaultTimeoutService { while (true) { try { await SafariApp.sendMessageToApp("sleep"); + // 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.checkVaultTimeout(); } catch (e) { // eslint-disable-next-line diff --git a/apps/browser/src/tools/background/abstractions/fileless-importer.background.ts b/apps/browser/src/tools/background/abstractions/fileless-importer.background.ts new file mode 100644 index 00000000000..2ade5bf7672 --- /dev/null +++ b/apps/browser/src/tools/background/abstractions/fileless-importer.background.ts @@ -0,0 +1,34 @@ +import { FilelessImportTypeKeys } from "../../enums/fileless-import.enums"; + +type FilelessImportPortMessage = { + command?: string; + importType?: FilelessImportTypeKeys; + data?: string; +}; + +type FilelessImportPortMessageHandlerParams = { + message: FilelessImportPortMessage; + port: chrome.runtime.Port; +}; + +type ImportNotificationMessageHandlers = { + [key: string]: ({ message, port }: FilelessImportPortMessageHandlerParams) => void; + cancelFilelessImport: ({ message, port }: FilelessImportPortMessageHandlerParams) => void; +}; + +type LpImporterMessageHandlers = { + [key: string]: ({ message, port }: FilelessImportPortMessageHandlerParams) => void; + displayLpImportNotification: ({ port }: { port: chrome.runtime.Port }) => void; + startLpImport: ({ message }: { message: FilelessImportPortMessage }) => void; +}; + +interface FilelessImporterBackground { + init(): void; +} + +export { + FilelessImportPortMessage, + ImportNotificationMessageHandlers, + LpImporterMessageHandlers, + FilelessImporterBackground, +}; diff --git a/apps/browser/src/tools/background/fileless-importer.background.spec.ts b/apps/browser/src/tools/background/fileless-importer.background.spec.ts new file mode 100644 index 00000000000..7b356b18fd5 --- /dev/null +++ b/apps/browser/src/tools/background/fileless-importer.background.spec.ts @@ -0,0 +1,335 @@ +import { mock } from "jest-mock-extended"; +import { firstValueFrom } from "rxjs"; + +import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { AuthService } from "@bitwarden/common/auth/services/auth.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { Importer, ImportResult, ImportServiceAbstraction } from "@bitwarden/importer/core"; + +import NotificationBackground from "../../autofill/background/notification.background"; +import { createPortSpyMock } from "../../autofill/spec/autofill-mocks"; +import { + flushPromises, + sendPortMessage, + triggerRuntimeOnConnectEvent, +} from "../../autofill/spec/testing-utils"; +import { BrowserApi } from "../../platform/browser/browser-api"; +import { BrowserScriptInjectorService } from "../../platform/services/browser-script-injector.service"; +import { FilelessImportPort, FilelessImportType } from "../enums/fileless-import.enums"; + +import FilelessImporterBackground from "./fileless-importer.background"; + +jest.mock("rxjs", () => { + const rxjs = jest.requireActual("rxjs"); + const { firstValueFrom } = rxjs; + return { + ...rxjs, + firstValueFrom: jest.fn(firstValueFrom), + }; +}); + +describe("FilelessImporterBackground ", () => { + let filelessImporterBackground: FilelessImporterBackground; + const configService = mock(); + const authService = mock(); + const policyService = mock(); + const notificationBackground = mock(); + const importService = mock(); + const syncService = mock(); + const platformUtilsService = mock(); + const logService = mock(); + let scriptInjectorService: BrowserScriptInjectorService; + + beforeEach(() => { + scriptInjectorService = new BrowserScriptInjectorService(platformUtilsService, logService); + filelessImporterBackground = new FilelessImporterBackground( + configService, + authService, + policyService, + notificationBackground, + importService, + syncService, + scriptInjectorService, + ); + filelessImporterBackground.init(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("init", () => { + it("sets up the port message listeners on initialization of the class", () => { + expect(chrome.runtime.onConnect.addListener).toHaveBeenCalledWith(expect.any(Function)); + }); + }); + + describe("handle ports onConnect", () => { + let lpImporterPort: chrome.runtime.Port; + let manifestVersionSpy: jest.SpyInstance; + let executeScriptInTabSpy: jest.SpyInstance; + + beforeEach(() => { + lpImporterPort = createPortSpyMock(FilelessImportPort.LpImporter); + manifestVersionSpy = jest.spyOn(BrowserApi, "manifestVersion", "get"); + executeScriptInTabSpy = jest.spyOn(BrowserApi, "executeScriptInTab").mockResolvedValue(null); + jest.spyOn(authService, "getAuthStatus").mockResolvedValue(AuthenticationStatus.Unlocked); + jest.spyOn(configService, "getFeatureFlag").mockResolvedValue(true); + jest.spyOn(filelessImporterBackground as any, "removeIndividualVault"); + (firstValueFrom as jest.Mock).mockResolvedValue(false); + }); + + it("ignores the port connection if the port name is not present in the set of filelessImportNames", async () => { + const port = createPortSpyMock("some-other-port"); + + triggerRuntimeOnConnectEvent(port); + await flushPromises(); + + expect(port.postMessage).not.toHaveBeenCalled(); + }); + + it("posts a message to the port indicating that the fileless import feature is disabled if the user's auth status is not unlocked", async () => { + jest.spyOn(authService, "getAuthStatus").mockResolvedValue(AuthenticationStatus.Locked); + + triggerRuntimeOnConnectEvent(lpImporterPort); + await flushPromises(); + + expect(lpImporterPort.postMessage).toHaveBeenCalledWith({ + command: "verifyFeatureFlag", + filelessImportEnabled: false, + }); + }); + + it("posts a message to the port indicating that the fileless import feature is disabled if the user's policy removes individual vaults", async () => { + (firstValueFrom as jest.Mock).mockResolvedValue(true); + + triggerRuntimeOnConnectEvent(lpImporterPort); + await flushPromises(); + + expect(lpImporterPort.postMessage).toHaveBeenCalledWith({ + command: "verifyFeatureFlag", + filelessImportEnabled: false, + }); + }); + + it("posts a message to the port indicating that the fileless import feature is disabled if the feature flag is turned off", async () => { + jest.spyOn(configService, "getFeatureFlag").mockResolvedValue(false); + + triggerRuntimeOnConnectEvent(lpImporterPort); + await flushPromises(); + + expect(lpImporterPort.postMessage).toHaveBeenCalledWith({ + command: "verifyFeatureFlag", + filelessImportEnabled: false, + }); + }); + + it("posts a message to the port indicating that the fileless import feature is enabled", async () => { + triggerRuntimeOnConnectEvent(lpImporterPort); + await flushPromises(); + + expect(lpImporterPort.postMessage).toHaveBeenCalledWith({ + command: "verifyFeatureFlag", + filelessImportEnabled: true, + }); + }); + + it("triggers an injection of the `lp-suppress-import-download.js` script in manifest v3", async () => { + manifestVersionSpy.mockReturnValue(3); + + triggerRuntimeOnConnectEvent(lpImporterPort); + await flushPromises(); + + expect(executeScriptInTabSpy).toHaveBeenCalledWith( + lpImporterPort.sender.tab.id, + { file: "content/lp-suppress-import-download.js", runAt: "document_start", frameId: 0 }, + { world: "MAIN" }, + ); + }); + + it("triggers an injection of the `lp-suppress-import-download-script-append-mv2.js` script in manifest v2", async () => { + manifestVersionSpy.mockReturnValue(2); + + triggerRuntimeOnConnectEvent(lpImporterPort); + await flushPromises(); + + expect(executeScriptInTabSpy).toHaveBeenCalledWith(lpImporterPort.sender.tab.id, { + file: "content/lp-suppress-import-download-script-append-mv2.js", + runAt: "document_start", + frameId: 0, + }); + }); + }); + + describe("port messages", () => { + let notificationPort: chrome.runtime.Port; + let lpImporterPort: chrome.runtime.Port; + + beforeEach(async () => { + jest.spyOn(authService, "getAuthStatus").mockResolvedValue(AuthenticationStatus.Unlocked); + jest.spyOn(configService, "getFeatureFlag").mockResolvedValue(true); + (firstValueFrom as jest.Mock).mockResolvedValue(false); + triggerRuntimeOnConnectEvent(createPortSpyMock(FilelessImportPort.NotificationBar)); + triggerRuntimeOnConnectEvent(createPortSpyMock(FilelessImportPort.LpImporter)); + await flushPromises(); + notificationPort = filelessImporterBackground["importNotificationsPort"]; + lpImporterPort = filelessImporterBackground["lpImporterPort"]; + }); + + it("skips handling a message if a message handler is not associated with the port message command", () => { + sendPortMessage(notificationPort, { command: "commandNotFound" }); + + expect(chrome.tabs.sendMessage).not.toHaveBeenCalled(); + }); + + describe("import notification port messages", () => { + describe("startFilelessImport", () => { + it("sends a message to start the LastPass fileless import within the content script", () => { + sendPortMessage(notificationPort, { + command: "startFilelessImport", + importType: FilelessImportType.LP, + }); + + expect(lpImporterPort.postMessage).toHaveBeenCalledWith({ + command: "startLpFilelessImport", + }); + }); + }); + + describe("cancelFilelessImport", () => { + it("sends a message to close the notification bar", async () => { + sendPortMessage(notificationPort, { command: "cancelFilelessImport" }); + + expect(chrome.tabs.sendMessage).toHaveBeenCalledWith( + notificationPort.sender.tab.id, + { + command: "closeNotificationBar", + }, + null, + expect.anything(), + ); + expect(lpImporterPort.postMessage).not.toHaveBeenCalledWith({ + command: "triggerCsvDownload", + }); + }); + + it("sends a message to trigger a download of the LP importer CSV", () => { + sendPortMessage(notificationPort, { + command: "cancelFilelessImport", + importType: FilelessImportType.LP, + }); + + expect(lpImporterPort.postMessage).toHaveBeenCalledWith({ + command: "triggerCsvDownload", + }); + expect(lpImporterPort.disconnect).toHaveBeenCalled(); + }); + }); + }); + + describe("lp importer port messages", () => { + describe("displayLpImportNotification", () => { + it("creates a request fileless import notification", async () => { + jest.spyOn(filelessImporterBackground["notificationBackground"], "requestFilelessImport"); + + sendPortMessage(lpImporterPort, { + command: "displayLpImportNotification", + }); + await flushPromises(); + + expect( + filelessImporterBackground["notificationBackground"].requestFilelessImport, + ).toHaveBeenCalledWith(lpImporterPort.sender.tab, FilelessImportType.LP); + }); + }); + + describe("startLpImport", () => { + it("ignores the message if the message does not contain data", () => { + sendPortMessage(lpImporterPort, { + command: "startLpImport", + }); + + expect(filelessImporterBackground["importService"].import).not.toHaveBeenCalled(); + }); + + it("triggers the import of the LastPass vault", async () => { + const data = "url,username,password"; + const importer = mock(); + jest + .spyOn(filelessImporterBackground["importService"], "getImporter") + .mockReturnValue(importer); + jest.spyOn(filelessImporterBackground["importService"], "import").mockResolvedValue( + mock({ + success: true, + }), + ); + jest.spyOn(filelessImporterBackground["syncService"], "fullSync"); + + sendPortMessage(lpImporterPort, { + command: "startLpImport", + data, + }); + await flushPromises(); + + expect(filelessImporterBackground["importService"].import).toHaveBeenCalledWith( + importer, + data, + null, + null, + false, + ); + expect( + filelessImporterBackground["importNotificationsPort"].postMessage, + ).toHaveBeenCalledWith({ command: "filelessImportCompleted" }); + expect(filelessImporterBackground["syncService"].fullSync).toHaveBeenCalledWith(true); + }); + + it("posts a failed message if the import fails", async () => { + const data = "url,username,password"; + const importer = mock(); + jest + .spyOn(filelessImporterBackground["importService"], "getImporter") + .mockReturnValue(importer); + jest + .spyOn(filelessImporterBackground["importService"], "import") + .mockImplementation(() => { + throw new Error("error"); + }); + jest.spyOn(filelessImporterBackground["syncService"], "fullSync"); + + sendPortMessage(lpImporterPort, { + command: "startLpImport", + data, + }); + await flushPromises(); + + expect( + filelessImporterBackground["importNotificationsPort"].postMessage, + ).toHaveBeenCalledWith({ command: "filelessImportFailed" }); + }); + }); + }); + }); + + describe("handleImporterPortDisconnect", () => { + it("resets the port properties to null", () => { + const lpImporterPort = createPortSpyMock(FilelessImportPort.LpImporter); + const notificationPort = createPortSpyMock(FilelessImportPort.NotificationBar); + filelessImporterBackground["lpImporterPort"] = lpImporterPort; + filelessImporterBackground["importNotificationsPort"] = notificationPort; + + filelessImporterBackground["handleImporterPortDisconnect"](lpImporterPort); + + expect(filelessImporterBackground["lpImporterPort"]).toBeNull(); + expect(filelessImporterBackground["importNotificationsPort"]).not.toBeNull(); + + filelessImporterBackground["handleImporterPortDisconnect"](notificationPort); + + expect(filelessImporterBackground["importNotificationsPort"]).toBeNull(); + }); + }); +}); diff --git a/apps/browser/src/tools/background/fileless-importer.background.ts b/apps/browser/src/tools/background/fileless-importer.background.ts new file mode 100644 index 00000000000..fed5541f520 --- /dev/null +++ b/apps/browser/src/tools/background/fileless-importer.background.ts @@ -0,0 +1,263 @@ +import { firstValueFrom } from "rxjs"; + +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "@bitwarden/common/admin-console/enums"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { ImportServiceAbstraction } from "@bitwarden/importer/core"; + +import NotificationBackground from "../../autofill/background/notification.background"; +import { BrowserApi } from "../../platform/browser/browser-api"; +import { ScriptInjectorService } from "../../platform/services/abstractions/script-injector.service"; +import { FilelessImporterInjectedScriptsConfig } from "../config/fileless-importer-injected-scripts"; +import { + FilelessImportPort, + FilelessImportType, + FilelessImportTypeKeys, +} from "../enums/fileless-import.enums"; + +import { + ImportNotificationMessageHandlers, + LpImporterMessageHandlers, + FilelessImporterBackground as FilelessImporterBackgroundInterface, + FilelessImportPortMessage, +} from "./abstractions/fileless-importer.background"; + +class FilelessImporterBackground implements FilelessImporterBackgroundInterface { + private static readonly filelessImporterPortNames: Set = new Set([ + FilelessImportPort.LpImporter, + FilelessImportPort.NotificationBar, + ]); + private importNotificationsPort: chrome.runtime.Port; + private lpImporterPort: chrome.runtime.Port; + private readonly importNotificationsPortMessageHandlers: ImportNotificationMessageHandlers = { + startFilelessImport: ({ message }) => this.startFilelessImport(message.importType), + cancelFilelessImport: ({ message, port }) => + this.cancelFilelessImport(message.importType, port.sender), + }; + private readonly lpImporterPortMessageHandlers: LpImporterMessageHandlers = { + displayLpImportNotification: ({ port }) => + this.displayFilelessImportNotification(port.sender.tab, FilelessImportType.LP), + startLpImport: ({ message }) => this.triggerLpImport(message.data), + }; + + /** + * Creates a new instance of the fileless importer background logic. + * + * @param configService - Identifies if the feature flag is enabled. + * @param authService - Verifies if the auth status of the user. + * @param policyService - Identifies if the user account has a policy that disables personal ownership. + * @param notificationBackground - Used to inject the notification bar into the tab. + * @param importService - Used to import the export data into the vault. + * @param syncService - Used to trigger a full sync after the import is completed. + * @param scriptInjectorService - Used to inject content scripts that initialize the import process + */ + constructor( + private configService: ConfigService, + private authService: AuthService, + private policyService: PolicyService, + private notificationBackground: NotificationBackground, + private importService: ImportServiceAbstraction, + private syncService: SyncService, + private scriptInjectorService: ScriptInjectorService, + ) {} + + /** + * Initializes the fileless importer background logic. + */ + init() { + this.setupPortMessageListeners(); + } + + /** + * Starts an import of the export data pulled from the tab. + * + * @param importType - The type of import to start. Identifies the used content script. + */ + private startFilelessImport(importType: FilelessImportTypeKeys) { + if (importType === FilelessImportType.LP) { + this.lpImporterPort?.postMessage({ command: "startLpFilelessImport" }); + } + } + + /** + * Cancels an import of the export data pulled from the tab. This closes any + * existing notifications that are present in the tab, and triggers importer + * specific behavior based on the import type. + * + * @param importType - The type of import to cancel. Identifies the used content script. + * @param sender - The sender of the message. + */ + private async cancelFilelessImport( + importType: FilelessImportTypeKeys, + sender: chrome.runtime.MessageSender, + ) { + if (importType === FilelessImportType.LP) { + this.triggerLpImporterCsvDownload(); + } + + await BrowserApi.tabSendMessage(sender.tab, { command: "closeNotificationBar" }); + } + + /** + * Injects the notification bar into the passed tab. + * + * @param tab + * @param importType + */ + private async displayFilelessImportNotification(tab: chrome.tabs.Tab, importType: string) { + await this.notificationBackground.requestFilelessImport(tab, importType); + } + + /** + * Triggers the download of the CSV file from the LP importer. This is triggered + * when the user opts to not save the export to Bitwarden within the notification bar. + */ + private triggerLpImporterCsvDownload() { + this.lpImporterPort?.postMessage({ command: "triggerCsvDownload" }); + this.lpImporterPort?.disconnect(); + } + + /** + * Completes the import process for the LP importer. This is triggered when the + * user opts to save the export to Bitwarden within the notification bar. + * + * @param data - The export data to import. + * @param sender - The sender of the message. + */ + private async triggerLpImport(data: string) { + if (!data) { + return; + } + + const promptForPassword_callback = async () => ""; + const importer = this.importService.getImporter( + "lastpasscsv", + promptForPassword_callback, + null, + ); + + try { + const result = await this.importService.import(importer, data, null, null, false); + if (result.success) { + this.importNotificationsPort?.postMessage({ command: "filelessImportCompleted" }); + await this.syncService.fullSync(true); + } + } catch (error) { + this.importNotificationsPort?.postMessage({ + command: "filelessImportFailed", + importErrorMessage: Object.values(error).length + ? error + : chrome.i18n.getMessage("importNetworkError"), + }); + } + } + + /** + * Identifies if the user account has a policy that disables personal ownership. + */ + private async removeIndividualVault(): Promise { + return await firstValueFrom( + this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership), + ); + } + + /** + * Sets up onConnect listeners for the extension. + */ + private setupPortMessageListeners() { + chrome.runtime.onConnect.addListener(this.handlePortOnConnect); + } + + /** + * Handles connections from content scripts that affect the fileless importer behavior. + * Is used to facilitate the passing of data and user actions to enact the import + * of web content to the Bitwarden vault. Along with this, a check is made to ensure + * that the feature flag is enabled and the user is authenticated. + */ + private handlePortOnConnect = async (port: chrome.runtime.Port) => { + if (!FilelessImporterBackground.filelessImporterPortNames.has(port.name)) { + return; + } + + const filelessImportFeatureFlagEnabled = await this.configService.getFeatureFlag( + FeatureFlag.BrowserFilelessImport, + ); + const userAuthStatus = await this.authService.getAuthStatus(); + const removeIndividualVault = await this.removeIndividualVault(); + const filelessImportEnabled = + filelessImportFeatureFlagEnabled && + userAuthStatus === AuthenticationStatus.Unlocked && + !removeIndividualVault; + port.postMessage({ command: "verifyFeatureFlag", filelessImportEnabled }); + + if (!filelessImportEnabled) { + return; + } + + port.onMessage.addListener(this.handleImporterPortMessage); + port.onDisconnect.addListener(this.handleImporterPortDisconnect); + + switch (port.name) { + case FilelessImportPort.LpImporter: + this.lpImporterPort = port; + await this.scriptInjectorService.inject({ + tabId: port.sender.tab.id, + injectDetails: { runAt: "document_start" }, + mv2Details: FilelessImporterInjectedScriptsConfig.LpSuppressImportDownload.mv2, + mv3Details: FilelessImporterInjectedScriptsConfig.LpSuppressImportDownload.mv3, + }); + break; + case FilelessImportPort.NotificationBar: + this.importNotificationsPort = port; + break; + } + }; + + /** + * Handles messages that are sent from fileless importer content scripts. + * @param message - The message that was sent. + * @param port - The port that the message was sent from. + */ + private handleImporterPortMessage = ( + message: FilelessImportPortMessage, + port: chrome.runtime.Port, + ) => { + let handler: CallableFunction | undefined; + + switch (port.name) { + case FilelessImportPort.LpImporter: + handler = this.lpImporterPortMessageHandlers[message.command]; + break; + case FilelessImportPort.NotificationBar: + handler = this.importNotificationsPortMessageHandlers[message.command]; + break; + } + + if (!handler) { + return; + } + + handler({ message, port }); + }; + + /** + * Handles disconnections from fileless importer content scripts. + * @param port - The port that was disconnected. + */ + private handleImporterPortDisconnect = (port: chrome.runtime.Port) => { + switch (port.name) { + case FilelessImportPort.LpImporter: + this.lpImporterPort = null; + break; + case FilelessImportPort.NotificationBar: + this.importNotificationsPort = null; + break; + } + }; +} + +export default FilelessImporterBackground; diff --git a/apps/browser/src/tools/background/service_factories/password-generation-service.factory.ts b/apps/browser/src/tools/background/service_factories/password-generation-service.factory.ts deleted file mode 100644 index b5a56dc1184..00000000000 --- a/apps/browser/src/tools/background/service_factories/password-generation-service.factory.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - PasswordGenerationService, - PasswordGenerationServiceAbstraction, -} from "@bitwarden/common/tools/generator/password"; - -import { - policyServiceFactory, - PolicyServiceInitOptions, -} from "../../../admin-console/background/service-factories/policy-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; - -type PasswordGenerationServiceFactoryOptions = FactoryOptions; - -export type PasswordGenerationServiceInitOptions = PasswordGenerationServiceFactoryOptions & - CryptoServiceInitOptions & - PolicyServiceInitOptions & - StateServiceInitOptions; - -export function passwordGenerationServiceFactory( - cache: { passwordGenerationService?: PasswordGenerationServiceAbstraction } & CachedServices, - opts: PasswordGenerationServiceInitOptions -): Promise { - return factory( - cache, - "passwordGenerationService", - opts, - async () => - new PasswordGenerationService( - await cryptoServiceFactory(cache, opts), - await policyServiceFactory(cache, opts), - await stateServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/tools/background/service_factories/password-strength-service.factory.ts b/apps/browser/src/tools/background/service_factories/password-strength-service.factory.ts deleted file mode 100644 index 3ebd4636fe3..00000000000 --- a/apps/browser/src/tools/background/service_factories/password-strength-service.factory.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { - PasswordStrengthService, - PasswordStrengthServiceAbstraction, -} from "@bitwarden/common/tools/password-strength"; - -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; - -type PasswordStrengthServiceFactoryOptions = FactoryOptions; - -export type PasswordStrengthServiceInitOptions = PasswordStrengthServiceFactoryOptions; - -export function passwordStrengthServiceFactory( - cache: { - passwordStrengthService?: PasswordStrengthServiceAbstraction; - } & CachedServices, - opts: PasswordStrengthServiceInitOptions -): Promise { - return factory(cache, "passwordStrengthService", opts, async () => new PasswordStrengthService()); -} diff --git a/apps/browser/src/tools/config/fileless-importer-injected-scripts.ts b/apps/browser/src/tools/config/fileless-importer-injected-scripts.ts new file mode 100644 index 00000000000..898ee1205ab --- /dev/null +++ b/apps/browser/src/tools/config/fileless-importer-injected-scripts.ts @@ -0,0 +1,25 @@ +import { + Mv2ScriptInjectionDetails, + Mv3ScriptInjectionDetails, +} from "../../platform/services/abstractions/script-injector.service"; + +type FilelessImporterInjectedScriptsConfigurations = { + LpSuppressImportDownload: { + mv2: Mv2ScriptInjectionDetails; + mv3: Mv3ScriptInjectionDetails; + }; +}; + +const FilelessImporterInjectedScriptsConfig: FilelessImporterInjectedScriptsConfigurations = { + LpSuppressImportDownload: { + mv2: { + file: "content/lp-suppress-import-download-script-append-mv2.js", + }, + mv3: { + file: "content/lp-suppress-import-download.js", + world: "MAIN", + }, + }, +} as const; + +export { FilelessImporterInjectedScriptsConfig }; diff --git a/apps/browser/src/tools/content/abstractions/lp-fileless-importer.ts b/apps/browser/src/tools/content/abstractions/lp-fileless-importer.ts new file mode 100644 index 00000000000..018ea2c8d94 --- /dev/null +++ b/apps/browser/src/tools/content/abstractions/lp-fileless-importer.ts @@ -0,0 +1,25 @@ +type LpFilelessImporterMessage = { + command?: string; + data?: string; + filelessImportEnabled?: boolean; +}; + +type LpFilelessImporterMessageHandlerParams = { + message: LpFilelessImporterMessage; + port: chrome.runtime.Port; +}; + +type LpFilelessImporterMessageHandlers = { + [key: string]: ({ message, port }: LpFilelessImporterMessageHandlerParams) => void; + verifyFeatureFlag: ({ message }: { message: LpFilelessImporterMessage }) => void; + triggerCsvDownload: () => void; + startLpFilelessImport: () => void; +}; + +interface LpFilelessImporter { + init(): void; + handleFeatureFlagVerification(message: LpFilelessImporterMessage): void; + triggerCsvDownload(): void; +} + +export { LpFilelessImporterMessage, LpFilelessImporterMessageHandlers, LpFilelessImporter }; diff --git a/apps/browser/src/tools/content/lp-fileless-importer.spec.ts b/apps/browser/src/tools/content/lp-fileless-importer.spec.ts new file mode 100644 index 00000000000..432754ab91c --- /dev/null +++ b/apps/browser/src/tools/content/lp-fileless-importer.spec.ts @@ -0,0 +1,209 @@ +import { mock } from "jest-mock-extended"; + +import { createPortSpyMock } from "../../autofill/spec/autofill-mocks"; +import { sendPortMessage } from "../../autofill/spec/testing-utils"; +import { FilelessImportPort } from "../enums/fileless-import.enums"; + +import { LpFilelessImporter } from "./abstractions/lp-fileless-importer"; + +describe("LpFilelessImporter", () => { + let lpFilelessImporter: LpFilelessImporter & { [key: string]: any }; + const portSpy: chrome.runtime.Port = createPortSpyMock(FilelessImportPort.LpImporter); + chrome.runtime.connect = jest.fn(() => portSpy); + + beforeEach(() => { + require("./lp-fileless-importer"); + lpFilelessImporter = (globalThis as any).lpFilelessImporter; + }); + + afterEach(() => { + (globalThis as any).lpFilelessImporter = undefined; + jest.clearAllMocks(); + jest.resetModules(); + Object.defineProperty(document, "readyState", { + value: "complete", + writable: true, + }); + }); + + describe("init", () => { + it("sets up the port connection with the background script", () => { + lpFilelessImporter.init(); + + expect(chrome.runtime.connect).toHaveBeenCalledWith({ + name: FilelessImportPort.LpImporter, + }); + }); + }); + + describe("handleFeatureFlagVerification", () => { + it("disconnects the message port when the fileless import feature is disabled", () => { + lpFilelessImporter.handleFeatureFlagVerification({ filelessImportEnabled: false }); + + expect(portSpy.disconnect).toHaveBeenCalled(); + }); + + it("sets up an event listener for DOMContentLoaded that triggers the importer when the document ready state is `loading`", () => { + Object.defineProperty(document, "readyState", { + value: "loading", + writable: true, + }); + const message = { + command: "verifyFeatureFlag", + filelessImportEnabled: true, + }; + jest.spyOn(document, "addEventListener"); + + lpFilelessImporter.handleFeatureFlagVerification(message); + + expect(document.addEventListener).toHaveBeenCalledWith( + "DOMContentLoaded", + (lpFilelessImporter as any).loadImporter, + ); + }); + + it("sets up a mutation observer to watch the document body for injection of the export content", () => { + const message = { + command: "verifyFeatureFlag", + filelessImportEnabled: true, + }; + jest.spyOn(document, "addEventListener"); + jest.spyOn(window, "MutationObserver").mockImplementationOnce(() => mock()); + + lpFilelessImporter.handleFeatureFlagVerification(message); + + expect(window.MutationObserver).toHaveBeenCalledWith( + (lpFilelessImporter as any).handleMutation, + ); + expect((lpFilelessImporter as any).mutationObserver.observe).toHaveBeenCalledWith( + document.body, + { childList: true, subtree: true }, + ); + }); + }); + + describe("triggerCsvDownload", () => { + it("posts a window message that triggers the download of the LastPass export", () => { + jest.spyOn(globalThis, "postMessage"); + + lpFilelessImporter.triggerCsvDownload(); + + expect(globalThis.postMessage).toHaveBeenCalledWith( + { command: "triggerCsvDownload" }, + "https://lastpass.com", + ); + }); + }); + + describe("handleMutation", () => { + beforeEach(() => { + lpFilelessImporter["mutationObserver"] = mock({ disconnect: jest.fn() }); + jest.spyOn(portSpy, "postMessage"); + }); + + it("ignores mutations that contain empty records", () => { + lpFilelessImporter["handleMutation"]([]); + + expect(portSpy.postMessage).not.toHaveBeenCalled(); + }); + + it("ignores mutations that have no added nodes in the mutation", () => { + lpFilelessImporter["handleMutation"]([{ addedNodes: [] }]); + + expect(portSpy.postMessage).not.toHaveBeenCalled(); + }); + + it("ignores mutations that have no added nodes with a tagname of `pre`", () => { + lpFilelessImporter["handleMutation"]([{ addedNodes: [{ nodeName: "div" }] }]); + + expect(portSpy.postMessage).not.toHaveBeenCalled(); + }); + + it("ignores mutations where the found `pre` element does not contain any textContent", () => { + lpFilelessImporter["handleMutation"]([{ addedNodes: [{ nodeName: "pre" }] }]); + + expect(portSpy.postMessage).not.toHaveBeenCalled(); + }); + + it("ignores mutations where the found `pre` element does not contain the expected header content", () => { + lpFilelessImporter["handleMutation"]([ + { addedNodes: [{ nodeName: "pre", textContent: "some other content" }] }, + ]); + + expect(portSpy.postMessage).not.toHaveBeenCalled(); + }); + + it("will store the export data, display the import notification, and disconnect the mutation observer when the export data is appended", () => { + const observerDisconnectSpy = jest.spyOn( + lpFilelessImporter["mutationObserver"], + "disconnect", + ); + + lpFilelessImporter["handleMutation"]([ + { addedNodes: [{ nodeName: "pre", textContent: "url,username,password" }] }, + ]); + + expect(lpFilelessImporter["exportData"]).toEqual("url,username,password"); + expect(portSpy.postMessage).toHaveBeenCalledWith({ command: "displayLpImportNotification" }); + expect(observerDisconnectSpy).toHaveBeenCalled(); + }); + }); + + describe("handlePortMessage", () => { + it("ignores messages that are not registered with the portMessageHandlers", () => { + const message = { command: "unknownCommand" }; + jest.spyOn(lpFilelessImporter, "handleFeatureFlagVerification"); + jest.spyOn(lpFilelessImporter, "triggerCsvDownload"); + + sendPortMessage(portSpy, message); + + expect(lpFilelessImporter.handleFeatureFlagVerification).not.toHaveBeenCalled(); + expect(lpFilelessImporter.triggerCsvDownload).not.toHaveBeenCalled(); + }); + + it("handles the port message that verifies the fileless import feature flag", () => { + const message = { command: "verifyFeatureFlag", filelessImportEnabled: true }; + jest.spyOn(lpFilelessImporter, "handleFeatureFlagVerification").mockImplementation(); + + sendPortMessage(portSpy, message); + + expect(lpFilelessImporter.handleFeatureFlagVerification).toHaveBeenCalledWith(message); + }); + + it("handles the port message that triggers the LastPass csv download", () => { + const message = { command: "triggerCsvDownload" }; + jest.spyOn(lpFilelessImporter, "triggerCsvDownload"); + + sendPortMessage(portSpy, message); + + expect(lpFilelessImporter.triggerCsvDownload).toHaveBeenCalled(); + }); + + describe("handles the port message that triggers the LastPass fileless import", () => { + beforeEach(() => { + jest.spyOn(lpFilelessImporter as any, "postPortMessage"); + }); + + it("skips the import of the export data is not populated", () => { + const message = { command: "startLpFilelessImport" }; + + sendPortMessage(portSpy, message); + + expect(lpFilelessImporter.postPortMessage).not.toHaveBeenCalled(); + }); + + it("starts the last pass fileless import", () => { + const message = { command: "startLpFilelessImport" }; + const exportData = "url,username,password"; + lpFilelessImporter["exportData"] = exportData; + + sendPortMessage(portSpy, message); + + expect(lpFilelessImporter.postPortMessage).toHaveBeenCalledWith({ + command: "startLpImport", + data: exportData, + }); + }); + }); + }); +}); diff --git a/apps/browser/src/tools/content/lp-fileless-importer.ts b/apps/browser/src/tools/content/lp-fileless-importer.ts new file mode 100644 index 00000000000..6f091ecf5a5 --- /dev/null +++ b/apps/browser/src/tools/content/lp-fileless-importer.ts @@ -0,0 +1,156 @@ +import { FilelessImportPort } from "../enums/fileless-import.enums"; + +import { + LpFilelessImporter as LpFilelessImporterInterface, + LpFilelessImporterMessage, + LpFilelessImporterMessageHandlers, +} from "./abstractions/lp-fileless-importer"; + +class LpFilelessImporter implements LpFilelessImporterInterface { + private exportData: string; + private messagePort: chrome.runtime.Port; + private mutationObserver: MutationObserver; + private readonly portMessageHandlers: LpFilelessImporterMessageHandlers = { + verifyFeatureFlag: ({ message }) => this.handleFeatureFlagVerification(message), + triggerCsvDownload: () => this.triggerCsvDownload(), + startLpFilelessImport: () => this.startLpImport(), + }; + + /** + * Initializes the LP fileless importer. + */ + init() { + this.setupMessagePort(); + } + + /** + * Enacts behavior based on the feature flag verification message. If the feature flag is + * not enabled, the message port is disconnected. If the feature flag is enabled, the + * download of the CSV file is suppressed. + * + * @param message - The port message, contains the feature flag indicator. + */ + handleFeatureFlagVerification(message: LpFilelessImporterMessage) { + if (!message.filelessImportEnabled) { + this.messagePort?.disconnect(); + return; + } + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", this.loadImporter); + return; + } + + this.loadImporter(); + } + + /** + * Posts a message to the LP importer to trigger the download of the CSV file. + */ + triggerCsvDownload() { + this.postWindowMessage({ command: "triggerCsvDownload" }); + } + + /** + * Initializes the importing mechanism used to import the CSV file into Bitwarden. + * This is done by observing the DOM for the addition of the LP importer element. + */ + private loadImporter = () => { + this.mutationObserver = new MutationObserver(this.handleMutation); + this.mutationObserver.observe(document.body, { + childList: true, + subtree: true, + }); + }; + + /** + * Handles mutations that are observed by the mutation observer. When the exported data + * element is added to the DOM, the export data is extracted and the import prompt is + * displayed. + * + * @param mutations - The mutations that were observed. + */ + private handleMutation = (mutations: MutationRecord[]) => { + let textContent: string; + for (let index = 0; index < mutations?.length; index++) { + const mutation: MutationRecord = mutations[index]; + + textContent = Array.from(mutation.addedNodes) + .filter((node) => node.nodeName.toLowerCase() === "pre") + .map((node) => (node as HTMLPreElement).textContent?.trim()) + .find((text) => text?.indexOf("url,username,password") >= 0); + + if (textContent) { + break; + } + } + + if (textContent) { + this.exportData = textContent; + this.postPortMessage({ command: "displayLpImportNotification" }); + this.mutationObserver.disconnect(); + } + }; + + /** + * If the export data is present, sends a message to the background with + * the export data to start the import process. + */ + private startLpImport() { + if (!this.exportData) { + return; + } + + this.postPortMessage({ command: "startLpImport", data: this.exportData }); + this.messagePort?.disconnect(); + } + + /** + * Posts a message to the background script. + * + * @param message - The message to post. + */ + private postPortMessage(message: LpFilelessImporterMessage) { + this.messagePort?.postMessage(message); + } + + /** + * Posts a message to the global context of the page. + * + * @param message - The message to post. + */ + private postWindowMessage(message: LpFilelessImporterMessage) { + globalThis.postMessage(message, "https://lastpass.com"); + } + + /** + * Sets up the message port that is used to facilitate communication between the + * background script and the content script. + */ + private setupMessagePort() { + this.messagePort = chrome.runtime.connect({ name: FilelessImportPort.LpImporter }); + this.messagePort.onMessage.addListener(this.handlePortMessage); + } + + /** + * Handles messages that are sent from the background script. + * + * @param message - The message that was sent. + * @param port - The port that the message was sent from. + */ + private handlePortMessage = (message: LpFilelessImporterMessage, port: chrome.runtime.Port) => { + const handler = this.portMessageHandlers[message.command]; + if (!handler) { + return; + } + + handler({ message, port }); + }; +} + +(function () { + if (!(globalThis as any).lpFilelessImporter) { + (globalThis as any).lpFilelessImporter = new LpFilelessImporter(); + (globalThis as any).lpFilelessImporter.init(); + } +})(); diff --git a/apps/browser/src/tools/content/lp-suppress-import-download-script-append.mv2.spec.ts b/apps/browser/src/tools/content/lp-suppress-import-download-script-append.mv2.spec.ts new file mode 100644 index 00000000000..95b49ea00ec --- /dev/null +++ b/apps/browser/src/tools/content/lp-suppress-import-download-script-append.mv2.spec.ts @@ -0,0 +1,21 @@ +describe("LP Suppress Import Download for Manifest v2", () => { + it("appends the `lp-suppress-import-download.js` script to the document element", () => { + let createdScriptElement: HTMLScriptElement; + jest.spyOn(window.document, "createElement"); + jest.spyOn(window.document.documentElement, "appendChild").mockImplementation((node) => { + createdScriptElement = node as HTMLScriptElement; + return node; + }); + + require("./lp-suppress-import-download-script-append.mv2"); + + expect(window.document.createElement).toHaveBeenCalledWith("script"); + expect(chrome.runtime.getURL).toHaveBeenCalledWith("content/lp-suppress-import-download.js"); + expect(window.document.documentElement.appendChild).toHaveBeenCalledWith( + expect.any(HTMLScriptElement), + ); + expect(createdScriptElement.src).toBe( + "chrome-extension://id/content/lp-suppress-import-download.js", + ); + }); +}); diff --git a/apps/browser/src/tools/content/lp-suppress-import-download-script-append.mv2.ts b/apps/browser/src/tools/content/lp-suppress-import-download-script-append.mv2.ts new file mode 100644 index 00000000000..cd641590ad1 --- /dev/null +++ b/apps/browser/src/tools/content/lp-suppress-import-download-script-append.mv2.ts @@ -0,0 +1,9 @@ +/** + * This script handles injection of the LP suppress import download script into the document. + * This is required for manifest v2, but will be removed when we migrate fully to manifest v3. + */ +(function (globalContext) { + const script = globalContext.document.createElement("script"); + script.src = chrome.runtime.getURL("content/lp-suppress-import-download.js"); + globalContext.document.documentElement.appendChild(script); +})(window); diff --git a/apps/browser/src/tools/content/lp-suppress-import-download.spec.ts b/apps/browser/src/tools/content/lp-suppress-import-download.spec.ts new file mode 100644 index 00000000000..bfff3787506 --- /dev/null +++ b/apps/browser/src/tools/content/lp-suppress-import-download.spec.ts @@ -0,0 +1,81 @@ +import { flushPromises, postWindowMessage } from "../../autofill/spec/testing-utils"; + +describe("LP Suppress Import Download", () => { + const downloadAttribute = "file.csv"; + const hrefAttribute = "https://example.com/file.csv"; + const overridenHrefAttribute = "javascript:void(0)"; + let anchor: HTMLAnchorElement; + + beforeEach(() => { + jest.spyOn(Element.prototype, "appendChild"); + jest.spyOn(window, "addEventListener"); + + require("./lp-suppress-import-download"); + + anchor = document.createElement("a"); + anchor.download = downloadAttribute; + anchor.href = hrefAttribute; + anchor.click = jest.fn(); + }); + + afterEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + }); + + it("disables the automatic download anchor", () => { + document.body.appendChild(anchor); + + expect(anchor.href).toBe(overridenHrefAttribute); + expect(anchor.download).toBe(""); + }); + + it("triggers the CSVDownload when receiving a `triggerCsvDownload` window message", async () => { + window.document.createElement = jest.fn(() => anchor); + jest.spyOn(window, "removeEventListener"); + + document.body.appendChild(anchor); + + // Precondition - Ensure the anchor in the document has overridden href and download attributes + expect(anchor.href).toBe(overridenHrefAttribute); + expect(anchor.download).toBe(""); + + postWindowMessage({ command: "triggerCsvDownload" }); + await flushPromises(); + + expect(anchor.click).toHaveBeenCalled(); + expect(anchor.href).toEqual(hrefAttribute); + expect(anchor.download).toEqual(downloadAttribute); + expect(window.removeEventListener).toHaveBeenCalledWith("message", expect.any(Function)); + }); + + it("skips subsequent calls to trigger a CSVDownload", async () => { + window.document.createElement = jest.fn(() => anchor); + + document.body.appendChild(anchor); + + postWindowMessage({ command: "triggerCsvDownload" }); + await flushPromises(); + + postWindowMessage({ command: "triggerCsvDownload" }); + await flushPromises(); + + expect(anchor.click).toHaveBeenCalledTimes(1); + }); + + it("skips triggering the CSV download for window messages that do not have the correct command", () => { + document.body.appendChild(anchor); + + postWindowMessage({ command: "notTriggerCsvDownload" }); + + expect(anchor.click).not.toHaveBeenCalled(); + }); + + it("skips triggering the CSV download for window messages that do not have a data value", () => { + document.body.appendChild(anchor); + + postWindowMessage(null); + + expect(anchor.click).not.toHaveBeenCalled(); + }); +}); diff --git a/apps/browser/src/tools/content/lp-suppress-import-download.ts b/apps/browser/src/tools/content/lp-suppress-import-download.ts new file mode 100644 index 00000000000..486d391279d --- /dev/null +++ b/apps/browser/src/tools/content/lp-suppress-import-download.ts @@ -0,0 +1,50 @@ +/** + * Handles intercepting the injection of the CSV download link, and ensures the + * download of the script is suppressed until the user opts to download the file. + * The download is triggered by a window message sent from the LpFilelessImporter + * content script. + */ +(function (globalContext) { + let csvDownload = ""; + let csvHref = ""; + let isCsvDownloadTriggered = false; + const defaultAppendChild = Element.prototype.appendChild; + Element.prototype.appendChild = function (newChild: Node) { + if (isAnchorElement(newChild) && newChild.download) { + csvDownload = newChild.download; + csvHref = newChild.href; + newChild.setAttribute("href", "javascript:void(0)"); + newChild.setAttribute("download", ""); + Element.prototype.appendChild = defaultAppendChild; + } + + return defaultAppendChild.call(this, newChild); + }; + + function isAnchorElement(node: Node): node is HTMLAnchorElement { + return node.nodeName.toLowerCase() === "a"; + } + + const handleWindowMessage = (event: MessageEvent) => { + const command = event.data?.command; + if ( + event.source !== globalContext || + command !== "triggerCsvDownload" || + isCsvDownloadTriggered + ) { + return; + } + + isCsvDownloadTriggered = true; + globalContext.removeEventListener("message", handleWindowMessage); + + const anchor = globalContext.document.createElement("a"); + anchor.setAttribute("href", csvHref); + anchor.setAttribute("download", csvDownload); + globalContext.document.body.appendChild(anchor); + anchor.click(); + globalContext.document.body.removeChild(anchor); + }; + + globalContext.addEventListener("message", handleWindowMessage); +})(window); diff --git a/apps/browser/src/tools/enums/fileless-import.enums.ts b/apps/browser/src/tools/enums/fileless-import.enums.ts new file mode 100644 index 00000000000..e20f4f15454 --- /dev/null +++ b/apps/browser/src/tools/enums/fileless-import.enums.ts @@ -0,0 +1,12 @@ +const FilelessImportType = { + LP: "LP", +} as const; + +type FilelessImportTypeKeys = (typeof FilelessImportType)[keyof typeof FilelessImportType]; + +const FilelessImportPort = { + NotificationBar: "fileless-importer-notification-bar", + LpImporter: "lp-fileless-importer", +} as const; + +export { FilelessImportType, FilelessImportTypeKeys, FilelessImportPort }; diff --git a/apps/browser/src/tools/popup/components/file-popout-callout.component.html b/apps/browser/src/tools/popup/components/file-popout-callout.component.html new file mode 100644 index 00000000000..0df77dc4367 --- /dev/null +++ b/apps/browser/src/tools/popup/components/file-popout-callout.component.html @@ -0,0 +1,11 @@ + +
{{ "sendLinuxChromiumFileWarning" | i18n }}
+
{{ "sendFirefoxFileWarning" | i18n }}
+
{{ "sendSafariFileWarning" | i18n }}
+
diff --git a/apps/browser/src/tools/popup/components/file-popout-callout.component.ts b/apps/browser/src/tools/popup/components/file-popout-callout.component.ts new file mode 100644 index 00000000000..9218403b133 --- /dev/null +++ b/apps/browser/src/tools/popup/components/file-popout-callout.component.ts @@ -0,0 +1,36 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnInit } from "@angular/core"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { CalloutModule } from "@bitwarden/components"; + +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { FilePopoutUtilsService } from "../services/file-popout-utils.service"; + +@Component({ + selector: "tools-file-popout-callout", + templateUrl: "file-popout-callout.component.html", + standalone: true, + imports: [CommonModule, JslibModule, CalloutModule], +}) +export class FilePopoutCalloutComponent implements OnInit { + protected showFilePopoutMessage: boolean; + protected showFirefoxFileWarning: boolean; + protected showSafariFileWarning: boolean; + protected showChromiumFileWarning: boolean; + + constructor(private filePopoutUtilsService: FilePopoutUtilsService) {} + + ngOnInit() { + this.showFilePopoutMessage = this.filePopoutUtilsService.showFilePopoutMessage(window); + this.showFirefoxFileWarning = this.filePopoutUtilsService.showFirefoxFileWarning(window); + this.showSafariFileWarning = this.filePopoutUtilsService.showSafariFileWarning(window); + this.showChromiumFileWarning = this.filePopoutUtilsService.showChromiumFileWarning(window); + } + + popOutWindow() { + // 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 + BrowserPopupUtils.openCurrentPagePopout(window); + } +} diff --git a/apps/browser/src/tools/popup/generator/credential-generator-history.component.html b/apps/browser/src/tools/popup/generator/credential-generator-history.component.html new file mode 100644 index 00000000000..06b503534b5 --- /dev/null +++ b/apps/browser/src/tools/popup/generator/credential-generator-history.component.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/apps/browser/src/tools/popup/generator/credential-generator-history.component.ts b/apps/browser/src/tools/popup/generator/credential-generator-history.component.ts new file mode 100644 index 00000000000..dd65bb96878 --- /dev/null +++ b/apps/browser/src/tools/popup/generator/credential-generator-history.component.ts @@ -0,0 +1,77 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { BehaviorSubject, distinctUntilChanged, firstValueFrom, map, switchMap } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { UserId } from "@bitwarden/common/types/guid"; +import { ButtonModule, ContainerComponent, DialogService } from "@bitwarden/components"; +import { + CredentialGeneratorHistoryComponent as CredentialGeneratorHistoryToolsComponent, + EmptyCredentialHistoryComponent, +} from "@bitwarden/generator-components"; +import { GeneratorHistoryService } from "@bitwarden/generator-history"; + +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; + +@Component({ + selector: "app-credential-generator-history", + templateUrl: "credential-generator-history.component.html", + standalone: true, + imports: [ + ButtonModule, + CommonModule, + ContainerComponent, + JslibModule, + PopOutComponent, + PopupHeaderComponent, + PopupPageComponent, + CredentialGeneratorHistoryToolsComponent, + EmptyCredentialHistoryComponent, + PopupFooterComponent, + ], +}) +export class CredentialGeneratorHistoryComponent { + protected readonly hasHistory$ = new BehaviorSubject(false); + protected readonly userId$ = new BehaviorSubject(null); + + constructor( + private accountService: AccountService, + private history: GeneratorHistoryService, + private dialogService: DialogService, + ) { + this.accountService.activeAccount$ + .pipe( + takeUntilDestroyed(), + map(({ id }) => id), + distinctUntilChanged(), + ) + .subscribe(this.userId$); + + this.userId$ + .pipe( + takeUntilDestroyed(), + switchMap((id) => id && this.history.credentials$(id)), + map((credentials) => credentials.length > 0), + ) + .subscribe(this.hasHistory$); + } + + clear = async () => { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "clearGeneratorHistoryTitle" }, + content: { key: "cleargGeneratorHistoryDescription" }, + type: "warning", + acceptButtonText: { key: "clearHistory" }, + cancelButtonText: { key: "cancel" }, + }); + + if (confirmed) { + await this.history.clear(await firstValueFrom(this.userId$)); + } + }; +} diff --git a/apps/browser/src/tools/popup/generator/credential-generator.component.html b/apps/browser/src/tools/popup/generator/credential-generator.component.html new file mode 100644 index 00000000000..aed02b46178 --- /dev/null +++ b/apps/browser/src/tools/popup/generator/credential-generator.component.html @@ -0,0 +1,15 @@ + + + + + + + + + + + {{ "generatorHistory" | i18n }} + + + + diff --git a/apps/browser/src/tools/popup/generator/credential-generator.component.ts b/apps/browser/src/tools/popup/generator/credential-generator.component.ts new file mode 100644 index 00000000000..9c1af07efdd --- /dev/null +++ b/apps/browser/src/tools/popup/generator/credential-generator.component.ts @@ -0,0 +1,30 @@ +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { ItemModule } from "@bitwarden/components"; +import { GeneratorModule } from "@bitwarden/generator-components"; + +import { CurrentAccountComponent } from "../../../auth/popup/account-switching/current-account.component"; +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; + +@Component({ + standalone: true, + selector: "credential-generator", + templateUrl: "credential-generator.component.html", + imports: [ + GeneratorModule, + CurrentAccountComponent, + JslibModule, + PopOutComponent, + PopupHeaderComponent, + PopupPageComponent, + PopupFooterComponent, + RouterModule, + ItemModule, + ], +}) +export class CredentialGeneratorComponent {} diff --git a/apps/browser/src/tools/popup/generator/generator.component.html b/apps/browser/src/tools/popup/generator/generator.component.html index 13d35b6cd7a..d92d32a5623 100644 --- a/apps/browser/src/tools/popup/generator/generator.component.html +++ b/apps/browser/src/tools/popup/generator/generator.component.html @@ -1,4 +1,4 @@ -
+
-
+
{{ "passwordGeneratorPolicyInEffect" | i18n }} @@ -176,7 +176,7 @@
+
+ {{ "passwordMinLength" | i18n }} + + {{ passwordOptionsMinLengthForReader$ | async }} + + {{ passwordOptions.minLength }} +
- +
@@ -249,8 +261,8 @@ type="number" min="0" max="9" - (change)="savePasswordOptions()" [(ngModel)]="passwordOptions.minNumber" + (input)="onPasswordOptionsMinNumberInput($event)" />
@@ -260,8 +272,8 @@ type="number" min="0" max="9" - (change)="savePasswordOptions()" [(ngModel)]="passwordOptions.minSpecial" + (input)="onPasswordOptionsMinSpecialInput($event)" />
+
+ + +
@@ -378,7 +400,7 @@ />
- +
+
+ + +
@@ -424,7 +456,7 @@ />
- +
- {{ h.date | date : "medium" }} + {{ h.date | date: "medium" }}
diff --git a/apps/browser/src/tools/popup/generator/password-generator-history.component.ts b/apps/browser/src/tools/popup/generator/password-generator-history.component.ts index fbe1ba10d33..2436ae51a7d 100644 --- a/apps/browser/src/tools/popup/generator/password-generator-history.component.ts +++ b/apps/browser/src/tools/popup/generator/password-generator-history.component.ts @@ -4,7 +4,8 @@ import { Component } from "@angular/core"; import { PasswordGeneratorHistoryComponent as BasePasswordGeneratorHistoryComponent } from "@bitwarden/angular/tools/generator/components/password-generator-history.component"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; +import { ToastService } from "@bitwarden/components"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; @Component({ selector: "app-password-generator-history", @@ -15,9 +16,10 @@ export class PasswordGeneratorHistoryComponent extends BasePasswordGeneratorHist passwordGenerationService: PasswordGenerationServiceAbstraction, platformUtilsService: PlatformUtilsService, i18nService: I18nService, - private location: Location + private location: Location, + toastService: ToastService, ) { - super(passwordGenerationService, platformUtilsService, i18nService, window); + super(passwordGenerationService, platformUtilsService, i18nService, window, toastService); } close() { diff --git a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html new file mode 100644 index 00000000000..40c942539f6 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + diff --git a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts new file mode 100644 index 00000000000..d1005883651 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts @@ -0,0 +1,198 @@ +import { CommonModule, Location } from "@angular/common"; +import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { FormsModule } from "@angular/forms"; +import { ActivatedRoute, Params, Router } from "@angular/router"; +import { map, switchMap } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; +import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; +import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { SendId } from "@bitwarden/common/types/guid"; +import { + AsyncActionsModule, + ButtonModule, + DialogService, + IconButtonModule, + SearchModule, + ToastService, +} from "@bitwarden/components"; +import { + DefaultSendFormConfigService, + SendFormConfig, + SendFormConfigService, + SendFormMode, + SendFormModule, +} from "@bitwarden/send-ui"; + +import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { SendFilePopoutDialogContainerComponent } from "../send-file-popout-dialog/send-file-popout-dialog-container.component"; + +/** + * Helper class to parse query parameters for the AddEdit route. + */ +class QueryParams { + constructor(params: Params) { + this.sendId = params.sendId; + this.type = parseInt(params.type, 10); + } + + /** + * The ID of the send to edit, empty when it's a new Send + */ + sendId?: SendId; + + /** + * The type of send to create. + */ + type: SendType; +} + +export type AddEditQueryParams = Partial>; + +/** + * Component for adding or editing a send item. + */ +@Component({ + selector: "tools-send-add-edit", + templateUrl: "send-add-edit.component.html", + standalone: true, + providers: [{ provide: SendFormConfigService, useClass: DefaultSendFormConfigService }], + imports: [ + CommonModule, + SearchModule, + JslibModule, + FormsModule, + ButtonModule, + IconButtonModule, + PopupPageComponent, + PopupHeaderComponent, + PopupFooterComponent, + SendFilePopoutDialogContainerComponent, + SendFormModule, + AsyncActionsModule, + ], +}) +export class SendAddEditComponent { + /** + * The header text for the component. + */ + headerText: string; + + /** + * The configuration for the send form. + */ + config: SendFormConfig; + + constructor( + private route: ActivatedRoute, + private location: Location, + private i18nService: I18nService, + private addEditFormConfigService: SendFormConfigService, + private sendApiService: SendApiService, + private toastService: ToastService, + private dialogService: DialogService, + private router: Router, + ) { + this.subscribeToParams(); + } + + /** + * Handles the event when the send is created. + */ + async onSendCreated(send: SendView) { + await this.router.navigate(["/send-created"], { + queryParams: { sendId: send.id }, + }); + return; + } + + /** + * Handles the event when the send is updated. + */ + async onSendUpdated(_: SendView) { + await this.router.navigate(["/tabs/send"]); + } + + deleteSend = async () => { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "deleteSend" }, + content: { key: "deleteSendPermanentConfirmation" }, + type: "warning", + }); + + if (!confirmed) { + return; + } + + try { + await this.sendApiService.delete(this.config.originalSend?.id); + } catch (e) { + this.toastService.showToast({ + variant: "error", + title: null, + message: e.message, + }); + return; + } + + this.location.back(); + + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("deletedSend"), + }); + }; + + /** + * Subscribes to the route query parameters and builds the configuration based on the parameters. + */ + subscribeToParams(): void { + this.route.queryParams + .pipe( + takeUntilDestroyed(), + map((params) => new QueryParams(params)), + switchMap(async (params) => { + let mode: SendFormMode; + if (params.sendId == null) { + mode = "add"; + } else { + mode = "edit"; + } + const config = await this.addEditFormConfigService.buildConfig( + mode, + params.sendId, + params.type, + ); + return config; + }), + ) + .subscribe((config) => { + this.config = config; + this.headerText = this.getHeaderText(config.mode, config.sendType); + }); + } + + /** + * Gets the header text based on the mode and type. + * @param mode The mode of the send form. + * @param type The type of the send + * @returns The header text. + */ + private getHeaderText(mode: SendFormMode, type: SendType) { + const headerKey = + mode === "edit" || mode === "partial-edit" ? "editItemHeader" : "newItemHeader"; + + switch (type) { + case SendType.Text: + return this.i18nService.t(headerKey, this.i18nService.t("textSend")); + case SendType.File: + return this.i18nService.t(headerKey, this.i18nService.t("fileSend")); + } + } +} diff --git a/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.html b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.html new file mode 100644 index 00000000000..af3abbf5427 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.html @@ -0,0 +1,37 @@ +
+ + + + + + + +
+ +

+ {{ "createdSendSuccessfully" | i18n }} +

+

+ {{ formatExpirationDate() }} +

+ +
+ + + + +
+
diff --git a/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.spec.ts b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.spec.ts new file mode 100644 index 00000000000..1a3df238543 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.spec.ts @@ -0,0 +1,198 @@ +import { CommonModule, Location } from "@angular/common"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { ActivatedRoute, Router, RouterLink } from "@angular/router"; +import { RouterTestingModule } from "@angular/router/testing"; +import { MockProxy, mock } from "jest-mock-extended"; +import { BehaviorSubject, of } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; +import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; +import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; +import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { ButtonModule, I18nMockService, IconModule, ToastService } from "@bitwarden/components"; + +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../../platform/popup/view-cache/popup-router-cache.service"; + +import { SendCreatedComponent } from "./send-created.component"; + +describe("SendCreatedComponent", () => { + let component: SendCreatedComponent; + let fixture: ComponentFixture; + let platformUtilsService: MockProxy; + let sendService: MockProxy; + let toastService: MockProxy; + let location: MockProxy; + let activatedRoute: MockProxy; + let environmentService: MockProxy; + let router: MockProxy; + + const sendId = "test-send-id"; + let sendView: SendView; + let sendViewsSubject: BehaviorSubject; + + beforeEach(async () => { + platformUtilsService = mock(); + sendService = mock(); + toastService = mock(); + location = mock(); + activatedRoute = mock(); + environmentService = mock(); + router = mock(); + + sendView = { + id: sendId, + deletionDate: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), + type: SendType.Text, + accessId: "abc", + urlB64Key: "123", + } as SendView; + + sendViewsSubject = new BehaviorSubject([sendView]); + sendService.sendViews$ = sendViewsSubject.asObservable(); + + Object.defineProperty(environmentService, "environment$", { + configurable: true, + get: () => of(new SelfHostedEnvironment({ webVault: "https://example.com" })), + }); + + activatedRoute.snapshot = { + queryParamMap: { + get: jest.fn().mockReturnValue(sendId), + }, + } as any; + + await TestBed.configureTestingModule({ + imports: [ + CommonModule, + RouterTestingModule, + JslibModule, + ButtonModule, + IconModule, + PopOutComponent, + PopupHeaderComponent, + PopupPageComponent, + RouterLink, + PopupFooterComponent, + SendCreatedComponent, + ], + providers: [ + { + provide: I18nService, + useFactory: () => { + return new I18nMockService({ + back: "back", + loading: "loading", + copyLink: "copyLink", + close: "close", + createdSend: "createdSend", + createdSendSuccessfully: "createdSendSuccessfully", + popOutNewWindow: "popOutNewWindow", + sendExpiresInHours: (hours) => `sendExpiresInHours ${hours}`, + sendExpiresInHoursSingle: "sendExpiresInHoursSingle", + sendExpiresInDays: (days) => `sendExpiresInDays ${days}`, + sendExpiresInDaysSingle: "sendExpiresInDaysSingle", + sendLinkCopied: "sendLinkCopied", + }); + }, + }, + { provide: PlatformUtilsService, useValue: platformUtilsService }, + { provide: SendService, useValue: sendService }, + { provide: ToastService, useValue: toastService }, + { provide: Location, useValue: location }, + { provide: ActivatedRoute, useValue: activatedRoute }, + { provide: ConfigService, useValue: mock() }, + { provide: EnvironmentService, useValue: environmentService }, + { provide: PopupRouterCacheService, useValue: mock() }, + { provide: Router, useValue: router }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(SendCreatedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + it("should initialize send, daysAvailable, and hoursAvailable", () => { + expect(component["send"]).toBe(sendView); + expect(component["daysAvailable"]).toBe(7); + expect(component["hoursAvailable"]).toBe(168); + }); + + it("should navigate back to the edit send form on close", async () => { + await component.goToEditSend(); + expect(router.navigate).toHaveBeenCalledWith(["/edit-send"], { + queryParams: { sendId: "test-send-id", type: SendType.Text }, + }); + }); + + describe("getHoursAvailable", () => { + it("returns the correct number of hours", () => { + sendViewsSubject.next([sendView]); + fixture.detectChanges(); + + expect(component.getHoursAvailable(sendView)).toBeCloseTo(168, 0); + }); + }); + + describe("formatExpirationDate", () => { + it("returns days plural if expiry is more than 24 hours", () => { + sendView.deletionDate = new Date(Date.now() + 168 * 60 * 60 * 1000); + sendViewsSubject.next([sendView]); + fixture.detectChanges(); + + expect(component.formatExpirationDate()).toBe("sendExpiresInDays 7"); + }); + + it("returns days singular if expiry is 24 hours", () => { + sendView.deletionDate = new Date(Date.now() + 24 * 60 * 60 * 1000); + sendViewsSubject.next([sendView]); + fixture.detectChanges(); + + expect(component.formatExpirationDate()).toBe("sendExpiresInDaysSingle"); + }); + + it("returns hours plural if expiry is more than 1 hour but less than 24", () => { + sendView.deletionDate = new Date(Date.now() + 2 * 60 * 60 * 1000); + sendViewsSubject.next([sendView]); + fixture.detectChanges(); + + expect(component.formatExpirationDate()).toBe("sendExpiresInHours 2"); + }); + + it("returns hours singular if expiry is in 1 hour", () => { + sendView.deletionDate = new Date(Date.now() + 1 * 60 * 60 * 1000); + sendViewsSubject.next([sendView]); + fixture.detectChanges(); + + expect(component.formatExpirationDate()).toBe("sendExpiresInHoursSingle"); + }); + }); + + describe("copyLink", () => { + it("should copy link and show toast", async () => { + const link = "https://example.com/#/send/abc/123"; + + await component.copyLink(); + + expect(platformUtilsService.copyToClipboard).toHaveBeenCalledWith(link); + expect(toastService.showToast).toHaveBeenCalledWith({ + variant: "success", + title: null, + message: "sendLinkCopied", + }); + }); + }); +}); diff --git a/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.ts b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.ts new file mode 100644 index 00000000000..98b09d380e4 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-created/send-created.component.ts @@ -0,0 +1,103 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { ActivatedRoute, Router, RouterLink, RouterModule } from "@angular/router"; +import { firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; +import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { ButtonModule, IconModule, ToastService } from "@bitwarden/components"; +import { SendCreatedIcon } from "@bitwarden/send-ui"; + +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; + +@Component({ + selector: "app-send-created", + templateUrl: "./send-created.component.html", + standalone: true, + imports: [ + ButtonModule, + CommonModule, + JslibModule, + PopOutComponent, + PopupHeaderComponent, + PopupPageComponent, + RouterLink, + RouterModule, + PopupFooterComponent, + IconModule, + ], +}) +export class SendCreatedComponent { + protected sendCreatedIcon = SendCreatedIcon; + protected send: SendView; + protected daysAvailable = 0; + protected hoursAvailable = 0; + + constructor( + private i18nService: I18nService, + private platformUtilsService: PlatformUtilsService, + private sendService: SendService, + private route: ActivatedRoute, + private toastService: ToastService, + private router: Router, + private environmentService: EnvironmentService, + ) { + const sendId = this.route.snapshot.queryParamMap.get("sendId"); + + this.sendService.sendViews$.pipe(takeUntilDestroyed()).subscribe((sendViews) => { + this.send = sendViews.find((s) => s.id === sendId); + if (this.send) { + this.hoursAvailable = this.getHoursAvailable(this.send); + this.daysAvailable = Math.ceil(this.hoursAvailable / 24); + } + }); + } + + formatExpirationDate(): string { + if (this.hoursAvailable < 24) { + return this.hoursAvailable === 1 + ? this.i18nService.t("sendExpiresInHoursSingle") + : this.i18nService.t("sendExpiresInHours", String(this.hoursAvailable)); + } + return this.daysAvailable === 1 + ? this.i18nService.t("sendExpiresInDaysSingle") + : this.i18nService.t("sendExpiresInDays", String(this.daysAvailable)); + } + + getHoursAvailable(send: SendView): number { + const now = new Date().getTime(); + return Math.max(0, Math.ceil((send.deletionDate.getTime() - now) / (1000 * 60 * 60))); + } + + async goToEditSend() { + await this.router.navigate([`/edit-send`], { + queryParams: { sendId: this.send.id, type: this.send.type }, + }); + } + + async goBack() { + await this.router.navigate(["/tabs/send"]); + } + + async copyLink() { + if (!this.send || !this.send.accessId || !this.send.urlB64Key) { + return; + } + const env = await firstValueFrom(this.environmentService.environment$); + const link = env.getSendUrl() + this.send.accessId + "/" + this.send.urlB64Key; + this.platformUtilsService.copyToClipboard(link); + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("sendLinkCopied"), + }); + } +} diff --git a/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog-container.component.html b/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog-container.component.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog-container.component.ts b/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog-container.component.ts new file mode 100644 index 00000000000..d535bbd86e3 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog-container.component.ts @@ -0,0 +1,36 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input, OnInit } from "@angular/core"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; +import { DialogService } from "@bitwarden/components"; +import { SendFormConfig } from "@bitwarden/send-ui"; + +import { FilePopoutUtilsService } from "../../services/file-popout-utils.service"; + +import { SendFilePopoutDialogComponent } from "./send-file-popout-dialog.component"; + +@Component({ + selector: "send-file-popout-dialog-container", + templateUrl: "./send-file-popout-dialog-container.component.html", + standalone: true, + imports: [JslibModule, CommonModule], +}) +export class SendFilePopoutDialogContainerComponent implements OnInit { + @Input() config: SendFormConfig; + + constructor( + private dialogService: DialogService, + private filePopoutUtilsService: FilePopoutUtilsService, + ) {} + + ngOnInit() { + if ( + this.config?.sendType === SendType.File && + this.config?.mode === "add" && + this.filePopoutUtilsService.showFilePopoutMessage(window) + ) { + this.dialogService.open(SendFilePopoutDialogComponent); + } + } +} diff --git a/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog.component.html b/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog.component.html new file mode 100644 index 00000000000..aaede0a821a --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog.component.html @@ -0,0 +1,20 @@ + +
+ +
+ +
+ {{ "sendFilePopoutDialogText" | i18n }} +
+
{{ "sendFilePopoutDialogDesc" | i18n }}
+
+ + + + +
diff --git a/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog.component.ts b/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog.component.ts new file mode 100644 index 00000000000..fb21b5bb026 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-file-popout-dialog/send-file-popout-dialog.component.ts @@ -0,0 +1,25 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { ButtonModule, DialogModule, DialogService, TypographyModule } from "@bitwarden/components"; + +import BrowserPopupUtils from "../../../../platform/popup/browser-popup-utils"; + +@Component({ + selector: "send-file-popout-dialog", + templateUrl: "./send-file-popout-dialog.component.html", + standalone: true, + imports: [JslibModule, CommonModule, DialogModule, ButtonModule, TypographyModule], +}) +export class SendFilePopoutDialogComponent { + constructor(private dialogService: DialogService) {} + + async popOutWindow() { + await BrowserPopupUtils.openCurrentPagePopout(window); + } + + close() { + this.dialogService.closeAll(); + } +} diff --git a/apps/browser/src/tools/popup/send-v2/send-v2.component.html b/apps/browser/src/tools/popup/send-v2/send-v2.component.html new file mode 100644 index 00000000000..d51bda45b55 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-v2.component.html @@ -0,0 +1,46 @@ + + + + + + + + + + + {{ "sendDisabledWarning" | i18n }} + + + + + + + +
+ + {{ "sendsNoItemsTitle" | i18n }} + {{ "sendsNoItemsMessage" | i18n }} + + +
+ + +
+ + {{ "noItemsMatchSearch" | i18n }} + {{ "clearFiltersOrTryAnother" | i18n }} + +
+ +
+
diff --git a/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts b/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts new file mode 100644 index 00000000000..506d7146dd6 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts @@ -0,0 +1,143 @@ +import { CommonModule } from "@angular/common"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { FormBuilder, ReactiveFormsModule } from "@angular/forms"; +import { RouterTestingModule } from "@angular/router/testing"; +import { MockProxy, mock } from "jest-mock-extended"; +import { of, BehaviorSubject } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { SearchService } from "@bitwarden/common/abstractions/search.service"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; +import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; +import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { ButtonModule, NoItemsModule } from "@bitwarden/components"; +import { + NewSendDropdownComponent, + SendListItemsContainerComponent, + SendItemsService, + SendSearchComponent, + SendListFiltersComponent, + SendListFiltersService, +} from "@bitwarden/send-ui"; + +import { CurrentAccountComponent } from "../../../auth/popup/account-switching/current-account.component"; +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../platform/popup/view-cache/popup-router-cache.service"; + +import { SendV2Component, SendState } from "./send-v2.component"; + +describe("SendV2Component", () => { + let component: SendV2Component; + let fixture: ComponentFixture; + let sendItemsService: MockProxy; + let sendListFiltersService: SendListFiltersService; + let sendListFiltersServiceFilters$: BehaviorSubject<{ sendType: SendType | null }>; + let sendItemsServiceEmptyList$: BehaviorSubject; + let sendItemsServiceNoFilteredResults$: BehaviorSubject; + let policyService: MockProxy; + + beforeEach(async () => { + sendListFiltersServiceFilters$ = new BehaviorSubject({ sendType: null }); + sendItemsServiceEmptyList$ = new BehaviorSubject(false); + sendItemsServiceNoFilteredResults$ = new BehaviorSubject(false); + + sendItemsService = mock({ + filteredAndSortedSends$: of([ + { id: "1", name: "Send A" }, + { id: "2", name: "Send B" }, + ] as SendView[]), + loading$: of(false), + latestSearchText$: of(""), + }); + + policyService = mock(); + policyService.policyAppliesToActiveUser$.mockReturnValue(of(true)); // Return `true` by default + + sendListFiltersService = new SendListFiltersService(mock(), new FormBuilder()); + + sendListFiltersService.filters$ = sendListFiltersServiceFilters$; + sendItemsService.emptyList$ = sendItemsServiceEmptyList$; + sendItemsService.noFilteredResults$ = sendItemsServiceNoFilteredResults$; + + await TestBed.configureTestingModule({ + imports: [ + CommonModule, + RouterTestingModule, + JslibModule, + ReactiveFormsModule, + ButtonModule, + NoItemsModule, + NewSendDropdownComponent, + SendListItemsContainerComponent, + SendListFiltersComponent, + SendSearchComponent, + SendV2Component, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + CurrentAccountComponent, + ], + providers: [ + { provide: AccountService, useValue: mock() }, + { provide: AuthService, useValue: mock() }, + { provide: AvatarService, useValue: mock() }, + { + provide: BillingAccountProfileStateService, + useValue: { hasPremiumFromAnySource$: of(false) }, + }, + { provide: ConfigService, useValue: mock() }, + { provide: EnvironmentService, useValue: mock() }, + { provide: LogService, useValue: mock() }, + { provide: PlatformUtilsService, useValue: mock() }, + { provide: SendApiService, useValue: mock() }, + { provide: SendItemsService, useValue: mock() }, + { provide: SearchService, useValue: mock() }, + { provide: SendService, useValue: { sendViews$: new BehaviorSubject([]) } }, + { provide: SendItemsService, useValue: sendItemsService }, + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: SendListFiltersService, useValue: sendListFiltersService }, + { provide: PopupRouterCacheService, useValue: mock() }, + { provide: PolicyService, useValue: policyService }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(SendV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + it("should update the title based on the current filter", () => { + sendListFiltersServiceFilters$.next({ sendType: SendType.File }); + fixture.detectChanges(); + expect(component["title"]).toBe("fileSends"); + }); + + it("should set listState to Empty when emptyList$ emits true", () => { + sendItemsServiceEmptyList$.next(true); + fixture.detectChanges(); + expect(component["listState"]).toBe(SendState.Empty); + }); + + it("should set listState to NoResults when noFilteredResults$ emits true", () => { + sendItemsServiceNoFilteredResults$.next(true); + fixture.detectChanges(); + expect(component["listState"]).toBe(SendState.NoResults); + }); +}); 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 new file mode 100644 index 00000000000..2766ba56c95 --- /dev/null +++ b/apps/browser/src/tools/popup/send-v2/send-v2.component.ts @@ -0,0 +1,107 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { RouterLink } from "@angular/router"; +import { combineLatest } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "@bitwarden/common/admin-console/enums"; +import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; +import { ButtonModule, CalloutModule, Icons, NoItemsModule } from "@bitwarden/components"; +import { + NoSendsIcon, + NewSendDropdownComponent, + SendListItemsContainerComponent, + SendItemsService, + SendSearchComponent, + SendListFiltersComponent, + SendListFiltersService, +} from "@bitwarden/send-ui"; + +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"; + +export enum SendState { + Empty, + NoResults, +} + +@Component({ + templateUrl: "send-v2.component.html", + standalone: true, + imports: [ + CalloutModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + CurrentAccountComponent, + NoItemsModule, + JslibModule, + CommonModule, + ButtonModule, + RouterLink, + NewSendDropdownComponent, + SendListItemsContainerComponent, + SendListFiltersComponent, + SendSearchComponent, + ], +}) +export class SendV2Component implements OnInit, OnDestroy { + sendType = SendType; + sendState = SendState; + + protected listState: SendState | null = null; + protected sends$ = this.sendItemsService.filteredAndSortedSends$; + protected sendsLoading$ = this.sendItemsService.loading$; + protected title: string = "allSends"; + protected noItemIcon = NoSendsIcon; + protected noResultsIcon = Icons.NoResults; + + protected sendsDisabled = false; + + constructor( + protected sendItemsService: SendItemsService, + protected sendListFiltersService: SendListFiltersService, + private policyService: PolicyService, + ) { + combineLatest([ + this.sendItemsService.emptyList$, + this.sendItemsService.noFilteredResults$, + this.sendListFiltersService.filters$, + ]) + .pipe(takeUntilDestroyed()) + .subscribe(([emptyList, noFilteredResults, currentFilter]) => { + if (currentFilter?.sendType !== null) { + this.title = `${this.sendType[currentFilter.sendType].toLowerCase()}Sends`; + } else { + this.title = "allSends"; + } + + if (emptyList) { + this.listState = SendState.Empty; + return; + } + + if (noFilteredResults) { + this.listState = SendState.NoResults; + return; + } + + this.listState = null; + }); + + this.policyService + .policyAppliesToActiveUser$(PolicyType.DisableSend) + .pipe(takeUntilDestroyed()) + .subscribe((sendsDisabled) => { + this.sendsDisabled = sendsDisabled; + }); + } + + ngOnInit(): void {} + + ngOnDestroy(): void {} +} diff --git a/apps/browser/src/tools/popup/send/components/send-list.component.html b/apps/browser/src/tools/popup/send/components/send-list.component.html index 3dc5af0106d..05c8e3e3754 100644 --- a/apps/browser/src/tools/popup/send/components/send-list.component.html +++ b/apps/browser/src/tools/popup/send/components/send-list.component.html @@ -57,7 +57,7 @@ {{ "pendingDeletion" | i18n }} - {{ s.deletionDate | date : "medium" }} + {{ s.deletionDate | date: "medium" }}
diff --git a/apps/browser/src/tools/popup/send/send-add-edit.component.html b/apps/browser/src/tools/popup/send/send-add-edit.component.html index 11dca222fca..38c8a8175bb 100644 --- a/apps/browser/src/tools/popup/send/send-add-edit.component.html +++ b/apps/browser/src/tools/popup/send/send-add-edit.component.html @@ -22,18 +22,7 @@ {{ "sendOptionsPolicyInEffect" | i18n }} - -
{{ "sendLinuxChromiumFileWarning" | i18n }}
-
{{ "sendFirefoxFileWarning" | i18n }}
-
{{ "sendSafariFileWarning" | i18n }}
-
+
diff --git a/apps/browser/src/tools/popup/send/send-add-edit.component.ts b/apps/browser/src/tools/popup/send/send-add-edit.component.ts index 2d90957de7f..569a9a15a5e 100644 --- a/apps/browser/src/tools/popup/send/send-add-edit.component.ts +++ b/apps/browser/src/tools/popup/send/send-add-edit.component.ts @@ -1,42 +1,43 @@ import { DatePipe, Location } from "@angular/common"; -import { Component } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import { FormBuilder } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { first } from "rxjs/operators"; import { AddEditComponent as BaseAddEditComponent } from "@bitwarden/angular/tools/send/add-edit.component"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; -import { DialogService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; -import { BrowserStateService } from "../../../platform/services/abstractions/browser-state.service"; -import { PopupUtilsService } from "../../../popup/services/popup-utils.service"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { FilePopoutUtilsService } from "../services/file-popout-utils.service"; @Component({ selector: "app-send-add-edit", templateUrl: "send-add-edit.component.html", }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class SendAddEditComponent extends BaseAddEditComponent { +export class SendAddEditComponent extends BaseAddEditComponent implements OnInit { // Options header showOptions = false; // File visibility isFirefox = false; inPopout = false; - inSidebar = false; - isLinux = false; - isUnsupportedMac = false; + showFileSelector = false; constructor( i18nService: I18nService, platformUtilsService: PlatformUtilsService, - stateService: BrowserStateService, + stateService: StateService, messagingService: MessagingService, policyService: PolicyService, environmentService: EnvironmentService, @@ -45,11 +46,14 @@ export class SendAddEditComponent extends BaseAddEditComponent { private route: ActivatedRoute, private router: Router, private location: Location, - private popupUtilsService: PopupUtilsService, logService: LogService, sendApiService: SendApiService, dialogService: DialogService, - formBuilder: FormBuilder + formBuilder: FormBuilder, + private filePopoutUtilsService: FilePopoutUtilsService, + billingAccountProfileStateService: BillingAccountProfileStateService, + accountService: AccountService, + toastService: ToastService, ) { super( i18nService, @@ -63,50 +67,25 @@ export class SendAddEditComponent extends BaseAddEditComponent { stateService, sendApiService, dialogService, - formBuilder - ); - } - - get showFileSelector(): boolean { - return !(this.editMode || this.showFilePopoutMessage); - } - - get showFilePopoutMessage(): boolean { - return ( - !this.editMode && - (this.showFirefoxFileWarning || this.showSafariFileWarning || this.showChromiumFileWarning) - ); - } - - get showFirefoxFileWarning(): boolean { - return this.isFirefox && !(this.inSidebar || this.inPopout); - } - - get showSafariFileWarning(): boolean { - return this.isSafari && !this.inPopout; - } - - // Only show this for Chromium based browsers in Linux and Mac > Big Sur - get showChromiumFileWarning(): boolean { - return ( - (this.isLinux || this.isUnsupportedMac) && - !this.isFirefox && - !(this.inSidebar || this.inPopout) + formBuilder, + billingAccountProfileStateService, + accountService, + toastService, ); } popOutWindow() { - this.popupUtilsService.popOut(window); + // 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 + BrowserPopupUtils.openCurrentPagePopout(window); } async ngOnInit() { // File visibility + this.showFileSelector = + !this.editMode && !this.filePopoutUtilsService.showFilePopoutMessage(window); + this.inPopout = BrowserPopupUtils.inPopout(window); this.isFirefox = this.platformUtilsService.isFirefox(); - this.inPopout = this.popupUtilsService.inPopout(window); - this.inSidebar = this.popupUtilsService.inSidebar(window); - this.isLinux = window?.navigator?.userAgent.indexOf("Linux") !== -1; - this.isUnsupportedMac = - this.platformUtilsService.isChrome() && window?.navigator?.appVersion.includes("Mac OS X 11"); // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe this.route.queryParams.pipe(first()).subscribe(async (params) => { @@ -147,7 +126,10 @@ export class SendAddEditComponent extends BaseAddEditComponent { cancel() { // If true, the window was pop'd out on the add-send page. location.back will not work - if ((window as any).previousPopupUrl.startsWith("/add-send")) { + const isPopup = (window as any)?.previousPopupUrl?.startsWith("/add-send") ?? false; + if (!isPopup) { + // 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(["tabs/send"]); } else { this.location.back(); diff --git a/apps/browser/src/tools/popup/send/send-groupings.component.html b/apps/browser/src/tools/popup/send/send-groupings.component.html index e677895b409..213afdfa227 100644 --- a/apps/browser/src/tools/popup/send/send-groupings.component.html +++ b/apps/browser/src/tools/popup/send/send-groupings.component.html @@ -1,9 +1,9 @@ -
+

{{ "send" | i18n }}

-
+
{{ "sendDisabledWarning" | i18n }} @@ -61,7 +61,7 @@
{{ "sendTypeText" | i18n }}
- {{ typeCounts.get(sendType.Text) || 0 }} + {{ getSendCount(sends, sendType.Text) }}
{{ "sendTypeFile" | i18n }}
- {{ typeCounts.get(sendType.File) || 0 }} + {{ getSendCount(sends, sendType.File) }} diff --git a/apps/browser/src/tools/popup/send/send-groupings.component.ts b/apps/browser/src/tools/popup/send/send-groupings.component.ts index e93064fe80b..87de6af31cf 100644 --- a/apps/browser/src/tools/popup/send/send-groupings.component.ts +++ b/apps/browser/src/tools/popup/send/send-groupings.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectorRef, Component, NgZone } from "@angular/core"; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { Router } from "@angular/router"; import { SendComponent as BaseSendComponent } from "@bitwarden/angular/tools/send/send.component"; @@ -14,11 +14,11 @@ import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { DialogService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; import { BrowserSendComponentState } from "../../../models/browserSendComponentState"; -import { BrowserStateService } from "../../../platform/services/abstractions/browser-state.service"; -import { PopupUtilsService } from "../../../popup/services/popup-utils.service"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { BrowserSendStateService } from "../services/browser-send-state.service"; const ComponentId = "SendComponent"; @@ -26,11 +26,9 @@ const ComponentId = "SendComponent"; selector: "app-send-groupings", templateUrl: "send-groupings.component.html", }) -export class SendGroupingsComponent extends BaseSendComponent { +export class SendGroupingsComponent extends BaseSendComponent implements OnInit, OnDestroy { // Header showLeftHeader = true; - // Send Type Calculations - typeCounts = new Map(); // State Handling state: BrowserSendComponentState; private loadedTimeout: number; @@ -43,15 +41,15 @@ export class SendGroupingsComponent extends BaseSendComponent { ngZone: NgZone, policyService: PolicyService, searchService: SearchService, - private popupUtils: PopupUtilsService, - private stateService: BrowserStateService, + private stateService: BrowserSendStateService, private router: Router, private syncService: SyncService, private changeDetectorRef: ChangeDetectorRef, private broadcasterService: BroadcasterService, logService: LogService, sendApiService: SendApiService, - dialogService: DialogService + dialogService: DialogService, + toastService: ToastService, ) { super( sendService, @@ -63,10 +61,10 @@ export class SendGroupingsComponent extends BaseSendComponent { policyService, logService, sendApiService, - dialogService + dialogService, + toastService, ); - super.onSuccessfulLoad = async () => { - this.calculateTypeCounts(); + this.onSuccessfulLoad = async () => { this.selectAll(); }; } @@ -74,7 +72,7 @@ export class SendGroupingsComponent extends BaseSendComponent { async ngOnInit() { // Determine Header details this.showLeftHeader = !( - this.popupUtils.inSidebar(window) && this.platformUtilsService.isFirefox() + BrowserPopupUtils.inSidebar(window) && this.platformUtilsService.isFirefox() ); // Clear state of Send Type Component await this.stateService.setBrowserSendTypeComponentState(null); @@ -87,25 +85,35 @@ export class SendGroupingsComponent extends BaseSendComponent { } if (!this.syncService.syncInProgress) { + // 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.load(); } else { this.loadedTimeout = window.setTimeout(() => { if (!this.loaded) { + // 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.load(); } }, 5000); } if (!this.syncService.syncInProgress || restoredScopeState) { - window.setTimeout(() => this.popupUtils.setContentScrollY(window, this.state?.scrollY), 0); + // 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 + BrowserPopupUtils.setContentScrollY(window, this.state?.scrollY); } // Load all sends if sync completed in background this.broadcasterService.subscribe(ComponentId, (message: any) => { + // 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.ngZone.run(async () => { switch (message.command) { case "syncCompleted": window.setTimeout(() => { + // 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.load(); }, 500); break; @@ -124,16 +132,22 @@ export class SendGroupingsComponent extends BaseSendComponent { window.clearTimeout(this.loadedTimeout); } // Save state + // 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.saveState(); // Unsubscribe this.broadcasterService.unsubscribe(ComponentId); } async selectType(type: SendType) { + // 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(["/send-type"], { queryParams: { type: type } }); } async selectSend(s: SendView) { + // 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(["/edit-send"], { queryParams: { sendId: s.id } }); } @@ -141,6 +155,8 @@ export class SendGroupingsComponent extends BaseSendComponent { if (this.disableSend) { return; } + // 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(["/add-send"]); } @@ -148,34 +164,24 @@ export class SendGroupingsComponent extends BaseSendComponent { if (this.disableSend) { return; } + // 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 super.removePassword(s); } showSearching() { - return ( - this.hasSearched || (!this.searchPending && this.searchService.isSearchable(this.searchText)) - ); + return this.hasSearched || (!this.searchPending && this.isSearchable); } - private calculateTypeCounts() { - // Create type counts - const typeCounts = new Map(); - this.sends.forEach((s) => { - if (typeCounts.has(s.type)) { - typeCounts.set(s.type, typeCounts.get(s.type) + 1); - } else { - typeCounts.set(s.type, 1); - } - }); - this.typeCounts = typeCounts; + getSendCount(sends: SendView[], type: SendType): number { + return sends.filter((s) => s.type === type).length; } private async saveState() { this.state = Object.assign(new BrowserSendComponentState(), { - scrollY: this.popupUtils.getContentScrollY(window), + scrollY: BrowserPopupUtils.getContentScrollY(window), searchText: this.searchText, sends: this.sends, - typeCounts: this.typeCounts, }); await this.stateService.setBrowserSendComponentState(this.state); } @@ -189,9 +195,6 @@ export class SendGroupingsComponent extends BaseSendComponent { if (this.state.sends != null) { this.sends = this.state.sends; } - if (this.state.typeCounts != null) { - this.typeCounts = this.state.typeCounts; - } return true; } diff --git a/apps/browser/src/tools/popup/send/send-type.component.ts b/apps/browser/src/tools/popup/send/send-type.component.ts index 4a2794fdda5..8329831e0bc 100644 --- a/apps/browser/src/tools/popup/send/send-type.component.ts +++ b/apps/browser/src/tools/popup/send/send-type.component.ts @@ -1,5 +1,5 @@ import { Location } from "@angular/common"; -import { ChangeDetectorRef, Component, NgZone } from "@angular/core"; +import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { first } from "rxjs/operators"; @@ -15,11 +15,11 @@ import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; -import { DialogService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; import { BrowserComponentState } from "../../../models/browserComponentState"; -import { BrowserStateService } from "../../../platform/services/abstractions/browser-state.service"; -import { PopupUtilsService } from "../../../popup/services/popup-utils.service"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { BrowserSendStateService } from "../services/browser-send-state.service"; const ComponentId = "SendTypeComponent"; @@ -27,7 +27,7 @@ const ComponentId = "SendTypeComponent"; selector: "app-send-type", templateUrl: "send-type.component.html", }) -export class SendTypeComponent extends BaseSendComponent { +export class SendTypeComponent extends BaseSendComponent implements OnInit, OnDestroy { groupingTitle: string; // State Handling state: BrowserComponentState; @@ -42,8 +42,7 @@ export class SendTypeComponent extends BaseSendComponent { ngZone: NgZone, policyService: PolicyService, searchService: SearchService, - private popupUtils: PopupUtilsService, - private stateService: BrowserStateService, + private stateService: BrowserSendStateService, private route: ActivatedRoute, private location: Location, private changeDetectorRef: ChangeDetectorRef, @@ -51,7 +50,8 @@ export class SendTypeComponent extends BaseSendComponent { private router: Router, logService: LogService, sendApiService: SendApiService, - dialogService: DialogService + dialogService: DialogService, + toastService: ToastService, ) { super( sendService, @@ -63,9 +63,10 @@ export class SendTypeComponent extends BaseSendComponent { policyService, logService, sendApiService, - dialogService + dialogService, + toastService, ); - super.onSuccessfulLoad = async () => { + this.onSuccessfulLoad = async () => { this.selectType(this.type); }; this.applySavedState = @@ -102,18 +103,26 @@ export class SendTypeComponent extends BaseSendComponent { // Restore state and remove reference if (this.applySavedState && this.state != null) { - window.setTimeout(() => this.popupUtils.setContentScrollY(window, this.state?.scrollY), 0); + // 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 + BrowserPopupUtils.setContentScrollY(window, this.state?.scrollY); } + // 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.stateService.setBrowserSendTypeComponentState(null); }); // Refresh Send list if sync completed in background this.broadcasterService.subscribe(ComponentId, (message: any) => { + // 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.ngZone.run(async () => { switch (message.command) { case "syncCompleted": if (message.successfully) { this.refreshTimeout = window.setTimeout(() => { + // 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.refresh(); }, 500); } @@ -133,12 +142,16 @@ export class SendTypeComponent extends BaseSendComponent { window.clearTimeout(this.refreshTimeout); } // Save state + // 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.saveState(); // Unsubscribe this.broadcasterService.unsubscribe(ComponentId); } async selectSend(s: SendView) { + // 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(["/edit-send"], { queryParams: { sendId: s.id } }); } @@ -146,6 +159,8 @@ export class SendTypeComponent extends BaseSendComponent { if (this.disableSend) { return; } + // 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(["/add-send"], { queryParams: { type: this.type } }); } @@ -153,6 +168,8 @@ export class SendTypeComponent extends BaseSendComponent { if (this.disableSend) { return; } + // 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 super.removePassword(s); } @@ -163,7 +180,7 @@ export class SendTypeComponent extends BaseSendComponent { private async saveState() { this.state = { - scrollY: this.popupUtils.getContentScrollY(window), + scrollY: BrowserPopupUtils.getContentScrollY(window), searchText: this.searchText, }; await this.stateService.setBrowserSendTypeComponentState(this.state); diff --git a/apps/browser/src/tools/popup/services/browser-send-state.service.spec.ts b/apps/browser/src/tools/popup/services/browser-send-state.service.spec.ts new file mode 100644 index 00000000000..6f0ae1455ad --- /dev/null +++ b/apps/browser/src/tools/popup/services/browser-send-state.service.spec.ts @@ -0,0 +1,59 @@ +import { + FakeAccountService, + mockAccountServiceWith, +} from "@bitwarden/common/../spec/fake-account-service"; +import { FakeStateProvider } from "@bitwarden/common/../spec/fake-state-provider"; +import { awaitAsync } from "@bitwarden/common/../spec/utils"; + +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { BrowserComponentState } from "../../../models/browserComponentState"; +import { BrowserSendComponentState } from "../../../models/browserSendComponentState"; + +import { BrowserSendStateService } from "./browser-send-state.service"; + +describe("Browser Send State Service", () => { + let stateProvider: FakeStateProvider; + + let accountService: FakeAccountService; + let stateService: BrowserSendStateService; + const mockUserId = Utils.newGuid() as UserId; + + beforeEach(() => { + accountService = mockAccountServiceWith(mockUserId); + stateProvider = new FakeStateProvider(accountService); + + stateService = new BrowserSendStateService(stateProvider); + }); + + describe("getBrowserSendComponentState", () => { + it("should return BrowserSendComponentState", async () => { + const state = new BrowserSendComponentState(); + state.scrollY = 0; + state.searchText = "test"; + + await stateService.setBrowserSendComponentState(state); + + await awaitAsync(); + + const actual = await stateService.getBrowserSendComponentState(); + expect(actual).toStrictEqual(state); + }); + }); + + describe("getBrowserSendTypeComponentState", () => { + it("should return BrowserComponentState", async () => { + const state = new BrowserComponentState(); + state.scrollY = 0; + state.searchText = "test"; + + await stateService.setBrowserSendTypeComponentState(state); + + await awaitAsync(); + + const actual = await stateService.getBrowserSendTypeComponentState(); + expect(actual).toStrictEqual(state); + }); + }); +}); diff --git a/apps/browser/src/tools/popup/services/browser-send-state.service.ts b/apps/browser/src/tools/popup/services/browser-send-state.service.ts new file mode 100644 index 00000000000..11e71c9b20f --- /dev/null +++ b/apps/browser/src/tools/popup/services/browser-send-state.service.ts @@ -0,0 +1,69 @@ +import { Observable, firstValueFrom } from "rxjs"; + +import { ActiveUserState, StateProvider } from "@bitwarden/common/platform/state"; + +import { BrowserComponentState } from "../../../models/browserComponentState"; +import { BrowserSendComponentState } from "../../../models/browserSendComponentState"; + +import { BROWSER_SEND_COMPONENT, BROWSER_SEND_TYPE_COMPONENT } from "./key-definitions"; + +/** Get or set the active user's component state for the Send browser component + */ +export class BrowserSendStateService { + /** Observable that contains the current state for active user Sends including the send data and type counts + * along with the search text and scroll position + */ + browserSendComponentState$: Observable; + + /** Observable that contains the current state for active user Sends that only includes the search text + * and scroll position + */ + browserSendTypeComponentState$: Observable; + + private activeUserBrowserSendComponentState: ActiveUserState; + private activeUserBrowserSendTypeComponentState: ActiveUserState; + + constructor(protected stateProvider: StateProvider) { + this.activeUserBrowserSendComponentState = this.stateProvider.getActive(BROWSER_SEND_COMPONENT); + this.browserSendComponentState$ = this.activeUserBrowserSendComponentState.state$; + + this.activeUserBrowserSendTypeComponentState = this.stateProvider.getActive( + BROWSER_SEND_TYPE_COMPONENT, + ); + this.browserSendTypeComponentState$ = this.activeUserBrowserSendTypeComponentState.state$; + } + + /** Get the active user's browser send component state + * @returns { BrowserSendComponentState } contains the sends and type counts along with the scroll position and search text for the + * send component on the browser + */ + async getBrowserSendComponentState(): Promise { + return await firstValueFrom(this.browserSendComponentState$); + } + + /** Set the active user's browser send component state + * @param { BrowserSendComponentState } value sets the sends along with the scroll position and search text for + * the send component on the browser + */ + async setBrowserSendComponentState(value: BrowserSendComponentState): Promise { + await this.activeUserBrowserSendComponentState.update(() => value, { + shouldUpdate: (current) => !(current == null && value == null), + }); + } + + /** Get the active user's browser component state + * @returns { BrowserComponentState } contains the scroll position and search text for the sends menu on the browser + */ + async getBrowserSendTypeComponentState(): Promise { + return await firstValueFrom(this.browserSendTypeComponentState$); + } + + /** Set the active user's browser component state + * @param { BrowserComponentState } value set the scroll position and search text for the send component on the browser + */ + async setBrowserSendTypeComponentState(value: BrowserComponentState): Promise { + await this.activeUserBrowserSendTypeComponentState.update(() => value, { + shouldUpdate: (current) => !(current == null && value == null), + }); + } +} diff --git a/apps/browser/src/tools/popup/services/file-popout-utils.service.ts b/apps/browser/src/tools/popup/services/file-popout-utils.service.ts new file mode 100644 index 00000000000..65a311e47c3 --- /dev/null +++ b/apps/browser/src/tools/popup/services/file-popout-utils.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from "@angular/core"; + +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; + +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; + +/** + * Service for determining whether to display file popout callout messages. + */ +@Injectable() +export class FilePopoutUtilsService { + /** + * Creates an instance of FilePopoutUtilsService. + */ + constructor(private platformUtilsService: PlatformUtilsService) {} + + /** + * Determines whether to show any file popout callout message in the current browser. + * @param win - The window context in which the check should be performed. + * @returns True if a file popout callout message should be displayed; otherwise, false. + */ + showFilePopoutMessage(win: Window): boolean { + return ( + this.showFirefoxFileWarning(win) || + this.showSafariFileWarning(win) || + this.showChromiumFileWarning(win) + ); + } + + /** + * Determines whether to show a file popout callout message for the Firefox browser + * @param win - The window context in which the check should be performed. + * @returns True if the extension is not in a sidebar or popout; otherwise, false. + */ + showFirefoxFileWarning(win: Window): boolean { + return ( + this.platformUtilsService.isFirefox() && + !(BrowserPopupUtils.inSidebar(win) || BrowserPopupUtils.inPopout(win)) + ); + } + + /** + * Determines whether to show a file popout message for the Safari browser + * @param win - The window context in which the check should be performed. + * @returns True if the extension is not in a popout; otherwise, false. + */ + showSafariFileWarning(win: Window): boolean { + return this.platformUtilsService.isSafari() && !BrowserPopupUtils.inPopout(win); + } + + /** + * Determines whether to show a file popout callout message for Chromium-based browsers in Linux and Mac OS X Big Sur + * @param win - The window context in which the check should be performed. + * @returns True if the extension is not in a sidebar or popout; otherwise, false. + */ + showChromiumFileWarning(win: Window): boolean { + return ( + (this.isLinux(win) || this.isUnsupportedMac(win)) && + !this.platformUtilsService.isFirefox() && + !(BrowserPopupUtils.inSidebar(win) || BrowserPopupUtils.inPopout(win)) + ); + } + + private isLinux(win: Window): boolean { + return win?.navigator?.userAgent.indexOf("Linux") !== -1; + } + + private isUnsupportedMac(win: Window): boolean { + return ( + this.platformUtilsService.isChrome() && win?.navigator?.appVersion.includes("Mac OS X 11") + ); + } +} diff --git a/apps/browser/src/tools/popup/services/key-definitions.spec.ts b/apps/browser/src/tools/popup/services/key-definitions.spec.ts new file mode 100644 index 00000000000..7517771669c --- /dev/null +++ b/apps/browser/src/tools/popup/services/key-definitions.spec.ts @@ -0,0 +1,39 @@ +import { Jsonify } from "type-fest"; + +import { BrowserSendComponentState } from "../../../models/browserSendComponentState"; + +import { BROWSER_SEND_COMPONENT, BROWSER_SEND_TYPE_COMPONENT } from "./key-definitions"; + +describe("Key definitions", () => { + describe("BROWSER_SEND_COMPONENT", () => { + it("should deserialize BrowserSendComponentState", () => { + const keyDef = BROWSER_SEND_COMPONENT; + + const expectedState = { + scrollY: 0, + searchText: "test", + }; + + const result = keyDef.deserializer( + JSON.parse(JSON.stringify(expectedState)) as Jsonify, + ); + + expect(result).toEqual(expectedState); + }); + }); + + describe("BROWSER_SEND_TYPE_COMPONENT", () => { + it("should deserialize BrowserComponentState", () => { + const keyDef = BROWSER_SEND_TYPE_COMPONENT; + + const expectedState = { + scrollY: 0, + searchText: "test", + }; + + const result = keyDef.deserializer(JSON.parse(JSON.stringify(expectedState))); + + expect(result).toEqual(expectedState); + }); + }); +}); diff --git a/apps/browser/src/tools/popup/services/key-definitions.ts b/apps/browser/src/tools/popup/services/key-definitions.ts new file mode 100644 index 00000000000..b4ccd991e7b --- /dev/null +++ b/apps/browser/src/tools/popup/services/key-definitions.ts @@ -0,0 +1,25 @@ +import { Jsonify } from "type-fest"; + +import { BROWSER_SEND_MEMORY, UserKeyDefinition } from "@bitwarden/common/platform/state"; + +import { BrowserComponentState } from "../../../models/browserComponentState"; +import { BrowserSendComponentState } from "../../../models/browserSendComponentState"; + +export const BROWSER_SEND_COMPONENT = new UserKeyDefinition( + BROWSER_SEND_MEMORY, + "browser_send_component", + { + deserializer: (obj: Jsonify) => + BrowserSendComponentState.fromJSON(obj), + clearOn: ["logout", "lock"], + }, +); + +export const BROWSER_SEND_TYPE_COMPONENT = new UserKeyDefinition( + BROWSER_SEND_MEMORY, + "browser_send_type_component", + { + deserializer: (obj: Jsonify) => BrowserComponentState.fromJSON(obj), + clearOn: ["logout", "lock"], + }, +); diff --git a/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.html b/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.html new file mode 100644 index 00000000000..eceeaf19cb7 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.html @@ -0,0 +1,47 @@ + +
+ +
+
Bitwarden
+
+

© Bitwarden Inc. 2015-{{ year }}

+

{{ "version" | i18n }}: {{ version$ | async }}

+

SDK: {{ sdkVersion$ | async }}

+ +

+ {{ "serverVersion" | i18n }}: {{ data.serverConfig?.version }} + + ({{ "lastSeenOn" | i18n: (data.serverConfig.utcDate | date: "mediumDate") }}) + +

+ + + +

+ {{ "serverVersion" | i18n }} ({{ "thirdParty" | i18n }}): + {{ data.serverConfig?.version }} + + ({{ "lastSeenOn" | i18n: (data.serverConfig.utcDate | date: "mediumDate") }}) + +

+
+ {{ "thirdPartyServerMessage" | i18n: data.serverConfig.server?.name }} +
+
+ +

+ {{ "serverVersion" | i18n }} ({{ "selfHostedServer" | i18n }}): + {{ data.serverConfig?.version }} + + ({{ "lastSeenOn" | i18n: (data.serverConfig.utcDate | date: "mediumDate") }}) + +

+
+
+
+
+ +
+
diff --git a/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.ts b/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.ts new file mode 100644 index 00000000000..f730fef24b3 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.ts @@ -0,0 +1,36 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { Observable, combineLatest, defer, map } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +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 { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; +import { ButtonModule, DialogModule } from "@bitwarden/components"; + +@Component({ + templateUrl: "about-dialog.component.html", + standalone: true, + imports: [CommonModule, JslibModule, DialogModule, ButtonModule], +}) +export class AboutDialogComponent { + protected year = new Date().getFullYear(); + protected version$: Observable; + + protected data$ = combineLatest([ + this.configService.serverConfig$, + this.environmentService.environment$.pipe(map((env) => env.isCloud())), + ]).pipe(map(([serverConfig, isCloud]) => ({ serverConfig, isCloud }))); + + protected sdkVersion$ = this.sdkService.version$; + + constructor( + private configService: ConfigService, + private environmentService: EnvironmentService, + private platformUtilsService: PlatformUtilsService, + private sdkService: SdkService, + ) { + this.version$ = defer(() => this.platformUtilsService.getApplicationVersion()); + } +} 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 new file mode 100644 index 00000000000..bcc0f12d0d7 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + +
+ {{ "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 new file mode 100644 index 00000000000..1d0d4218439 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.ts @@ -0,0 +1,94 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { DeviceType } from "@bitwarden/common/enums"; +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"; + +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 { AboutDialogComponent } from "../about-dialog/about-dialog.component"; + +const RateUrls = { + [DeviceType.ChromeExtension]: + "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", + [DeviceType.FirefoxExtension]: + "https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews", + [DeviceType.OperaExtension]: + "https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container", + [DeviceType.EdgeExtension]: + "https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh", + [DeviceType.VivaldiExtension]: + "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", + [DeviceType.SafariExtension]: "https://apps.apple.com/app/bitwarden/id1352778147", +}; + +@Component({ + templateUrl: "about-page-v2.component.html", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + ], +}) +export class AboutPageV2Component { + constructor( + private dialogService: DialogService, + private environmentService: EnvironmentService, + private platformUtilsService: PlatformUtilsService, + ) {} + + about() { + this.dialogService.open(AboutDialogComponent); + } + + async launchHelp() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToHelpCenter" }, + content: { key: "continueToHelpCenterDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/help/"); + } + } + + async openWebVault() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "continueToWebAppDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + const url = env.getWebVaultUrl(); + await BrowserApi.createNewTab(url); + } + } + + async rate() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBrowserExtensionStore" }, + content: { key: "continueToBrowserExtensionStoreDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const deviceType = this.platformUtilsService.getDevice(); + await BrowserApi.createNewTab((RateUrls as any)[deviceType]); + } + } +} diff --git a/apps/browser/src/tools/popup/settings/about-page/about-page.component.html b/apps/browser/src/tools/popup/settings/about-page/about-page.component.html new file mode 100644 index 00000000000..7537c75bd9e --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/about-page.component.html @@ -0,0 +1,63 @@ +
+
+ +
+

+ {{ "about" | i18n }} +

+
+ +
+
+
+
+
+ + + + + +
+
+
diff --git a/apps/browser/src/tools/popup/settings/about-page/about-page.component.ts b/apps/browser/src/tools/popup/settings/about-page/about-page.component.ts new file mode 100644 index 00000000000..7c3e87a92fb --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/about-page.component.ts @@ -0,0 +1,84 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { DeviceType } from "@bitwarden/common/enums"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { DialogService } from "@bitwarden/components"; + +import { BrowserApi } from "../../../../platform/browser/browser-api"; +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { AboutDialogComponent } from "../about-dialog/about-dialog.component"; + +const RateUrls = { + [DeviceType.ChromeExtension]: + "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", + [DeviceType.FirefoxExtension]: + "https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews", + [DeviceType.OperaExtension]: + "https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container", + [DeviceType.EdgeExtension]: + "https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh", + [DeviceType.VivaldiExtension]: + "https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews", + [DeviceType.SafariExtension]: "https://apps.apple.com/app/bitwarden/id1352778147", +}; + +@Component({ + templateUrl: "about-page.component.html", + standalone: true, + imports: [CommonModule, JslibModule, RouterModule, PopOutComponent], +}) +export class AboutPageComponent { + constructor( + private dialogService: DialogService, + private environmentService: EnvironmentService, + private platformUtilsService: PlatformUtilsService, + ) {} + + about() { + this.dialogService.open(AboutDialogComponent); + } + + async launchHelp() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToHelpCenter" }, + content: { key: "continueToHelpCenterDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/help/"); + } + } + + async openWebVault() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "continueToWebAppDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + const url = env.getWebVaultUrl(); + await BrowserApi.createNewTab(url); + } + } + + async rate() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBrowserExtensionStore" }, + content: { key: "continueToBrowserExtensionStoreDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const deviceType = this.platformUtilsService.getDevice(); + await BrowserApi.createNewTab((RateUrls as any)[deviceType]); + } + } +} diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.html b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.html new file mode 100644 index 00000000000..9322ab5113e --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.html @@ -0,0 +1,46 @@ + + + + + + + + + + + {{ "premiumMembership" | i18n }} + + + + + + + + + + + + + + + + + + + + diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts new file mode 100644 index 00000000000..7cdb691d56c --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts @@ -0,0 +1,105 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { Observable, firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { DialogService, ItemModule } from "@bitwarden/components"; + +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", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + ], +}) +export class MoreFromBitwardenPageV2Component { + canAccessPremium$: Observable; + protected familySponsorshipAvailable$: Observable; + + constructor( + private dialogService: DialogService, + billingAccountProfileStateService: BillingAccountProfileStateService, + private environmentService: EnvironmentService, + private organizationService: OrganizationService, + ) { + this.canAccessPremium$ = billingAccountProfileStateService.hasPremiumFromAnySource$; + this.familySponsorshipAvailable$ = this.organizationService.familySponsorshipAvailable$; + } + + async openFreeBitwardenFamiliesPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "freeBitwardenFamiliesPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + const url = env.getWebVaultUrl(); + await BrowserApi.createNewTab(url + "/#/settings/sponsored-families"); + } + } + + async openBitwardenForBusinessPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "bitwardenForBusinessPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/business/"); + } + } + + async openAuthenticatorPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToAuthenticatorPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/authenticator"); + } + } + + async openSecretsManagerPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToSecretsManagerPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/secrets-manager"); + } + } + + async openPasswordlessDotDevPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToPasswordlessDotDevPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/passwordless"); + } + } +} diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.html b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.html new file mode 100644 index 00000000000..bf9decca4eb --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.html @@ -0,0 +1,75 @@ +
+
+ +
+

+ {{ "moreFromBitwarden" | i18n }} +

+
+ +
+
+
+
+
+
+ +
+ + + + + +
+
+
diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.ts b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.ts new file mode 100644 index 00000000000..a9e9e797bf3 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page.component.ts @@ -0,0 +1,91 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { Observable, firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { DialogService } from "@bitwarden/components"; + +import { BrowserApi } from "../../../../platform/browser/browser-api"; +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; + +@Component({ + templateUrl: "more-from-bitwarden-page.component.html", + standalone: true, + imports: [CommonModule, JslibModule, RouterModule, PopOutComponent], +}) +export class MoreFromBitwardenPageComponent { + canAccessPremium$: Observable; + + constructor( + private dialogService: DialogService, + private billingAccountProfileStateService: BillingAccountProfileStateService, + private environmentService: EnvironmentService, + ) { + this.canAccessPremium$ = billingAccountProfileStateService.hasPremiumFromAnySource$; + } + + async openFreeBitwardenFamiliesPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "freeBitwardenFamiliesPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + const url = env.getWebVaultUrl(); + await BrowserApi.createNewTab(url + "/#/settings/sponsored-families"); + } + } + + async openBitwardenForBusinessPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "bitwardenForBusinessPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/business/"); + } + } + + async openAuthenticatorPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToAuthenticatorPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/authenticator"); + } + } + + async openSecretsManagerPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToSecretsManagerPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/secrets-manager"); + } + } + + async openPasswordlessDotDevPage() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToBitwardenDotCom" }, + content: { key: "continueToPasswordlessDotDevPageDesc" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + await BrowserApi.createNewTab("https://bitwarden.com/products/passwordless"); + } + } +} diff --git a/apps/browser/src/tools/popup/settings/export.component.html b/apps/browser/src/tools/popup/settings/export.component.html deleted file mode 100644 index db072d6b504..00000000000 --- a/apps/browser/src/tools/popup/settings/export.component.html +++ /dev/null @@ -1,40 +0,0 @@ -
-
-
- -
-

- {{ "exportVault" | i18n }} -

-
- -
-
-
- - {{ "personalVaultExportPolicyInEffect" | i18n }} - - - -
-
-
- - -
- - -
- -
-
-
diff --git a/apps/browser/src/tools/popup/settings/export.component.ts b/apps/browser/src/tools/popup/settings/export.component.ts deleted file mode 100644 index d34b86a9e46..00000000000 --- a/apps/browser/src/tools/popup/settings/export.component.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component } from "@angular/core"; -import { UntypedFormBuilder } from "@angular/forms"; -import { Router } from "@angular/router"; - -import { ExportComponent as BaseExportComponent } from "@bitwarden/angular/tools/export/components/export.component"; -import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; -import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.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"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { DialogService } from "@bitwarden/components"; -import { VaultExportServiceAbstraction } from "@bitwarden/exporter/vault-export"; - -@Component({ - selector: "app-export", - templateUrl: "export.component.html", -}) -export class ExportComponent extends BaseExportComponent { - constructor( - cryptoService: CryptoService, - i18nService: I18nService, - platformUtilsService: PlatformUtilsService, - exportService: VaultExportServiceAbstraction, - eventCollectionService: EventCollectionService, - policyService: PolicyService, - private router: Router, - logService: LogService, - userVerificationService: UserVerificationService, - formBuilder: UntypedFormBuilder, - fileDownloadService: FileDownloadService, - dialogService: DialogService - ) { - super( - cryptoService, - i18nService, - platformUtilsService, - exportService, - eventCollectionService, - policyService, - window, - logService, - userVerificationService, - formBuilder, - fileDownloadService, - dialogService - ); - } - - protected saved() { - super.saved(); - this.router.navigate(["/tabs/settings"]); - } -} diff --git a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html new file mode 100644 index 00000000000..9ad6ed36835 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts new file mode 100644 index 00000000000..cbb66cbcf5a --- /dev/null +++ b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.ts @@ -0,0 +1,40 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { Router, RouterLink } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/components"; +import { ExportComponent } from "@bitwarden/vault-export-ui"; + +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; + +@Component({ + templateUrl: "export-browser-v2.component.html", + standalone: true, + imports: [ + CommonModule, + RouterLink, + JslibModule, + DialogModule, + AsyncActionsModule, + ButtonModule, + ExportComponent, + PopupPageComponent, + PopupFooterComponent, + PopupHeaderComponent, + PopOutComponent, + ], +}) +export class ExportBrowserV2Component { + protected disabled = false; + protected loading = false; + + constructor(private router: Router) {} + + protected async onSuccessfulExport(organizationId: string): Promise { + await this.router.navigate(["/vault-settings"]); + } +} diff --git a/apps/browser/src/tools/popup/settings/export/export-browser.component.html b/apps/browser/src/tools/popup/settings/export/export-browser.component.html new file mode 100644 index 00000000000..bccde32a68d --- /dev/null +++ b/apps/browser/src/tools/popup/settings/export/export-browser.component.html @@ -0,0 +1,26 @@ +
+
+ +
+

+ {{ "exportVault" | i18n }} +

+
+ +
+
+
+
+ +
+
diff --git a/apps/browser/src/tools/popup/settings/export/export-browser.component.ts b/apps/browser/src/tools/popup/settings/export/export-browser.component.ts new file mode 100644 index 00000000000..3125e0a2934 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/export/export-browser.component.ts @@ -0,0 +1,40 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { Router, RouterLink } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/components"; +import { ExportComponent } from "@bitwarden/vault-export-ui"; + +@Component({ + templateUrl: "export-browser.component.html", + standalone: true, + imports: [ + CommonModule, + RouterLink, + JslibModule, + DialogModule, + AsyncActionsModule, + ButtonModule, + ExportComponent, + ], +}) +export class ExportBrowserComponent { + /** + * Used to control the disabled state of the Submit button + * Gets set indirectly by the disabled state being emitted from the sub-form when thier form gets disabled or the submit button is clicked + */ + protected disabled = false; + + /** + * Used to control the disabled state of the Submit button + * Gets set indirectly by the loading state being emitted from the sub-form when their form is loading or finished loading + */ + protected loading = false; + + constructor(private router: Router) {} + + protected async onSuccessfulExport(organizationId: string): Promise { + await this.router.navigate(["/vault-settings"]); + } +} diff --git a/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.html b/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.html new file mode 100644 index 00000000000..5458b46535a --- /dev/null +++ b/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts b/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts new file mode 100644 index 00000000000..16759057ed5 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/import/import-browser-v2.component.ts @@ -0,0 +1,40 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { Router, RouterLink } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/components"; +import { ImportComponent } from "@bitwarden/importer/ui"; + +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; + +@Component({ + templateUrl: "import-browser-v2.component.html", + standalone: true, + imports: [ + CommonModule, + RouterLink, + JslibModule, + DialogModule, + AsyncActionsModule, + ButtonModule, + ImportComponent, + PopupPageComponent, + PopupFooterComponent, + PopupHeaderComponent, + PopOutComponent, + ], +}) +export class ImportBrowserV2Component { + protected disabled = false; + protected loading = false; + + constructor(private router: Router) {} + + protected async onSuccessfulImport(organizationId: string): Promise { + await this.router.navigate(["/vault-settings"]); + } +} diff --git a/apps/browser/src/tools/popup/settings/import/import-browser.component.html b/apps/browser/src/tools/popup/settings/import/import-browser.component.html new file mode 100644 index 00000000000..67b5eb348ae --- /dev/null +++ b/apps/browser/src/tools/popup/settings/import/import-browser.component.html @@ -0,0 +1,26 @@ +
+
+ +
+

+ {{ "importData" | i18n }} +

+
+ +
+
+
+
+ +
+
diff --git a/apps/browser/src/tools/popup/settings/import/import-browser.component.ts b/apps/browser/src/tools/popup/settings/import/import-browser.component.ts new file mode 100644 index 00000000000..7ee4877ce1a --- /dev/null +++ b/apps/browser/src/tools/popup/settings/import/import-browser.component.ts @@ -0,0 +1,33 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { Router, RouterLink } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AsyncActionsModule, ButtonModule, DialogModule } from "@bitwarden/components"; +import { ImportComponent } from "@bitwarden/importer/ui"; + +@Component({ + templateUrl: "import-browser.component.html", + standalone: true, + imports: [ + CommonModule, + RouterLink, + JslibModule, + DialogModule, + AsyncActionsModule, + ButtonModule, + ImportComponent, + ], +}) +export class ImportBrowserComponent { + protected disabled = false; + protected loading = false; + + constructor(private router: Router) {} + + protected async onSuccessfulImport(organizationId: string): Promise { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.router.navigate(["/tabs/settings"]); + } +} diff --git a/apps/browser/src/tools/popup/settings/settings-v2.component.html b/apps/browser/src/tools/popup/settings/settings-v2.component.html new file mode 100644 index 00000000000..7ff958e26ac --- /dev/null +++ b/apps/browser/src/tools/popup/settings/settings-v2.component.html @@ -0,0 +1,47 @@ + + + + + + + + + + + {{ "accountSecurity" | i18n }} + + + + + {{ "autofill" | i18n }} + + + + + {{ "notifications" | i18n }} + + + + + {{ "vault" | i18n }} + + + + + {{ "appearance" | i18n }} + + + + + {{ "about" | 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 new file mode 100644 index 00000000000..5f3eb1c8f12 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/settings-v2.component.ts @@ -0,0 +1,27 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { ItemModule } from "@bitwarden/components"; + +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: "settings-v2.component.html", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + CurrentAccountComponent, + ], +}) +export class SettingsV2Component {} diff --git a/apps/browser/src/tools/popup/settings/settings.component.html b/apps/browser/src/tools/popup/settings/settings.component.html new file mode 100644 index 00000000000..c547229653e --- /dev/null +++ b/apps/browser/src/tools/popup/settings/settings.component.html @@ -0,0 +1,63 @@ + +
+

+ {{ "settings" | i18n }} +

+
+ +
+
+
+
+
+ + + + + + +
+
+
diff --git a/apps/browser/src/tools/popup/settings/settings.component.ts b/apps/browser/src/tools/popup/settings/settings.component.ts new file mode 100644 index 00000000000..973efc72038 --- /dev/null +++ b/apps/browser/src/tools/popup/settings/settings.component.ts @@ -0,0 +1,9 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "tools-settings", + templateUrl: "settings.component.html", +}) +export class SettingsComponent { + constructor() {} +} diff --git a/apps/browser/src/vault/background/abort-manager.ts b/apps/browser/src/vault/background/abort-manager.ts new file mode 100644 index 00000000000..8e61ca7a7b4 --- /dev/null +++ b/apps/browser/src/vault/background/abort-manager.ts @@ -0,0 +1,21 @@ +type Runner = (abortController: AbortController) => Promise; + +/** + * Manages abort controllers for long running tasks and allow separate + * execution contexts to abort each other by using ids. + */ +export class AbortManager { + private abortControllers = new Map(); + + runWithAbortController(id: string, runner: Runner): Promise { + const abortController = new AbortController(); + this.abortControllers.set(id, abortController); + return runner(abortController).finally(() => { + this.abortControllers.delete(id); + }); + } + + abort(id: string) { + this.abortControllers.get(id)?.abort(); + } +} diff --git a/apps/browser/src/vault/background/service_factories/cipher-service.factory.ts b/apps/browser/src/vault/background/service_factories/cipher-service.factory.ts deleted file mode 100644 index 006daadc1af..00000000000 --- a/apps/browser/src/vault/background/service_factories/cipher-service.factory.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { CipherService as AbstractCipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CipherService } from "@bitwarden/common/vault/services/cipher.service"; - -import { - CipherFileUploadServiceInitOptions, - cipherFileUploadServiceFactory, -} from "../../../background/service-factories/cipher-file-upload-service.factory"; -import { - searchServiceFactory, - SearchServiceInitOptions, -} from "../../../background/service-factories/search-service.factory"; -import { - SettingsServiceInitOptions, - settingsServiceFactory, -} from "../../../background/service-factories/settings-service.factory"; -import { - apiServiceFactory, - ApiServiceInitOptions, -} from "../../../platform/background/service-factories/api-service.factory"; -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - EncryptServiceInitOptions, - encryptServiceFactory, -} from "../../../platform/background/service-factories/encrypt-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; - -type CipherServiceFactoryOptions = FactoryOptions; - -export type CipherServiceInitOptions = CipherServiceFactoryOptions & - CryptoServiceInitOptions & - SettingsServiceInitOptions & - ApiServiceInitOptions & - CipherFileUploadServiceInitOptions & - I18nServiceInitOptions & - SearchServiceInitOptions & - StateServiceInitOptions & - EncryptServiceInitOptions; - -export function cipherServiceFactory( - cache: { cipherService?: AbstractCipherService } & CachedServices, - opts: CipherServiceInitOptions -): Promise { - return factory( - cache, - "cipherService", - opts, - async () => - new CipherService( - await cryptoServiceFactory(cache, opts), - await settingsServiceFactory(cache, opts), - await apiServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await searchServiceFactory(cache, opts), - await stateServiceFactory(cache, opts), - await encryptServiceFactory(cache, opts), - await cipherFileUploadServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/vault/background/service_factories/collection-service.factory.ts b/apps/browser/src/vault/background/service_factories/collection-service.factory.ts deleted file mode 100644 index 323eebe27d1..00000000000 --- a/apps/browser/src/vault/background/service_factories/collection-service.factory.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { CollectionService as AbstractCollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; -import { CollectionService } from "@bitwarden/common/vault/services/collection.service"; - -import { - cryptoServiceFactory, - CryptoServiceInitOptions, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - stateServiceFactory as stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; - -type CollectionServiceFactoryOptions = FactoryOptions; - -export type CollectionServiceInitOptions = CollectionServiceFactoryOptions & - CryptoServiceInitOptions & - I18nServiceInitOptions & - StateServiceInitOptions; - -export function collectionServiceFactory( - cache: { collectionService?: AbstractCollectionService } & CachedServices, - opts: CollectionServiceInitOptions -): Promise { - return factory( - cache, - "collectionService", - opts, - async () => - new CollectionService( - await cryptoServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await stateServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/vault/background/service_factories/folder-service.factory.ts b/apps/browser/src/vault/background/service_factories/folder-service.factory.ts deleted file mode 100644 index b33c79a012b..00000000000 --- a/apps/browser/src/vault/background/service_factories/folder-service.factory.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { FolderService as AbstractFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; - -import { - CryptoServiceInitOptions, - cryptoServiceFactory, -} from "../../../platform/background/service-factories/crypto-service.factory"; -import { - CachedServices, - factory, - FactoryOptions, -} from "../../../platform/background/service-factories/factory-options"; -import { - i18nServiceFactory, - I18nServiceInitOptions, -} from "../../../platform/background/service-factories/i18n-service.factory"; -import { - stateServiceFactory as stateServiceFactory, - StateServiceInitOptions, -} from "../../../platform/background/service-factories/state-service.factory"; -import { BrowserFolderService } from "../../services/browser-folder.service"; - -import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory"; - -type FolderServiceFactoryOptions = FactoryOptions; - -export type FolderServiceInitOptions = FolderServiceFactoryOptions & - CryptoServiceInitOptions & - CipherServiceInitOptions & - I18nServiceInitOptions & - StateServiceInitOptions; - -export function folderServiceFactory( - cache: { folderService?: AbstractFolderService } & CachedServices, - opts: FolderServiceInitOptions -): Promise { - return factory( - cache, - "folderService", - opts, - async () => - new BrowserFolderService( - await cryptoServiceFactory(cache, opts), - await i18nServiceFactory(cache, opts), - await cipherServiceFactory(cache, opts), - await stateServiceFactory(cache, opts) - ) - ); -} diff --git a/apps/browser/src/vault/background/service_factories/sync-notifier-service.factory.ts b/apps/browser/src/vault/background/service_factories/sync-notifier-service.factory.ts deleted file mode 100644 index 9e976b3bf75..00000000000 --- a/apps/browser/src/vault/background/service_factories/sync-notifier-service.factory.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SyncNotifierService as AbstractSyncNotifierService } from "@bitwarden/common/vault/abstractions/sync/sync-notifier.service.abstraction"; -import { SyncNotifierService } from "@bitwarden/common/vault/services/sync/sync-notifier.service"; - -import { - FactoryOptions, - CachedServices, - factory, -} from "../../../platform/background/service-factories/factory-options"; - -type SyncNotifierServiceFactoryOptions = FactoryOptions; - -export type SyncNotifierServiceInitOptions = SyncNotifierServiceFactoryOptions; - -export function syncNotifierServiceFactory( - cache: { syncNotifierService?: AbstractSyncNotifierService } & CachedServices, - opts: SyncNotifierServiceInitOptions -): Promise { - return factory(cache, "syncNotifierService", opts, () => - Promise.resolve(new SyncNotifierService()) - ); -} diff --git a/apps/browser/src/vault/content/send-on-installed-message.ts b/apps/browser/src/vault/content/send-on-installed-message.ts new file mode 100644 index 00000000000..9df15eb0d51 --- /dev/null +++ b/apps/browser/src/vault/content/send-on-installed-message.ts @@ -0,0 +1,5 @@ +import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; + +(function (globalContext) { + globalContext.postMessage({ command: VaultOnboardingMessages.HasBwInstalled }); +})(window); diff --git a/apps/browser/src/vault/guards/clear-vault-state.guard.ts b/apps/browser/src/vault/guards/clear-vault-state.guard.ts new file mode 100644 index 00000000000..2b43f1ecbd3 --- /dev/null +++ b/apps/browser/src/vault/guards/clear-vault-state.guard.ts @@ -0,0 +1,28 @@ +import { inject } from "@angular/core"; +import { CanDeactivateFn } from "@angular/router"; + +import { VaultV2Component } from "../popup/components/vault/vault-v2.component"; +import { VaultPopupItemsService } from "../popup/services/vault-popup-items.service"; +import { VaultPopupListFiltersService } from "../popup/services/vault-popup-list-filters.service"; + +/** + * Guard to clear the vault state (search and filter) when navigating away from the vault view. + * This ensures the search and filter state is reset when navigating between different tabs, except viewing a cipher. + */ +export const clearVaultStateGuard: CanDeactivateFn = ( + component: VaultV2Component, + currentRoute, + currentState, + nextState, +) => { + const vaultPopupItemsService = inject(VaultPopupItemsService); + const vaultPopupListFiltersService = inject(VaultPopupListFiltersService); + if (nextState && !isViewingCipher(nextState.url)) { + vaultPopupItemsService.applyFilter(""); + vaultPopupListFiltersService.resetFilterForm(); + } + + return true; +}; + +const isViewingCipher = (url: string): boolean => url.includes("view-cipher"); diff --git a/apps/browser/src/vault/popup/components/action-buttons.component.ts b/apps/browser/src/vault/popup/components/action-buttons.component.ts index 110e4ef32a5..b0e7b318d2e 100644 --- a/apps/browser/src/vault/popup/components/action-buttons.component.ts +++ b/apps/browser/src/vault/popup/components/action-buttons.component.ts @@ -1,21 +1,22 @@ -import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; +import { Subject, takeUntil } from "rxjs"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; -import { TotpService } from "@bitwarden/common/abstractions/totp.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { PasswordRepromptService } from "@bitwarden/common/vault/abstractions/password-reprompt.service"; +import { TotpService as TotpServiceAbstraction } from "@bitwarden/common/vault/abstractions/totp.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; -import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { PasswordRepromptService } from "@bitwarden/vault"; @Component({ selector: "app-action-buttons", templateUrl: "action-buttons.component.html", }) -export class ActionButtonsComponent { +export class ActionButtonsComponent implements OnInit, OnDestroy { @Output() onView = new EventEmitter(); @Output() launchEvent = new EventEmitter(); @Input() cipher: CipherView; @@ -24,17 +25,28 @@ export class ActionButtonsComponent { cipherType = CipherType; userHasPremiumAccess = false; + private componentIsDestroyed$ = new Subject(); + constructor( private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private eventCollectionService: EventCollectionService, - private totpService: TotpService, - private stateService: StateService, - private passwordRepromptService: PasswordRepromptService + private totpService: TotpServiceAbstraction, + private passwordRepromptService: PasswordRepromptService, + private billingAccountProfileStateService: BillingAccountProfileStateService, ) {} - async ngOnInit() { - this.userHasPremiumAccess = await this.stateService.getCanAccessPremium(); + ngOnInit() { + this.billingAccountProfileStateService.hasPremiumFromAnySource$ + .pipe(takeUntil(this.componentIsDestroyed$)) + .subscribe((canAccessPremium: boolean) => { + this.userHasPremiumAccess = canAccessPremium; + }); + } + + ngOnDestroy() { + this.componentIsDestroyed$.next(true); + this.componentIsDestroyed$.complete(); } launchCipher() { @@ -64,14 +76,20 @@ export class ActionButtonsComponent { this.platformUtilsService.showToast( "info", null, - this.i18nService.t("valueCopied", this.i18nService.t(typeI18nKey)) + this.i18nService.t("valueCopied", this.i18nService.t(typeI18nKey)), ); if (typeI18nKey === "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.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id); } else if (typeI18nKey === "verificationCodeTotp") { + // 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.eventCollectionService.collect(EventType.Cipher_ClientCopiedHiddenField, cipher.id); } else if (typeI18nKey === "securityCode") { + // 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.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id); } } diff --git a/apps/browser/src/vault/popup/components/password-reprompt.component.html b/apps/browser/src/vault/popup/components/password-reprompt.component.html deleted file mode 100644 index 730e96fab96..00000000000 --- a/apps/browser/src/vault/popup/components/password-reprompt.component.html +++ /dev/null @@ -1,55 +0,0 @@ - diff --git a/apps/browser/src/vault/popup/components/password-reprompt.component.ts b/apps/browser/src/vault/popup/components/password-reprompt.component.ts deleted file mode 100644 index f63da5ed48e..00000000000 --- a/apps/browser/src/vault/popup/components/password-reprompt.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from "@angular/core"; - -import { PasswordRepromptComponent as BasePasswordRepromptComponent } from "@bitwarden/angular/vault/components/password-reprompt.component"; - -@Component({ - templateUrl: "password-reprompt.component.html", -}) -export class PasswordRepromptComponent extends BasePasswordRepromptComponent {} diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.html b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.html new file mode 100644 index 00000000000..0e6dbf24427 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.html @@ -0,0 +1,41 @@ +
+ + + {{ (variant === "add" ? "newFolder" : "editFolder") | i18n }} + +
+ + {{ "folderName" | i18n }} + + + {{ "folderHintText" | i18n }} + + +
+
+ + + + +
+
+
diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts new file mode 100644 index 00000000000..4e222a554f7 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts @@ -0,0 +1,182 @@ +import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { BehaviorSubject } from "rxjs"; + +import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { UserId } from "@bitwarden/common/types/guid"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; +import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; +import { Folder } from "@bitwarden/common/vault/models/domain/folder"; +import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; +import { DialogService, ToastService } from "@bitwarden/components"; +import { KeyService } from "@bitwarden/key-management"; + +import { + AddEditFolderDialogComponent, + AddEditFolderDialogData, +} from "./add-edit-folder-dialog.component"; + +describe("AddEditFolderDialogComponent", () => { + let component: AddEditFolderDialogComponent; + let fixture: ComponentFixture; + + const dialogData = {} as AddEditFolderDialogData; + const folder = new Folder(); + const encrypt = jest.fn().mockResolvedValue(folder); + const save = jest.fn().mockResolvedValue(null); + const deleteFolder = jest.fn().mockResolvedValue(null); + const openSimpleDialog = jest.fn().mockResolvedValue(true); + const getUserKeyWithLegacySupport = jest.fn().mockResolvedValue(""); + const error = jest.fn(); + const close = jest.fn(); + const showToast = jest.fn(); + + const dialogRef = { + close, + }; + + beforeEach(async () => { + encrypt.mockClear(); + save.mockClear(); + deleteFolder.mockClear(); + error.mockClear(); + close.mockClear(); + showToast.mockClear(); + + const userId = "" as UserId; + const accountInfo: AccountInfo = { + email: "", + emailVerified: true, + name: undefined, + }; + + await TestBed.configureTestingModule({ + imports: [AddEditFolderDialogComponent, NoopAnimationsModule], + providers: [ + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: FolderService, useValue: { encrypt } }, + { provide: FolderApiServiceAbstraction, useValue: { save, delete: deleteFolder } }, + { + provide: AccountService, + useValue: { activeAccount$: new BehaviorSubject({ id: userId, ...accountInfo }) }, + }, + { + provide: KeyService, + useValue: { + getUserKeyWithLegacySupport, + }, + }, + { provide: LogService, useValue: { error } }, + { provide: ToastService, useValue: { showToast } }, + { provide: DIALOG_DATA, useValue: dialogData }, + { provide: DialogRef, useValue: dialogRef }, + ], + }) + .overrideProvider(DialogService, { useValue: { openSimpleDialog } }) + .compileComponents(); + + fixture = TestBed.createComponent(AddEditFolderDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + describe("new folder", () => { + it("requires a folder name", async () => { + await component.submit(); + + expect(encrypt).not.toHaveBeenCalled(); + + component.folderForm.controls.name.setValue("New Folder"); + + await component.submit(); + + expect(encrypt).toHaveBeenCalled(); + }); + + it("submits a new folder view", async () => { + component.folderForm.controls.name.setValue("New Folder"); + + await component.submit(); + + const newFolder = new FolderView(); + newFolder.name = "New Folder"; + + expect(encrypt).toHaveBeenCalledWith(newFolder, ""); + expect(save).toHaveBeenCalled(); + }); + + it("shows success toast after saving", async () => { + component.folderForm.controls.name.setValue("New Folder"); + + await component.submit(); + + expect(showToast).toHaveBeenCalledWith({ + message: "editedFolder", + title: null, + variant: "success", + }); + }); + + it("closes the dialog after saving", async () => { + component.folderForm.controls.name.setValue("New Folder"); + + await component.submit(); + + expect(close).toHaveBeenCalled(); + }); + + it("logs error if saving fails", async () => { + const errorObj = new Error("Failed to save folder"); + save.mockRejectedValue(errorObj); + + component.folderForm.controls.name.setValue("New Folder"); + + await component.submit(); + + expect(error).toHaveBeenCalledWith(errorObj); + }); + }); + + describe("editing folder", () => { + const folderView = new FolderView(); + folderView.id = "1"; + folderView.name = "Folder 1"; + + beforeEach(() => { + dialogData.editFolderConfig = { folder: folderView }; + + component.ngOnInit(); + }); + + it("populates form with folder name", () => { + expect(component.folderForm.controls.name.value).toBe("Folder 1"); + }); + + it("submits the updated folder", async () => { + component.folderForm.controls.name.setValue("Edited Folder"); + await component.submit(); + + expect(encrypt).toHaveBeenCalledWith( + { + ...dialogData.editFolderConfig.folder, + name: "Edited Folder", + }, + "", + ); + }); + + it("deletes the folder", async () => { + await component.deleteFolder(); + + expect(deleteFolder).toHaveBeenCalledWith(folderView.id); + expect(showToast).toHaveBeenCalledWith({ + variant: "success", + title: null, + message: "deletedFolder", + }); + }); + }); +}); diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.ts new file mode 100644 index 00000000000..c0cbf877480 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.ts @@ -0,0 +1,162 @@ +import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; +import { CommonModule } from "@angular/common"; +import { + AfterViewInit, + Component, + DestroyRef, + inject, + Inject, + OnInit, + ViewChild, +} from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { FormBuilder, ReactiveFormsModule, Validators } from "@angular/forms"; +import { firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; +import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; +import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; +import { + AsyncActionsModule, + BitSubmitDirective, + ButtonComponent, + ButtonModule, + DialogModule, + DialogService, + FormFieldModule, + IconButtonModule, + ToastService, +} from "@bitwarden/components"; +import { KeyService } from "@bitwarden/key-management"; + +export type AddEditFolderDialogData = { + /** When provided, dialog will display edit folder variant */ + editFolderConfig?: { folder: FolderView }; +}; + +@Component({ + standalone: true, + selector: "vault-add-edit-folder-dialog", + templateUrl: "./add-edit-folder-dialog.component.html", + imports: [ + CommonModule, + JslibModule, + DialogModule, + ButtonModule, + FormFieldModule, + ReactiveFormsModule, + IconButtonModule, + AsyncActionsModule, + ], +}) +export class AddEditFolderDialogComponent implements AfterViewInit, OnInit { + @ViewChild(BitSubmitDirective) private bitSubmit: BitSubmitDirective; + @ViewChild("submitBtn") private submitBtn: ButtonComponent; + + folder: FolderView; + + variant: "add" | "edit"; + + folderForm = this.formBuilder.group({ + name: ["", Validators.required], + }); + + private destroyRef = inject(DestroyRef); + + constructor( + private formBuilder: FormBuilder, + private folderService: FolderService, + private folderApiService: FolderApiServiceAbstraction, + private accountService: AccountService, + private keyService: KeyService, + private toastService: ToastService, + private i18nService: I18nService, + private logService: LogService, + private dialogService: DialogService, + private dialogRef: DialogRef, + @Inject(DIALOG_DATA) private data?: AddEditFolderDialogData, + ) {} + + ngOnInit(): void { + this.variant = this.data?.editFolderConfig ? "edit" : "add"; + + if (this.variant === "edit") { + this.folderForm.controls.name.setValue(this.data.editFolderConfig.folder.name); + this.folder = this.data.editFolderConfig.folder; + } else { + // Create a new folder view + this.folder = new FolderView(); + } + } + + ngAfterViewInit(): void { + this.bitSubmit.loading$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((loading) => { + if (!this.submitBtn) { + return; + } + + this.submitBtn.loading = loading; + }); + } + + /** Submit the new folder */ + submit = async () => { + if (this.folderForm.invalid) { + return; + } + + this.folder.name = this.folderForm.controls.name.value; + + try { + const activeUserId = await firstValueFrom(this.accountService.activeAccount$); + const userKey = await this.keyService.getUserKeyWithLegacySupport(activeUserId.id); + const folder = await this.folderService.encrypt(this.folder, userKey); + await this.folderApiService.save(folder); + + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("editedFolder"), + }); + + this.close(); + } catch (e) { + this.logService.error(e); + } + }; + + /** Delete the folder with when the user provides a confirmation */ + deleteFolder = async () => { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "deleteFolder" }, + content: { key: "deleteFolderPermanently" }, + type: "warning", + }); + + if (!confirmed) { + return; + } + + try { + await this.folderApiService.delete(this.folder.id); + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("deletedFolder"), + }); + } catch (e) { + this.logService.error(e); + } + + this.close(); + }; + + /** Close the dialog */ + private close() { + this.dialogRef.close(); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.html new file mode 100644 index 00000000000..a46f5a6955b --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts new file mode 100644 index 00000000000..ebfb1ff765f --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts @@ -0,0 +1,329 @@ +import { ComponentFixture, fakeAsync, TestBed, tick } from "@angular/core/testing"; +import { ActivatedRoute, Router } from "@angular/router"; +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { EventType } from "@bitwarden/common/enums"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { AddEditCipherInfo } from "@bitwarden/common/vault/types/add-edit-cipher-info"; +import { + CipherFormConfig, + CipherFormConfigService, + CipherFormMode, + OptionalInitialValues, +} from "@bitwarden/vault"; + +import { BrowserFido2UserInterfaceSession } from "../../../../../autofill/fido2/services/browser-fido2-user-interface.service"; +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; +import { PopupCloseWarningService } from "../../../../../popup/services/popup-close-warning.service"; + +import { AddEditV2Component } from "./add-edit-v2.component"; + +// 'qrcode-parser' is used by `BrowserTotpCaptureService` but is an es6 module that jest can't compile. +// Mock the entire module here to prevent jest from throwing an error. I wasn't able to find a way to mock the +// `BrowserTotpCaptureService` where jest would not load the file in the first place. +jest.mock("qrcode-parser", () => {}); + +describe("AddEditV2Component", () => { + let component: AddEditV2Component; + let fixture: ComponentFixture; + let addEditCipherInfo$: BehaviorSubject; + let cipherServiceMock: MockProxy; + + const buildConfigResponse = { originalCipher: {} } as CipherFormConfig; + const buildConfig = jest.fn((mode: CipherFormMode) => + Promise.resolve({ mode, ...buildConfigResponse }), + ); + const queryParams$ = new BehaviorSubject({}); + const disable = jest.fn(); + const navigate = jest.fn(); + const back = jest.fn().mockResolvedValue(null); + const collect = jest.fn().mockResolvedValue(null); + + beforeEach(async () => { + buildConfig.mockClear(); + disable.mockClear(); + navigate.mockClear(); + back.mockClear(); + collect.mockClear(); + + addEditCipherInfo$ = new BehaviorSubject(null); + cipherServiceMock = mock(); + cipherServiceMock.addEditCipherInfo$ = addEditCipherInfo$.asObservable(); + + await TestBed.configureTestingModule({ + imports: [AddEditV2Component], + providers: [ + { provide: PlatformUtilsService, useValue: mock() }, + { provide: ConfigService, useValue: mock() }, + { provide: PopupRouterCacheService, useValue: { back } }, + { provide: PopupCloseWarningService, useValue: { disable } }, + { provide: Router, useValue: { navigate } }, + { provide: ActivatedRoute, useValue: { queryParams: queryParams$ } }, + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: CipherService, useValue: cipherServiceMock }, + { provide: EventCollectionService, useValue: { collect } }, + ], + }) + .overrideProvider(CipherFormConfigService, { + useValue: { + buildConfig, + }, + }) + .compileComponents(); + + fixture = TestBed.createComponent(AddEditV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + describe("query params", () => { + describe("mode", () => { + it("sets mode to `add` when no `cipherId` is provided", fakeAsync(() => { + queryParams$.next({}); + + tick(); + + expect(buildConfig.mock.lastCall[0]).toBe("add"); + expect(component.config.mode).toBe("add"); + })); + + it("sets mode to `edit` when `params.clone` is not provided", fakeAsync(() => { + queryParams$.next({ cipherId: "222-333-444-5555", clone: "true" }); + + tick(); + + expect(buildConfig.mock.lastCall[0]).toBe("clone"); + expect(component.config.mode).toBe("clone"); + })); + + it("sets mode to `edit` when `params.clone` is not provided", fakeAsync(() => { + buildConfigResponse.originalCipher = { edit: true } as Cipher; + queryParams$.next({ cipherId: "222-333-444-5555" }); + + tick(); + + expect(buildConfig.mock.lastCall[0]).toBe("edit"); + expect(component.config.mode).toBe("edit"); + })); + + it("sets mode to `partial-edit` when `config.originalCipher.edit` is false", fakeAsync(() => { + buildConfigResponse.originalCipher = { edit: false } as Cipher; + queryParams$.next({ cipherId: "222-333-444-5555" }); + + tick(); + + expect(buildConfig.mock.lastCall[0]).toBe("edit"); + expect(component.config.mode).toBe("partial-edit"); + })); + }); + }); + + describe("analytics", () => { + it("does not log viewed event when mode is add", fakeAsync(() => { + queryParams$.next({}); + + tick(); + + expect(collect).not.toHaveBeenCalled(); + })); + + it("does not log viewed event whe mode is clone", fakeAsync(() => { + queryParams$.next({ cipherId: "222-333-444-5555", clone: "true" }); + buildConfigResponse.originalCipher = {} as Cipher; + + tick(); + + expect(collect).not.toHaveBeenCalled(); + })); + + it("logs viewed event when mode is edit", fakeAsync(() => { + buildConfigResponse.originalCipher = { + edit: true, + id: "222-333-444-5555", + organizationId: "444-555-666", + } as Cipher; + queryParams$.next({ cipherId: "222-333-444-5555" }); + + tick(); + + expect(collect).toHaveBeenCalledWith( + EventType.Cipher_ClientViewed, + "222-333-444-5555", + false, + "444-555-666", + ); + })); + + it("logs viewed event whe mode is partial-edit", fakeAsync(() => { + buildConfigResponse.originalCipher = { edit: false } as Cipher; + queryParams$.next({ cipherId: "222-333-444-5555", orgId: "444-555-666" }); + + tick(); + + expect(collect).toHaveBeenCalledWith( + EventType.Cipher_ClientViewed, + "222-333-444-5555", + false, + "444-555-666", + ); + })); + }); + + describe("addEditCipherInfo initialization", () => { + it("populates config.initialValues with `addEditCipherInfo` values", fakeAsync(() => { + const addEditCipherInfo = { + cipher: { + name: "test", + folderId: "folder1", + organizationId: "org1", + type: CipherType.Login, + login: { + password: "password", + username: "username", + uris: [{ uri: "https://example.com" }], + }, + }, + collectionIds: ["col1", "col2"], + } as AddEditCipherInfo; + addEditCipherInfo$.next(addEditCipherInfo); + queryParams$.next({}); + + tick(); + + expect(component.config.initialValues).toEqual({ + name: "test", + folderId: "folder1", + organizationId: "org1", + password: "password", + username: "username", + loginUri: "https://example.com", + collectionIds: ["col1", "col2"], + } as OptionalInitialValues); + })); + + it("populates config.initialValues.username when `addEditCipherInfo` is an Identity", fakeAsync(() => { + addEditCipherInfo$.next({ + cipher: { type: CipherType.Identity, identity: { username: "identity-username" } }, + } as AddEditCipherInfo); + queryParams$.next({}); + + tick(); + + expect(component.config.initialValues.username).toBe("identity-username"); + })); + + it("overrides query params with `addEditCipherInfo` values", fakeAsync(() => { + addEditCipherInfo$.next({ + cipher: { name: "AddEditCipherName" }, + } as AddEditCipherInfo); + queryParams$.next({ + name: "QueryParamName", + }); + + tick(); + + expect(component.config.initialValues.name).toBe("AddEditCipherName"); + })); + + it("clears `addEditCipherInfo` after initialization", fakeAsync(() => { + addEditCipherInfo$.next({ cipher: { name: "test" } } as AddEditCipherInfo); + queryParams$.next({}); + + tick(); + + expect(cipherServiceMock.setAddEditCipherInfo).toHaveBeenCalledTimes(1); + })); + }); + + describe("onCipherSaved", () => { + it("disables warning when in popout", async () => { + jest.spyOn(BrowserPopupUtils, "inPopout").mockReturnValueOnce(true); + + await component.onCipherSaved({ id: "123-456-789" } as CipherView); + + expect(disable).toHaveBeenCalled(); + }); + + it("calls `confirmNewCredentialResponse` when in fido2 popout", async () => { + // @ts-expect-error - `inFido2PopoutWindow` is a private getter, mock the response here + // for the test rather than setting up the dependencies. + jest.spyOn(component, "inFido2PopoutWindow", "get").mockReturnValueOnce(true); + + await component.onCipherSaved({ id: "123-456-789" } as CipherView); + + expect(BrowserPopupUtils.inPopout).toHaveBeenCalled(); + expect(navigate).not.toHaveBeenCalled(); + }); + + it("closes single action popout", async () => { + jest.spyOn(BrowserPopupUtils, "inSingleActionPopout").mockReturnValueOnce(true); + jest.spyOn(BrowserPopupUtils, "closeSingleActionPopout").mockResolvedValue(); + + await component.onCipherSaved({ id: "123-456-789" } as CipherView); + + expect(BrowserPopupUtils.closeSingleActionPopout).toHaveBeenCalled(); + expect(navigate).not.toHaveBeenCalled(); + }); + + it("navigates to view-cipher for new ciphers", async () => { + component.config.mode = "add"; + + await component.onCipherSaved({ id: "123-456-789" } as CipherView); + + expect(navigate).toHaveBeenCalledWith(["/view-cipher"], { + replaceUrl: true, + queryParams: { cipherId: "123-456-789" }, + }); + expect(back).not.toHaveBeenCalled(); + }); + + it("navigates to view-cipher for edit ciphers", async () => { + component.config.mode = "edit"; + + await component.onCipherSaved({ id: "123-456-789" } as CipherView); + + expect(navigate).not.toHaveBeenCalled(); + expect(back).toHaveBeenCalled(); + }); + }); + + describe("handleBackButton", () => { + it("disables warning and aborts fido2 popout", async () => { + // @ts-expect-error - `inFido2PopoutWindow` is a private getter, mock the response here + // for the test rather than setting up the dependencies. + jest.spyOn(component, "inFido2PopoutWindow", "get").mockReturnValueOnce(true); + jest.spyOn(BrowserFido2UserInterfaceSession, "abortPopout"); + + await component.handleBackButton(); + + expect(disable).toHaveBeenCalled(); + expect(BrowserFido2UserInterfaceSession.abortPopout).toHaveBeenCalled(); + expect(back).not.toHaveBeenCalled(); + }); + + it("closes single action popout", async () => { + jest.spyOn(BrowserPopupUtils, "inSingleActionPopout").mockReturnValueOnce(true); + jest.spyOn(BrowserPopupUtils, "closeSingleActionPopout").mockResolvedValue(); + + await component.handleBackButton(); + + expect(BrowserPopupUtils.closeSingleActionPopout).toHaveBeenCalled(); + expect(back).not.toHaveBeenCalled(); + }); + + it("navigates the user backwards", async () => { + await component.handleBackButton(); + + expect(back).toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts new file mode 100644 index 00000000000..8d95acbce9d --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts @@ -0,0 +1,398 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnInit } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { FormsModule } from "@angular/forms"; +import { ActivatedRoute, Params, Router } from "@angular/router"; +import { firstValueFrom, map, switchMap } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { EventType } from "@bitwarden/common/enums"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherId, CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { AddEditCipherInfo } from "@bitwarden/common/vault/types/add-edit-cipher-info"; +import { AsyncActionsModule, ButtonModule, SearchModule } from "@bitwarden/components"; +import { + CipherFormConfig, + CipherFormConfigService, + CipherFormGenerationService, + CipherFormMode, + CipherFormModule, + DefaultCipherFormConfigService, + OptionalInitialValues, + TotpCaptureService, +} from "@bitwarden/vault"; + +import { BrowserFido2UserInterfaceSession } from "../../../../../autofill/fido2/services/browser-fido2-user-interface.service"; +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; +import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; +import { PopupCloseWarningService } from "../../../../../popup/services/popup-close-warning.service"; +import { BrowserCipherFormGenerationService } from "../../../services/browser-cipher-form-generation.service"; +import { BrowserTotpCaptureService } from "../../../services/browser-totp-capture.service"; +import { + fido2PopoutSessionData$, + Fido2SessionData, +} from "../../../utils/fido2-popout-session-data"; +import { VaultPopoutType } from "../../../utils/vault-popout-window"; +import { OpenAttachmentsComponent } from "../attachments/open-attachments/open-attachments.component"; + +/** + * Helper class to parse query parameters for the AddEdit route. + */ +class QueryParams { + constructor(params: Params) { + this.cipherId = params.cipherId; + this.type = params.type != undefined ? parseInt(params.type, null) : undefined; + this.clone = params.clone === "true"; + this.folderId = params.folderId; + this.organizationId = params.organizationId; + this.collectionId = params.collectionId; + this.uri = params.uri; + this.username = params.username; + this.name = params.name; + } + + /** + * The ID of the cipher to edit or clone. + */ + cipherId?: CipherId; + + /** + * The type of cipher to create. + */ + type?: CipherType; + + /** + * Whether to clone the cipher. + */ + clone?: boolean; + + /** + * Optional folderId to pre-select. + */ + folderId?: string; + + /** + * Optional organizationId to pre-select. + */ + organizationId?: OrganizationId; + + /** + * Optional collectionId to pre-select. + */ + collectionId?: CollectionId; + + /** + * Optional URI to pre-fill for login ciphers. + */ + uri?: string; + + /** + * Optional username to pre-fill for login/identity ciphers. + */ + username?: string; + + /** + * Optional name to pre-fill for the cipher. + */ + name?: string; +} + +export type AddEditQueryParams = Partial>; + +@Component({ + selector: "app-add-edit-v2", + templateUrl: "add-edit-v2.component.html", + standalone: true, + providers: [ + { provide: CipherFormConfigService, useClass: DefaultCipherFormConfigService }, + { provide: TotpCaptureService, useClass: BrowserTotpCaptureService }, + { provide: CipherFormGenerationService, useClass: BrowserCipherFormGenerationService }, + ], + imports: [ + CommonModule, + SearchModule, + JslibModule, + FormsModule, + ButtonModule, + OpenAttachmentsComponent, + PopupPageComponent, + PopupHeaderComponent, + PopupFooterComponent, + CipherFormModule, + AsyncActionsModule, + PopOutComponent, + ], +}) +export class AddEditV2Component implements OnInit { + headerText: string; + config: CipherFormConfig; + + get loading() { + return this.config == null; + } + + get originalCipherId(): CipherId | null { + return this.config?.originalCipher?.id as CipherId; + } + + private fido2PopoutSessionData$ = fido2PopoutSessionData$(); + private fido2PopoutSessionData: Fido2SessionData; + + private get inFido2PopoutWindow() { + return BrowserPopupUtils.inPopout(window) && this.fido2PopoutSessionData.isFido2Session; + } + + private get inSingleActionPopout() { + return BrowserPopupUtils.inSingleActionPopout(window, VaultPopoutType.addEditVaultItem); + } + + constructor( + private route: ActivatedRoute, + private i18nService: I18nService, + private addEditFormConfigService: CipherFormConfigService, + private popupCloseWarningService: PopupCloseWarningService, + private popupRouterCacheService: PopupRouterCacheService, + private router: Router, + private cipherService: CipherService, + private eventCollectionService: EventCollectionService, + ) { + this.subscribeToParams(); + } + + async ngOnInit() { + this.fido2PopoutSessionData = await firstValueFrom(this.fido2PopoutSessionData$); + + if (BrowserPopupUtils.inPopout(window)) { + this.popupCloseWarningService.enable(); + } + } + + /** + * Called before the form is submitted, allowing us to handle Fido2 user verification. + */ + protected checkFido2UserVerification: () => Promise = async () => { + if (!this.inFido2PopoutWindow) { + // Not in a Fido2 popout window, no need to handle user verification. + return true; + } + + // TODO use fido2 user verification service once user verification for passkeys is approved for production. + // We are bypassing user verification pending approval for production. + return true; + }; + + /** + * Handle back button + */ + async handleBackButton() { + if (this.inFido2PopoutWindow) { + this.popupCloseWarningService.disable(); + BrowserFido2UserInterfaceSession.abortPopout(this.fido2PopoutSessionData.sessionId); + return; + } + + if (this.inSingleActionPopout) { + await BrowserPopupUtils.closeSingleActionPopout(VaultPopoutType.addEditVaultItem); + return; + } + + await this.popupRouterCacheService.back(); + } + + async onCipherSaved(cipher: CipherView) { + if (BrowserPopupUtils.inPopout(window)) { + this.popupCloseWarningService.disable(); + } + + if (this.inFido2PopoutWindow) { + BrowserFido2UserInterfaceSession.confirmNewCredentialResponse( + this.fido2PopoutSessionData.sessionId, + cipher.id, + this.fido2PopoutSessionData.userVerification, + ); + return; + } + + if (this.inSingleActionPopout) { + await BrowserPopupUtils.closeSingleActionPopout(VaultPopoutType.addEditVaultItem, 1000); + return; + } + + // When the cipher is in edit / partial edit, the previous page was the view-cipher page. + // In the case of creating a new cipher, the user should go view-cipher page but we need to also + // remove it from the history stack. This avoids the user having to click back twice on the + // view-cipher page. + if (this.config.mode === "edit" || this.config.mode === "partial-edit") { + await this.popupRouterCacheService.back(); + } else { + await this.router.navigate(["/view-cipher"], { + replaceUrl: true, + queryParams: { cipherId: cipher.id }, + }); + } + } + + subscribeToParams(): void { + this.route.queryParams + .pipe( + takeUntilDestroyed(), + map((params) => new QueryParams(params)), + switchMap(async (params) => { + let mode: CipherFormMode; + if (params.cipherId == null) { + mode = "add"; + } else { + mode = params.clone ? "clone" : "edit"; + } + const config = await this.addEditFormConfigService.buildConfig( + mode, + params.cipherId, + params.type, + ); + + if (config.mode === "edit" && !config.originalCipher.edit) { + config.mode = "partial-edit"; + } + + config.initialValues = this.setInitialValuesFromParams(params); + + // The browser notification bar and overlay use addEditCipherInfo$ to pass modified cipher details to the form + // Attempt to fetch them here and overwrite the initialValues if present + const cachedCipherInfo = await firstValueFrom(this.cipherService.addEditCipherInfo$); + + if (cachedCipherInfo != null) { + // Cached cipher info has priority over queryParams + config.initialValues = { + ...config.initialValues, + ...mapAddEditCipherInfoToInitialValues(cachedCipherInfo), + }; + // Be sure to clear the "cached" cipher info, so it doesn't get used again + await this.cipherService.setAddEditCipherInfo(null); + } + + if (["edit", "partial-edit"].includes(config.mode) && config.originalCipher?.id) { + await this.eventCollectionService.collect( + EventType.Cipher_ClientViewed, + config.originalCipher.id, + false, + config.originalCipher.organizationId, + ); + } + + return config; + }), + ) + .subscribe((config) => { + this.config = config; + this.headerText = this.setHeader(config.mode, config.cipherType); + }); + } + + setInitialValuesFromParams(params: QueryParams) { + const initialValues = {} as OptionalInitialValues; + if (params.folderId) { + initialValues.folderId = params.folderId; + } + if (params.organizationId) { + initialValues.organizationId = params.organizationId; + } + if (params.collectionId) { + initialValues.collectionIds = [params.collectionId]; + } + if (params.uri) { + initialValues.loginUri = params.uri; + } + if (params.username) { + initialValues.username = params.username; + } + if (params.name) { + initialValues.name = params.name; + } + return initialValues; + } + + setHeader(mode: CipherFormMode, type: CipherType) { + const partOne = mode === "edit" || mode === "partial-edit" ? "editItemHeader" : "newItemHeader"; + + switch (type) { + case CipherType.Login: + return this.i18nService.t(partOne, this.i18nService.t("typeLogin").toLocaleLowerCase()); + case CipherType.Card: + return this.i18nService.t(partOne, this.i18nService.t("typeCard").toLocaleLowerCase()); + case CipherType.Identity: + return this.i18nService.t(partOne, this.i18nService.t("typeIdentity").toLocaleLowerCase()); + case CipherType.SecureNote: + return this.i18nService.t(partOne, this.i18nService.t("note").toLocaleLowerCase()); + case CipherType.SshKey: + return this.i18nService.t(partOne, this.i18nService.t("typeSshKey").toLocaleLowerCase()); + } + } +} + +/** + * Helper to map the old AddEditCipherInfo to the new OptionalInitialValues type used by the CipherForm + * @param cipherInfo + */ +const mapAddEditCipherInfoToInitialValues = ( + cipherInfo: AddEditCipherInfo | null, +): OptionalInitialValues => { + const initialValues: OptionalInitialValues = {}; + + if (cipherInfo == null) { + return initialValues; + } + + if (cipherInfo.collectionIds != null) { + initialValues.collectionIds = cipherInfo.collectionIds as CollectionId[]; + } + + if (cipherInfo.cipher == null) { + return initialValues; + } + + const cipher = cipherInfo.cipher; + + if (cipher.folderId != null) { + initialValues.folderId = cipher.folderId; + } + + if (cipher.organizationId != null) { + initialValues.organizationId = cipher.organizationId as OrganizationId; + } + + if (cipher.name != null) { + initialValues.name = cipher.name; + } + + if (cipher.type === CipherType.Login) { + const login = cipher.login; + + if (login != null) { + if (login.uris != null && login.uris.length > 0) { + initialValues.loginUri = login.uris[0].uri; + } + + if (login.username != null) { + initialValues.username = login.username; + } + + if (login.password != null) { + initialValues.password = login.password; + } + } + } + + if (cipher.type === CipherType.Identity && cipher.identity?.username != null) { + initialValues.username = cipher.identity.username; + } + + return initialValues; +}; diff --git a/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.html b/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.html new file mode 100644 index 00000000000..b0e651e8e2b --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + {{ "cancel" | i18n }} + + + 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 new file mode 100644 index 00000000000..202103c16d3 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts @@ -0,0 +1,99 @@ +import { CommonModule, Location } from "@angular/common"; +import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { ReactiveFormsModule } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { Observable, combineLatest, first, map, switchMap } from "rxjs"; + +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 { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { + ButtonModule, + CardComponent, + SelectModule, + FormFieldModule, + AsyncActionsModule, +} from "@bitwarden/components"; +import { AssignCollectionsComponent, CollectionAssignmentParams } from "@bitwarden/vault"; + +import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component"; + +@Component({ + standalone: true, + selector: "app-assign-collections", + templateUrl: "./assign-collections.component.html", + imports: [ + AsyncActionsModule, + ButtonModule, + CommonModule, + JslibModule, + SelectModule, + FormFieldModule, + AssignCollectionsComponent, + CardComponent, + ReactiveFormsModule, + PopupPageComponent, + PopupHeaderComponent, + PopupFooterComponent, + PopOutComponent, + ], +}) +export class AssignCollections { + /** Params needed to populate the assign collections component */ + params: CollectionAssignmentParams; + + constructor( + private location: Location, + private collectionService: CollectionService, + private cipherService: CipherService, + private accountService: AccountService, + route: ActivatedRoute, + ) { + const cipher$: Observable = route.queryParams.pipe( + switchMap(({ cipherId }) => this.cipherService.get(cipherId)), + switchMap((cipherDomain) => + this.accountService.activeAccount$.pipe( + map((account) => account?.id), + switchMap((userId) => + this.cipherService + .getKeyForCipherKeyDecryption(cipherDomain, userId) + .then(cipherDomain.decrypt.bind(cipherDomain)), + ), + ), + ), + ); + + combineLatest([cipher$, this.collectionService.decryptedCollections$]) + .pipe(takeUntilDestroyed(), first()) + .subscribe(([cipherView, collections]) => { + let availableCollections = collections.filter((c) => !c.readOnly); + const organizationId = (cipherView?.organizationId as OrganizationId) ?? null; + + // If the cipher is already a part of an organization, + // only show collections that belong to that organization + if (organizationId) { + availableCollections = availableCollections.filter( + (c) => c.organizationId === organizationId, + ); + } + + this.params = { + ciphers: [cipherView], + organizationId, + availableCollections, + }; + }); + } + + /** Navigates the user back to the previous screen */ + navigateBack() { + this.location.back(); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.html new file mode 100644 index 00000000000..58ad816bfc5 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.html @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.spec.ts new file mode 100644 index 00000000000..29793a41ec9 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.spec.ts @@ -0,0 +1,121 @@ +import { Component, Input } from "@angular/core"; +import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; +import { ActivatedRoute, Router } from "@angular/router"; +import { mock } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { ButtonComponent } from "@bitwarden/components"; +import { CipherAttachmentsComponent } from "@bitwarden/vault"; + +import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; + +import { AttachmentsV2Component } from "./attachments-v2.component"; + +@Component({ + standalone: true, + selector: "popup-header", + template: ``, +}) +class MockPopupHeaderComponent { + @Input() pageTitle: string; + @Input() backAction: () => void; +} + +@Component({ + standalone: true, + selector: "popup-footer", + template: ``, +}) +class MockPopupFooterComponent { + @Input() pageTitle: string; +} + +describe("AttachmentsV2Component", () => { + let component: AttachmentsV2Component; + let fixture: ComponentFixture; + const queryParams = new BehaviorSubject<{ cipherId: string }>({ cipherId: "5555-444-3333" }); + let cipherAttachment: CipherAttachmentsComponent; + const navigate = jest.fn(); + const back = jest.fn().mockResolvedValue(undefined); + + const mockUserId = Utils.newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); + + beforeEach(async () => { + back.mockClear(); + navigate.mockClear(); + + await TestBed.configureTestingModule({ + imports: [AttachmentsV2Component], + providers: [ + { provide: LogService, useValue: mock() }, + { provide: ConfigService, useValue: mock() }, + { provide: PlatformUtilsService, useValue: mock() }, + { provide: CipherService, useValue: mock() }, + { provide: PopupRouterCacheService, useValue: { back } }, + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: Router, useValue: { navigate } }, + { + provide: ActivatedRoute, + useValue: { + queryParams, + }, + }, + { + provide: AccountService, + useValue: accountService, + }, + ], + }) + .overrideComponent(AttachmentsV2Component, { + remove: { + imports: [PopupHeaderComponent, PopupFooterComponent], + }, + add: { + imports: [MockPopupHeaderComponent, MockPopupFooterComponent], + }, + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AttachmentsV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + + cipherAttachment = fixture.debugElement.query( + By.directive(CipherAttachmentsComponent), + ).componentInstance; + }); + + it("sets `cipherId` from query params", () => { + expect(component.cipherId).toBe("5555-444-3333"); + }); + + it("passes the submit button to the cipher attachments component", () => { + const submitBtn = fixture.debugElement.queryAll(By.directive(ButtonComponent))[1] + .componentInstance; + + expect(cipherAttachment.submitBtn).toEqual(submitBtn); + }); + + it("navigates the user to the edit view `onUploadSuccess`", fakeAsync(() => { + cipherAttachment.onUploadSuccess.emit(); + + tick(); + + expect(back).toHaveBeenCalledTimes(1); + })); +}); diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.ts new file mode 100644 index 00000000000..09762767c81 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/attachments-v2.component.ts @@ -0,0 +1,53 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { ActivatedRoute } from "@angular/router"; +import { first } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { CipherId } from "@bitwarden/common/types/guid"; +import { ButtonModule } from "@bitwarden/components"; +import { CipherAttachmentsComponent } from "@bitwarden/vault"; + +import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; + +@Component({ + standalone: true, + selector: "app-attachments-v2", + templateUrl: "./attachments-v2.component.html", + imports: [ + CommonModule, + ButtonModule, + JslibModule, + CipherAttachmentsComponent, + PopupPageComponent, + PopupHeaderComponent, + PopupFooterComponent, + PopOutComponent, + ], +}) +export class AttachmentsV2Component { + /** The `id` tied to the underlying HTMLFormElement */ + attachmentFormId = CipherAttachmentsComponent.attachmentFormID; + + /** Id of the cipher */ + cipherId: CipherId; + + constructor( + private popupRouterCacheService: PopupRouterCacheService, + route: ActivatedRoute, + ) { + route.queryParams.pipe(takeUntilDestroyed(), first()).subscribe(({ cipherId }) => { + this.cipherId = cipherId; + }); + } + + /** Navigate the user back to the edit screen after uploading an attachment */ + async navigateBack() { + await this.popupRouterCacheService.back(); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.html b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.html new file mode 100644 index 00000000000..6345c3ea4e1 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.html @@ -0,0 +1,12 @@ + + + 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 new file mode 100644 index 00000000000..8c1e0641b03 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts @@ -0,0 +1,186 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { Router } from "@angular/router"; +import { RouterTestingModule } from "@angular/router/testing"; +import { BehaviorSubject } from "rxjs"; + +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; +import { ProductTierType } from "@bitwarden/common/billing/enums"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { CipherId, UserId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { ToastService } from "@bitwarden/components"; + +import BrowserPopupUtils from "../../../../../../platform/popup/browser-popup-utils"; +import { FilePopoutUtilsService } from "../../../../../../tools/popup/services/file-popout-utils.service"; + +import { OpenAttachmentsComponent } from "./open-attachments.component"; + +describe("OpenAttachmentsComponent", () => { + let component: OpenAttachmentsComponent; + let fixture: ComponentFixture; + let router: Router; + const showToast = jest.fn(); + const hasPremiumFromAnySource$ = new BehaviorSubject(true); + const openCurrentPagePopout = jest + .spyOn(BrowserPopupUtils, "openCurrentPagePopout") + .mockResolvedValue(null); + const cipherView = { + id: "5555-444-3333", + type: CipherType.Login, + name: "Test Login", + login: { + username: "username", + password: "password", + }, + } as CipherView; + + const cipherDomain = { + decrypt: () => cipherView, + }; + + const org = { + name: "Test Org", + productTierType: ProductTierType.Enterprise, + } as Organization; + + const getCipher = jest.fn().mockResolvedValue(cipherDomain); + const getOrganization = jest.fn().mockResolvedValue(org); + const showFilePopoutMessage = jest.fn().mockReturnValue(false); + + const mockUserId = Utils.newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); + + beforeEach(async () => { + openCurrentPagePopout.mockClear(); + getCipher.mockClear(); + showToast.mockClear(); + getOrganization.mockClear(); + showFilePopoutMessage.mockClear(); + + await TestBed.configureTestingModule({ + imports: [OpenAttachmentsComponent, RouterTestingModule], + providers: [ + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: BillingAccountProfileStateService, useValue: { hasPremiumFromAnySource$ } }, + { + provide: CipherService, + useValue: { + get: getCipher, + getKeyForCipherKeyDecryption: () => Promise.resolve(null), + }, + }, + { + provide: ToastService, + useValue: { showToast }, + }, + { + provide: OrganizationService, + useValue: { get: getOrganization }, + }, + { + provide: FilePopoutUtilsService, + useValue: { showFilePopoutMessage }, + }, + { + provide: AccountService, + useValue: accountService, + }, + ], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(OpenAttachmentsComponent); + component = fixture.componentInstance; + component.cipherId = "5555-444-3333" as CipherId; + router = TestBed.inject(Router); + jest.spyOn(router, "navigate").mockResolvedValue(true); + fixture.detectChanges(); + }); + + it("opens attachments in new popout", async () => { + showFilePopoutMessage.mockReturnValue(true); + + await component.ngOnInit(); + + await component.openAttachments(); + + expect(router.navigate).toHaveBeenCalledWith(["/attachments"], { + queryParams: { cipherId: "5555-444-3333" }, + }); + expect(openCurrentPagePopout).toHaveBeenCalledWith(window); + }); + + it("opens attachments in same window", async () => { + showFilePopoutMessage.mockReturnValue(false); + + await component.ngOnInit(); + + await component.openAttachments(); + + expect(openCurrentPagePopout).not.toHaveBeenCalled(); + expect(router.navigate).toHaveBeenCalledWith(["/attachments"], { + queryParams: { cipherId: "5555-444-3333" }, + }); + }); + + it("routes the user to the premium page when they cannot access premium features", async () => { + hasPremiumFromAnySource$.next(false); + + await component.openAttachments(); + + expect(router.navigate).toHaveBeenCalledWith(["/premium"]); + }); + + describe("Free Orgs", () => { + beforeEach(() => { + component.cipherIsAPartOfFreeOrg = undefined; + }); + + it("sets `cipherIsAPartOfFreeOrg` to false when the cipher is not a part of an organization", async () => { + cipherView.organizationId = null; + + await component.ngOnInit(); + + expect(component.cipherIsAPartOfFreeOrg).toBe(false); + }); + + it("sets `cipherIsAPartOfFreeOrg` to true when the cipher is a part of a free organization", async () => { + cipherView.organizationId = "888-333-333"; + org.productTierType = ProductTierType.Free; + + await component.ngOnInit(); + + expect(component.cipherIsAPartOfFreeOrg).toBe(true); + }); + + it("sets `cipherIsAPartOfFreeOrg` to false when the organization is not free", async () => { + cipherView.organizationId = "888-333-333"; + org.productTierType = ProductTierType.Families; + + await component.ngOnInit(); + + expect(component.cipherIsAPartOfFreeOrg).toBe(false); + }); + + it("shows toast when the cipher is a part of a free org", async () => { + component.canAccessAttachments = true; + component.cipherIsAPartOfFreeOrg = true; + + await component.openAttachments(); + + expect(showToast).toHaveBeenCalledWith({ + variant: "error", + title: null, + message: "freeOrgsCannotUseAttachments", + }); + }); + }); +}); 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 new file mode 100644 index 00000000000..118510695c5 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts @@ -0,0 +1,112 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input, OnInit } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { Router } from "@angular/router"; +import { firstValueFrom, map } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; +import { ProductTierType } from "@bitwarden/common/billing/enums"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { + BadgeModule, + CardComponent, + ItemModule, + ToastService, + TypographyModule, +} from "@bitwarden/components"; + +import BrowserPopupUtils from "../../../../../../platform/popup/browser-popup-utils"; +import { FilePopoutUtilsService } from "../../../../../../tools/popup/services/file-popout-utils.service"; + +@Component({ + standalone: true, + selector: "app-open-attachments", + templateUrl: "./open-attachments.component.html", + imports: [BadgeModule, CommonModule, ItemModule, JslibModule, TypographyModule, CardComponent], +}) +export class OpenAttachmentsComponent implements OnInit { + /** Cipher `id` */ + @Input({ required: true }) cipherId: CipherId; + + /** True when the attachments window should be opened in a popout */ + openAttachmentsInPopout: boolean; + + /** True when the user has access to premium or h */ + canAccessAttachments: boolean; + + /** True when the cipher is a part of a free organization */ + cipherIsAPartOfFreeOrg: boolean; + + constructor( + private router: Router, + private billingAccountProfileStateService: BillingAccountProfileStateService, + private cipherService: CipherService, + private organizationService: OrganizationService, + private toastService: ToastService, + private i18nService: I18nService, + private filePopoutUtilsService: FilePopoutUtilsService, + private accountService: AccountService, + ) { + this.billingAccountProfileStateService.hasPremiumFromAnySource$ + .pipe(takeUntilDestroyed()) + .subscribe((canAccessPremium) => { + this.canAccessAttachments = canAccessPremium; + }); + } + + async ngOnInit(): Promise { + this.openAttachmentsInPopout = this.filePopoutUtilsService.showFilePopoutMessage(window); + + if (!this.cipherId) { + return; + } + + const cipherDomain = await this.cipherService.get(this.cipherId); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); + const cipher = await cipherDomain.decrypt( + await this.cipherService.getKeyForCipherKeyDecryption(cipherDomain, activeUserId), + ); + + if (!cipher.organizationId) { + this.cipherIsAPartOfFreeOrg = false; + return; + } + + const org = await this.organizationService.get(cipher.organizationId); + + this.cipherIsAPartOfFreeOrg = org.productTierType === ProductTierType.Free; + } + + /** Routes the user to the attachments screen, if available */ + async openAttachments() { + if (!this.canAccessAttachments) { + await this.router.navigate(["/premium"]); + return; + } + + if (this.cipherIsAPartOfFreeOrg) { + this.toastService.showToast({ + variant: "error", + title: null, + message: this.i18nService.t("freeOrgsCannotUseAttachments"), + }); + return; + } + + await this.router.navigate(["/attachments"], { queryParams: { cipherId: this.cipherId } }); + + // Open the attachments page in a popout + // This is done after the router navigation to ensure that the navigation + // is included in the `PopupRouterCacheService` history + if (this.openAttachmentsInPopout) { + await BrowserPopupUtils.openCurrentPagePopout(window); + } + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html new file mode 100644 index 00000000000..52ae387e8b9 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html @@ -0,0 +1,9 @@ + diff --git a/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.ts b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.ts new file mode 100644 index 00000000000..8e72d84053d --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.ts @@ -0,0 +1,79 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { combineLatest, map, Observable } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { + IconButtonModule, + SectionComponent, + SectionHeaderComponent, + TypographyModule, +} from "@bitwarden/components"; + +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; +import { VaultPopupAutofillService } from "../../../services/vault-popup-autofill.service"; +import { VaultPopupItemsService } from "../../../services/vault-popup-items.service"; +import { PopupCipherView } from "../../../views/popup-cipher.view"; +import { VaultListItemsContainerComponent } from "../vault-list-items-container/vault-list-items-container.component"; + +@Component({ + standalone: true, + imports: [ + CommonModule, + SectionComponent, + TypographyModule, + VaultListItemsContainerComponent, + JslibModule, + SectionHeaderComponent, + IconButtonModule, + ], + selector: "app-autofill-vault-list-items", + templateUrl: "autofill-vault-list-items.component.html", +}) +export class AutofillVaultListItemsComponent { + /** + * The list of ciphers that can be used to autofill the current page. + * @protected + */ + protected autofillCiphers$: Observable = + this.vaultPopupItemsService.autoFillCiphers$; + + /** + * Flag indicating whether the refresh button should be shown. Only shown when the popup is within the FF sidebar. + * @protected + */ + protected showRefresh: boolean = BrowserPopupUtils.inSidebar(window); + + /** + * Observable that determines whether the empty autofill tip should be shown. + * The tip is shown when there are no login ciphers to autofill, no filter is applied, and autofill is allowed in + * the current context (e.g. not in a popout). + * @protected + */ + protected showEmptyAutofillTip$: Observable = combineLatest([ + this.vaultPopupItemsService.hasFilterApplied$, + this.autofillCiphers$, + this.vaultPopupAutofillService.autofillAllowed$, + ]).pipe( + map( + ([hasFilter, ciphers, canAutoFill]) => + !hasFilter && canAutoFill && ciphers.filter((c) => c.type == CipherType.Login).length === 0, + ), + ); + + constructor( + private vaultPopupItemsService: VaultPopupItemsService, + private vaultPopupAutofillService: VaultPopupAutofillService, + ) { + // TODO: Migrate logic to show Autofill policy toast PM-8144 + } + + /** + * Refreshes the current tab to re-populate the autofill ciphers. + * @protected + */ + protected refreshCurrentTab() { + this.vaultPopupAutofillService.refreshCurrentTab(); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/index.ts b/apps/browser/src/vault/popup/components/vault-v2/index.ts new file mode 100644 index 00000000000..13618d007d2 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/index.ts @@ -0,0 +1,2 @@ +export * from "./vault-list-items-container/vault-list-items-container.component"; +export * from "./autofill-vault-list-items/autofill-vault-list-items.component"; 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 new file mode 100644 index 00000000000..973b1f9f1a4 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.ts b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.ts new file mode 100644 index 00000000000..00a775024ce --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.ts @@ -0,0 +1,60 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input } from "@angular/core"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { IconButtonModule, ItemModule, MenuModule } from "@bitwarden/components"; +import { CopyCipherFieldDirective } from "@bitwarden/vault"; + +@Component({ + standalone: true, + selector: "app-item-copy-actions", + templateUrl: "item-copy-actions.component.html", + imports: [ + ItemModule, + IconButtonModule, + JslibModule, + MenuModule, + CommonModule, + CopyCipherFieldDirective, + ], +}) +export class ItemCopyActionsComponent { + @Input() cipher: CipherView; + + protected CipherType = CipherType; + + get hasLoginValues() { + return ( + !!this.cipher.login.hasTotp || !!this.cipher.login.password || !!this.cipher.login.username + ); + } + + get hasCardValues() { + return !!this.cipher.card.code || !!this.cipher.card.number; + } + + get hasIdentityValues() { + return ( + !!this.cipher.identity.fullAddressForCopy || + !!this.cipher.identity.email || + !!this.cipher.identity.username || + !!this.cipher.identity.phone + ); + } + + get hasSecureNoteValue() { + return !!this.cipher.notes; + } + + get hasSshKeyValues() { + return ( + !!this.cipher.sshKey.privateKey || + !!this.cipher.sshKey.publicKey || + !!this.cipher.sshKey.keyFingerprint + ); + } + + constructor() {} +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.html b/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.html new file mode 100644 index 00000000000..8b70896e019 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + {{ "clone" | i18n }} + + + {{ "assignToCollections" | i18n }} + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.ts b/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.ts new file mode 100644 index 00000000000..8ce3bcd2b60 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/item-more-options/item-more-options.component.ts @@ -0,0 +1,175 @@ +import { CommonModule } from "@angular/common"; +import { booleanAttribute, Component, Input, OnInit } from "@angular/core"; +import { Router, RouterModule } from "@angular/router"; +import { BehaviorSubject, firstValueFrom, map, switchMap } from "rxjs"; +import { filter } from "rxjs/operators"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherRepromptType, CipherType } from "@bitwarden/common/vault/enums"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service"; +import { + DialogService, + IconButtonModule, + ItemModule, + MenuModule, + ToastService, +} from "@bitwarden/components"; +import { PasswordRepromptService } from "@bitwarden/vault"; + +import { VaultPopupAutofillService } from "../../../services/vault-popup-autofill.service"; +import { AddEditQueryParams } from "../add-edit/add-edit-v2.component"; + +@Component({ + standalone: true, + selector: "app-item-more-options", + templateUrl: "./item-more-options.component.html", + imports: [ItemModule, IconButtonModule, MenuModule, CommonModule, JslibModule, RouterModule], +}) +export class ItemMoreOptionsComponent implements OnInit { + private _cipher$ = new BehaviorSubject(undefined); + + @Input({ + required: true, + }) + set cipher(c: CipherView) { + this._cipher$.next(c); + } + + get cipher() { + return this._cipher$.value; + } + + /** + * Flag to hide the autofill menu options. Used for items that are + * already in the autofill list suggestion. + */ + @Input({ transform: booleanAttribute }) + hideAutofillOptions: boolean; + + protected autofillAllowed$ = this.vaultPopupAutofillService.autofillAllowed$; + + /** + * Observable that emits a boolean value indicating if the user is authorized to clone the cipher. + * @protected + */ + protected canClone$ = this._cipher$.pipe( + filter((c) => c != null), + switchMap((c) => this.cipherAuthorizationService.canCloneCipher$(c)), + ); + + /** Boolean dependent on the current user having access to an organization */ + protected hasOrganizations = false; + + constructor( + private cipherService: CipherService, + private passwordRepromptService: PasswordRepromptService, + private toastService: ToastService, + private dialogService: DialogService, + private router: Router, + private i18nService: I18nService, + private vaultPopupAutofillService: VaultPopupAutofillService, + private accountService: AccountService, + private organizationService: OrganizationService, + private cipherAuthorizationService: CipherAuthorizationService, + ) {} + + async ngOnInit(): Promise { + this.hasOrganizations = await this.organizationService.hasOrganizations(); + } + + get canEdit() { + return this.cipher.edit; + } + + /** + * Determines if the cipher can be autofilled. + */ + get canAutofill() { + return [CipherType.Login, CipherType.Card, CipherType.Identity].includes(this.cipher.type); + } + + get isLogin() { + return this.cipher.type === CipherType.Login; + } + + get favoriteText() { + return this.cipher.favorite ? "unfavorite" : "favorite"; + } + + async doAutofill() { + await this.vaultPopupAutofillService.doAutofill(this.cipher); + } + + async doAutofillAndSave() { + await this.vaultPopupAutofillService.doAutofillAndSave(this.cipher, false); + } + + /** + * Toggles the favorite status of the cipher and updates it on the server. + */ + async toggleFavorite() { + this.cipher.favorite = !this.cipher.favorite; + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); + const encryptedCipher = await this.cipherService.encrypt(this.cipher, activeUserId); + await this.cipherService.updateWithServer(encryptedCipher); + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t( + this.cipher.favorite ? "itemAddedToFavorites" : "itemRemovedFromFavorites", + ), + }); + } + + /** + * Navigate to the clone cipher page with the current cipher as the source. + * A password reprompt is attempted if the cipher requires it. + * A confirmation dialog is shown if the cipher has FIDO2 credentials. + */ + async clone() { + if ( + this.cipher.reprompt === CipherRepromptType.Password && + !(await this.passwordRepromptService.showPasswordPrompt()) + ) { + return; + } + + if (this.cipher.login?.hasFido2Credentials) { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "passkeyNotCopied" }, + content: { key: "passkeyNotCopiedAlert" }, + type: "info", + }); + + if (!confirmed) { + return; + } + } + + await this.router.navigate(["/clone-cipher"], { + queryParams: { + clone: true.toString(), + cipherId: this.cipher.id, + type: this.cipher.type.toString(), + } as AddEditQueryParams, + }); + } + + /** Prompts for password when necessary then navigates to the assign collections route */ + async conditionallyNavigateToAssignCollections() { + if (this.cipher.reprompt && !(await this.passwordRepromptService.showPasswordPrompt())) { + return; + } + + await this.router.navigate(["/assign-collections"], { + queryParams: { cipherId: this.cipher.id }, + }); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.html new file mode 100644 index 00000000000..78403784f46 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.html @@ -0,0 +1,27 @@ + + + + + {{ "typeLogin" | i18n }} + + + + {{ "typeCard" | i18n }} + + + + {{ "typeIdentity" | i18n }} + + + + {{ "note" | i18n }} + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.spec.ts new file mode 100644 index 00000000000..6842f35ea6f --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.spec.ts @@ -0,0 +1,142 @@ +import { CommonModule } from "@angular/common"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { Router } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { ButtonModule, DialogService, MenuModule } from "@bitwarden/components"; + +import { BrowserApi } from "../../../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; +import { AddEditQueryParams } from "../add-edit/add-edit-v2.component"; +import { AddEditFolderDialogComponent } from "../add-edit-folder-dialog/add-edit-folder-dialog.component"; + +import { NewItemDropdownV2Component, NewItemInitialValues } from "./new-item-dropdown-v2.component"; + +describe("NewItemDropdownV2Component", () => { + let component: NewItemDropdownV2Component; + let fixture: ComponentFixture; + const open = jest.fn(); + const navigate = jest.fn(); + + jest + .spyOn(BrowserApi, "getTabFromCurrentWindow") + .mockResolvedValue({ url: "https://example.com" } as chrome.tabs.Tab); + + beforeEach(async () => { + open.mockClear(); + navigate.mockClear(); + + await TestBed.configureTestingModule({ + imports: [NewItemDropdownV2Component, MenuModule, ButtonModule, JslibModule, CommonModule], + providers: [ + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: Router, useValue: { navigate } }, + ], + }) + .overrideProvider(DialogService, { useValue: { open } }) + .compileComponents(); + + fixture = TestBed.createComponent(NewItemDropdownV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("opens new folder dialog", () => { + component.openFolderDialog(); + + expect(open).toHaveBeenCalledWith(AddEditFolderDialogComponent); + }); + + describe("new item", () => { + const emptyParams: AddEditQueryParams = { + collectionId: undefined, + organizationId: undefined, + folderId: undefined, + }; + + beforeEach(() => { + jest.spyOn(component, "newItemNavigate"); + }); + + it("navigates to new login", async () => { + await component.newItemNavigate(CipherType.Login); + + expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { + queryParams: { + type: CipherType.Login.toString(), + name: "example.com", + uri: "https://example.com", + ...emptyParams, + }, + }); + }); + + it("navigates to new card", async () => { + await component.newItemNavigate(CipherType.Card); + + expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { + queryParams: { type: CipherType.Card.toString(), ...emptyParams }, + }); + }); + + it("navigates to new identity", async () => { + await component.newItemNavigate(CipherType.Identity); + + expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { + queryParams: { type: CipherType.Identity.toString(), ...emptyParams }, + }); + }); + + it("navigates to new note", async () => { + await component.newItemNavigate(CipherType.SecureNote); + + expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { + queryParams: { type: CipherType.SecureNote.toString(), ...emptyParams }, + }); + }); + + it("includes initial values", async () => { + component.initialValues = { + folderId: "222-333-444", + organizationId: "444-555-666", + collectionId: "777-888-999", + } as NewItemInitialValues; + + await component.newItemNavigate(CipherType.Login); + + expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { + queryParams: { + type: CipherType.Login.toString(), + folderId: "222-333-444", + organizationId: "444-555-666", + collectionId: "777-888-999", + uri: "https://example.com", + name: "example.com", + }, + }); + }); + + it("does not include name or uri when the extension is popped out", async () => { + jest.spyOn(BrowserPopupUtils, "inPopout").mockReturnValue(true); + + component.initialValues = { + folderId: "222-333-444", + organizationId: "444-555-666", + collectionId: "777-888-999", + } as NewItemInitialValues; + + await component.newItemNavigate(CipherType.Login); + + expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { + queryParams: { + type: CipherType.Login.toString(), + folderId: "222-333-444", + organizationId: "444-555-666", + collectionId: "777-888-999", + }, + }); + }); + }); +}); diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts new file mode 100644 index 00000000000..a1d5cbd332d --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts @@ -0,0 +1,71 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input } from "@angular/core"; +import { Router, RouterLink } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { ButtonModule, DialogService, MenuModule, NoItemsModule } from "@bitwarden/components"; + +import { BrowserApi } from "../../../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; +import { AddEditQueryParams } from "../add-edit/add-edit-v2.component"; +import { AddEditFolderDialogComponent } from "../add-edit-folder-dialog/add-edit-folder-dialog.component"; + +export interface NewItemInitialValues { + folderId?: string; + organizationId?: OrganizationId; + collectionId?: CollectionId; +} + +@Component({ + selector: "app-new-item-dropdown", + templateUrl: "new-item-dropdown-v2.component.html", + standalone: true, + imports: [NoItemsModule, JslibModule, CommonModule, ButtonModule, RouterLink, MenuModule], +}) +export class NewItemDropdownV2Component { + cipherType = CipherType; + + /** + * Optional initial values to pass to the add cipher form + */ + @Input() + initialValues: NewItemInitialValues; + + constructor( + private router: Router, + private dialogService: DialogService, + ) {} + + private async buildQueryParams(type: CipherType): Promise { + const tab = await BrowserApi.getTabFromCurrentWindow(); + const poppedOut = BrowserPopupUtils.inPopout(window); + + const loginDetails: { uri?: string; name?: string } = {}; + + // When a Login Cipher is created and the extension is not popped out, + // pass along the uri and name + if (!poppedOut && type === CipherType.Login && tab) { + loginDetails.uri = tab.url; + loginDetails.name = Utils.getHostname(tab.url); + } + + return { + type: type.toString(), + collectionId: this.initialValues?.collectionId, + organizationId: this.initialValues?.organizationId, + folderId: this.initialValues?.folderId, + ...loginDetails, + }; + } + + async newItemNavigate(type: CipherType) { + await this.router.navigate(["/add-cipher"], { queryParams: await this.buildQueryParams(type) }); + } + + openFolderDialog() { + this.dialogService.open(AddEditFolderDialogComponent); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.html new file mode 100644 index 00000000000..72aaeea493d --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.html @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.spec.ts new file mode 100644 index 00000000000..d37bc367110 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.spec.ts @@ -0,0 +1,85 @@ +import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; +import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { mock, MockProxy } from "jest-mock-extended"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherFormGeneratorComponent } from "@bitwarden/vault"; + +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; + +import { + GeneratorDialogParams, + GeneratorDialogResult, + VaultGeneratorDialogComponent, +} from "./vault-generator-dialog.component"; + +@Component({ + selector: "vault-cipher-form-generator", + template: "", + standalone: true, +}) +class MockCipherFormGenerator { + @Input() type: "password" | "username"; + @Output() valueGenerated = new EventEmitter(); +} + +describe("VaultGeneratorDialogComponent", () => { + let component: VaultGeneratorDialogComponent; + let fixture: ComponentFixture; + let mockDialogRef: MockProxy>; + let dialogData: GeneratorDialogParams; + + beforeEach(async () => { + mockDialogRef = mock>(); + dialogData = { type: "password" }; + + await TestBed.configureTestingModule({ + imports: [VaultGeneratorDialogComponent, NoopAnimationsModule], + providers: [ + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: DIALOG_DATA, useValue: dialogData }, + { provide: DialogRef, useValue: mockDialogRef }, + { provide: PopupRouterCacheService, useValue: mock() }, + ], + }) + .overrideComponent(VaultGeneratorDialogComponent, { + remove: { imports: [CipherFormGeneratorComponent] }, + add: { imports: [MockCipherFormGenerator] }, + }) + .compileComponents(); + + fixture = TestBed.createComponent(VaultGeneratorDialogComponent); + component = fixture.componentInstance; + }); + + it("should create", () => { + fixture.detectChanges(); + expect(component).toBeTruthy(); + }); + + it("should use the appropriate text based on generator type", () => { + expect(component["title"]).toBe("passwordGenerator"); + expect(component["selectButtonText"]).toBe("useThisPassword"); + + dialogData.type = "username"; + + fixture = TestBed.createComponent(VaultGeneratorDialogComponent); + component = fixture.componentInstance; + + expect(component["title"]).toBe("usernameGenerator"); + expect(component["selectButtonText"]).toBe("useThisUsername"); + }); + + it("should close the dialog with the generated value when the user selects it", () => { + component["generatedValue"] = "generated-value"; + + fixture.nativeElement.querySelector("button[data-testid='select-button']").click(); + + expect(mockDialogRef.close).toHaveBeenCalledWith({ + action: "selected", + generatedValue: "generated-value", + }); + }); +}); 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 new file mode 100644 index 00000000000..dc91166d61c --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.ts @@ -0,0 +1,108 @@ +import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog"; +import { Overlay } from "@angular/cdk/overlay"; +import { CommonModule } from "@angular/common"; +import { Component, Inject } from "@angular/core"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { ButtonModule, DialogService } from "@bitwarden/components"; +import { CipherFormGeneratorComponent } from "@bitwarden/vault"; + +import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component"; + +export interface GeneratorDialogParams { + type: "password" | "username"; +} + +export interface GeneratorDialogResult { + action: GeneratorDialogAction; + generatedValue?: string; +} + +export enum GeneratorDialogAction { + Selected = "selected", + Canceled = "canceled", +} + +@Component({ + selector: "app-vault-generator-dialog", + templateUrl: "./vault-generator-dialog.component.html", + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + PopupFooterComponent, + CommonModule, + CipherFormGeneratorComponent, + ButtonModule, + ], +}) +export class VaultGeneratorDialogComponent { + protected title = this.i18nService.t(this.isPassword ? "passwordGenerator" : "usernameGenerator"); + protected selectButtonText = this.i18nService.t( + this.isPassword ? "useThisPassword" : "useThisUsername", + ); + + /** + * Whether the dialog is generating a password/passphrase. If false, it is generating a username. + * @protected + */ + protected get isPassword() { + return this.params.type === "password"; + } + + /** + * The currently generated value. + * @protected + */ + protected generatedValue: string = ""; + + constructor( + @Inject(DIALOG_DATA) protected params: GeneratorDialogParams, + private dialogRef: DialogRef, + private i18nService: I18nService, + ) {} + + /** + * Close the dialog without selecting a value. + */ + protected close = () => { + this.dialogRef.close({ action: GeneratorDialogAction.Canceled }); + }; + + /** + * Close the dialog and select the currently generated value. + */ + protected selectValue = () => { + this.dialogRef.close({ + action: GeneratorDialogAction.Selected, + generatedValue: this.generatedValue, + }); + }; + + onValueGenerated(value: string) { + this.generatedValue = value; + } + + /** + * Opens the vault generator dialog in a full screen dialog. + */ + static open( + dialogService: DialogService, + overlay: Overlay, + config: DialogConfig, + ) { + const position = overlay.position().global(); + + return dialogService.open( + VaultGeneratorDialogComponent, + { + ...config, + positionStrategy: position, + height: "100vh", + width: "100vw", + }, + ); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.html new file mode 100644 index 00000000000..05deeec0d3d --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.html @@ -0,0 +1,38 @@ +
+
+ +
+
+ +

+ {{ supportingText }} +

+
+ {{ numberOfAppliedFilters$ | async }} +
+
+
+ +
+ +
+
diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts new file mode 100644 index 00000000000..38ec6056d19 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts @@ -0,0 +1,162 @@ +import { CommonModule } from "@angular/common"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { FormBuilder } from "@angular/forms"; +import { By } from "@angular/platform-browser"; +import { ActivatedRoute } from "@angular/router"; +import { mock } from "jest-mock-extended"; +import { BehaviorSubject, Subject } from "rxjs"; + +import { CollectionService } from "@bitwarden/admin-console/common"; +import { SearchService } from "@bitwarden/common/abstractions/search.service"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { MessageSender } from "@bitwarden/common/platform/messaging"; +import { StateProvider } from "@bitwarden/common/platform/state"; +import { SyncService } from "@bitwarden/common/platform/sync"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; +import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; +import { PasswordRepromptService } from "@bitwarden/vault"; + +import { AutofillService } from "../../../../../autofill/services/abstractions/autofill.service"; +import { VaultPopupItemsService } from "../../../../../vault/popup/services/vault-popup-items.service"; +import { + PopupListFilter, + VaultPopupListFiltersService, +} from "../../../../../vault/popup/services/vault-popup-list-filters.service"; + +import { VaultHeaderV2Component } from "./vault-header-v2.component"; + +describe("VaultHeaderV2Component", () => { + let component: VaultHeaderV2Component; + let fixture: ComponentFixture; + + const emptyForm: PopupListFilter = { + organization: null, + collection: null, + folder: null, + cipherType: null, + }; + + const numberOfAppliedFilters$ = new BehaviorSubject(0); + const state$ = new Subject(); + + // Mock state provider update + const update = jest.fn().mockResolvedValue(undefined); + + /** When it exists, returns the notification badge debug element */ + const getBadge = () => fixture.debugElement.query(By.css('[data-testid="filter-badge"]')); + + beforeEach(async () => { + update.mockClear(); + + await TestBed.configureTestingModule({ + imports: [VaultHeaderV2Component, CommonModule], + providers: [ + { + provide: CipherService, + useValue: mock({ cipherViews$: new BehaviorSubject([]) }), + }, + { provide: VaultSettingsService, useValue: mock() }, + { provide: FolderService, useValue: mock() }, + { provide: OrganizationService, useValue: mock() }, + { provide: CollectionService, useValue: mock() }, + { provide: PolicyService, useValue: mock() }, + { provide: SearchService, useValue: mock() }, + { provide: PlatformUtilsService, useValue: mock() }, + { provide: AutofillService, useValue: mock() }, + { provide: PasswordRepromptService, useValue: mock() }, + { provide: MessageSender, useValue: mock() }, + { provide: AccountService, useValue: mock() }, + { provide: LogService, useValue: mock() }, + { + provide: VaultPopupItemsService, + useValue: mock({ latestSearchText$: new BehaviorSubject("") }), + }, + { + provide: SyncService, + useValue: mock({ activeUserLastSync$: () => new Subject() }), + }, + { provide: ActivatedRoute, useValue: { queryParams: new BehaviorSubject({}) } }, + { provide: I18nService, useValue: { t: (key: string) => key } }, + { + provide: VaultPopupListFiltersService, + useValue: { + numberOfAppliedFilters$, + filters$: new BehaviorSubject(emptyForm), + filterForm: new FormBuilder().group(emptyForm), + filterVisibilityState$: state$, + updateFilterVisibility: update, + }, + }, + { + provide: StateProvider, + useValue: { getGlobal: () => ({ state$, update }) }, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(VaultHeaderV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("does not show filter badge when no filters are selected", () => { + state$.next(false); + numberOfAppliedFilters$.next(0); + fixture.detectChanges(); + + expect(getBadge()).toBeNull(); + }); + + it("does not show filter badge when disclosure is open", () => { + state$.next(true); + numberOfAppliedFilters$.next(1); + fixture.detectChanges(); + + expect(getBadge()).toBeNull(); + }); + + it("shows the notification badge when there are populated filters and the disclosure is closed", async () => { + state$.next(false); + numberOfAppliedFilters$.next(1); + fixture.detectChanges(); + + expect(getBadge()).not.toBeNull(); + }); + + it("displays the number of filters populated", () => { + numberOfAppliedFilters$.next(1); + state$.next(false); + fixture.detectChanges(); + + expect(getBadge().nativeElement.textContent.trim()).toBe("1"); + + numberOfAppliedFilters$.next(2); + + fixture.detectChanges(); + + expect(getBadge().nativeElement.textContent.trim()).toBe("2"); + + numberOfAppliedFilters$.next(4); + + fixture.detectChanges(); + + expect(getBadge().nativeElement.textContent.trim()).toBe("4"); + }); + + it("defaults the initial state to true", (done) => { + // The initial value of the `state$` variable above is undefined + component["initialDisclosureVisibility$"].subscribe((initialVisibility) => { + expect(initialVisibility).toBeTrue(); + done(); + }); + + // Update the state to null + state$.next(null); + }); +}); diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.ts new file mode 100644 index 00000000000..c7183f6fa28 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.ts @@ -0,0 +1,70 @@ +import { CommonModule } from "@angular/common"; +import { Component, inject, NgZone, ViewChild } from "@angular/core"; +import { combineLatest, map, take } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { DisclosureTriggerForDirective, IconButtonModule } from "@bitwarden/components"; + +import { DisclosureComponent } from "../../../../../../../../libs/components/src/disclosure/disclosure.component"; +import { runInsideAngular } from "../../../../../platform/browser/run-inside-angular.operator"; +import { VaultPopupListFiltersService } from "../../../../../vault/popup/services/vault-popup-list-filters.service"; +import { VaultListFiltersComponent } from "../vault-list-filters/vault-list-filters.component"; +import { VaultV2SearchComponent } from "../vault-search/vault-v2-search.component"; + +@Component({ + selector: "app-vault-header-v2", + templateUrl: "vault-header-v2.component.html", + standalone: true, + imports: [ + VaultV2SearchComponent, + VaultListFiltersComponent, + DisclosureComponent, + IconButtonModule, + DisclosureTriggerForDirective, + CommonModule, + JslibModule, + ], +}) +export class VaultHeaderV2Component { + @ViewChild(DisclosureComponent) disclosure: DisclosureComponent; + + /** Emits the visibility status of the disclosure component. */ + protected isDisclosureShown$ = this.vaultPopupListFiltersService.filterVisibilityState$.pipe( + runInsideAngular(inject(NgZone)), // Browser state updates can happen outside of `ngZone` + map((v) => v ?? true), + ); + + // Only use the first value to avoid an infinite loop from two-way binding + protected initialDisclosureVisibility$ = this.isDisclosureShown$.pipe(take(1)); + + protected numberOfAppliedFilters$ = this.vaultPopupListFiltersService.numberOfAppliedFilters$; + + /** Emits true when the number of filters badge should be applied. */ + protected showBadge$ = combineLatest([ + this.numberOfAppliedFilters$, + this.isDisclosureShown$, + ]).pipe(map(([numberOfFilters, disclosureShown]) => numberOfFilters !== 0 && !disclosureShown)); + + protected buttonSupportingText$ = this.numberOfAppliedFilters$.pipe( + map((numberOfFilters) => { + if (numberOfFilters === 0) { + return null; + } + if (numberOfFilters === 1) { + return this.i18nService.t("filterApplied"); + } + + return this.i18nService.t("filterAppliedPlural", numberOfFilters); + }), + ); + + constructor( + private vaultPopupListFiltersService: VaultPopupListFiltersService, + private i18nService: I18nService, + ) {} + + async toggleFilters(isShown: boolean) { + await this.vaultPopupListFiltersService.updateFilterVisibility(isShown); + } +} 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 new file mode 100644 index 00000000000..56f35c41f6d --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-filters/vault-list-filters.component.html @@ -0,0 +1,48 @@ +
+
+ + + + + + + + + + + + + + +
+
diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-filters/vault-list-filters.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-list-filters/vault-list-filters.component.ts new file mode 100644 index 00000000000..0e57450fc77 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-filters/vault-list-filters.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { ReactiveFormsModule } from "@angular/forms"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { ChipSelectComponent } from "@bitwarden/components"; + +import { VaultPopupListFiltersService } from "../../../services/vault-popup-list-filters.service"; + +@Component({ + standalone: true, + selector: "app-vault-list-filters", + templateUrl: "./vault-list-filters.component.html", + imports: [CommonModule, JslibModule, ChipSelectComponent, ReactiveFormsModule], +}) +export class VaultListFiltersComponent { + protected filterForm = this.vaultPopupListFiltersService.filterForm; + protected organizations$ = this.vaultPopupListFiltersService.organizations$; + protected collections$ = this.vaultPopupListFiltersService.collections$; + protected folders$ = this.vaultPopupListFiltersService.folders$; + protected cipherTypes = this.vaultPopupListFiltersService.cipherTypes; + + constructor(private vaultPopupListFiltersService: VaultPopupListFiltersService) {} +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html new file mode 100644 index 00000000000..a493ea2171c --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html @@ -0,0 +1,83 @@ + +
+ +

+ {{ title }} +

+ + {{ ciphers.length }} +
+
+
+ {{ description }} +
+ + + + + + + + + + + + + + + + + +
diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts new file mode 100644 index 00000000000..fa2c8a440e0 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts @@ -0,0 +1,194 @@ +import { ScrollingModule } from "@angular/cdk/scrolling"; +import { CommonModule } from "@angular/common"; +import { booleanAttribute, Component, EventEmitter, inject, Input, Output } from "@angular/core"; +import { Router, RouterLink } from "@angular/router"; +import { map } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { + BadgeModule, + ButtonModule, + CompactModeService, + IconButtonModule, + ItemModule, + SectionComponent, + SectionHeaderComponent, + TypographyModule, +} from "@bitwarden/components"; +import { OrgIconDirective, PasswordRepromptService } from "@bitwarden/vault"; + +import { BrowserApi } from "../../../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; +import { VaultPopupAutofillService } from "../../../services/vault-popup-autofill.service"; +import { PopupCipherView } from "../../../views/popup-cipher.view"; +import { ItemCopyActionsComponent } from "../item-copy-action/item-copy-actions.component"; +import { ItemMoreOptionsComponent } from "../item-more-options/item-more-options.component"; + +@Component({ + imports: [ + CommonModule, + ItemModule, + ButtonModule, + BadgeModule, + IconButtonModule, + SectionComponent, + TypographyModule, + JslibModule, + SectionHeaderComponent, + RouterLink, + ItemCopyActionsComponent, + ItemMoreOptionsComponent, + OrgIconDirective, + ScrollingModule, + ], + selector: "app-vault-list-items-container", + templateUrl: "vault-list-items-container.component.html", + standalone: true, +}) +export class VaultListItemsContainerComponent { + private compactModeService = inject(CompactModeService); + + /** + * The class used to set the height of a bit item's inner content. + */ + protected readonly itemHeightClass = `tw-h-[52px]`; + + /** + * The height of a bit item in pixels. Includes any margin, padding, or border. Used by the virtual scroll + * to estimate how many items can be displayed at once and how large the virtual container should be. + * Needs to be updated if the item height or spacing changes. + * + * Default: 52px + 1px border + 6px bottom margin = 59px + * + * Compact mode: 52px + 1px border = 53px + */ + protected readonly itemHeight$ = this.compactModeService.enabled$.pipe( + map((enabled) => (enabled ? 53 : 59)), + ); + + /** + * Timeout used to add a small delay when selecting a cipher to allow for double click to launch + * @private + */ + private viewCipherTimeout: number | null; + + /** + * The list of ciphers to display. + */ + @Input() + ciphers: PopupCipherView[] = []; + + /** + * Title for the vault list item section. + */ + @Input() + title: string; + + /** + * Optional description for the vault list item section. Will be shown below the title even when + * no ciphers are available. + */ + @Input() + description: string; + + /** + * Option to show a refresh button in the section header. + */ + @Input({ transform: booleanAttribute }) + showRefresh: boolean; + + /** + * Event emitted when the refresh button is clicked. + */ + @Output() + onRefresh = new EventEmitter(); + + /** + * Option to show the autofill button for each item. + */ + @Input({ transform: booleanAttribute }) + showAutofillButton: boolean; + + /** + * Remove the bottom margin from the bit-section in this component + * (used for containers at the end of the page where bottom margin is not needed) + */ + @Input({ transform: booleanAttribute }) + disableSectionMargin: boolean = false; + + /** + * The tooltip text for the organization icon for ciphers that belong to an organization. + * @param cipher + */ + orgIconTooltip(cipher: PopupCipherView) { + if (cipher.collectionIds.length > 1) { + return this.i18nService.t("nCollections", cipher.collectionIds.length); + } + + return cipher.collections[0]?.name; + } + + constructor( + private i18nService: I18nService, + private vaultPopupAutofillService: VaultPopupAutofillService, + private passwordRepromptService: PasswordRepromptService, + private cipherService: CipherService, + private router: Router, + ) {} + + /** + * Launches the login cipher in a new browser tab. + */ + async launchCipher(cipher: CipherView) { + if (!cipher.canLaunch) { + return; + } + + // If there is a view action pending, clear it + if (this.viewCipherTimeout != null) { + window.clearTimeout(this.viewCipherTimeout); + this.viewCipherTimeout = null; + } + + await this.cipherService.updateLastLaunchedDate(cipher.id); + + await BrowserApi.createNewTab(cipher.login.launchUri); + + if (BrowserPopupUtils.inPopup(window)) { + BrowserApi.closePopup(window); + } + } + + async doAutofill(cipher: PopupCipherView) { + await this.vaultPopupAutofillService.doAutofill(cipher); + } + + async onViewCipher(cipher: PopupCipherView) { + // We already have a view action in progress, don't start another + if (this.viewCipherTimeout != null) { + return; + } + + // Wrap in a timeout to allow for double click to launch + this.viewCipherTimeout = window.setTimeout( + async () => { + try { + const repromptPassed = await this.passwordRepromptService.passwordRepromptCheck(cipher); + if (!repromptPassed) { + return; + } + await this.router.navigate(["/view-cipher"], { + queryParams: { cipherId: cipher.id, type: cipher.type }, + }); + } finally { + // Ensure the timeout is always cleared + this.viewCipherTimeout = null; + } + }, + cipher.canLaunch ? 200 : 0, + ); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.html new file mode 100644 index 00000000000..d4ff0662fe0 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.spec.ts new file mode 100644 index 00000000000..a375aba302e --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.spec.ts @@ -0,0 +1,56 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { ActivatedRoute } from "@angular/router"; +import { mock } from "jest-mock-extended"; +import { Subject } from "rxjs"; + +import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; + +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; + +import { PasswordHistoryV2Component } from "./vault-password-history-v2.component"; + +describe("PasswordHistoryV2Component", () => { + let component: PasswordHistoryV2Component; + let fixture: ComponentFixture; + const params$ = new Subject(); + const back = jest.fn().mockResolvedValue(undefined); + + beforeEach(async () => { + back.mockClear(); + + await TestBed.configureTestingModule({ + imports: [PasswordHistoryV2Component], + providers: [ + { provide: WINDOW, useValue: window }, + { provide: PlatformUtilsService, useValue: mock() }, + { provide: ConfigService, useValue: mock() }, + { provide: CipherService, useValue: mock() }, + { provide: AccountService, useValue: mock() }, + { provide: PopupRouterCacheService, useValue: { back } }, + { provide: ActivatedRoute, useValue: { queryParams: params$ } }, + { provide: I18nService, useValue: { t: (key: string) => key } }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(PasswordHistoryV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("sets the cipherId from the params", () => { + params$.next({ cipherId: "444-33-33-1111" }); + + expect(component["cipherId"]).toBe("444-33-33-1111"); + }); + + it("navigates back when a cipherId is not in the params", () => { + params$.next({}); + + expect(back).toHaveBeenCalledTimes(1); + }); +}); 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 new file mode 100644 index 00000000000..bc677a91d64 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts @@ -0,0 +1,50 @@ +import { NgIf } from "@angular/common"; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { first } from "rxjs/operators"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { CipherId } from "@bitwarden/common/types/guid"; + +import { PasswordHistoryViewComponent } from "../../../../../../../../libs/vault/src/components/password-history-view/password-history-view.component"; +import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; + +@Component({ + standalone: true, + selector: "vault-password-history-v2", + templateUrl: "vault-password-history-v2.component.html", + imports: [ + JslibModule, + PopupPageComponent, + PopOutComponent, + PopupHeaderComponent, + PasswordHistoryViewComponent, + NgIf, + ], +}) +export class PasswordHistoryV2Component implements OnInit { + protected cipherId: CipherId; + + constructor( + private browserRouterHistory: PopupRouterCacheService, + private route: ActivatedRoute, + ) {} + + ngOnInit() { + // eslint-disable-next-line rxjs-angular/prefer-takeuntil + this.route.queryParams.pipe(first()).subscribe((params) => { + if (params.cipherId) { + this.cipherId = params.cipherId; + } else { + this.close(); + } + }); + } + + close() { + void this.browserRouterHistory.back(); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-search/vault-v2-search.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-search/vault-v2-search.component.html new file mode 100644 index 00000000000..7cf154c0ee8 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-search/vault-v2-search.component.html @@ -0,0 +1,7 @@ + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-search/vault-v2-search.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-search/vault-v2-search.component.ts new file mode 100644 index 00000000000..e6100321607 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-search/vault-v2-search.component.ts @@ -0,0 +1,52 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { FormsModule } from "@angular/forms"; +import { Subject, Subscription, debounceTime, filter } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { SearchModule } from "@bitwarden/components"; + +import { VaultPopupItemsService } from "../../../services/vault-popup-items.service"; + +const SearchTextDebounceInterval = 200; + +@Component({ + imports: [CommonModule, SearchModule, JslibModule, FormsModule], + standalone: true, + selector: "app-vault-v2-search", + templateUrl: "vault-v2-search.component.html", +}) +export class VaultV2SearchComponent { + searchText: string; + + private searchText$ = new Subject(); + + constructor(private vaultPopupItemsService: VaultPopupItemsService) { + this.subscribeToLatestSearchText(); + this.subscribeToApplyFilter(); + } + + onSearchTextChanged() { + this.searchText$.next(this.searchText); + } + + subscribeToLatestSearchText(): Subscription { + return this.vaultPopupItemsService.latestSearchText$ + .pipe( + takeUntilDestroyed(), + filter((data) => !!data), + ) + .subscribe((text) => { + this.searchText = text; + }); + } + + subscribeToApplyFilter(): Subscription { + return this.searchText$ + .pipe(debounceTime(SearchTextDebounceInterval), takeUntilDestroyed()) + .subscribe((data) => { + this.vaultPopupItemsService.applyFilter(data); + }); + } +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-ui-onboarding/vault-ui-onboarding.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-ui-onboarding/vault-ui-onboarding.component.ts new file mode 100644 index 00000000000..20b39c5a88d --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-ui-onboarding/vault-ui-onboarding.component.ts @@ -0,0 +1,79 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { + ButtonModule, + DialogModule, + DialogService, + IconModule, + svgIcon, +} from "@bitwarden/components"; + +const announcementIcon = svgIcon` + + + + + + + + + + + + + + + + +`; + +@Component({ + standalone: true, + selector: "app-vault-ui-onboarding", + template: ` + +
+ +
+ + {{ "bitwardenNewLook" | i18n }} + + + {{ "bitwardenNewLookDesc" | i18n }} + + + + + + +
+ `, + imports: [CommonModule, DialogModule, ButtonModule, JslibModule, IconModule], +}) +export class VaultUiOnboardingComponent { + icon = announcementIcon; + + static open(dialogService: DialogService) { + return dialogService.open(VaultUiOnboardingComponent); + } + + navigateToLink = async () => { + window.open( + "https://bitwarden.com/blog/bringing-intuitive-workflows-and-visual-updates-to-the-bitwarden-browser/", + "_blank", + ); + }; +} diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.html new file mode 100644 index 00000000000..c2645f15ea8 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..36343d3a661 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts @@ -0,0 +1,163 @@ +import { ComponentFixture, fakeAsync, flush, TestBed } from "@angular/core/testing"; +import { ActivatedRoute, Router } from "@angular/router"; +import { mock } from "jest-mock-extended"; +import { Subject } from "rxjs"; + +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AUTOFILL_ID } from "@bitwarden/common/autofill/constants"; +import { EventType } from "@bitwarden/common/enums"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service"; + +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; + +import { VaultPopupAutofillService } from "./../../../services/vault-popup-autofill.service"; +import { ViewV2Component } from "./view-v2.component"; + +// 'qrcode-parser' is used by `BrowserTotpCaptureService` but is an es6 module that jest can't compile. +// Mock the entire module here to prevent jest from throwing an error. I wasn't able to find a way to mock the +// `BrowserTotpCaptureService` where jest would not load the file in the first place. +jest.mock("qrcode-parser", () => {}); + +describe("ViewV2Component", () => { + let component: ViewV2Component; + let fixture: ComponentFixture; + const params$ = new Subject(); + const mockNavigate = jest.fn(); + const collect = jest.fn().mockResolvedValue(null); + const doAutofill = jest.fn(); + + const mockCipher = { + id: "122-333-444", + type: CipherType.Login, + orgId: "222-444-555", + }; + + const mockVaultPopupAutofillService = { + doAutofill, + }; + const mockUserId = Utils.newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); + + const mockCipherService = { + get: jest.fn().mockResolvedValue({ decrypt: jest.fn().mockResolvedValue(mockCipher) }), + getKeyForCipherKeyDecryption: jest.fn().mockResolvedValue({}), + }; + + beforeEach(async () => { + mockNavigate.mockClear(); + collect.mockClear(); + doAutofill.mockClear(); + + await TestBed.configureTestingModule({ + imports: [ViewV2Component], + providers: [ + { provide: Router, useValue: { navigate: mockNavigate } }, + { provide: CipherService, useValue: mockCipherService }, + { provide: LogService, useValue: mock() }, + { provide: PlatformUtilsService, useValue: mock() }, + { provide: ConfigService, useValue: mock() }, + { provide: PopupRouterCacheService, useValue: mock() }, + { provide: ActivatedRoute, useValue: { queryParams: params$ } }, + { provide: EventCollectionService, useValue: { collect } }, + { + provide: I18nService, + useValue: { + t: (key: string, ...rest: string[]) => { + if (rest?.length) { + return `${key} ${rest.join(" ")}`; + } + return key; + }, + }, + }, + { provide: VaultPopupAutofillService, useValue: mockVaultPopupAutofillService }, + { + provide: AccountService, + useValue: accountService, + }, + { + provide: CipherAuthorizationService, + useValue: { + canDeleteCipher$: jest.fn().mockReturnValue(true), + }, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(ViewV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + describe("queryParams", () => { + it("loads an existing cipher", fakeAsync(() => { + params$.next({ cipherId: "122-333-444" }); + + flush(); // Resolve all promises + + expect(mockCipherService.get).toHaveBeenCalledWith("122-333-444"); + expect(component.cipher).toEqual(mockCipher); + })); + + it("sets the correct header text", fakeAsync(() => { + // Set header text for a login + mockCipher.type = CipherType.Login; + params$.next({ cipherId: mockCipher.id }); + flush(); // Resolve all promises + + expect(component.headerText).toEqual("viewItemHeader typelogin"); + + // Set header text for a card + mockCipher.type = CipherType.Card; + params$.next({ cipherId: mockCipher.id }); + flush(); // Resolve all promises + + expect(component.headerText).toEqual("viewItemHeader typecard"); + + // Set header text for an identity + mockCipher.type = CipherType.Identity; + params$.next({ cipherId: mockCipher.id }); + flush(); // Resolve all promises + + expect(component.headerText).toEqual("viewItemHeader typeidentity"); + + // Set header text for a secure note + mockCipher.type = CipherType.SecureNote; + params$.next({ cipherId: mockCipher.id }); + flush(); // Resolve all promises + + expect(component.headerText).toEqual("viewItemHeader note"); + })); + + it("sends viewed event", fakeAsync(() => { + params$.next({ cipherId: "122-333-444" }); + + flush(); // Resolve all promises + + expect(collect).toHaveBeenCalledWith( + EventType.Cipher_ClientViewed, + mockCipher.id, + false, + undefined, + ); + })); + + it('invokes `doAutofill` when action="AUTOFILL_ID"', fakeAsync(() => { + params$.next({ action: AUTOFILL_ID }); + + flush(); // Resolve all promises + + expect(doAutofill).toHaveBeenCalledOnce(); + })); + }); +}); 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 new file mode 100644 index 00000000000..8242fd8747e --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts @@ -0,0 +1,214 @@ +import { CommonModule } from "@angular/common"; +import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { FormsModule } from "@angular/forms"; +import { ActivatedRoute, Router } from "@angular/router"; +import { firstValueFrom, map, Observable, switchMap } from "rxjs"; + +import { CollectionView } from "@bitwarden/admin-console/common"; +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AUTOFILL_ID, SHOW_AUTOFILL_BUTTON } from "@bitwarden/common/autofill/constants"; +import { EventType } from "@bitwarden/common/enums"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { ViewPasswordHistoryService } from "@bitwarden/common/vault/abstractions/view-password-history.service"; +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 { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service"; +import { + AsyncActionsModule, + ButtonModule, + DialogService, + IconButtonModule, + SearchModule, + ToastService, +} from "@bitwarden/components"; + +import { PremiumUpgradePromptService } from "../../../../../../../../libs/common/src/vault/abstractions/premium-upgrade-prompt.service"; +import { CipherViewComponent } from "../../../../../../../../libs/vault/src/cipher-view"; +import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component"; +import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service"; +import { BrowserPremiumUpgradePromptService } from "../../../services/browser-premium-upgrade-prompt.service"; +import { BrowserViewPasswordHistoryService } from "../../../services/browser-view-password-history.service"; + +import { PopupFooterComponent } from "./../../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "./../../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "./../../../../../platform/popup/layout/popup-page.component"; +import { VaultPopupAutofillService } from "./../../../services/vault-popup-autofill.service"; + +@Component({ + selector: "app-view-v2", + templateUrl: "view-v2.component.html", + standalone: true, + imports: [ + CommonModule, + SearchModule, + JslibModule, + FormsModule, + ButtonModule, + PopupPageComponent, + PopupHeaderComponent, + PopupFooterComponent, + IconButtonModule, + CipherViewComponent, + AsyncActionsModule, + PopOutComponent, + ], + providers: [ + { provide: ViewPasswordHistoryService, useClass: BrowserViewPasswordHistoryService }, + { provide: PremiumUpgradePromptService, useClass: BrowserPremiumUpgradePromptService }, + ], +}) +export class ViewV2Component { + headerText: string; + cipher: CipherView; + organization$: Observable; + folder$: Observable; + canDeleteCipher$: Observable; + collections$: Observable; + loadAction: typeof AUTOFILL_ID | typeof SHOW_AUTOFILL_BUTTON; + + constructor( + private route: ActivatedRoute, + private router: Router, + private i18nService: I18nService, + private cipherService: CipherService, + private dialogService: DialogService, + private logService: LogService, + private toastService: ToastService, + private vaultPopupAutofillService: VaultPopupAutofillService, + private accountService: AccountService, + private eventCollectionService: EventCollectionService, + private popupRouterCacheService: PopupRouterCacheService, + protected cipherAuthorizationService: CipherAuthorizationService, + ) { + this.subscribeToParams(); + } + + subscribeToParams(): void { + this.route.queryParams + .pipe( + switchMap(async (params): Promise => { + this.loadAction = params.action; + return await this.getCipherData(params.cipherId); + }), + switchMap(async (cipher) => { + this.cipher = cipher; + this.headerText = this.setHeader(cipher.type); + if (this.loadAction === AUTOFILL_ID) { + await this.vaultPopupAutofillService.doAutofill(this.cipher); + } + + this.canDeleteCipher$ = this.cipherAuthorizationService.canDeleteCipher$(cipher); + + await this.eventCollectionService.collect( + EventType.Cipher_ClientViewed, + cipher.id, + false, + cipher.organizationId, + ); + }), + takeUntilDestroyed(), + ) + .subscribe(); + } + + setHeader(type: CipherType) { + switch (type) { + case CipherType.Login: + return this.i18nService.t("viewItemHeader", this.i18nService.t("typeLogin").toLowerCase()); + case CipherType.Card: + return this.i18nService.t("viewItemHeader", this.i18nService.t("typeCard").toLowerCase()); + case CipherType.Identity: + return this.i18nService.t( + "viewItemHeader", + this.i18nService.t("typeIdentity").toLowerCase(), + ); + case CipherType.SecureNote: + return this.i18nService.t("viewItemHeader", this.i18nService.t("note").toLowerCase()); + case CipherType.SshKey: + return this.i18nService.t("viewItemHeader", this.i18nService.t("typeSshkey").toLowerCase()); + } + } + + async getCipherData(id: string) { + const cipher = await this.cipherService.get(id); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); + return await cipher.decrypt( + await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), + ); + } + + async editCipher() { + if (this.cipher.isDeleted) { + return false; + } + void this.router.navigate(["/edit-cipher"], { + queryParams: { cipherId: this.cipher.id, type: this.cipher.type, isNew: false }, + }); + return true; + } + + delete = async (): Promise => { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "deleteItem" }, + content: { + key: this.cipher.isDeleted ? "permanentlyDeleteItemConfirmation" : "deleteItemConfirmation", + }, + type: "warning", + }); + + if (!confirmed) { + return false; + } + + try { + await this.deleteCipher(); + } catch (e) { + this.logService.error(e); + return false; + } + + await this.popupRouterCacheService.back(); + + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t(this.cipher.isDeleted ? "permanentlyDeletedItem" : "deletedItem"), + }); + + return true; + }; + + restore = async (): Promise => { + try { + await this.cipherService.restoreWithServer(this.cipher.id); + } catch (e) { + this.logService.error(e); + } + + await this.popupRouterCacheService.back(); + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("restoredItem"), + }); + }; + + protected deleteCipher() { + return this.cipher.isDeleted + ? this.cipherService.deleteWithServer(this.cipher.id) + : this.cipherService.softDeleteWithServer(this.cipher.id); + } + + protected showFooter(): boolean { + return this.cipher && (!this.cipher.isDeleted || (this.cipher.isDeleted && this.cipher.edit)); + } +} diff --git a/apps/browser/src/vault/popup/components/vault/add-edit.component.html b/apps/browser/src/vault/popup/components/vault/add-edit.component.html index dda71cb0d6e..fb1efbbbd79 100644 --- a/apps/browser/src/vault/popup/components/vault/add-edit.component.html +++ b/apps/browser/src/vault/popup/components/vault/add-edit.component.html @@ -62,7 +62,7 @@ (click)="generateUsername()" *ngIf="!(!cipher.edit && editMode)" > - + @@ -92,12 +92,12 @@ *ngIf="cipher.viewPassword" > @@ -108,11 +108,11 @@ appStopClick appA11yTitle="{{ 'toggleVisibility' | i18n }}" (click)="togglePassword()" - *ngIf="cipher.viewPassword" + *ngIf="cipher.viewPassword && cipher.login.password" [attr.aria-pressed]="showPassword" > @@ -125,24 +125,92 @@ (click)="generatePassword()" *ngIf="cipher.viewPassword && !(!cipher.edit && editMode)" > - + -
- - + + +
+
+
+ +
+ {{ "typePasskey" | i18n }} + {{ "dateCreated" | i18n }} + {{ cipher.login.fido2Credentials[0].creationDate | date: "short" }} +
+
+
+
+ +
+
+ + +
+
+ + + +
+
@@ -179,7 +247,7 @@ [attr.aria-pressed]="showCardNumber" > @@ -229,7 +297,7 @@ type="text" name="Card.ExpYear" [(ngModel)]="cipher.card.expYear" - placeholder="{{ 'ex' | i18n }} {{ currentDate | date : 'yyyy' }}" + placeholder="{{ 'ex' | i18n }} {{ currentDate | date: 'yyyy' }}" [readonly]="!cipher.edit && editMode" />
@@ -256,7 +324,7 @@ [attr.aria-pressed]="showCardCode" > @@ -461,6 +529,26 @@ />
+ + +
+
+ {{ "sshPrivateKey" | i18n }} + {{ cipher.sshKey.privateKey }} +
+
+ {{ "sshPublicKey" | i18n }} + {{ cipher.sshKey.publicKey }} +
+
+ {{ "sshKeyFingerprint" | i18n }} + {{ cipher.sshKey.keyFingerprint }} +
+
@@ -471,18 +559,19 @@ class="box-content-row box-content-row-multi" appBoxRow *ngFor="let u of cipher.login.uris; let i = index; trackBy: trackByFunction" - attr.aria-label="{{ 'uriPosition' | i18n : i + 1 }}" + attr.aria-label="{{ 'uriPosition' | i18n: i + 1 }}" >
- +
@@ -594,7 +685,7 @@ {{ "passwordPrompt" | i18n }} @@ -708,7 +799,7 @@ -
+
-
diff --git a/apps/browser/src/vault/popup/components/vault/password-history.component.ts b/apps/browser/src/vault/popup/components/vault/password-history.component.ts index 1dd7697a7d5..bf1b4ea7717 100644 --- a/apps/browser/src/vault/popup/components/vault/password-history.component.ts +++ b/apps/browser/src/vault/popup/components/vault/password-history.component.ts @@ -1,9 +1,10 @@ import { Location } from "@angular/common"; -import { Component } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { first } from "rxjs/operators"; import { PasswordHistoryComponent as BasePasswordHistoryComponent } from "@bitwarden/angular/vault/components/password-history.component"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -13,15 +14,16 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi templateUrl: "password-history.component.html", }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class PasswordHistoryComponent extends BasePasswordHistoryComponent { +export class PasswordHistoryComponent extends BasePasswordHistoryComponent implements OnInit { constructor( cipherService: CipherService, platformUtilsService: PlatformUtilsService, i18nService: I18nService, + accountService: AccountService, private location: Location, - private route: ActivatedRoute + private route: ActivatedRoute, ) { - super(cipherService, platformUtilsService, i18nService, window); + super(cipherService, platformUtilsService, i18nService, accountService, window); } async ngOnInit() { diff --git a/apps/browser/src/vault/popup/components/vault/share.component.ts b/apps/browser/src/vault/popup/components/vault/share.component.ts index 80188646baf..8e061665b73 100644 --- a/apps/browser/src/vault/popup/components/vault/share.component.ts +++ b/apps/browser/src/vault/popup/components/vault/share.component.ts @@ -1,21 +1,22 @@ -import { Component } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { first } from "rxjs/operators"; +import { CollectionService } from "@bitwarden/admin-console/common"; import { ShareComponent as BaseShareComponent } from "@bitwarden/angular/components/share.component"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; @Component({ selector: "app-vault-share", templateUrl: "share.component.html", }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class ShareComponent extends BaseShareComponent { +export class ShareComponent extends BaseShareComponent implements OnInit { constructor( collectionService: CollectionService, platformUtilsService: PlatformUtilsService, @@ -24,7 +25,8 @@ export class ShareComponent extends BaseShareComponent { cipherService: CipherService, private route: ActivatedRoute, private router: Router, - organizationService: OrganizationService + organizationService: OrganizationService, + accountService: AccountService, ) { super( collectionService, @@ -32,13 +34,16 @@ export class ShareComponent extends BaseShareComponent { i18nService, cipherService, logService, - organizationService + organizationService, + accountService, ); } async ngOnInit() { // eslint-disable-next-line rxjs-angular/prefer-takeuntil this.onSharedCipher.subscribe(() => { + // 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(["view-cipher", { cipherId: this.cipherId }]); }); // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe @@ -57,6 +62,8 @@ export class ShareComponent extends BaseShareComponent { } cancel() { + // 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(["/view-cipher"], { replaceUrl: true, queryParams: { cipherId: this.cipher.id }, diff --git a/apps/browser/src/vault/popup/components/vault/vault-filter.component.html b/apps/browser/src/vault/popup/components/vault/vault-filter.component.html index 8e459a26006..f5c28b2bebd 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-filter.component.html +++ b/apps/browser/src/vault/popup/components/vault/vault-filter.component.html @@ -1,9 +1,9 @@ -
+

{{ "myVault" | i18n }}

-
+
{{ "typeLogin" | i18n }}
- {{ typeCounts.get(cipherType.Login) || 0 }} + + {{ typeCounts.get(cipherType.Login) || 0 }} + +
diff --git a/apps/browser/src/vault/popup/components/vault/vault-filter.component.ts b/apps/browser/src/vault/popup/components/vault/vault-filter.component.ts index 4be0fe89fe1..448f85a8cbd 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-filter.component.ts +++ b/apps/browser/src/vault/popup/components/vault/vault-filter.component.ts @@ -1,26 +1,26 @@ import { Location } from "@angular/common"; import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; -import { firstValueFrom } from "rxjs"; -import { first } from "rxjs/operators"; +import { BehaviorSubject, Subject, firstValueFrom, from } from "rxjs"; +import { first, switchMap, takeUntil } from "rxjs/operators"; +import { CollectionView } from "@bitwarden/admin-console/common"; import { VaultFilter } from "@bitwarden/angular/vault/vault-filter/models/vault-filter.model"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SyncService } from "@bitwarden/common/platform/sync"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { BrowserGroupingsComponentState } from "../../../../models/browserGroupingsComponentState"; import { BrowserApi } from "../../../../platform/browser/browser-api"; -import { BrowserStateService } from "../../../../platform/services/abstractions/browser-state.service"; -import { PopupUtilsService } from "../../../../popup/services/popup-utils.service"; +import BrowserPopupUtils from "../../../../platform/popup/browser-popup-utils"; +import { VaultBrowserStateService } from "../../../services/vault-browser-state.service"; import { VaultFilterService } from "../../../services/vault-filter.service"; const ComponentId = "VaultComponent"; @@ -53,7 +53,6 @@ export class VaultFilterComponent implements OnInit, OnDestroy { folderCounts = new Map(); collectionCounts = new Map(); typeCounts = new Map(); - searchText: string; state: BrowserGroupingsComponentState; showLeftHeader = true; searchPending = false; @@ -71,6 +70,16 @@ export class VaultFilterComponent implements OnInit, OnDestroy { private hasSearched = false; private hasLoadedAllCiphers = false; private allCiphers: CipherView[] = null; + private destroy$ = new Subject(); + private _searchText$ = new BehaviorSubject(""); + private isSearchable: boolean = false; + + get searchText() { + return this._searchText$.value; + } + set searchText(value: string) { + this._searchText$.next(value); + } constructor( private i18nService: I18nService, @@ -80,13 +89,12 @@ export class VaultFilterComponent implements OnInit, OnDestroy { private broadcasterService: BroadcasterService, private changeDetectorRef: ChangeDetectorRef, private route: ActivatedRoute, - private popupUtils: PopupUtilsService, private syncService: SyncService, private platformUtilsService: PlatformUtilsService, private searchService: SearchService, private location: Location, - private browserStateService: BrowserStateService, - private vaultFilterService: VaultFilterService + private vaultFilterService: VaultFilterService, + private vaultBrowserStateService: VaultBrowserStateService, ) { this.noFolderListSize = 100; } @@ -94,15 +102,19 @@ export class VaultFilterComponent implements OnInit, OnDestroy { async ngOnInit() { this.searchTypeSearch = !this.platformUtilsService.isSafari(); this.showLeftHeader = !( - this.popupUtils.inSidebar(window) && this.platformUtilsService.isFirefox() + BrowserPopupUtils.inSidebar(window) && this.platformUtilsService.isFirefox() ); - await this.browserStateService.setBrowserVaultItemsComponentState(null); + await this.vaultBrowserStateService.setBrowserVaultItemsComponentState(null); this.broadcasterService.subscribe(ComponentId, (message: any) => { + // 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.ngZone.run(async () => { switch (message.command) { case "syncCompleted": window.setTimeout(() => { + // 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.load(); }, 500); break; @@ -117,7 +129,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { const restoredScopeState = await this.restoreState(); // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe this.route.queryParams.pipe(first()).subscribe(async (params) => { - this.state = await this.browserStateService.getBrowserGroupingComponentState(); + this.state = await this.vaultBrowserStateService.getBrowserGroupingsComponentState(); if (this.state?.searchText) { this.searchText = this.state.searchText; } else if (params.searchText) { @@ -126,19 +138,34 @@ export class VaultFilterComponent implements OnInit, OnDestroy { } if (!this.syncService.syncInProgress) { + // 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.load(); } else { this.loadedTimeout = window.setTimeout(() => { if (!this.loaded) { + // 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.load(); } }, 5000); } if (!this.syncService.syncInProgress || restoredScopeState) { - window.setTimeout(() => this.popupUtils.setContentScrollY(window, this.state?.scrollY), 0); + // 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 + BrowserPopupUtils.setContentScrollY(window, this.state?.scrollY); } }); + + this._searchText$ + .pipe( + switchMap((searchText) => from(this.searchService.isSearchable(searchText))), + takeUntil(this.destroy$), + ) + .subscribe((isSearchable) => { + this.isSearchable = isSearchable; + }); } ngOnDestroy() { @@ -148,8 +175,12 @@ export class VaultFilterComponent implements OnInit, OnDestroy { if (this.selectedTimeout != null) { window.clearTimeout(this.selectedTimeout); } + // 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.saveState(); this.broadcasterService.unsubscribe(ComponentId); + this.destroy$.next(); + this.destroy$.complete(); } async load() { @@ -170,7 +201,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { async loadCiphers() { this.allCiphers = await this.cipherService.getAllDecrypted(); if (!this.hasLoadedAllCiphers) { - this.hasLoadedAllCiphers = !this.searchService.isSearchable(this.searchText); + this.hasLoadedAllCiphers = !(await this.searchService.isSearchable(this.searchText)); } await this.search(null); this.getCounts(); @@ -178,7 +209,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { async loadCollections() { const allCollections = await this.vaultFilterService.buildCollections( - this.selectedOrganization + this.selectedOrganization, ); this.collections = allCollections.fullList; this.nestedCollections = allCollections.nestedList; @@ -186,7 +217,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { async loadFolders() { const allFolders = await firstValueFrom( - this.vaultFilterService.buildNestedFolders(this.selectedOrganization) + this.vaultFilterService.buildNestedFolders(this.selectedOrganization), ); this.folders = allFolders.fullList; this.nestedFolders = allFolders.nestedList; @@ -199,55 +230,65 @@ export class VaultFilterComponent implements OnInit, OnDestroy { } const filterDeleted = (c: CipherView) => !c.isDeleted; if (timeout == null) { - this.hasSearched = this.searchService.isSearchable(this.searchText); + this.hasSearched = this.isSearchable; this.ciphers = await this.searchService.searchCiphers( this.searchText, filterDeleted, - this.allCiphers + this.allCiphers, ); this.ciphers = this.ciphers.filter( - (c) => !this.vaultFilterService.filterCipherForSelectedVault(c) + (c) => !this.vaultFilterService.filterCipherForSelectedVault(c), ); return; } this.searchPending = true; this.searchTimeout = setTimeout(async () => { - this.hasSearched = this.searchService.isSearchable(this.searchText); + this.hasSearched = this.isSearchable; if (!this.hasLoadedAllCiphers && !this.hasSearched) { await this.loadCiphers(); } else { this.ciphers = await this.searchService.searchCiphers( this.searchText, filterDeleted, - this.allCiphers + this.allCiphers, ); } this.ciphers = this.ciphers.filter( - (c) => !this.vaultFilterService.filterCipherForSelectedVault(c) + (c) => !this.vaultFilterService.filterCipherForSelectedVault(c), ); this.searchPending = false; }, timeout); } async selectType(type: CipherType) { + // 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(["/ciphers"], { queryParams: { type: type } }); } async selectFolder(folder: FolderView) { + // 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(["/ciphers"], { queryParams: { folderId: folder.id || "none" } }); } async selectCollection(collection: CollectionView) { + // 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(["/ciphers"], { queryParams: { collectionId: collection.id } }); } async selectTrash() { + // 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(["/ciphers"], { queryParams: { deleted: true } }); } async selectCipher(cipher: CipherView) { this.selectedTimeout = window.setTimeout(() => { if (!this.preventSelected) { + // 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(["/view-cipher"], { queryParams: { cipherId: cipher.id } }); } this.preventSelected = false; @@ -264,13 +305,17 @@ export class VaultFilterComponent implements OnInit, OnDestroy { } this.preventSelected = true; await this.cipherService.updateLastLaunchedDate(cipher.id); + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises BrowserApi.createNewTab(cipher.login.launchUri); - if (this.popupUtils.inPopup(window)) { + if (BrowserPopupUtils.inPopup(window)) { BrowserApi.closePopup(window); } } async addCipher() { + // 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(["/add-cipher"], { queryParams: { selectedVault: this.vaultFilter.selectedOrganizationId }, }); @@ -302,7 +347,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { const typeCounts = new Map(); this.deletedCount = this.allCiphers.filter( - (c) => c.isDeleted && !this.vaultFilterService.filterCipherForSelectedVault(c) + (c) => c.isDeleted && !this.vaultFilterService.filterCipherForSelectedVault(c), ).length; this.ciphers?.forEach((c) => { @@ -356,9 +401,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { } showSearching() { - return ( - this.hasSearched || (!this.searchPending && this.searchService.isSearchable(this.searchText)) - ); + return this.hasSearched || (!this.searchPending && this.isSearchable); } closeOnEsc(e: KeyboardEvent) { @@ -376,7 +419,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { private async saveState() { this.state = Object.assign(new BrowserGroupingsComponentState(), { - scrollY: this.popupUtils.getContentScrollY(window), + scrollY: BrowserPopupUtils.getContentScrollY(window), searchText: this.searchText, favoriteCiphers: this.favoriteCiphers, noFolderCiphers: this.noFolderCiphers, @@ -388,11 +431,11 @@ export class VaultFilterComponent implements OnInit, OnDestroy { collections: this.collections, deletedCount: this.deletedCount, }); - await this.browserStateService.setBrowserGroupingComponentState(this.state); + await this.vaultBrowserStateService.setBrowserGroupingsComponentState(this.state); } private async restoreState(): Promise { - this.state = await this.browserStateService.getBrowserGroupingComponentState(); + this.state = await this.vaultBrowserStateService.getBrowserGroupingsComponentState(); if (this.state == null) { return false; } diff --git a/apps/browser/src/vault/popup/components/vault/vault-items.component.ts b/apps/browser/src/vault/popup/components/vault/vault-items.component.ts index 59d7ae92c28..27d36cbc2f1 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-items.component.ts +++ b/apps/browser/src/vault/popup/components/vault/vault-items.component.ts @@ -3,26 +3,24 @@ import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angula import { ActivatedRoute, Router } from "@angular/router"; import { first } from "rxjs/operators"; +import { CollectionService, CollectionView } from "@bitwarden/admin-console/common"; import { VaultItemsComponent as BaseVaultItemsComponent } from "@bitwarden/angular/vault/components/vault-items.component"; import { VaultFilter } from "@bitwarden/angular/vault/vault-filter/models/vault-filter.model"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; -import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; -import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { BrowserComponentState } from "../../../../models/browserComponentState"; import { BrowserApi } from "../../../../platform/browser/browser-api"; -import { BrowserStateService } from "../../../../platform/services/abstractions/browser-state.service"; -import { PopupUtilsService } from "../../../../popup/services/popup-utils.service"; +import BrowserPopupUtils from "../../../../platform/popup/browser-popup-utils"; +import { VaultBrowserStateService } from "../../../services/vault-browser-state.service"; import { VaultFilterService } from "../../../services/vault-filter.service"; const ComponentId = "VaultItemsComponent"; @@ -60,14 +58,12 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn private ngZone: NgZone, private broadcasterService: BroadcasterService, private changeDetectorRef: ChangeDetectorRef, - private stateService: BrowserStateService, - private popupUtils: PopupUtilsService, + private stateService: VaultBrowserStateService, private i18nService: I18nService, - private folderService: FolderService, private collectionService: CollectionService, private platformUtilsService: PlatformUtilsService, cipherService: CipherService, - private vaultFilterService: VaultFilterService + private vaultFilterService: VaultFilterService, ) { super(searchService, cipherService); this.applySavedState = @@ -77,7 +73,7 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn async ngOnInit() { this.searchTypeSearch = !this.platformUtilsService.isSafari(); - this.showOrganizations = this.organizationService.hasOrganizations(); + this.showOrganizations = await this.organizationService.hasOrganizations(); this.vaultFilter = this.vaultFilterService.getVaultFilter(); // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe this.route.queryParams.pipe(first()).subscribe(async (params) => { @@ -110,6 +106,9 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn case CipherType.SecureNote: this.groupingTitle = this.i18nService.t("secureNotes"); break; + case CipherType.SshKey: + this.groupingTitle = this.i18nService.t("sshKeys"); + break; default: break; } @@ -146,7 +145,7 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn : null; } await this.load( - (c) => c.collectionIds != null && c.collectionIds.indexOf(this.collectionId) > -1 + (c) => c.collectionIds != null && c.collectionIds.indexOf(this.collectionId) > -1, ); } else { this.showVaultFilter = true; @@ -155,21 +154,26 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn } if (this.applySavedState && this.state != null) { - window.setTimeout( - () => - this.popupUtils.setContentScrollY(window, this.state.scrollY, this.scrollingContainer), - 0 - ); + // 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 + BrowserPopupUtils.setContentScrollY(window, this.state.scrollY, { + delay: 0, + containerSelector: this.scrollingContainer, + }); } await this.stateService.setBrowserVaultItemsComponentState(null); }); this.broadcasterService.subscribe(ComponentId, (message: any) => { + // 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.ngZone.run(async () => { switch (message.command) { case "syncCompleted": if (message.successfully) { window.setTimeout(() => { + // 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.refresh(); }, 500); } @@ -184,6 +188,8 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn } ngOnDestroy() { + // 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.saveState(); this.broadcasterService.unsubscribe(ComponentId); } @@ -192,7 +198,11 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn this.selectedTimeout = window.setTimeout(() => { if (!this.preventSelected) { super.selectCipher(cipher); - this.router.navigate(["/view-cipher"], { queryParams: { cipherId: cipher.id } }); + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.router.navigate(["/view-cipher"], { + queryParams: { cipherId: cipher.id, collectionId: this.collectionId }, + }); } this.preventSelected = false; }, 200); @@ -200,11 +210,15 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn selectFolder(folder: FolderView) { if (folder.id != null) { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.router.navigate(["/ciphers"], { queryParams: { folderId: folder.id } }); } } selectCollection(collection: CollectionView) { + // 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(["/ciphers"], { queryParams: { collectionId: collection.id } }); } @@ -218,8 +232,10 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn } this.preventSelected = true; await this.cipherService.updateLastLaunchedDate(cipher.id); + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises BrowserApi.createNewTab(cipher.login.launchUri); - if (this.popupUtils.inPopup(window)) { + if (BrowserPopupUtils.inPopup(window)) { BrowserApi.closePopup(window); } } @@ -229,6 +245,8 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn return false; } super.addCipher(); + // 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(["/add-cipher"], { queryParams: { folderId: this.folderId, @@ -288,7 +306,7 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnIn private async saveState() { this.state = { - scrollY: this.popupUtils.getContentScrollY(window, this.scrollingContainer), + scrollY: BrowserPopupUtils.getContentScrollY(window, this.scrollingContainer), searchText: this.searchText, }; await this.stateService.setBrowserVaultItemsComponentState(this.state); diff --git a/apps/browser/src/vault/popup/components/vault/vault-select.component.html b/apps/browser/src/vault/popup/components/vault/vault-select.component.html index 84c5f48a4e8..4f6ce3a11e6 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-select.component.html +++ b/apps/browser/src/vault/popup/components/vault/vault-select.component.html @@ -57,12 +57,12 @@ >
diff --git a/apps/browser/src/vault/popup/components/vault/vault-select.component.ts b/apps/browser/src/vault/popup/components/vault/vault-select.component.ts index 30b5533fcc4..6780cd57929 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-select.component.ts +++ b/apps/browser/src/vault/popup/components/vault/vault-select.component.ts @@ -5,17 +5,28 @@ import { Component, ElementRef, EventEmitter, + HostListener, + OnDestroy, OnInit, Output, TemplateRef, ViewChild, ViewContainerRef, - HostListener, - OnDestroy, } from "@angular/core"; -import { BehaviorSubject, concatMap, map, merge, Observable, Subject, takeUntil } from "rxjs"; +import { + BehaviorSubject, + combineLatest, + concatMap, + map, + merge, + Observable, + Subject, + takeUntil, +} from "rxjs"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -32,7 +43,7 @@ import { VaultFilterService } from "../../../services/vault-filter.service"; "void", style({ opacity: 0, - }) + }), ), transition( "void => open", @@ -40,8 +51,8 @@ import { VaultFilterService } from "../../../services/vault-filter.service"; "100ms linear", style({ opacity: 1, - }) - ) + }), + ), ), transition("* => void", animate("100ms linear", style({ opacity: 0 }))), ]), @@ -87,7 +98,8 @@ export class VaultSelectComponent implements OnInit, OnDestroy { private overlay: Overlay, private viewContainerRef: ViewContainerRef, private platformUtilsService: PlatformUtilsService, - private organizationService: OrganizationService + private organizationService: OrganizationService, + private policyService: PolicyService, ) {} @HostListener("document:keydown.escape", ["$event"]) @@ -103,11 +115,13 @@ export class VaultSelectComponent implements OnInit, OnDestroy { .pipe(takeUntil(this._destroy)) .pipe(map((orgs) => orgs.sort(Utils.getSortFunction(this.i18nService, "name")))); - this.organizations$ + combineLatest([ + this.organizations$, + this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership), + ]) .pipe( - concatMap(async (organizations) => { - this.enforcePersonalOwnership = - await this.vaultFilterService.checkForPersonalOwnershipPolicy(); + concatMap(async ([organizations, enforcePersonalOwnership]) => { + this.enforcePersonalOwnership = enforcePersonalOwnership; if (this.shouldShow(organizations)) { if (this.enforcePersonalOwnership && !this.vaultFilterService.vaultFilter.myVaultOnly) { @@ -118,14 +132,14 @@ export class VaultSelectComponent implements OnInit, OnDestroy { this._selectedVault.next(this.i18nService.t(this.vaultFilterService.myVault)); } else if (this.vaultFilterService.vaultFilter.selectedOrganizationId != null) { const selectedOrganization = organizations.find( - (o) => o.id === this.vaultFilterService.vaultFilter.selectedOrganizationId + (o) => o.id === this.vaultFilterService.vaultFilter.selectedOrganizationId, ); this._selectedVault.next(selectedOrganization.name); } else { this._selectedVault.next(this.i18nService.t(this.vaultFilterService.allVaults)); } } - }) + }), ) .pipe(takeUntil(this._destroy)) .subscribe(); @@ -167,7 +181,7 @@ export class VaultSelectComponent implements OnInit, OnDestroy { merge( this.overlayRef.outsidePointerEvents(), this.overlayRef.backdropClick(), - this.overlayRef.detachments() + this.overlayRef.detachments(), // eslint-disable-next-line rxjs-angular/prefer-takeuntil ).subscribe(() => { this.close(); @@ -187,7 +201,7 @@ export class VaultSelectComponent implements OnInit, OnDestroy { this.platformUtilsService.showToast( "error", null, - this.i18nService.t("disabledOrganizationFilterError") + this.i18nService.t("disabledOrganizationFilterError"), ); } else { this._selectedVault.next(organization.name); diff --git a/apps/browser/src/vault/popup/components/vault/vault-v2.component.html b/apps/browser/src/vault/popup/components/vault/vault-v2.component.html new file mode 100644 index 00000000000..4798ddf4dfb --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault/vault-v2.component.html @@ -0,0 +1,78 @@ + + + + + + + + + + +
+ + {{ "yourVaultIsEmpty" | i18n }} + {{ "autofillSuggestionsTip" | i18n }} + + +
+ + + + + + + +
+ + {{ "noItemsMatchSearch" | i18n }} + {{ "clearFiltersOrTryAnother" | i18n }} + +
+ + +
+
+ + + {{ "organizationIsDeactivated" | i18n }} + + {{ "contactYourOrgAdmin" | i18n }} + +
+
+ +
+ + + +
+
+
diff --git a/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts b/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts new file mode 100644 index 00000000000..68aa40cbf62 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts @@ -0,0 +1,120 @@ +import { ScrollingModule } from "@angular/cdk/scrolling"; +import { CommonModule } from "@angular/common"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { RouterLink } from "@angular/router"; +import { combineLatest, Observable, shareReplay, switchMap } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherType } from "@bitwarden/common/vault/enums"; +import { ButtonModule, Icons, NoItemsModule } from "@bitwarden/components"; +import { VaultIcons } from "@bitwarden/vault"; + +import { CurrentAccountComponent } from "../../../../auth/popup/account-switching/current-account.component"; +import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { VaultPopupItemsService } from "../../services/vault-popup-items.service"; +import { VaultPopupListFiltersService } from "../../services/vault-popup-list-filters.service"; +import { VaultUiOnboardingService } from "../../services/vault-ui-onboarding.service"; +import { AutofillVaultListItemsComponent, VaultListItemsContainerComponent } from "../vault-v2"; +import { + NewItemDropdownV2Component, + NewItemInitialValues, +} from "../vault-v2/new-item-dropdown/new-item-dropdown-v2.component"; +import { VaultHeaderV2Component } from "../vault-v2/vault-header/vault-header-v2.component"; + +enum VaultState { + Empty, + NoResults, + DeactivatedOrg, +} + +@Component({ + selector: "app-vault", + templateUrl: "vault-v2.component.html", + standalone: true, + imports: [ + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + CurrentAccountComponent, + NoItemsModule, + JslibModule, + CommonModule, + AutofillVaultListItemsComponent, + VaultListItemsContainerComponent, + ButtonModule, + RouterLink, + NewItemDropdownV2Component, + ScrollingModule, + VaultHeaderV2Component, + ], + providers: [VaultUiOnboardingService], +}) +export class VaultV2Component implements OnInit, OnDestroy { + cipherType = CipherType; + + protected favoriteCiphers$ = this.vaultPopupItemsService.favoriteCiphers$; + protected remainingCiphers$ = this.vaultPopupItemsService.remainingCiphers$; + protected loading$ = this.vaultPopupItemsService.loading$; + + protected newItemItemValues$: Observable = + this.vaultPopupListFiltersService.filters$.pipe( + switchMap( + async (filter) => + ({ + organizationId: (filter.organization?.id || + filter.collection?.organizationId) as OrganizationId, + collectionId: filter.collection?.id as CollectionId, + folderId: filter.folder?.id, + }) as NewItemInitialValues, + ), + shareReplay({ refCount: true, bufferSize: 1 }), + ); + + /** Visual state of the vault */ + protected vaultState: VaultState | null = null; + + protected vaultIcon = VaultIcons.Vault; + protected deactivatedIcon = VaultIcons.DeactivatedOrg; + protected noResultsIcon = Icons.NoResults; + + protected VaultStateEnum = VaultState; + + constructor( + private vaultPopupItemsService: VaultPopupItemsService, + private vaultPopupListFiltersService: VaultPopupListFiltersService, + private vaultUiOnboardingService: VaultUiOnboardingService, + ) { + combineLatest([ + this.vaultPopupItemsService.emptyVault$, + this.vaultPopupItemsService.noFilteredResults$, + this.vaultPopupItemsService.showDeactivatedOrg$, + ]) + .pipe(takeUntilDestroyed()) + .subscribe(([emptyVault, noResults, deactivatedOrg]) => { + switch (true) { + case emptyVault: + this.vaultState = VaultState.Empty; + break; + case deactivatedOrg: + // The deactivated org state takes precedence over the no results state + this.vaultState = VaultState.DeactivatedOrg; + break; + case noResults: + this.vaultState = VaultState.NoResults; + break; + default: + this.vaultState = null; + } + }); + } + + async ngOnInit() { + await this.vaultUiOnboardingService.showOnboardingDialog(); + } + + ngOnDestroy(): void {} +} diff --git a/apps/browser/src/vault/popup/components/vault/view.component.html b/apps/browser/src/vault/popup/components/vault/view.component.html index e8dceaff090..57a5d007d8a 100644 --- a/apps/browser/src/vault/popup/components/vault/view.component.html +++ b/apps/browser/src/vault/popup/components/vault/view.component.html @@ -142,6 +142,22 @@
+ + +
+
+
+ {{ "typePasskey" | i18n }} + {{ fido2CredentialCreationDateValue }} +
+
+
+
-
{{ "verificationCodeTotp" | i18n }} @@ -222,10 +237,10 @@ >{{ "number" | i18n }} {{ - cipher.card.maskedNumber | creditCardNumber : cipher.card.brand + cipher.card.maskedNumber | creditCardNumber: cipher.card.brand }} {{ - cipher.card.number | creditCardNumber : cipher.card.brand + cipher.card.number | creditCardNumber: cipher.card.brand }}
@@ -414,6 +429,39 @@
{{ cipher.identity.country }}
+ +
+
+ + {{ "sshPrivateKey" | i18n }} + +
+
+
+ + {{ "sshPublicKey" | i18n }} + {{ cipher.sshKey.publicKey }} +
+
+ + {{ "sshFingerprint" | i18n }} + {{ cipher.sshKey.keyFingerprint }} +
+
@@ -457,7 +505,7 @@ attr.aria-label="{{ 'launch' | i18n }} {{ u.uri }}" appA11yTitle="{{ 'launch' | i18n }}" *ngIf="u.canLaunch" - (click)="launch(u)" + (click)="launch(u, cipher.id)" > @@ -629,7 +677,7 @@ class="box-content-row" appStopClick (click)="delete()" - *ngIf="cipher.edit" + *ngIf="canDeleteCipher$ | async" >